Язык visual basic для чайников
VBA Excel. Начинаем программировать с нуля
Первое знакомство с редактором VBA Excel, создание процедур (подпрограмм) и написание простейшего кода, работающего с переменными и ячейками рабочего листа.
Начинаем программировать с нуля
Часть 1. Первая программа
[Часть 1] [Часть 2] [Часть 3] [Часть 4]
Знакомство с редактором VBA
В левой части редактора VBA расположен проводник проекта, в котором отображены все открытые книги Excel. Верхней строки, как на изображении, у вас скорее всего не будет, так как это – личная книга макросов. Справа расположен модуль, в который записываются процедуры (подпрограммы) с кодом VBA. На изображении открыт модуль листа, мы же далее создадим стандартный программный модуль.
После нажатия кнопки «Module» вы увидите ссылку на него, появившуюся в проводнике слева.
Первая программа на VBA Excel
Добавляем на стандартный модуль шаблон процедуры – строки ее начала и завершения, между которыми мы и будем писать свою первую программу (процедуру, подпрограмму).
В результате откроется окно добавления шаблона процедуры (Sub).
Имя процедуры может быть написано как на латинице, так и на кириллице, может содержать цифры и знак подчеркивания. Оно обязательно должно начинаться с буквы и не содержать пробелы, вместо которых следует использовать знак подчеркивания.
Функция MsgBox выводит информационное сообщение с указанным текстом. В нашем примере – это «Привет».
Если вы увидели такое сообщение, как на изображении, то, поздравляю – вы написали свою первую программу!
Работа с переменными
Чтобы использовать в процедуре переменные, их необходимо объявить с помощью ключевого слова «Dim». Если при объявлении переменных не указать типы данных, они смогут принимать любые доступные в VBA Excel значения. Комментарии в тексте процедур начинаются со знака «’» (апостроф).
Пример 2
Присвоение переменным числовых значений:
Автоматизация рутины в Microsoft Excel при помощи VBA
В этом посте я расскажу, что такое VBA и как с ним работать в Microsoft Excel 2007/2010 (для более старых версий изменяется лишь интерфейс — код, скорее всего, будет таким же) для автоматизации различной рутины.
VBA (Visual Basic for Applications) — это упрощенная версия Visual Basic, встроенная в множество продуктов линейки Microsoft Office. Она позволяет писать программы прямо в файле конкретного документа. Вам не требуется устанавливать различные IDE — всё, включая отладчик, уже есть в Excel.
Еще при помощи Visual Studio Tools for Office можно писать макросы на C# и также встраивать их. Спасибо, FireStorm.
Сразу скажу — писать на других языках (C++/Delphi/PHP) также возможно, но требуется научится читать, изменять и писать файлы офиса — встраивать в документы не получится. А интерфейсы Microsoft работают через COM. Чтобы вы поняли весь ужас, вот Hello World с использованием COM.
Поэтому, увы, будем учить Visual Basic.
Чуть-чуть подготовки и постановка задачи
Итак, поехали. Открываем Excel.
Для начала давайте добавим в Ribbon панель «Разработчик». В ней находятся кнопки, текстовые поля и пр. элементы для конструирования форм.
Теперь давайте подумаем, на каком примере мы будем изучать VBA. Недавно мне потребовалось красиво оформить прайс-лист, выглядевший, как таблица. Идём в гугл, набираем «прайс-лист» и качаем любой, который оформлен примерно так (не сочтите за рекламу, пожалуйста):
То есть требуется, чтобы было как минимум две группы, по которым можно объединить товары (в нашем случае это будут Тип и Производитель — в таком порядке). Для того, чтобы предложенный мною алгоритм работал корректно, отсортируйте товары так, чтобы товары из одной группы стояли подряд (сначала по Типу, потом по Производителю).
Результат, которого хотим добиться, выглядит примерно так:
Разумеется, если смотреть прайс только на компьютере, то можно добавить фильтры и будет гораздо удобнее искать нужный товар. Однако мы хотим научится кодить и задача вполне подходящая, не так ли?
Кодим
Для начала требуется создать кнопку, при нажатии на которую будет вызываться наша програма. Кнопки находятся в панели «Разработчик» и появляются по кнопке «Вставить». Вам нужен компонент формы «Кнопка». Нажали, поставили на любое место в листе. Далее, если не появилось окно назначения макроса, надо нажать правой кнопкой и выбрать пункт «Назначить макрос». Назовём его FormatPrice. Важно, чтобы перед именем макроса ничего не было — иначе он создастся в отдельном модуле, а не в пространстве имен книги. В этому случае вам будет недоступно быстрое обращение к выделенному листу. Нажимаем кнопку «Новый».
И вот мы в среде разработки VB. Также её можно вызвать из контекстного меню командой «Исходный текст»/«View code».
Перед вами окно с заглушкой процедуры. Можете его развернуть. Код должен выглядеть примерно так:
Напишем Hello World:
Sub FormatPrice()
MsgBox «Hello World!»
End Sub
И запустим либо щелкнув по кнопке (предварительно сняв с неё выделение), либо клавишей F5 прямо из редактора.
Тут, пожалуй, следует отвлечься на небольшой ликбез по поводу синтаксиса VB. Кто его знает — может смело пропустить этот раздел до конца. Основное отличие Visual Basic от Pascal/C/Java в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.
Примеры синтаксиса
Dim res As sTRING ‘ Регистр в VB не важен. Впрочем, редактор Вас поправит
Dim i As Integer
‘ Цикл всегда состоит из нескольких строк
For i = 1 To 10
res = res + CStr(i) ‘ Конвертация чего угодно в String
If i = 5 Then Exit For
Next i
Dim x As Double
x = Val( «1.234» ) ‘ Парсинг чисел
x = x + 10
MsgBox x
On Error GoTo Err ‘ При ошибке перейти к метке Err
x = 5 / 0
MsgBox «OK!»
GoTo ne
ne:
On Error GoTo 0 ‘ Отключаем обработку ошибок
‘ Циклы бывает, какие захотите
Do While True
Exit Do
Loop ‘While True
Do ‘Until False
Exit Do
Loop Until False
‘ А вот при вызове функций, от которых хотим получить значение, скобки нужны.
‘ Val также умеет возвращать Integer
Select Case LengthSqr(Len( «abc» ), Val( «4» ))
Case 24
MsgBox «0»
Case 25
MsgBox «1»
Case 26
MsgBox «2»
End Select
Грабли-1. При копировании кода из IDE (в английском Excel) есь текст конвертируется в 1252 Latin-1. Поэтому, если хотите сохранить русские комментарии — надо сохранить крокозябры как Latin-1, а потом открыть в 1251.
Грабли-2. Т.к. VB позволяет использовать необъявленные переменные, я всегда в начале кода (перед всеми процедурами) ставлю строчку Option Explicit. Эта директива запрещает интерпретатору заводить переменные самостоятельно.
Грабли-3. Глобальные переменные можно объявлять только до первой функции/процедуры. Локальные — в любом месте процедуры/функции.
Еще немного дополнительных функций, которые могут пригодится: InPos, Mid, Trim, LBound, UBound. Также ответы на все вопросы по поводу работы функций/их параметров можно получить в MSDN.
Надеюсь, что этого Вам хватит, чтобы не пугаться кода и самостоятельно написать какое-нибудь домашнее задание по информатике. По ходу поста я буду ненавязчиво знакомить Вас с новыми конструкциями.
Кодим много и под Excel
В этой части мы уже начнём кодить нечто, что умеет работать с нашими листами в Excel. Для начала создадим отдельный лист с именем result (лист с данными назовём data). Теперь, наверное, нужно этот лист очистить от того, что на нём есть. Также мы «выделим» лист с данными, чтобы каждый раз не писать длинное обращение к массиву с листами.
Sub FormatPrice()
Sheets( «result» ).Cells.Clear
Sheets( «data» ).Activate
End Sub
Работа с диапазонами ячеек
Вся работа в Excel VBA производится с диапазонами ячеек. Они создаются функцией Range и возвращают объект типа Range. У него есть всё необходимое для работы с данными и/или оформлением. Кстати сказать, свойство Cells листа — это тоже Range.
Примеры работы с Range
Sheets( «result» ).Activate
Dim r As Range
Set r = Range( «A1» )
r.Value = «123»
Set r = Range( «A3,A5» )
r.Font.Color = vbRed
r.Value = «456»
Set r = Range( «A6:A7» )
r.Value = «=A1+A3»
Теперь давайте поймем алгоритм работы нашего кода. Итак, у каждой строчки листа data, начиная со второй, есть некоторые данные, которые нас не интересуют (ID, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:
Для упрощения работы рекомендую определить следующие функции-сокращения:
Function GetCol(Col As Integer ) As String
GetCol = Chr(Asc( «A» ) + Col)
End Function
Далее определим глобальную переменную «текущая строчка»: Dim CurRow As Integer. В начале процедуры её следует сделать равной единице. Еще нам потребуется переменная-«текущая строка в data», массив с именами групп текущей предыдущей строк. Потом можно написать цикл «пока первая ячейка в строке непуста».
Глобальные переменные
Option Explicit ‘ про эту строчку я уже рассказывал
Dim CurRow As Integer
Const GroupsCount As Integer = 2
Const DataCount As Integer = 3
FormatPrice
Sub FormatPrice()
Dim I As Integer ‘ строка в data
CurRow = 1
Dim Groups(1 To GroupsCount) As String
Dim PrGroups(1 To GroupsCount) As String
Теперь надо заполнить массив Groups:
На месте многоточия
И создать заголовки:
На месте многоточия в предыдущем куске
For I2 = 1 To GroupsCount
If Groups(I2) <> PrGroups(I2) Then
Dim I3 As Integer
For I3 = I2 To GroupsCount
AddHeader I3, Groups(I3)
Next I3
Exit For
End If
Next I2
Не забудем про процедуру AddHeader:
Перед FormatPrice
Теперь надо перенести всякую информацию в result
Подогнать столбцы по ширине и выбрать лист result для показа результата
После цикла в конце FormatPrice
Sheets( «Result» ).Activate
Columns.AutoFit
Всё. Можно любоваться первой версией.
Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:
Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:
Поэтому чуть-чуть меняем код с добавлением стиля границ:
Select Case Ty
Case 1 ‘ Тип
.Font.Bold = True
.Font.Size = 16
.Borders(xlTop).Weight = xlThick
Case 2 ‘ Производитель
.Font.Size = 12
.Borders(xlTop).Weight = xlMedium
End Select
.Borders(xlBottom).Weight = xlMedium ‘ По убыванию: xlThick, xlMedium, xlThin, xlHairline
End With
CurRow = CurRow + 1
End Sub
Осталось лишь добится пропусков перед началом новой группы. Это легко:
В начале FormatPrice
Dim I As Integer ‘ строка в data
CurRow = 0 ‘ чтобы не было пропуска в самом начале
Dim Groups(1 To GroupsCount) As String
В цикле расстановки заголовков
If Groups(I2) <> PrGroups(I2) Then
CurRow = CurRow + 1
Dim I3 As Integer
В точности то, что и хотели.
Надеюсь, что эта статья помогла вам немного освоится с программированием для Excel на VBA. Домашнее задание — добавить заголовки «ID, Название, Цена» в результат. Подсказка: CurRow = 0 CurRow = 1.
Файл можно скачать тут (min.us) или тут (Dropbox). Не забудьте разрешить исполнение макросов. Если кто-нибудь подскажет человеческих файлохостинг, залью туда.
Спасибо за внимание.
Буду рад конструктивной критике в комментариях.
UPD: Перезалил пример на Dropbox и min.us.
UPD2: На самом деле, при вызове процедуры с одним параметром скобки можно поставить. Либо использовать конструкцию Call Foo(«bar», 1, 2, 3) — тут скобки нужны постоянно.
Руководство. Начало работы с Visual Basic в Visual Studio Tutorial: Get started with Visual Basic in Visual Studio
В этом руководстве по Visual Basic вы будете работать со средой Visual Studio для создания и запуска нескольких разных консольных приложений. Вы также ознакомитесь с некоторыми возможностями интегрированной среды разработки (IDE) Visual Studio. In this tutorial for Visual Basic (VB), you’ll use Visual Studio to create and run a few different console apps and explore some features of the Visual Studio integrated development environment (IDE) while you do so.
Установите Visual Studio бесплатно со страницы скачиваемых материалов Visual Studio, если еще не сделали этого. If you haven’t already installed Visual Studio, go to the Visual Studio downloads page to install it for free.
Установите Visual Studio бесплатно со страницы скачиваемых материалов Visual Studio, если еще не сделали этого. If you haven’t already installed Visual Studio, go to the Visual Studio downloads page to install it for free.
Создание проекта Create a project
Сначала мы создадим проект приложения Visual Basic. First, we’ll create a Visual Basic application project. Для этого типа проекта уже имеются все нужные файлы шаблонов, что избавляет вас от лишней работы. The project type comes with all the template files you’ll need, before you’ve even added anything!
Откройте Visual Studio 2017. Open Visual Studio 2017.
В верхней строке меню последовательно выберите Файл > Создать > Проект. From the top menu bar, choose File > New > Project.
Добавление рабочей нагрузки (необязательно) Add a workload (optional)
Вариант 1: использование диалогового окна «Новый проект» Option 1: Use the New Project dialog box
Щелкните ссылку Открыть установщик Visual Studio в левой области диалогового окна Новый проект. Click the Open Visual Studio Installer link in the left pane of the New Project dialog box.
Вариант 2: использование меню «Сервис» Option 2: Use the Tools menu bar
Закройте диалоговое окно Создать проект и в верхней строке меню выберите Сервис > Получить средства и компоненты. Cancel out of the New Project dialog box and from the top menu bar, choose Tools > Get Tools and Features.
На некоторых снимках экрана в этом учебнике используется темная тема. Some of the screenshots in this tutorial use the dark theme. Если вы не используете темную тему, но хотите переключиться на нее, см. страницу Персонализация интегрированной среды разработки и редактора Visual Studio. If you aren’t using the dark theme but would like to, see the Personalize the Visual Studio IDE and Editor page to learn how.
Запустите Visual Studio 2019. Open Visual Studio 2019.
На начальном экране выберите Создать проект. On the start window, choose Create a new project.
В окне Создание проекта выберите Visual Basic в списке языков. In the Create a new project window, choose Visual Basic from the Language list. Затем выберите Windows в списке платформ и Консоль в списке типов проектов. Next, choose Windows from the Platform list and Console from the project types list.
Применив фильтры по языку, платформе и типу проекта, выберите шаблон Консольное приложение и щелкните Далее. After you apply the language, platform, and project type filters, choose the Console Application template, and then choose Next.
Если шаблон Консольное приложение отсутствует, его можно установить в окне Создание проекта. If you do not see the Console Application template, you can install it from the Create a new project window. В сообщении Не нашли то, что искали? выберите ссылку Установка других средств и компонентов. In the Not finding what you’re looking for? message, choose the Install more tools and features link.
Затем нажмите кнопку Изменить в Visual Studio Installer. After that, choose the Modify button in the Visual Studio Installer. Вам может быть предложено сохранить результаты работы; в таком случае сделайте это. You might be prompted to save your work; if so, do so. Выберите Продолжить, чтобы установить рабочую нагрузку. Next, choose Continue to install the workload. После этого вернитесь к шагу 2 в процедуре Создание проекта. Then, return to step 2 in this «Create a project» procedure.
В поле Имя проекта окна Настроить новый проект введите WhatIsYourName. In the Configure your new project window, type or enter WhatIsYourName in the Project name box. Нажмите кнопку Далее. Then, choose Next.
В окне Дополнительные сведения для целевой платформы должна быть указана версия .NET Core 3.1. In the Additional information window, .NET Core 3.1 should already be selected for your target framework. Если это не так, выберите .NET Core 3.1. If not, select .NET Core 3.1. Затем нажмите Создать. Then, choose Create.
Новый проект открывается в Visual Studio. Visual Studio opens your new project.
Создание приложения для запроса имени Create a «What Is Your Name» application
Давайте создадим приложение, которое запрашивает имя пользователя, а затем выводит его вместе с датой и временем. Let’s create an app that prompts you for your name and then displays it along with the date and time. Вот как это сделать. Here’s how:
Откройте проект WhatIsYourName, если он еще не открыт. If it is not already open, then open your WhatIsYourName project.
Введите следующий код Visual Basic между первой открывающей скобкой после строки Sub Main(args As String()) и строкой End Sub : Enter the following Visual Basic code immediately after the opening bracket that follows the Sub Main(args As String()) line and before the End Sub line:
Этот код заменяет существующие операторы WriteLine, Write и ReadKey. This code replaces the existing WriteLine, Write, and ReadKey statements.
Нажмите зеленую кнопку Пуск или клавишу F5, чтобы создать и запустить свое первое приложение. Use the green Start button, or press F5 to build and run your first app.
Когда откроется окно консоли, введите свое имя. When the console window opens, enter your name. Окно консоли должно выглядеть так, как показано на следующем снимке экрана: Your console window should look similar to the following screenshot:
Для закрытия консольного окна нажмите любую клавишу. Press any key to close the console window.
В проекте WhatIsYourName введите следующий код Visual Basic между первой открывающей скобкой после строки Sub Main(args As String()) и строкой End Sub : In the WhatIsYourName project, enter the following Visual Basic code immediately after the opening bracket that follows the Sub Main(args As String()) line and before the End Sub line:
Этот код заменяет существующие операторы WriteLine, Write и ReadKey. This code replaces the existing WriteLine, Write, and ReadKey statements.
Нажмите зеленую кнопку Пуск или клавишу F5, чтобы создать и запустить свое первое приложение. Use the green Start button, or press F5 to build and run your first app.
Когда откроется окно консоли, введите свое имя. When the console window opens, enter your name. Окно консоли должно выглядеть так, как показано на следующем снимке экрана: Your console window should look similar to the following screenshot:
Для закрытия консольного окна нажмите любую клавишу. Press any key to close the console window.
Создание приложения «Калькулятор» Create a «Calculate This» application
Откройте Visual Studio 2017 и в верхней строке меню выберите Файл > Создать > Проект. Open Visual Studio 2017, and then from the top menu bar, choose File > New > Project.
Введите следующий код между строками Module Program и End Module : Enter the following code between the Module Program line and End Module line:
Окно кода должно выглядеть так, как показано на следующем снимке экрана: Your code window should look like the following screenshot:
Щелкните CalculateThis, чтобы запустить программу. Click CalculateThis to run your program. Окно консоли должно выглядеть так, как показано на следующем снимке экрана: Your console window should look similar to the following screenshot:
На начальном экране выберите Создать проект. On the start window, choose Create a new project.
В окне Создание проекта выберите Visual Basic в списке языков. In the Create a new project window, choose Visual Basic from the Language list. Затем выберите Windows в списке платформ и Консоль в списке типов проектов. Next, choose Windows from the Platform list and Console from the project types list.
Применив фильтры по языку, платформе и типу проекта, выберите шаблон Консольное приложение и щелкните Далее. After you apply the language, platform, and project type filters, choose the Console Application template, and then choose Next.
Затем в поле Имя проекта окна Настроить новый проект введите CalculateThis. Then, in the Configure your new project window, type or enter CalculateThis in the Project name box. Затем щелкните Далее. Then, choose Next.
В окне Дополнительные сведения для целевой платформы должна быть указана версия .NET Core 3.1. In the Additional information window, .NET Core 3.1 should already be selected for your target framework. Если это не так, выберите .NET Core 3.1. If not, select .NET Core 3.1. Затем нажмите Создать. Then, choose Create.
Введите следующий код между строками Module Program и End Module : Enter the following code between the Module Program line and End Module line:
Окно кода должно выглядеть так, как показано на следующем снимке экрана: Your code window should look like the following screenshot:
Щелкните CalculateThis, чтобы запустить программу. Click CalculateThis to run your program. Окно консоли должно выглядеть так, как показано на следующем снимке экрана: Your console window should look similar to the following screenshot:
Быстрые ответы на часто задаваемые вопросы Quick answers FAQ
Ниже приведен краткий список вопросов и ответов, с помощью которого вы сможете ознакомиться с некоторыми основными понятиями. Here’s a quick FAQ to highlight some key concepts.
Что такое Visual Basic? What is Visual Basic?
Visual Basic — это типобезопасный язык программирования, который прост в изучении. Visual Basic is a type-safe programming language that’s designed to be easy to learn. Он является производным от языка BASIC (Beginner’s All-purpose Symbolic Instruction Code — универсальный код символических инструкций для начинающих). It is derived from BASIC, which means «Beginner’s All-purpose Symbolic Instruction Code».
Что такое Visual Studio? What is Visual Studio?
Visual Studio — это интегрированный набор средств разработки. Visual Studio is an integrated development suite of productivity tools for developers. Его можно рассматривать как программу для создания приложений. Think of it as a program you can use to create programs and applications.
Что такое консольное приложение? What is a console app?
Консольное приложение принимает входные данные и выводит результаты в окне командной строки (также называется консоль). A console app takes input and displays output in a command-line window, also known as a console.
Следующие шаги Next steps
Поздравляем с завершением этого учебника! Congratulations on completing this tutorial! Для получения дополнительных сведений перейдите к следующему руководству. To learn even more, see the following tutorial.