Уменьшенные и увеличенные аккорды. Что такое диммер и как он работает Пользовательские типы данных

Нередко молодым девушкам дают совет кушать много капусты для роста груди. Но действительно ли этот овощ поможет обрести фигуру мечты?

Рациональное зерно в утверждении, что капуста стимулирует рост груди, все же есть. Дело в том, что данное растение в своем составе имеет дииндолилметан. Это вещество благотворно влияет не только на ткани молочной железы, но и на репродуктивное здоровье. Притом пользу дииндолилметан приносит не только женщинам, но и мужчинам.

Это профилактическое средство от многих заболеваний половой системы. А если проблемы уже имеются, оно вполне может стать отличным дополнением лечения, поскольку имеет и терапевтические свойства.

В крестоцветных овощах содержится 3,3’-дииндолилметан. Поскольку термин довольно сложно выговаривается, его обозначают аббревиатурой DIM. Название имеет логическое происхождение. В структуре дииндолилметана к молекуле метана присоединяются индольные группы, их две.

Форма выпуска – таблетки. Можно взять БАД с концентрацией дииндолилметана 100 или 200 мг в одной таблетке. Препарат, фасуется по 60, 120 и 180 таблеток в пластиковые баночки. ДИМ 200 мг продается по 60 таблеток в упаковке. БАД содержит витамин Е, соевый лецитин, а также экстракт черного перца, улучшающий усвоение организмом основного компонента.

Olympian Labs Inc., DIM-100, 60 капсул

Переменная - это некий контейнер, в котором VBA хранит данные. Если подробнее, то это как коробочка, в которую Вы можете положить что-то на хранение, а затем по мере необходимости достать. Только в данном случае в переменной мы храним число, строку или иные данные, которые затем можем извлекать из неё и использовать в коде по мере необходимости.

Для чего нужна переменная? Чтобы хранить значение и применить его позже в любой момент. Например, в ячейке А1 записана сумма, а нажатием на кнопку запускается обновление отчета. После обновления отчета сумма в А1 изменится. Необходимо сверить сумму до обновления с суммой после и в зависимости от этого сделать какое-либо действие. Переменная как раз позволит запомнить значение ячейки до того, как она обновится и использовать именно это значение после обновления.

Требования к переменным:

В качестве имен переменных можно использовать символы букв и числа, но первой в имени переменной всегда должна быть буква. Не допускается использование точки, запятой, пробела и иных знаков препинания, кроме нижнего подчеркивания. Длина имени не должна превышать 254 символов. Так же нельзя использовать в качестве имен для переменных зарезервированные константы редактора VBA(например Sub, Msgbox, ubound, Date и т.п.) . Так же для переменных неважен регистр букв.

Теперь рассмотрим основные декларированные в VBA типы данных, которые можно хранить в переменных:

Тип данных Занимает байт в памяти Пределы значений
Byte 1 Целые числа от 0 до 255
Boolean 2 True или False
Integer 2 Целые числа от (-32768 ) до 32767
Long 4 Целые числа от (-2147483648 ) до 2147483647
Single 4 От (–3.402823Е+38 ) до (–1.401298Е-45 ) и от 1.401298Е-45 до 3.402823Е+38
Double 8 От ±1.79769313486232Е+308 до ±4.94065645841247Е-324
Decimal 12 От ±79228162514264337593543950335 без десятичных знаков до ±7,9228162514264337593543950335 с 28-ю знаками после запятой
Currency 8 От (–922337203685477.5808 ) до 922337203685477.5807
Date 8 От 01.01.100 до 31.12.9999 (не надо путать с датами в Excel - 01.01.1900 до 31.12.2078)
String 1 От 0 до 65400 символов для фиксированных строк и чуть более 2 млрд. для строк переменной длины
Object 4 Любой объект
Array Определяется кол-вом и размером элементов -
Variant от 16-ти Любой из встроенных типов данных

Как видно из таблицы больше всего памяти занимает Variant . Притом это если он хранит числовые данные. Если же такая переменная будет хранить данные строкового типа(текст), то размер занимаемой памяти будет измеряться уже начиная с 22 байт + длина строки, хранящейся в переменной. Чем больше памяти занимает переменная, тем дольше она инициализируется в памяти и тем медленнее код будет выполняться. Вот поэтому и важно явно задавать тип данных, хранимых в переменной - это называется объявить переменную .

Тип данных Decimal больше не используется, поэтому объявить переменную данного типа в VBA не получится - подобная попытка приведет к синтаксической ошибке. Для работы с данными типа Decimal переменную необходимо изначально объявить как Variant или вообще без типа (например Dim a), т.к. тип данных Variant используется в VBA по умолчанию и принимает любой тип данных.

Так же переменным можно назначать и другие типы данных, которых нет в таблице выше - это типы, которые поддерживаются объектной моделью приложений, к которым "подключен" VBA. Например, если зайти в VBA из Excel, то библиотека типов объектной модели Excel подключена по умолчанию и для переменных становится доступно множество типов этой объектной модели. Многие из них знакомы всем: Workbook, Worksheet, Range, Cells, Chart и т.д. Т.е. это книги, листы, ячейки, диаграммы. Типов много, почти на каждый объект и коллекцию. Рассматривать здесь все бессмысленно. Могу лишь привести пару строк кода:

Dim rRange as Range Set rRange = Range("A1") "присвоили ссылку на ячейку A1 текущего листа

Про объявление переменных подробно написано чуть ниже.
А более подробно про обращение к диапазонам из VBA можно почитать в этой статье: Как обратиться к диапазону из VBA

Как объявлять переменные
На самом деле все очень просто. Это делается при помощи операторов области действия: Dim , Public ,Static и оператора присвоения типа As . Самый распространенный оператор - Dim . Его и возьмем в качестве примера. Синтаксис объявления:

[оператор области действия] Имя_переменной As [тип данных]

Очень частая ошибка при объявлении переменных, совершаемая начинающими изучать VBA:

Dim MyVar1, MyVar2, MyVar3 As Integer

Dim MyVar1, MyVar2, MyVar3 As Integer

Вроде бы исходя из логики всем переменным присвоен тип данных Integer . Но это ошибочное суждение. Тип Integer присвоен только последней переменной, к которой он "привязан" оператором As - MyVar3 . Все остальные переменные имеют тип данных Variant . Т.е. если Вы не задаете переменной тип хранимых данных явно(т.е. не указываете для неё тип данных) , то VBA сам присваивает такой переменной тип данных Variant , т.к. он может хранить любой тип данных. А вот так выглядит правильное присвоение типа данных:

Dim MyVar1%, MyVar2%, MyVar3%

Всего шесть типов, которые можно объявить подобным методом:
! - Single
# - Double
$ - String
% - Integer
& - Long
@ - Currency
На что стоит обратить внимание, при объявлении переменных подобным образом: между именем переменной и знаком типа не должно быть пробелов.
Я лично предпочитаю использовать первый метод, т.е. полное указание типа. Это читабельнее и понятнее. Но это мои предпочтения и в своих кодах Вы вправе использовать удобный Вам метод - ошибки не будет.

Теперь разберемся с операторами области действия(Dim , Public и Static):

  • Dim - данный оператор используется для объявления переменной, значение которой будет храниться только в той процедуре, внутри которой данная переменная объявлена. Во время запуска процедуры такая переменная инициализируется в памяти, Вы можете использовать её значение внутри только этой процедуры и по завершению процедуры переменная выгружается из памяти(обнуляется) и данные по ней теряются. Переменную, объявленную подобным образом еще называют локальной переменной . Однако с помощью данного оператора можно объявить переменную, которая будет доступна в любой процедуре модуля. Необходимо объявить переменную вне процедуры - в области объявлений(читать как первой строкой в модуле, после строк объявлений типа - Option Explicit). Тогда значение переменной будет доступно в любой процедуре лишь того модуля, в котором данная переменная была объявлена. Такие переменные называются переменными уровня модуля .
  • Static - данный оператор используется для объявления переменной, значение которой предполагается использовать внутри процедуры, но не теряя значения данной переменной по завершении процедуры. Переменные данного типа обычно используют в качестве накопительных счетчиков. Такая переменная инициализируется в памяти при первом запуске процедуры, в которой она объявлена. По завершении процедуры данные по переменной не выгружаются из памяти, но однако они не доступны в других процедурах. Как только Вы запустите процедуру с этой переменной еще раз - данные по такой переменной будут доступны в том виде, в котором были до завершения процедуры. Выгружается из памяти такая переменная только после закрытия проекта(книги с кодом) . В простонародье такие переменные чаще называют глобальными (возможно из-за того, что раньше подобные переменные объявлялись при помощи оператора Global, который в настоящее время устарел и не используется)
  • Public - данный оператор используется для объявления переменной, значение которой будет храниться в любой процедуре проекта. Переменная, объявленная подобным образом, должна быть объявлена вне процедуры - в области объявлений. Такая переменная загружается в память во время загрузки проекта(при открытии книги) и хранит значение до выгрузки проекта(закрытия книги) . Использовать её можно в любом модуле и любой процедуре проекта. Важно: объявлять подобным образом переменную необходимо строго в стандартном модуле . Такие переменные называются переменными уровня проекта .
    Для большего понимания того, где и как объявлять переменные уровня проекта два небольших примера.
    Неправильное объявление

    Option Explicit Sub main() Public MyVariable As String MyVariable = "Глобальная переменная" "показываем текущее значение переменной MsgBox MyVariable "пробуем изменить значение переменной Call sub_main "показываем измененное значение переменной MsgBox MyVariable End Sub "доп.процедура изменения значения переменной Sub ChangeMyVariable() MyVariable = "Изменили её значение" End Sub

    переменные не будут видны во всех модулях всех процедур и функций проекта, потому что:
    1. Оператор Public недопустим внутри процедуры(между Sub и End Sub), поэтому VBA при попытке выполнения такой процедуры обязательно выдаст ошибку - Invalid Attribut in Sub or Function .
    2. Даже если Public заменить на Dim - это уже будет переменная уровня процедуры и для других процедур будет недоступна.
    3. Т.к. объявление неверное - вторая процедура(ChangeMyVariable) ничего не знает о переменной MyVariable и естественно, не сможет изменить именно её.
    Правильное объявление

    "выше глобальных переменных и констант могут быть только декларации: Option Explicit "принудительное объявление переменных Option Base 1 "нижняя граница объявляемых массивов начинается с 1 Option Compare Text "сравнение текста без учета регистра "глобальная переменная - первой строкой, выше всех процедур Public MyVariable As String "далее процедуры и функции Sub main() MyVariable = "Глобальная переменная" "показываем текущее значение переменной MsgBox MyVariable, vbInformation, "www.сайт" "пробуем изменить значение переменной Call ChangeMyVariable "показываем измененное значение переменной MsgBox MyVariable, vbInformation, "www.сайт" End Sub "доп.процедура изменения значения переменной Sub ChangeMyVariable() MyVariable = "Изменили её значение" End Sub

    "выше глобальных переменных и констант могут быть только декларации: Option Explicit "принудительное объявление переменных Option Base 1 "нижняя граница объявляемых массивов начинается с 1 Option Compare Text "сравнение текста без учета регистра "глобальная переменная - первой строкой, выше всех процедур Public MyVariable As String "далее процедуры и функции Sub main() MyVariable = "Глобальная переменная" "показываем текущее значение переменной MsgBox MyVariable, vbInformation, "www.сайт" "пробуем изменить значение переменной Call ChangeMyVariable "показываем измененное значение переменной MsgBox MyVariable, vbInformation, "www..процедура изменения значения переменной Sub ChangeMyVariable() MyVariable = "Изменили её значение" End Sub

  • Операторы области действия так же могут применяться и к процедурам. Для процедур доступен еще один оператор области действия - Private . Объявленная подобным образом процедура доступна только из того модуля, в котором записана и такая процедура не видна в диалоговом окне вызова макросов(Alt +F8 )

Как правильно назвать переменную:

"Что самое сложное в работе программиста? - выдумывать имена переменным." :-) А ведь придумать имя переменной тоже не так-то просто. Можно, конечно, давать им имена типа: a , d , f , x , y и т.д.(я сам иногда так делаю, но либо в простых кодах, либо для специального запутывания кода). Но стоит задуматься: а как Вы с ними будете управляться в большом коде? Код строк на 10 еще потерпит такие имена, а вот более крупные проекты - не советовал бы я в них оперировать такими переменными. Вы сами запутаетесь какая переменная как объявлена и какой тип данных может хранить и что за значение ей присвоено. Поэтому лучше всего давать переменным осмысленные имена и следовать соглашению об именовании переменных. Что за соглашение? Все очень просто: перед основным названием переменной ставится префикс, указывающий на тип данных, который мы предполагаем хранить в данной переменной. Про имеющиеся типы данных я уже рассказал выше. А ниже приведена примерная таблица соответствий префиксов типам данных:

Префикс Тип хранимых данных
b Boolean
bt Byte
i Integer
l Long
s Single
d Double
c Currency
dt Date
str String
obj Object
v Variant

Лично я немного для себя её переделал, т.к. некоторые обозначения мне кажутся скудными. Например Double я обозначаю как dbl , а Single как sgl . Это мне кажется более наглядным.

В чем еще плюс явного указания префикса данных. В VBA есть такие операторы как Def, при помощи которых можно указать тип данных по умолчанию для переменных, первая буква имени которых попадает в заданный в операторе диапазон. Например:

DefBool B-C Sub test() Dim bCheck, cCheck End Sub

Но я считаю, что одной буквы для одного типа вполне достаточно. Можно задать сразу несколько операторов Def.

DefBool B DefStr S Sub test() Dim bCheck, sCheck End Sub

DefBool B DefStr S Sub test() Dim bCheck, sCheck End Sub

Ниже приведен полный перечень операторов типов и данные, которые задает каждый из них:
DefBool - Задает тип Boolean
DefByte - Задает тип Byte
DefCur - Задает тип Currency
DefDate - Задает тип Date
DefDbl - Задает тип Double
DefInt - Задает тип Integer
DefLng - Задает тип Long
DefObj - Задает тип Object
DefSng - Задает тип Single
DefStr - Задает тип String
DefVar - Задает тип Variant
По умолчанию в VBA применена инструкция DefVar для всех переменных.

Ну и немаловажный момент это непосредственно осмысленное имя переменной. Имя переменной должно примерно отражать то, что в ней будет храниться. Например, Вы создаете отчет и Вам надо объявить две переменные: одна имя листа, другая имя книги. Можно было сделать так: str1 , str2 . Коротко, здорово. Но если подумать - и как можно понять, какая из этих переменных что хранит? Никак. Надо просматривать код и вспоминать, какой переменной какое значение было присвоено. Не совсем удобно, правда? А если бы Вы задали имена так: strBookName , strSheetName , то вроде как более понятно, что мы в них будем хранить.Это удобно не только вам самим при работе с кодом, но и другим людям, которые, возможно в будущем будут пользоваться Вашим кодом. Им будет удобнее читать код, если он будет оформлен грамотно, а переменные названы осмысленно. И не стоит экономить на длине имени - имя должно быть понятным. Без фанатизма, конечно:-). Хоть VBA и позволяет нам создавать переменные длиной до 254 символов, но читать такую переменную так же неудобно, как и с одним символом. Но здесь уже все зависит от Ваших предпочтений и фантазии.
Небольшое дополнение: лучше привыкать давать названия переменным на латинице(т.е. английский алфавит), т.к. для VBA английский язык "родной" и лучше использовать его.

Небольшой пример использования переменных в кодах:

Sub main() "объявляем переменные с назначением конкретных типов "As String - текст "As Long - целое число Dim sAddress As String , sNewAddress As String , sShName As String Dim lRow As Long Dim rRange as Range "назначили переменной тип ячейка/диапазон "присвоили переменной rRange ссылку на текущую выделенную ячейку Set rRange = Selection "меняем выделение - выделяем ячейку D9 Range("D9" ).Select "назначаем переменной адрес выделенных ячеек sAddress = Selection.Address "назначаем переменной lRow значение первой строки выделенной области lRow = Selection.Row "показываем сообщение MsgBox "Адрес выделенной области: " & sAddress, vbInformation, "www.сайт" MsgBox "Номер первой строки: " & lRow, vbInformation, "www.сайт" "назначаем другой переменной значение адреса ячейки A1 sNewAddress = "A1" "выделяем ячейку, заданную переменной sNewAddres Range(sNewAddress).Select MsgBox "Адрес выделенной области: " & sNewAddress, vbInformation, "www.сайт" "выделяем изначально выделенную ячейку, используя переменную rRange rRange.Select MsgBox "Адрес выделенной области: " & rRange.Address, vbInformation, "www.сайт" "задаем значение переменной sShName = "excel-vba" "переименовываем активный лист на имя, заданное переменной ActiveSheet.Name = sShName End Sub

Sub main() "объявляем переменные с назначением конкретных типов "As String - текст "As Long - целое число Dim sAddress As String, sNewAddress As String, sShName As String Dim lRow As Long Dim rRange as Range "назначили переменной тип ячейка/диапазон "присвоили переменной rRange ссылку на текущую выделенную ячейку Set rRange = Selection "меняем выделение - выделяем ячейку D9 Range("D9").Select "назначаем переменной адрес выделенных ячеек sAddress = Selection.Address "назначаем переменной lRow значение первой строки выделенной области lRow = Selection.Row "показываем сообщение MsgBox "Адрес выделенной области: " & sAddress, vbInformation, "www..сайт" "назначаем другой переменной значение адреса ячейки A1 sNewAddress = "A1" "выделяем ячейку, заданную переменной sNewAddres Range(sNewAddress).Select MsgBox "Адрес выделенной области: " & sNewAddress, vbInformation, "www.сайт" "выделяем изначально выделенную ячейку, используя переменную rRange rRange.Select MsgBox "Адрес выделенной области: " & rRange.Address, vbInformation, "www.сайт" "задаем значение переменной sShName = "excel-vba" "переименовываем активный лист на имя, заданное переменной ActiveSheet.Name = sShName End Sub

Просмотреть пошагово выполнение данного кода поможет статья: Отлов ошибок и отладка кода VBA
Важно! Если переменной назначается ссылка на ячейку(Set var = Range("A1")), то обращение к переменной идентично обращению к самой ячейке А1 когда бы это ни происходило. Такое назначение не запоминает свойства ячейки до или после - в переменной хранится ссылка на конкретную ячейку и доступ есть исключительно к свойствам ячейки на текущий момент. Чтобы запомнить значение, цвет ячейки или даже адрес (а так же и другие свойства) до изменения ячейки и применить их даже после изменения/перемещения самой ячейки - необходимо запоминать в переменные именно свойства ячейки:

Sub main() Dim val, l_InteriorColor As Long , l_FontColor As Long Dim rRange As Range "назначили переменной тип ячейка/диапазон "присвоили переменной rRange ссылку на активную ячейку Set rRange = ActiveCell "запоминаем свойства ячейки val = rRange.Value "значение l_InteriorColor = rRange.Interior.Color "цвет заливки l_FontColor = rRange.Font.Color "цвет шрифта "копируем другую ячейку и вставляем на место активной ActiveSheet.Range("D1" ).Copy rRange "проверяем, что rRange теперь имеет совершенно другие свойста - как у D1 "Цвет заливки rRange: " "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www.сайт" "назначаем свойства из сохраненных в переменных rRange.Value = val "значение rRange.Interior.Color = l_InteriorColor "цвет заливки rRange.Font.Color = l_FontColor "цвет шрифта "проверяем, что rRange возвращены параметры до копирования MsgBox "Значение rRange: " & rRange.Value & vbNewLine & _ "Цвет заливки rRange: " & rRange.Interior.Color & vbNewLine & _ "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www.сайт" End Sub

Sub main() Dim val, l_InteriorColor As Long, l_FontColor As Long Dim rRange As Range "назначили переменной тип ячейка/диапазон "присвоили переменной rRange ссылку на активную ячейку Set rRange = ActiveCell "запоминаем свойства ячейки val = rRange.Value "значение l_InteriorColor = rRange.Interior.Color "цвет заливки l_FontColor = rRange.Font.Color "цвет шрифта "копируем другую ячейку и вставляем на место активной ActiveSheet.Range("D1").Copy rRange "проверяем, что rRange теперь имеет совершенно другие свойста - как у D1 MsgBox "Значение rRange: " & rRange.Value & vbNewLine & _ "Цвет заливки rRange: " & rRange.Interior.Color & vbNewLine & _ "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www..Value = val "значение rRange.Interior.Color = l_InteriorColor "цвет заливки rRange.Font.Color = l_FontColor "цвет шрифта "проверяем, что rRange возвращены параметры до копирования MsgBox "Значение rRange: " & rRange.Value & vbNewLine & _ "Цвет заливки rRange: " & rRange.Interior.Color & vbNewLine & _ "Цвет шрифта rRange: " & rRange.Font.Color & vbNewLine, vbInformation, "www.сайт" End Sub

Это так же распространяется на все другие объекты. Т.е. те переменные, значения которым назначаются через оператор Set.

Константы
Так же есть и иной вид "переменных" - константы. Это такая же переменная, только(как следует из её названия) - она не может быть изменена во время выполнения кода, т.к. является величиной постоянной и значение её назначается только один раз - перед выполнением кода.

Const sMyConst As String = "Имя моей программы"

Const sMyConst As String = "Имя моей программы"

Константам могут быть назначены данные тех же типов, что и для переменных. Для дополнительной области видимости/жизни констант используется только Public . Если область видимости не указана, то константа будет доступна только из того модуля, в котором объявлена. Здесь обращаю внимание на то, что Dim уже не используется, т.к. Dim это идентификатор только для переменных. Пару важных отличий объявления констант от объявления переменных:

  • при объявлении константы необходимо обязательно указывать явно, что это константа ключевым словом Const
  • сразу в момент объявления необходимо назначить константе значение: = "Имя моей программы"

Во всем остальном объявление и применение констант идентично объявлению переменных. Коротко приведу пару примеров.
Если константа объявлена внутри процедуры:

Sub TestConst() Const sMyConst As String = "Имя моей программы" MsgBox sMyConst "показываем сообщение с именем программы End Sub Sub TestConst2() MsgBox sMyConst "вызовет ошибку Variable not defined End Sub

Чтобы использовать одну константу во всех процедурах проекта(книги), необходимо объявить её как Public.

Добрый день, дорогие Красавицы!

С вами снова я, Оксана Зубкова:)

И сегодня я хочу рассказать вам об удивительной силе не чудодейственной таблетки или дорогой процедуры. И не о заморской СУПЕРеде. Речь сегодня пойдет о… простой капусте:) Но которая простой никак не является. А существует в Природе для тотальной защиты здоровья Женщины и природного баланса ее гормонов. Вот об этой СИЛЬНОЙ капусте мы и поговорим сегодня.

Доказано, что Женщины почти в несколько раз больше подвержены различным аутоиммунным заболеваниям, чем мужчины. А всё дело в том, что уровень гормонов эстрогенов напрямую влияет на силу или слабость нашего иммунитета. Иммунные клетки, как правило, имеют рецепторы эстрогенов, и именно эти гормоны стимулируют их вырабатывать антитела в случае угрозы здоровью организма.

Если вы наблюдаете у себя

— задержку жидкости
— предменструальный синдром
— обильные или нерегулярные месячные
— увеличение груди или ее болезненную чувствительность
— кисты груди и кисты яичников
— мигрени и головную боль
— выпадение волос, расширенные поры на лице
— выпуклый живот
— эндометриоз, фиброиды, проблемы с зачатием
— бесплодие
— трудности с похудением
— проблемы простаты, «пивной» живот, рост грудных желез, снижение либидо у мужчин…

То знайте, что причиной 90% гормональных проблем современного человека являются ПСЕВДОэстрогены – вещества, сделанные руками человека, которые, попадая в наш организм, узнаются им как свои собственные гормоны эстрогены.

ПСЕВДОэстрогены, или «ложные» эстрогены – это синтетические гормоны, которые содержат в себе противозачаточные таблетки, тяжелые металлы в воздухе и в пище, химическая чистка вещей, большинство коммерческой косметики, краска для волос, пластик, антибактериальное мыло, кофе, коммерческое мясо, а также «безобидная» молочница (кандида). Они способны даже с минимальным попаданием в организм увеличивать количество эстрогенов в разы, таким образом нарушая деликатный баланс гормонов и в десятки, сотни раз увеличивая шансы заболевания раком.

«А при чем здесь капустные?» – спросите вы:) А при том, что Природа дает нам уникальное решение всех вышеперечисленных проблем – без синтетических гормонов, лечений, таблеток и тому подобного. Просто капуста! И можете быть уверены, что вы возьмете под контроль уровень «плохих» эстрогенов легко и быстро.

Есть капусту на завтрак, обед и ужин будет далеко не каждая… Да к тому же капусты не бывает зимой. Что же делать? Ответ, как всегда, прост. Извлечь из капусты вещество ДИМ, положить его в полезную капсулу и выпить со стаканом воды.


ДИМ – ди-индол метан
– это вытяжка из капустных, которая обладает уникальной способностью выводить ПСЕВДОэстрогены из организма, таким образом являясь вашей страховкой Здоровых гормонов, защиты от рака и сильной иммунной системы.

DIM делает ваше тело стройным, уменьшая процент жира в организме, и дарит вам яркий и красивый секс, потому что улучшает работу не только ваших гормонов, но и регулирует здоровье простаты у Мужчин.

DIM – Гормональная таблетка от Природы!

DIM содержится в овощах семейства крестоцветных, включая обыкновенную капусту, цветную, брюссельскую, савойскую, краснокочанную капусту, кольраби, брокколи и другие подобные зеленые овощи.

Биоактивный DIM в добавке – это самый натуральный способ наладить работу ваших гормонов и привести ваш вес в норму.

Но это еще не всё! Обнаруженное в красноцветных вещество – сульфорафан – является онкопротектором, способным подавлять раковые клетки и даже способствовать их самоуничтожению. Также сульфорафан активирует восстановление белков в поврежденных злокачественными новообразованиями клетках и способствует защите организма от воздействия канцерогенов и свободных радикалов. Многочисленные исследования доказали его эффективность в лечении рака молочной железы.

Вот почему биоактивная добавка DIM – ваша лучшая, 100% природная защита от рака!

Переменные VBA, объявление переменных, Option Explicit, правила именования, типы данных VBA, исходные значения переменных

Переменные - контейнеры для хранения изменяемых данных. Без них не обходится практически ни одна программа. Для простоты переменную можно сравнить с номерком в гардеробе - вы сдаете в "гардероб" какие-то данные, в ответ вам выдается номерок. Когда вам опять потребовались эти данные, вы "предъявляете номерок" и получаете их. Пример работы с переменными в VBA может выглядеть так:

Dim nMyAge As Integer

nMyAge = nMyAge + 10

MsgBox nMyAge

Dim nMyAge As Integer

Как расшифровать эту строку:

Dim - это область видимости переменной. В VBA предусмотрено 4 ключевых слова для определения области видимости переменных:

  • Dim - используется в большинстве случаев. Если переменная объявлена как Dim в области объявлений модуля, она будет доступна во всем модуле, если в процедуре - только на время работы этой процедуры;
  • Private - при объявлении переменных в VBA значит то же, что и Dim;
  • Public - такая переменная будет доступна всем процедурам во всех модулях данного проекта, если вы объявили ее в области объявлений модуля. Если вы объявили ее внутри процедуры, она будет вести себя как Dim/Private;
  • Static - такие переменные можно использовать только внутри процедуры. Эти переменные видны только внутри процедуры, в которой они объявлены, зато они сохраняют свое значение между разными вызовами этой процедуры. Обычно используются для накопления каких-либо значений. Например:

Static nVar1 As Integer

nVar1 = nVar1 + 1

MsgBox nVar1

Если нет никаких особых требований, то есть смысл всегда выбирать область видимости Dim.

Второе слово в нашем объявление (nMyAge) - это идентификатор (проще говоря, имя) переменной. Правила выбора имен в VBA едины для многих элементов (переменные, константы, функции и процедуры и т.п.). Имя:

  • должно начинаться с буквы;
  • не должно содержать пробелов и символов пунктуации (исключение - символ подчеркивания);
  • максимальная длина - 255 символов;
  • должно быть уникальным в текущей области видимости (подробнее - далее);
  • зарезервированные слова (те, которые подсвечиваются другим цветом в окне редактора кода) использовать нельзя.

При создании программ VBA настоятельно рекомендуется определиться с правилами, по которым будут присваиваться имена объектам - соглашение об именовании. Чаще всего используется так называемое венгерское соглашение (в честь одного из программистов Microsoft, Charles Simonyi, венгра по национальности):

  • имя переменной должно начинаться с префикса, записанного строчными буквами. Префикс указывает, что именно будет храниться в этой переменной:
    • str (или s) - String, символьное значение;
    • fn (или f) - функция;
    • c (или сделать все буквы заглавными) - константа;
    • b - Boolean, логическое значение (true или false);
    • d - дата;
    • obj (или o) - ссылка на объект;
    • n - числовое значение.
  • имена функций, методов и каждое слово в составном слове должно начинаться с заглавной буквы:

MsgBox objMyDocument.Name

Sub CheckDateSub()

  • в ранних версиях VB не было слова Const - все константы определялись как переменные, а для отличия их записывали заглавными буквами, между словами ставили подчеркивания:

COMPANY_NAME

Многие программисты используют такой подход для обозначения констант и сейчас (но использование ключевого слова Const теперь обязательно - об этом будет рассказано в следующем разделе).

Третья часть нашего объявления - As Integer - это указание на тип данных нашей переменной. Тип данных определяет, данные какого вида можно будет хранить в нашей переменной.

В VBA предусмотрены следующие типы данных:

  • числовые (byte - целое число от 0 до 255, integer - целое число от -32768 до 32767, long - большое целое число, currency (большое десятичное число с 19 позициями, включая 4 позиции после запятой), decimal (еще большее десятичное число с 29 позициями), single и double - значение с плавающей запятой (double в два раза больше));

Внимание! Попытка объявить переменную с типом Decimal (например, Dim n As Decimal) приведет к синтаксической ошибке. Чтобы получить возможность работать с типом Decimal, переменную нужно изначально объявить как Variant или вообще объявить без типа (Dim n), поскольку тип данных Variant используется в VBA по умолчанию.

  • строковые (string переменной длины (до примерно 2 млрд символов) и фиксированной длины (до примерно 65400 символов);
  • дата и время (date - от 01.01.100 до 31.12.9999);
  • логический (boolean - может хранить только значения True и False);
  • объектный (object - хранит ссылку на любой объект в памяти);
  • Variant - специальный тип данных, который может хранить любые другие типы данных.

Можно еще использовать пользовательские типы данных, но их вначале нужно определить при помощи выражения Type. Обычно пользовательские типы данных используются как дополнительное средство проверки вводимых пользователем значений (классический пример - почтовый индекс).

Некоторые моменты, связанные с выбором типов данных для переменных:

  • общий принцип - выбирайте наименьший тип данных, который может вместить выбранные вами значения. Если есть какие-то сомнения - выбирайте больший тип данных во избежание возникновения ошибок;
  • если есть возможность, лучше не использовать типы данных с плавающей запятой (single и double). Работа с такими типами данных производится медленнее, кроме того, могут быть проблемы при сравнениях за счет округлений;
  • если есть возможность, лучше не пользоваться типом Variant. Этот тип все равно приводится VBA к одному из других типов, но памяти для него требуется больше. Кроме того, в ходе такого неявного образования могут возникнуть ошибки;
  • при определении переменных можно использовать так называемые символы определения типа (% - integer, $ - String и т.п.). Например, в нашем примере нужно закомментировать строку Dim nVar 1 As Integer, а во второй строке написать:

nVar1% = nVar1% + 1

Такой подход является устаревшим и к использованию не рекомендуется.

При объявлении переменных можно и не указывать ее тип. Например, наше объявление может выглядеть так:

Dim nVar1

В этом случае переменная будет автоматически объявлена с типом Variant.

В принципе, в VBA можно работать и без объявления переменных. Например, такой код

nVar1 = nVar1 + 1

MsgBox nVar1

будет вполне работоспособным. Если мы используем переменную в программе без ее объявления, то будет автоматически создана новая переменная типа Variant. Однако объявлять переменные нужно обязательно! И при этом желательно явно указывать нужный тип данных. Почему:

  • сокращается количество ошибок: программа с самого начала откажется принимать в переменную значение неправильно типа (например, строковое вместо числового);
  • при работе с объектами подсказка по свойствам и методам действует только тогда, когда мы изначально объявили объектную переменную с нужным типом. Например, в Excel два варианта кода будут работать одинаково:

первый вариант:

Dim oWbk As Workbook

Set oWbk = Workbooks.Add()

второй вариант:

Set oWbk = Workbooks.Add()

Но подсказка по свойствам и методам объекта oWbk будет работать только во втором случае.

Все опытные разработчики вообще запрещают использование переменных без явного их объявления. Для этого можно воспользоваться специальной командой компилятора (она помещается только в раздел объявлений модуля)

Option Explicit

а можно вставлять эту команду во все модули при их создании автоматически - установив в окне редактора кода флажок Require Variable Declarations (меню Tools -> Options , вкладка Editor ).

Проиллюстрировать, зачем они это делают, можно на простом примере:

n = n + 1

MsgBox п

С виду код не должен вызывать никаких проблем и просто выводить в окне сообщения единицу. На самом деле он выведет пустое окно сообщения. Причина спрятана очень коварно: в третьей строке n - это вовсе не английская буква N, а русская П. На вид в окне редактора кода отличить их очень сложно. В то же время компилятор VBA, встретив такой код, просто создаст новую переменную с типом данных Variant, у которой будет пустое значение. На выявление такой ошибки может потребоваться определенное время.

Хорошее правило - объявлять переменные заблаговременно, а не когда они потребовались. Это позволяет сделать программу более читаемой и четко спланированной.

Можно объявить несколько переменных в одной строке, например, так:

Dim n1 As Integer, s1 As String

Присвоение значений переменным выглядит так:

nVar1 = 30

Если нужно увеличить уже существующее значение переменной, то команда может выглядеть так:

nVar1 = nVar1 + 1

В обоих примерах знак равенства означает не "равно", а присвоить.

При присвоении значений переменным нужно помнить о следующем:

  • строковые значения всегда заключаются в двойные кавычки:

sVar1 = "Hello";

  • значение даты/времени заключаются в "решетки" - символы фунта:

dVar1 = #05/06/2004#

Обратите внимание, что при присвоении значения даты/времени таким "явным способом" нам придется использовать принятые в США стандарты: 05 в данном случае - это месяц, 06 - день. Отображение же этого значения (например, в окне сообщения) будет зависеть от региональных настроек на компьютере пользователя.

Если нужно передать шестнадцатеричное значение, то перед ним ставятся символы &H:

nVar1 = &HFF00

Что содержится в переменных до присвоения им значений?

  • В переменных всех числовых типов данных - 0.
  • В строковых переменных переменной длины - "" (строка нулевой длины).
  • В строковых переменных фиксированной длины - строка данной длины с символами ASCII 0 (эти символы на экран не выводятся).
  • В Variant - пустое значение.
  • В Object - ничто (нет ссылки ни на один из объектов).

Здравствуйте, уважаемые читатели. В сегодняшней статье мы посмотрим как применять уменьшенный аккорд в гармонии, а также какие аккорды можно им заменять.

Об уменьшенном аккорде мы говорили в статье о септаккордах - это септаккорд, то есть состоит из четырех звуков. Почему он именно уменьшенный? - об этом читайте в статье . О том как данный аккорд применить в гармонии говорилось в статье . На самом деле применений очень много - также мы заменяли, например доминантсептаккорд G7 с помощью уменьшенных аккордов. Вы знаете также об интересных особенностях этих созвучий, заметно расширяющих область их применения на грифе гитары из статьи .

Сегодня мы узнаем еще кое-что интересное, чем также можно пользоваться.

Вот давайте представим, что у нас есть гармония и содержит она как обычно тонику - субдоминанту - доминанту. И один из аккордов у нас мэйдж (или большой мажорный септаккорд) или даже два, не суть важно. Например, тоника до-мэйдж, субдоминанта F-maj и доминанта - G7. Кстати, а помните как заменять каждый из этих аккордов, пользуясь особенностями описанными нами в статье?

Возможность разнообразить аккорд вида мэйдж мы и рассмотрим сегодня. Иногда используют связку уменьшенного аккорда и мэйджа, До-мэйдж чередуют с До-диез-уменьшенным - это звучит интересно. Также мы можем вообще вместо C-maj играть С#dim, то есть они взаимозаменяемы.

Так мы можем изменить звучание гармонии, как всегда. Однако, как мы пришли к заключению, что эти аккорды взаимозаменяемы? Чего у них общего? Вот здесь самое интересное. Это очень похоже на то, что мы писали в статье - там где о тональностях третьей степени родства. Правда в той статье мы просто о них рассказали, но не рассмотрели как так получается, теперь мы это сделаем.

Как же объяснить это? На самом деле вы можете и сами прийти к заключению что С-maj и C#dim - родственные аккорды и можно их менять друг с другом. Для этого нужно произвести некоторые манипуляции - у Cmaj найти медианту Em.

рис. 1

Затем Em превратить в Em6 и поменять басовую ноту (тонику) на ля (как мы делали в статье ).

рис. 2

И потом ноту ля в получившемся A7 меняем на ля-диез, получив C#dim (до-диез-уменьшенный).

рис. 3

Получилось, что аккорды Сmaj и C#dim в какой-то степени равны друг другу и поэтому в гармонии могут взаимодействовать, а то и заменять друг друга.

рис. 4

Вот так не хитро (примерно в три шага) мы и можем находить для мажорных аккордов (не только для большого мажорного, но и для обычного трезвучия и доминантсептаккорда это работает) замены и с успехом использовать их. Уменьшенный аккорд в нашем случае хорошо брать в середине композиции, когда вы её развиваете, потому что он звучит напряженно и из него очень хорошо переходить в аккорды имеющие более мягкий и устойчивый звук.