Vba excel 2007 основы

Время на прочтение
7 мин

Количество просмотров 312K

Приветствую всех.

В этом посте я расскажу, что такое 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».

Перед вами окно с заглушкой процедуры. Можете его развернуть. Код должен выглядеть примерно так:

Sub FormatPrice()End Sub

Напишем Hello World:

Sub FormatPrice()
    MsgBox "Hello World!"
End Sub

И запустим либо щелкнув по кнопке (предварительно сняв с неё выделение), либо клавишей F5 прямо из редактора.

Тут, пожалуй, следует отвлечься на небольшой ликбез по поводу синтаксиса VB. Кто его знает — может смело пропустить этот раздел до конца. Основное отличие Visual Basic от Pascal/C/Java в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.

Примеры синтаксиса

' Процедура. Ничего не возвращает
' Перегрузка в VBA отсутствует
Sub foo(a As String, b As String)
    ' Exit Sub ' Это значит "выйти из процедуры"
    MsgBox a + ";" + b
End Sub' Функция. Вовращает Integer
Function LengthSqr(x As Integer, y As IntegerAs Integer
    ' Exit Function
    LengthSqr = x * x + y * y
End FunctionSub FormatPrice()
    Dim s1 As String, s2 As String
    s1 = "str1"
    s2 = "str2"
    If s1 <> s2 Then
        foo "123""456" ' Скобки при вызове процедур запрещены
    End IfDim 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 iDim x As Double
    x = Val("1.234"' Парсинг чисел
    x = x + 10
    MsgBox xOn Error Resume Next ' Обработка ошибок - игнорировать все ошибки
    x = 5 / 0
    MsgBox xOn Error GoTo Err ' При ошибке перейти к метке Err
    x = 5 / 0
    MsgBox "OK!"
    GoTo ne

Err:
    MsgBox 

"Err!"

ne:

On Error GoTo 0 ' Отключаем обработку ошибок

    ' Циклы бывает, какие захотите
    Do While True
        Exit DoLoop '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' Двухмерный массив.
    ' Можно также менять размеры командой ReDim (Preserve) - см. google
    Dim arr(1 to 10, 5 to 6) As Integer
    arr(1, 6) = 8Dim coll As New Collection
    Dim coll2 As Collection
    coll.Add "item""key"
    Set coll2 = coll ' Все присваивания объектов должны производится командой Set
    MsgBox coll2("key")
    Set coll2 = New Collection
    MsgBox coll2.Count
End Sub

Грабли-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, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:

  1. Считали группы из очередной строки.
  2. Пробегаемся по всем группам в порядке приоритета (вначале более крупные)
    1. Если текущая группа не совпадает, вызываем процедуру AddGroup(i, name), где i — номер группы (от номера текущей до максимума), name — её имя. Несколько вызовов необходимы, чтобы создать не только наш заголовок, но и всё более мелкие.
  3. После отрисовки всех необходимых заголовков делаем еще одну строку и заполняем её данными.

Для упрощения работы рекомендую определить следующие функции-сокращения:

Function GetCol(Col As IntegerAs String
    GetCol = Chr(Asc("A") + Col)
End FunctionFunction GetCellS(Sheet As String, Col As Integer, Row As IntegerAs Range
    Set GetCellS = Sheets(Sheet).Range(GetCol(Col) + CStr(Row))
End FunctionFunction GetCell(Col As Integer, Row As IntegerAs Range
    Set GetCell = Range(GetCol(Col) + CStr(Row))
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

    Sheets(

"data").Activate
    I = 2
    Do While True
        If GetCell(0, I).Value = "" Then Exit Do
        ' ...
        I = I + 1
    Loop
End Sub

Теперь надо заполнить массив Groups:

На месте многоточия

Dim I2 As Integer
For I2 = 1 To GroupsCount
    Groups(I2) = GetCell(I2, I)
Next I2
' ...
For I2 = 1 To GroupsCount ' VB не умеет копировать массивы
    PrGroups(I2) = Groups(I2)
Next I2
I =  I + 1

И создать заголовки:

На месте многоточия в предыдущем куске

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

Sub AddHeader(Ty As Integer, Name As String)
    GetCellS("result", 1, CurRow).Value = Name
    CurRow = CurRow + 1
End Sub

Теперь надо перенести всякую информацию в result

For I2 = 0 To DataCount - 1
    GetCellS("result", I2, CurRow).Value = GetCell(I2, I)
Next I2

Подогнать столбцы по ширине и выбрать лист result для показа результата

После цикла в конце FormatPrice

Sheets("Result").Activate
Columns.AutoFit

Всё. Можно любоваться первой версией.

Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:

Sub AddHeader(Ty As Integer, Name As String)
    Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow)).Merge
    ' Чтобы не заводить переменную и не писать каждый раз длинный вызов
    ' можно воспользоваться блоком With
    With GetCellS("result", 0, CurRow)
        .Value = Name
        .Font.Italic = True
        .Font.Name = "Cambria"
        Select Case Ty
        Case 1 ' Тип
            .Font.Bold = True
            .Font.Size = 16
        Case 2 ' Производитель
            .Font.Size = 12
        End Select
        .HorizontalAlignment = xlCenter
    End With
    CurRow = CurRow + 1
End Sub

Уже лучше:

Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:

Поэтому чуть-чуть меняем код с добавлением стиля границ:

Sub AddHeader(Ty As Integer, Name As String)
    With Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow))
        .Merge
        .Value = Name
        .Font.Italic = True
        .Font.Name = "Cambria"
        .HorizontalAlignment = xlCenterSelect 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) — тут скобки нужны постоянно.

Содержание

  1. VBA Excel. Начинаем программировать с нуля
  2. Знакомство с редактором VBA
  3. Первая программа на VBA Excel
  4. Работа с переменными
  5. Автоматизация рутины в Microsoft Excel при помощи VBA
  6. Чуть-чуть подготовки и постановка задачи
  7. Кодим
  8. Кодим много и под Excel
  9. Работа с диапазонами ячеек

VBA Excel. Начинаем программировать с нуля

Первое знакомство с редактором VBA Excel, создание процедур (подпрограмм) и написание простейшего кода, работающего с переменными и ячейками рабочего листа.

Начинаем программировать с нуля
Часть 1. Первая программа
[Часть 1] [Часть 2] [Часть 3] [Часть 4]

Знакомство с редактором VBA

  1. Создайте новую книгу Excel и сохраните ее как книгу с поддержкой макросов с расширением .xlsm. В старых версиях Excel по 2003 год – как обычную книгу с расширением .xls.
  2. Нажмите сочетание клавиш «Левая_клавиша_Alt+F11», которое откроет редактор VBA. С правой клавишей Alt такой фокус не пройдет. Также, в редактор VBA можно перейти по ссылке «Visual Basic» из панели инструментов «Разработчик» на ленте быстрого доступа. Если вкладки «Разработчик» на ленте нет, ее следует добавить в настройках параметров Excel.

В левой части редактора VBA расположен проводник проекта, в котором отображены все открытые книги Excel. Верхней строки, как на изображении, у вас скорее всего не будет, так как это – личная книга макросов. Справа расположен модуль, в который записываются процедуры (подпрограммы) с кодом VBA. На изображении открыт модуль листа, мы же далее создадим стандартный программный модуль.

  1. Нажмите кнопку «Module» во вкладке «Insert» главного меню. То же подменю откроется при нажатии на вторую кнопку после значка Excel на панели инструментов.

После нажатия кнопки «Module» вы увидите ссылку на него, появившуюся в проводнике слева.

Первая программа на VBA Excel

Добавляем на стандартный модуль шаблон процедуры – строки ее начала и завершения, между которыми мы и будем писать свою первую программу (процедуру, подпрограмму).

  1. Откройте стандартный модуль двойным кликом по его ссылке в проводнике. Поместите в него курсор и нажмите кнопку «Procedure…» во вкладке «Insert» главного меню. Та же ссылка будет доступна при нажатии на вторую кнопку после значка Excel на панели инструментов.

В результате откроется окно добавления шаблона процедуры (Sub).

  1. Наберите в поле «Name» имя процедуры: «Primer1», или скопируйте его отсюда и вставьте в поле «Name». Нажмите кнопку «OK», чтобы добавить в модуль первую и последнюю строки процедуры.

Имя процедуры может быть написано как на латинице, так и на кириллице, может содержать цифры и знак подчеркивания. Оно обязательно должно начинаться с буквы и не содержать пробелы, вместо которых следует использовать знак подчеркивания.

  1. Вставьте внутрь шаблона процедуры следующую строку: MsgBox «Привет» .

Функция MsgBox выводит информационное сообщение с указанным текстом. В нашем примере – это «Привет».

  1. Проверьте, что курсор находится внутри процедуры, и запустите ее, нажав клавишу «F5». А также, запустить процедуру на выполнение можно, нажав на треугольник (на изображении под пунктом меню «Debug») или на кнопку «Run Sub/UserForm» во вкладке «Run» главного меню редактора VBA Excel.


Если вы увидели такое сообщение, как на изображении, то, поздравляю – вы написали свою первую программу!

Работа с переменными

Чтобы использовать в процедуре переменные, их необходимо объявить с помощью ключевого слова «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 в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.

Примеры синтаксиса

‘ Процедура. Ничего не возвращает
‘ Перегрузка в VBA отсутствует
Sub foo(a As String , b As String )
‘ Exit Sub ‘ Это значит «выйти из процедуры»
MsgBox a + «;» + b
End Sub

‘ Функция. Вовращает Integer
Function LengthSqr(x As Integer , y As Integer ) As Integer
‘ Exit Function
LengthSqr = x * x + y * y
End Function

Sub FormatPrice()
Dim s1 As String , s2 As String
s1 = «str1»
s2 = «str2»
If s1 <> s2 Then
foo «123» , «456» ‘ Скобки при вызове процедур запрещены
End If

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 Resume Next ‘ Обработка ошибок — игнорировать все ошибки
x = 5 / 0
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

‘ Двухмерный массив.
‘ Можно также менять размеры командой ReDim (Preserve) — см. google
Dim arr(1 to 10, 5 to 6) As Integer
arr(1, 6) = 8

Dim coll As New Collection
Dim coll2 As Collection
coll.Add «item» , «key»
Set coll2 = coll ‘ Все присваивания объектов должны производится командой Set
MsgBox coll2( «key» )
Set coll2 = New Collection
MsgBox coll2.Count
End Sub

Грабли-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, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:

  1. Считали группы из очередной строки.
  2. Пробегаемся по всем группам в порядке приоритета (вначале более крупные)
    1. Если текущая группа не совпадает, вызываем процедуру AddGroup(i, name), где i — номер группы (от номера текущей до максимума), name — её имя. Несколько вызовов необходимы, чтобы создать не только наш заголовок, но и всё более мелкие.
  3. После отрисовки всех необходимых заголовков делаем еще одну строку и заполняем её данными.

Для упрощения работы рекомендую определить следующие функции-сокращения:

Function GetCol(Col As Integer ) As String
GetCol = Chr(Asc( «A» ) + Col)
End Function

Function GetCellS(Sheet As String , Col As Integer , Row As Integer ) As Range
Set GetCellS = Sheets(Sheet).Range(GetCol(Col) + CStr(Row))
End Function

Function GetCell(Col As Integer , Row As Integer ) As Range
Set GetCell = Range(GetCol(Col) + CStr(Row))
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

Sheets( «data» ).Activate
I = 2
Do While True
If GetCell(0, I).Value = «» Then Exit Do
‘ .
I = I + 1
Loop
End Sub

Теперь надо заполнить массив Groups:

На месте многоточия

Dim I2 As Integer
For I2 = 1 To GroupsCount
Groups(I2) = GetCell(I2, I)
Next I2
‘ .
For I2 = 1 To GroupsCount ‘ VB не умеет копировать массивы
PrGroups(I2) = Groups(I2)
Next I2
I = I + 1

И создать заголовки:

На месте многоточия в предыдущем куске

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

Sub AddHeader(Ty As Integer , Name As String )
GetCellS( «result» , 1, CurRow).Value = Name
CurRow = CurRow + 1
End Sub

Теперь надо перенести всякую информацию в result

For I2 = 0 To DataCount — 1
GetCellS( «result» , I2, CurRow).Value = GetCell(I2, I)
Next I2

Подогнать столбцы по ширине и выбрать лист result для показа результата

После цикла в конце FormatPrice

Sheets( «Result» ).Activate
Columns.AutoFit

Всё. Можно любоваться первой версией.

Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:

Sub AddHeader(Ty As Integer , Name As String )
Sheets( «result» ).Range( «A» + CStr(CurRow) + «:C» + CStr(CurRow)).Merge
‘ Чтобы не заводить переменную и не писать каждый раз длинный вызов
‘ можно воспользоваться блоком With
With GetCellS( «result» , 0, CurRow)
.Value = Name
.Font.Italic = True
.Font.Name = «Cambria»
Select Case Ty
Case 1 ‘ Тип
.Font.Bold = True
.Font.Size = 16
Case 2 ‘ Производитель
.Font.Size = 12
End Select
.HorizontalAlignment = xlCenter
End With
CurRow = CurRow + 1
End Sub

Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:

Поэтому чуть-чуть меняем код с добавлением стиля границ:

Sub AddHeader(Ty As Integer , Name As String )
With Sheets( «result» ).Range( «A» + CStr(CurRow) + «:C» + CStr(CurRow))
.Merge
.Value = Name
.Font.Italic = True
.Font.Name = «Cambria»
.HorizontalAlignment = xlCenter

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) — тут скобки нужны постоянно.

Источник

Добавил:

Upload

Опубликованный материал нарушает ваши авторские права? Сообщите нам.

Вуз:

Предмет:

Файл:

Скачиваний:

169

Добавлен:

17.04.2015

Размер:

1.69 Mб

Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«КАМСКАЯ ГОСУДАРСТВЕННАЯ ИНЖЕНЕРНО-ЭКОНОМИЧЕСКАЯ АКАДЕМИЯ»

РАЗРАБОТКА ПРИЛОЖЕНИЙ В VBA

методические указания для выполнения курсовой работы по дисциплине «Информатика»

Макарова, И.В. Разработка приложений в VBA: методические указания для выполнения курсовой работы по дисциплине «Информатика» / И.В. Макарова, А.И. Беляев, В.Г. Маврин. – Набережные Челны: ИНЭКА, 2012. – 52 с.

Методические указания для выполнения курсовой работы по информатике разработаны на кафедре «Сервис транспортных систем» и предназначены для самостоятельной работы во время курсового проектирования для студентов направлений подготовки бакалавров 220100.62 «Системный анализ и управление» и 230400.62 «Информационные системы и технологии».

Рассмотрены основы программирования на VBA, содержится технология создания приложения с использованием возможностей табличного процессора Excel и VBA.

Рецензент: к.пед.н., доцент Ахметзянова Г.Н.

Печатается по решению научно-методического совета Камской государственной инженерно-экономической академии.

© Камская государственная инженерно-экономическая академия, 2012 год.

2

Содержание

1. Использование возможностей VBA для разработки приложений

……….4

1.1. Основные понятия Visual Basic……………………………………………………

4

1.2. Работа с объектами Excel…………………………………………………………….

6

1.3. Объекты Excel …………………………………………………………………………….

6

1.3.1. Использование коллекции объектов ………………………………………

7

1.3.2. Классы …………………………………………………………………………………

7

1.3.3. Методы и свойства объектов …………………………………………………

7

1.3.4. События ……………………………………………………………………………….

8

1.3.5. Общие свойства и методы семейств объектов ………………………..

8

1.3.6. Объектная модель Excel………………………………………………………..

9

2. Основы программирования на VBA …………………………………………………

16

2.1. Типы данных и переменные ………………………………………………………

16

2.2. Операции VBA………………………………………………………………………….

18

2.3. Приоритеты операций ……………………………………………………………….

18

2.4. Операторы VBA………………………………………………………………………..

19

2.4.1. Оператор присваивания ………………………………………………………

19

2.4.2. Оператор With…………………………………………………………………….

19

2.4.3. Операторы управления………………………………………………………..

20

2.5. Процедура ………………………………………………………………………………..

27

2.6 Организация программы на языке VBA ………………………………………

31

2.7. Вызов процедуры………………………………………………………………………

32

2.8. Передача параметров по ссылке и значению ………………………………

33

3. Организация взаимодействия с пользователем …………………………………

34

3.1. Вывод сообщений с помощью окон сообщений………………………….

34

3.2. Ввод данных пользователем с помощью окон ввода. ………………….

36

3.3. Создание формы и работа со свойствами формы ………………………..

37

3.3.1. Использование полей, надписей и кнопок. …………………………..

38

3.3.2.Программирование формы и ее элементов управления…………

41

3.3.3. Использование флажков, переключателей и рамок………………

44

3.3.4. Использование выключателей и счетчиков. …………………………

47

3.3.5. Использование элементов управления набора вкладок и набора

страниц ……………………………………………………………………………………….

49

3.3.6.Использование элемента RefEdit…………………………………………..

53

3.4. Управление окружением рабочей области………………………………….

54

4. Рекомендации по выполнению курсовой работы ………………………………

56

5. Темы курсовых работ ………………………………………………………………………

64

Список рекомендуемых источников…………………………………………………….

70

3

1. Использование возможностей VBA для разработки приложений

1.1. Основные понятия Visual Basic

Visual Basic – это расширение традиционного языка Basic элементами объектно-ориентированного программирования, которые использовались при создании программ для

Microsoft Office. Обычно говорят о Visual Basic for Applications. Это скорее собирательный термин, потому что приложений много и для каждого предназначен свой диалект VB. Общим является то, что в пределах Microsoft Office программирование превратилось в макропрограммирование.

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

VBA относится к языкам объектно-ориентированного программирования (ООП). ООП можно описать как методику анализа, проектирования и написания приложений с использованием объектов.

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

Каждая программа на VB должна начинаться с оператора Sub, а заканчиваться – оператором End Sub.

В новых версиях Excel разработчики отказались от размещения текстов программ на листах-модулях. Теперь для работы с макросами используется так называемый редактор VB. Он предназначен не только для редактирования кода, но и для работы с файлами, отладки и получения справочных сведений по VB. Однако идея модулей оказалась достаточно плодотворной, и они были преобразованы в подобия папок Windows. Левая область окна редактора VB – Окно проекта

4

– содержит древовидную структуру, которая помогает понять организацию рабочей книги. Здесь обычно размещается панель с перечнем свойств рабочей книги. Это происходит после нажатия кнопки Окно свойств. Еще один режим редактора – просмотр всех классов, доступных в текущей рабочей книге. Его можно включить кнопкой Просмотр объектов. В этом случае левая область окна будет содержать список классов, а правая – перечень соответствующих свойств, событий, функций и констант. Пользователю предоставляется возможность перейти к разделу справочной системы, нажав кнопку со знаком вопроса.

Кнопка Конструктор предназначена для отключения редактора. Нажатие на нее активизирует выход из режима конструктора. Панель инструментов будет постоянно находиться на экране, независимо от того, какой режим работы Excel (например, просмотр рабочих листов) изберет пользователь. Отжав кнопку, пользователь закроет редактор VB. На этой панели можно разместить необходимые кнопки, программа запомнит конфигурацию, и будет выводить в дальнейшем панель в расширенном виде.

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

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

5

создать файл с текстом программ, имеющий тип .BAS. Обратная операция – импорт модуля – позволяет вставить модуль в рабочую книгу.

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

Система меню редактора VB в общих чертах напоминает Excel. Пользователь получает доступ к стандартным и хорошо знакомым командам работы с файлами, печатью, буфером обмена, а также поиска и форматирования. Системы настройки панелей инструментов, получения справки и управления окнами тоже похожи. Оригинальными являются только команды для запуска, записи и отладки макроса.

1.2. Работа с объектами Excel

Большая часть реальной работы выполняется макросом Excel с помощью объектной модели Excel. Операции в записанном макросе – в основном результаты выполнения методов и модификации свойств встроенных объектов. При записи собственного кода необходимо разобраться в объектной модели Excel, чтобы определить наилучшую последовательность действий в коде.

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

1.3. Объекты Excel

Объект – это инкапсуляция данных вместе с кодом, предназначенным для их обработки, т.е. объединение данных и кода в единое целое. И хотя в строгом понимании VBA не является объектно-ориентированным языком программирования, объектный подход играет в нем ведущую роль. Все

6

визуальные объекты, такие как рабочий лист, диапазон, диаграмма, форма – объекты. В VBA более 100 встроенных объектов.

1.3.1. Использование коллекции объектов

Многие объекты обычно находятся в коллекциях. Коллекция – это множество элементов, представленных в том порядке, как они определены в Excel. Работать с определенным объектом в коллекции можно с помощью индекса элемента. Кроме числового индекса, в коллекции в качестве индекса можно использовать имя элемента. Этот прием особенно полезен, поскольку многие коллекции изменяются динамически, и номер индекса для элемента может измениться.

1.3.2. Классы

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

1.3.3. Методы и свойства объектов

Чтобы использовать объект, необходимо работать с его методами и свойствами.

Метод представляет действия, выполняемые объектом, т.е. он подобен предопределенной процедуре, которая выполняет некоторые операции над объектом.

Синтаксис применения метода: Объект.Метод. Метод можно применять ко всем объектам семейства объекта

Многие методы имеют один или несколько аргументов. Аргумент – это вид данных, по которым метод определяет, как он должен работать. Некоторые аргументы необязательны.

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

7

объекта можно использовать средство Просмотр объектов. Синтаксис установки значения свойства:

Объект.Свойство = ЗначениеСвойства

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

1.3.4. События

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

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

1.3.5. Общие свойства и методы семейств объектов

Семейства объектов имеют одно общее свойство Count, возвращающее число элементов семейства и три метода:

Метод

Описание

Add

Добавляет новый элемент в семейство: object.Add item, key,

before, after

item — обязательный. Выражение, специфицирующее добав-

ляемый элемент

key – необязательный. Может использоваться вместо по-

рядкового номера элемента

before – необязательный, указывает, перед каким элемен-

том в семействе размещается добавляемый элемент

after – необязательный, указывает, после какого элемента в

семействе размещается добавляемый элемент

Item

Возвращает специфицированный элемент семейства:

object.Item(index)

где index – порядковый номер элемента в семействе или его

идентификатор, заданный параметром key метода Add

Remo

Удаляет элемент из семейства: Object.Remove index

-ve

где index – порядковый номер элемента в семействе или его

идентификатор, заданный параметром key метода Add

8

1.3.6. Объектная модель Excel

Объектная модель Excel представляет собой иерархию объектов, подчиненных одному объекту Application, который соответствует самому приложению Excel. Многие из них собраны в библиотеке объектов Excel, но некоторые, например Assistant, входят в библиотеку объектов Office, общую для всех офисных приложений.

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

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

Объект Application. В Excel объект Application – глав-

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

Можно использовать методы и свойства объекта Application непосредственно с помощью точечной нотации. Объект Application охватывает более 180 методов и свойств.

Свойства объекта Application:

Свойство

Описание

ActiveCell

Возвращает объект диапазона, ссылающийся

на активную ячейку

ActivePrinter

Возвращает или устанавливает активный

принтер

ActiveSheet

Возвращает объект листа, ссылающийся на

активный рабочий лист

ActiveWindow

Возвращает объект окна, ссылающийся на

активное окно

ActiveWorkbook

Возвращает объект рабочей книги, ссылаю-

щийся на активную книгу

Calculation

Возвращает или устанавливает режим вы-

числения

9

Свойство

Описание

Caption

Возвращает или устанавливает текст стро-

ки заголовка Excel

CommandBars

Возвращает объект, представляющий панель

команд Excel (строки меню и панели инстру-

ментов)

DefaultFilePath

Возвращает или устанавливает местораспо-

ложение, используемое Excel для сохранения

новых книг

DisplayFormulaBa

Показывает или устанавливает, отображена

r

ли строка формул Excel

MailSystem

Возвращает число, которое определяет уста-

новленную систему электронной почты (если

есть)

MemoryFree

Возвращает число байтов свободной памяти

Name

Возвращает имя приложения

OperatingSystem

Возвращает имя и номер версии операционной

системы

PreviousSelections

Возвращает массив последних четырех диапа-

зонов или имена выделенных диапазонов

RecordRelative

Указывает, записывался ли макрос с относи-

тельными ссылками

ScreenUpdating

Указывает, обновлялся ли экран Excel во время

выполнения макроса

StatusBar

Возвращает или устанавливает текст в

строке состояния

UserName

Возвращает имя текущего пользователя

VBE

Возвращает ссылку на редактор Visual Basic

Workbooks

Возвращает коллекцию всех открытых книг

С помощью методов объекта Application определены действия, которые могут выполняться на уровне приложения:

Метод

Описание

ActivateMicrosoftAp

Запуск программы Microsoft, например

p

Word или Access

Calculate

Проведение вычислений во всех открытых

книгах

10

Соседние файлы в папке Информатика

  • #
  • #
  • #
  • #
  • #
  • #

vba excel      Статья предназначена для людей, которые хотят научиться писать программы на встроенном в Excel Visual Basic (VBA), но абсолютно не знают что это такое.

      Для начала — несколько слов о том, зачем это нужно. Средство VBA в MS Excel, представляет нам универсальный инструмент для быстрого и точного решения любых индивидуальных пользовательских задач в MS Excel. Можно конечно использовать и встроенные в MS Excel функции которых великое множество, однако они далеко не всегда решают поставленную задачу.
      Итак, создадим для примера простейшую программу. Будем использовать MS Excel 2007.  Откройте MS Excel, нажмите «сохранить как» и сохраните файл Вашей программы нажав «Книга ексель с поддержкой макросов». 

vba excel
      Далее необходимо включить вкладку «Разработчик». Для этого нажимаем «Параметры Excel» vba excel
       Ставим галочку на «Показывать вкладку «Разработчик» на ленте»

 программа excel
       После этого на ленте, в верху листа Excel, появится вкладка «Разработчик», которая содержит в себе инструменты для создания VBA макросов.
       Представим себе небольшую задачу — допустим мы имеем 2 числа, нам необходимо их сложить и по полученной сумме получить значение из нашей таблицы.
       Поставим в ячейки Листа1 следующие значения:

 программа excel
      на Листе2 заполним ячейки, создав таблицу из 2 столбцов

 программа excel
       Далее перейдем на Лист1, нажмем на вкладку «Разработчик», «Вставить», на ней выберем кнопку программа excel
и нарисуем кнопку на Листе1, после чего сразу появится окно «Назначить макрос объекту», в котором выбираем «Создать» программа excel
       После этого откроется редактор Visual Basic, и автоматически напишется наименование процедуры, которая будет выполняться при нажатии кнопки. Под названием процедуры впишем следующий код:

 vba excel
      Код выполнит следующие действия:

  • MsgBox («Это мой первый Макрос!») — сообщение
  • Переменной q присваивается значение ячейки на Листе1, с координатами 2 строка, 2 столбец
  • Переменной w присваивается значение ячейки на Листе1, с координатами 3 строка, 2 столбец
  • В ячейку на Листе1, с координатами 4 строка, 2 столбец, записывается сумма q+w

vba excel
      Далее получим значение столбца В из Листа2, которое расположено на той же строке где значение нашей суммы совпадает с значением столбца А.
      Введем следующий код:

 vba excel
и получим при нажатии на кнопку следующий результат:

 vba excel
из результата видно что макрос подобрал число из таблицы на Листе2 в соответствии с нашей суммой.
      Не буду вдаваться в подробности этого хитрого кода, так как цель данной статьи — начать писать макросы. Для VBA в интернете есть масса ресурсов, с примерами и разъяснениями, хотя для автоматизации расчетов вполне хватит объема информации в справке.

      Таким образом с помощью VBA возможно автоматизировать расчет любой сложности и последовательности. Справочные таблицы можно копировать из различной литературы на отдельные листы Excel и писать последовательный расчет с кнопками.

Like this post? Please share to your friends:
  • Vba access recordset to excel
  • Vba excel 2007 массивы
  • Vba access excel object
  • Vba excel 2007 массив
  • Vba access excel cells