Excel Analysis Blog
BETA
Придется немного поработать


Макросы. Урок шестой

Условия выполения, ветки решения

Case

В прошлом уроке мы с вами разобрали как работает IF, условие замечательное, но поддерживает только две ветки решения. Перед вами также может стоять задача, чтобы веток решения было больше. Конечно можно использовать для этого вложенные IF. Но Case в данном случае тут будет более оптимальным. Пример: предположим что пользователь может внести в систему числа от 1 до 5. Наша задача выдать в MsgBox эту цифру словами. Делаем.

Данный оператор всегда начинается со строки Select Case, а завершается командой End Select.

Конструкция:

  1. Select Case (далее пишем оператор из условий которого будем решать)
  2. Через оператор Case Is пишем что делаем при выполнении того или иного условия
  3. Закрываем оператор через End Select
Sub test()
    Dim a As Byte
    Dim b As String
    
    a = InputBox("Введите число от 1 до 5", "", 1)
    Select Case a
        Case Is = 1
            b = "Вы ввели цифру один"
        Case Is = 2
            b = "Вы ввели цифру два"
        Case Is = 3
            b = "Вы ввели цифру три"
        Case Is = 4
            b = "Вы ввели цифру четыре"
        Case Is = 5
            b = "Вы ввели цифру пять"
    End Select
    MsgBox (b)
End Sub

Разумеется, в Case вы можете использовать переменные.

Case is=ПЕРЕМЕННАЯ

И знаки сравнения.

Case is>10

Также мы можем использовать оператор Case Else. Его пишем в конце. Данная ветка будет выбрана в том случае, если ни одно условие не выполнилось. Попробуйте ввести любую другую цифру, вне этого диапазона и выполнить следующий код пошагово:

Sub test()
    Dim a As Byte
    Dim b As String
    
    a = InputBox("Введите число от 1 до 5", "", 1)
    Select Case a
        Case Is = 1
            b = "Вы ввели цифру один"
        Case Is = 2
            b = "Вы ввели цифру два"
        Case Is = 3
            b = "Вы ввели цифру три"
        Case Is = 4
            b = "Вы ввели цифру четыре"
        Case Is = 5
            b = "Вы ввели цифру пять"
        Case Else
            b = "РУССКИМ ЯЗЫКОМ БЫЛО СКАЗАНО, ОТ 1 ДО 5"
    End Select
    MsgBox (b)
End Sub

Преобразование типов переменных

Может так случиться, что вам понадобится делать из цифры текст, из текста дату и т.п. Тут может произойти разное, но в большинстве случаев VBA это делать позволяет, если формат будет понятен ему самому. Эти функции могут пригодиться, например, если вам нужно в ячейку внести число, в формате «01». Для Excel такого числа не существует, он его автоматически переделает как «. Тогда единственный выход — это сделать так, чтобы переменную воспринимали как текст. Ну лучше покажем на деле. Хотя заранее можно успокоить, такое делать предстоит не часто. Если у вас в ячейке A1 записана дата 01.01.2001 как текст, но в VBA вы заранее объявили свою переменную как Date, то при выполнении примерно такого кода:

Sub test()
    Dim a As Date

        a = ThisWorkbook.Worksheets.Cells(1, 1)
End Sub

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

Выполняем пошагово следующий код:

Sub test1()
    Dim a As String
    Dim b As Date
    
    a = "01.09.2015" 'наведите курсов на переменную, видите, что дата записана в кавычках,
                        'как мы помним это означает что значение текст
    b = CDate(a) 'наведите курсов снова, видим, что кавычки исчезли, теперь для программы
                    'это дата
End Sub

В дальнейшем можете использовать эти функции:

  • CByte(переменная) — преобразуем в тип Byte
  • CInt(переменная) — в Integer
  • CLng(переменная) — в Long
  • CSng(переменная) — в Single
  • CDbl(переменная) — в Double
  • CDate(переменная) — в дату
  • CStr(переменная) — в текст

Только не забывайте об ограничениях. Вы можете переменную со значением 12568745 переделать в Byte, поскольку он может хранить данные только до 256.

Несколько функция для работы с датами

Рассмотрим, как мы можем вытягивать данные из даты, это я часто использую в работе.

Sub test2()
    Dim a As Date
    Dim b As Integer
    Dim c As Integer
    
    a = InputBox("Введите дату", , Date - 1)
    
    b = Day(a)
    MsgBox ("Мы вывели день. Он у нас " & b)
    b = Month(a)
    MsgBox ("Мы вывели месяц. Он у нас " & b)
    b = Year(a)
    MsgBox ("Мы вывели год. Он у нас " & b)
    c = Right(b, 2) 'берем данные переменной B. У нас там год. Данная функция вытащит два крайним правым символа.
        'Думаю, что больших пояснений ее конструкции не требуется
     MsgBox ("Мы вывели сокращенный год. Он у нас " & c & ".> 
	 'В последнем случае мы заодно изучили функцию Right, которая вывела два крайних правых символа. 
	 'Не трудно догадаться, что еще есть функция Left
    
End Sub

Кстати, функции можно сразу совмещать. Например, так:

b = Right(Year(b), 2)

Кстати, раз уж начали говорить про Left и Right, то еще стоит упомянуть несколько полезных функций. Например, мы просим менеджеров заполнить в столбик, кто есть сегодня на работе. Только фамилии и имя. И дальше запускаем макрос сверки с каким-нибудь нашим списком. И тут может возникнуть такое, что каждый менеджер пришлет фамилии по-своему. Пример, у вас в списке записан я, как Старостин Алексей. А как его вам могут прислать менеджеры:

Старостин Алексей = Старостин Алексей
Старостин Алексей <> старостин алексей
Старостин Алексей <> СТАРОСТИН АлекКСей
Старостин Алексей <> Старостин Алексей

В последнем случае они для красоты пробел перед фразой поставили.

Когда будет читать данные из ячеек и прогонять через IF, то только в первом случае совпадение будет верно. Во всех других случаях переменные не равны, не одинаковы. Лично мое мнение, что за такое нужно давать по шапке, но нам приходится выкручиваться, благо VBA нам может помочь. Вот несколько функций:

Sub test3()
    Dim a As String
    Dim b As Byte
    
    a = " Старостин  Алексей" 'тут пробел перед первым словом
    b = Len(a) 'функция Len подсчитывает количество символов в переменной
    a = Trim(a) 'замечательная функция. Убираем все лишние пробелы, в начале и в конце переменной
    b = Len(a)
    a = LCase(a) 'преобразует все символы в нижний регистр
    a = UCase(a) 'преобразует все символы в верхний регистр
End Sub

Теперь можно приступать к самостоятельным заданиям.

Скачать примеры урока

Скачать самостоятельное задание