Написание a на основе excel


В формулах EXCEL можно сослаться на значение другой ячейки используя ее адрес (=А1). Адрес ячейки в формуле можно записать по-разному, например: А1 или $A1 или $A$1. То, каким образом вы введете адрес в формулу, будет зависеть, как он будет модифицироваться при ее копировании в другие ячейки листа. Это пригодится при как построении обычных формул на листе, так и при создании

Именованных формул

, задания правил

Условного форматирования

и при формировании условий

Проверки данных

.

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

В1

содержится формула =А1+5 , то означает, что в ячейку

В1

будет помещено значение ячейки

А1

находящейся на пересечении столбца

А

и строки

1

,

к которому прибавлено число 5. Также в формулах используются ссылки на диапазоны ячеек, например, формула =СУММ(А2:А11) вычисляет сумму значений из ячеек

А2

,

А3

, …

А11

. Однако, формула

=СУММ($А$2:$А$11)

также вычисляет сумму значений из тех же ячеек. Тогда в чем же разница? Разница проявляется при копировании этой формулы в соседние ячейки.

Абсолютная адресация (абсолютные ссылки)

Для создания абсолютной ссылки используется знак $. Ссылка на диапазона записывается ввиде

$А$2:$А$11

. Абсолютная ссылка позволяет при

копировании

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

Пусть в ячейке

В2

введена формула

=СУММ(

$А$2:$А$11

)

, а в ячейке

С2

формула

=СУММ(А2:А11).

Скопировав формулы вниз, например с помощью

Маркера заполнения,

во всех ячейках столбца

В

получим одну и ту же формулу

=СУММ(

$А$2:$А$11

)

, т.е. ссылка на диапазон ячеек при копировании

не изменилась

. А в столбце

С

получим другой результат: в ячейке

С3

будет формула =СУММ(A3:A12) , в ячейке

С4

будет формула =СУММ(A4:A13) и т.д. Т.е. при копировании ссылка была

модифицирована

.

Какая формула лучше? Все зависит от вашей задачи: иногда при копировании нужно фиксировать диапазон, в других случая это делать не нужно.


Другой пример.

Пусть в диапазоне

А1:А5

имеются числа (например, зарплата сотрудников отдела), а в

С1

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

В1:В5

. Для этого введем в ячейку

В1

формулу =А1*С1 . Если мы с помощью

Маркера заполнения

протянем формулу вниз, то получим в

В2:В5

нули (при условии, что в диапазоне

С2:С5

нет никаких значений). В ячейке

В5

будем иметь формулу =А5*С5 (EXCEL при копировании формулы модифицировал ссылки на ячейки, т.к. их адреса не были записаны в виде абсолютных ссылок).

Чтобы выйти из ситуации — откорректируем формулу в ячейке

В1

.

  • выделите ячейку

    В1

    ;
  • войдите в режим правки ячейки (нажмите клавишу

    F2

    ) или поставьте курсор в

    Строку формул

    ;

  • поставьте курсор на ссылку

    С1

    (можно перед

    С

    , перед или после

    1

    );
  • нажмите один раз клавишу

    F

    4

    . Ссылка

    С1

    выделится и превратится в

    $

    C

    $1

    (при повторных нажатиях клавиши

    F

    4

    ссылка будет принимать последовательно вид

    C

    $1, $

    C

    1,

    C

    1, $

    C

    $1

    , …). Ссылка вида

    $

    C

    $1

    называется

    абсолютно

    ,

    C

    $1, $

    C

    1

    – смешанными, а

    С1



    относительной

    .

Такм образом, введем в

В1

формулу =А1*$С$1 . Это можно сделать и в ручную, введя знак $ перед буквой столбца и перед номером строки.

Нажмем

ENTER

и протянем ее вниз. Теперь в

В5

будет правильная формула =А5*$С$1 . Всем сотрудникам теперь достанется премия :).

Относительная адресация (относительные ссылки)

Введем в ячейку

B1

формулу =А1 , представляющую собой относительную ссылку на ячейку

А1

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

В1

? После протягивания ее вниз

Маркером заполнения

, в ячейке

В5

будет стоять формула =А5 , т.е. EXCEL

изменил

первоначальную формулу =A1 . При копировании вправо в ячейку

С1

формула будет преобразована в =В1.


Теперь примеры.

Пусть в столбце

А

введены числовые значения. В столбце

B

нужно ввести формулы для суммирования значений из 2-х ячеек столбца

А

: значения из той же строки и значения из строки выше.

Т.е. в

B2

должна быть формула: =СУММ(A1:A2) , в

B3

: =СУММ(A2:A3) и т.д.

Решить задачу просто: записав в

B2

формулу =СУММ(A1:A2) , протянем ее с помощью

Маркера заполнения

в ячейку

B3

и ниже.


Альтернативное решение

Другим вариантом решения этой задачи является использование

Именованной формулы

. Для этого:

  • выделите ячейку

    B2

    (это принципиально при использовании относительных ссылок в

    Именах

    ). Теперь

    B2

    – активная ячейка;

  • на вкладке

    Формулы

    в группе

    Определенные имена

    выберите команду

    Присвоить имя

    ;
  • в поле

    Имя

    введите, например

    Сумма2ячеек

    ;
  • убедитесь, что в поле

    Диапазон

    введена формула =СУММ(A1:A2)
  • Нажмите ОК.

Теперь в

B2

введем формулу =

Сумма2ячеек

. Результат будет тот, который мы ожидали: будет выведена сумма 2-х ячеек из столбца слева (см. файл примера , лист

пример1

). Если формулу ввести в ячейку

B5

, то она будет суммировать ячейки

A4:A5

, если ввести в

D10

, то – ячейки

С9:С10

.

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

Ссылка на диапазон суммирования будет меняться в зависимости от месторасположения формулы на листе, но «расстояние» между ячейкой с формулой и диапазоном суммирования всегда будет одинаковым (один столбец влево).


Относительная адресация при создании формул для Условного форматирования.

Пусть необходимо выделить в таблице, содержащей числа от 1 до 100, значения больше 50, причем, только в четных строках (см. файл примера , лист

пример2

). Построим такую таблицу:

Создадим правило для

Условного форматирования

:

  • выделите диапазон таблицы

    B

    2:

    F

    11

    , так, чтобы активной ячейкой была

    B

    2

    (важно выделить диапазон начиная с

    B

    2

    , а не с

    F

    11

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

    F

    11

    );
  • вызовите инструмент

    Условное форматирование

    (

    Главная/ Стили/ Условное форматирование/ Создать правило/ использовать формулу для …

    );

  • введите формулу =И(ОСТАТ($A2;2)=$I$1;B2>50) ;
  • выберите

    Формат

    ;
  • нажмите

    ОК

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

F11

, то формулу необходимо было переписать: =И(ОСТАТ($A11;2)=$I$1;F11>50) . Поменять необходимо только ссылки незафиксированные знаком $:

B2

на

F11

и

$A2

на

$A11

.


Внимание!

При использовании относительной адресации в

Именованных формулах

,

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

,

Условном форматировании

,

Проверке данных

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


Смешанные ссылки

Смешанные ссылки имеют формат =$В3 или =B$3 . В первом случае при копировании формулы фиксируется ссылка на столбец

B

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

Предположим, у нас есть столбец с ценами в диапазоне

B

3:

B

6

(см. файл примера , лист

пример3

). В столбцах

С,

D

, Е

содержатся прогнозы продаж в натуральном выражении по годам (в шт.). Задача: в столбцах

F

,

G

,

H

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

С,

D

, Е

на столбец

B

. Использование механизма относительной адресации позволяет нам ввести для решения задачи только одну формулу. В ячейку

F

вводим: =$В3*C3 . Потом протягиваем формулу

маркером заполнения

вниз до

F

6

,

а затем весь столбец таблицы протягиваем вправо на столбцы

G

и

H

.

Обратите внимание, что в формуле =$В3*C3 перед столбцом

B

стоит значок $. При копировании формулы =$В3*C3 в ячейки столбцов

F,

G

и

H

, этот значок $ говорит EXCEL о том, что ссылку на столбец

B

модифицировать не нужно. А вот перед столбцом

С

такого значка нет и формула в ячейке

H6

примет вид =$В6*E6 .

Вводим знак $ в адрес ячейки

Существует несколько возможностей при вводе формулы ввести знак $ в адрес ячейки или диапазона. Рассмотрим ввод на примере формулы

=СУММ($А$2:$А$5)

1. Ввести знак $ можно вручную, последовательно вводя с клавиатуры все знаки

=СУММ($А$2:$А$5)

2. С помощью клавиши

F4

(для ввода абсолютной ссылки):

  • Введите часть формулы без ввода $:

    =СУММ(А2:А5
  • Затем

    сразу

    нажмите клавишу

    F4

    , знаки $ будут вставлены автоматически:

    =СУММ(

    $А$2:$А$5
  • Для окончания ввода формулы нажмите

    ENTER.

Если после ввода

=СУММ(А2:А5

в формуле передвинуть курсор с помощью мыши в позицию левее,

а затем вернуть его в самую правую позицию (также мышкой),

то после нажатия клавиши

F4

, знаки $ будут автоматически вставлены только во вторую часть ссылки!

=СУММ(

А2:$А$5

Чтобы вставить знаки $ во всю ссылку, выделите всю ссылку

А2:$А$5

или ее часть по обе стороны двоеточия, например

2:$А

, и нажмите клавишу

F4.

Знаки $ будут автоматически вставлены во всю ссылку

$А$2:$А$5

3. С помощью клавиши

F4

(для ввода относительной ссылки).

  • Введите часть формулы без ввода $:

    =СУММ(А2:А5
  • Затем

    сразу

    нажмите клавишу

    F4

    , будут автоматически вставлены знаки $:

    =СУММ(

    $А$2:$А$5
  • Еще раз нажмите клавишу

    F4

    : ссылка будет модифицирована в

    =СУММ(

    А$2:А$5

    (фиксируются строки)
  • Еще раз нажмите клавишу

    F4

    : ссылка будет модифицирована в

    =СУММ($

    А2:$А5

    (фиксируется столбец)
  • Еще раз нажмите клавишу

    F4

    : ссылка будет модифицирована в

    =СУММ(

    А2:А5

    (относительная ссылка). Последующие нажатия изменяют ссылку заново по кругу.
  • Для окончания ввода нажмите

    ENTER.

Чтобы изменить только первую или втрорую часть ссылки — установите мышкой курсор в нужную часть ссылки и последовательно нажимайте клавушу

F4.

«СуперАбсолютная» адресация

В заключении расширим тему абсолютной адресации. Предположим, что в ячейке

B

2

находится число 25, с которым необходимо выполнить ряд вычислений, например, возвести в разные степени (см. файл примера , лист

пример4

). Для этого в столбце

C

напишем формулу возведения в степень (значения степени введем в столбец

D

): =$B$2^$D2 .

Мы использовали абсолютную ссылку на ячейку

B

2

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

25

:

  • при копировании формулы из

    С3

    в

    Н3

    – формула не изменится, и мы получим правильный результат

    625

    ;
  • при вставке нового столбца между столбцами

    А

    и

    В

    – формула превратится в =$C$2^$E3 , но мы снова получим правильный результат

    625

    .

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

B

2

(т.е. всегда во второй столбец листа). Теперь, при вставке столбца между столбцами

А

и

В

– формула как и раньше превратится в =$C$2^$E3 , но т.к. исходное число (25) будет вставляться макросом не в

С2

, а по прежнему в ячейку

B

2

, и мы получим неправильный результат.

Вопрос: можно ли модифицировать исходную формулу из

С2

( =$B$2^$D2 ), так чтобы данные все время брались из второго столбца листа и независимо от вставки новых столбцов?

Решение заключается в использовании функции ДВССЫЛ() , которая формирует ссылку на ячейку из текстовой строки. Если ввести в ячейку формулу: =ДВССЫЛ(«B2») , то она всегда будет указывать на ячейку с адресом

B2

вне зависимости от любых дальнейших действий пользователя, вставки или удаления столбцов и т.д.

Небольшая сложность состоит в том, что если целевая ячейка пустая, то ДВССЫЛ() выводит 0, что не всегда удобно. Однако, это можно легко обойти, используя чуть более сложную конструкцию с проверкой через функцию ЕПУСТО() :

=ЕСЛИ(ЕПУСТО(ДВССЫЛ(«B2″));»»;ДВССЫЛ(«B2»))

При ссылке на ячейку

В2

с другого листа =ДВССЫЛ(«пример4!B2») может возникнуть и другая сложность: при изменении названия листа

пример4

– формула перестает работать. Но это также можно обойти – см. пример из статьи

Определяем имя листа

.

Другим способом заставить формулу ссылаться на один и тот же столбец является использование функции СМЕЩ() – об этом читайте статью

Как заставить формулу все время ссылаться на один и тот же столбец

.

Kapp-Ear, начнём с того, что сам вопрос вы ставите неверно от слова совсем.

Цитата
Сообщение от Kapp-Ear
Посмотреть сообщение

писать программы на основе данных из Excel.

Цитата
Сообщение от Kapp-Ear
Посмотреть сообщение

многие такие проекты страшно виснут из-за огромного количества данных

Excel — всего лишь электронные таблицы, пусть и со всякими приятными наворотами, расширяющими возможность использования. И использовать файлы Excel для хранения и извлечения данных по запросам в соответствии с нередко требуемым сложным набором фильтров этой информации вместо специально для этого предназначенных баз данных, сравнимо с постоянным использованием рукомойника не только для мытья рук, но и по всяким другим надобностям только из-за того, что он рядом и уже знаком, а прочим оборудованием ещё учиться пользоваться придётся.
В правильно составленной базе данных на миллионы записей, отвечающей нормальным формам, с нормально прописанными индексами, SQL запрос нередко отрабатывает за время, которое вполне описывается идиомой «не успеешь глазом моргнуть». Так что рекомендую хотя бы на время забыть о желании

Цитата
Сообщение от Kapp-Ear
Посмотреть сообщение

писать программы на основе данных из Excel.

и изучать не чисто в применении к excel, а с учётом того, что рабочая инфомация по-хорошему должна попадать в базу данных, вне зависимости от того, через какие файлы и нтерфейсы она была получена, пусть и из excel-файлов. И в дальнейшем обрабатыватся она должна в базе данных, пусть и придётся иногда её выгружать в Excel-файлы, для удобства просмотра какими-нибудь независимыми потребителями. Можно использовать MS Access, поставляемую с MS Office, можно какую-нибудь бесплатную, типа FireBird или что-то другое.

ЯП при этом могут быть самыми разными — возможно вам будет проще всего изучить VBS (visual basic script) или JS (java script), интерпретаторы которых уже встроены в любую винду и не требуют компиляции, запускась простым тычком в текстовый файл с программой, а VBS при этом ещё и мало отличим от VBA, встроенного в MS Office в качестве языка макросов. Возможно захотите использовать язык, требующий компиляции в исполняемый модуль — это уже не столь важно, поскольку и Excel и базы данных предоставляют механизмы для обращения к ним практически из всего популярного набора языков.

Главное, определитесь сейчас: действительно ли вы собираетесь и дальше использовать файлы excel в качестве, к которому они не очень приспособлены: как хранилище больших объёмов обычно плохо структурированных данных? И хотите учиться обрабатывать именно их и только их из внешних программ?

Или всё-таки расширите свой интерес до обращения с базами данных, а Excel-файлы оставите, наряду с другими в качестве временного носителя избранной части информации в удобном для конечного пользователя виде.

В данном разделе мы рассмотрим трюк, с помощью которого можно автоматически создавать текстовые документы Word на основе данных, хранящихся в таблице Excel. Это бывает необходимо, например, для быстрого формирования текстовых отчетов, в которых должны фигурировать табличные данные. Использование этого приема мы рассмотрим на конкретном примере.

Предположим, что у нас есть следующие данные о продажах по регионам (рис. 3.31).

Внимание!

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

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

Рис. 3.31. Данные о продажах

Листинг 3.85. Создание документов Word на основе таблицы Excel

Sub ReportToWord()

Dim intReportCount As Integer ‘ Количество сообщений

Dim strForWho As String ‘ Получатель сообщения

Dim strSum As String ‘ Сумма за товар

Dim strProduct As String ‘ Название товара

Dim strOutFileName As String ‘ Имя файла для сохранения

сообщения

Dim strMessage As String ‘ Текст дополнительного сообщения

Dim rgData As Range ‘ Обрабатываемые ячейки

Dim objWord As Object

Dim i As Integer

‘ Создание объекта Word

Set objWord = CreateObject(«Word.Application»)

‘ Информация с рабочего листа

Set rgData = Range(«A1»)

strMessage = Range(«E6»)

‘ Просмотр записей на листе Лист1

intReportCount = Application.CountA(Range(«A:A»))

For i = 1 To intReportCount

‘ Динамические сообщения в строке состояния

Application.StatusBar = «Создание сообщения » & i

‘ Назначение данных переменным

strForWho = rgData.Cells(i, 1).Value

strProduct = rgData.Cells(i, 2).Value

strSum = Format(rgData.Cells(i, 3).Value, «#,000»)

‘ Имя файла для сохранения отчета

strOutFileName = ThisWorkbook.path & «» & strForWho &

«.doc»

‘ Передача команд в Word

With objWord

.Documents.Add

With .Selection

‘ Заголовок сообщения

.Font.Size = 14

.Font.Bold = True

.ParagraphFormat.Alignment = 1

.TypeText Text:=»О Т Ч Е Т»

‘ Дата

.TypeParagraph

.TypeParagraph

.Font.Size = 12

.ParagraphFormat.Alignment = 0

.Font.Bold = False

.TypeText Text:=»Дата:» & vbTab & _

Format(Date, «mmmm d, yyyy»)

‘ Получатель сообщения

.TypeParagraph

.TypeText Text:=»Кому: менеджеру » & vbTab &

strForWho

‘ Отправитель

.TypeParagraph

.TypeText Text:=»От:» & vbTab &

Application.UserName

‘ Сообщение

.TypeParagraph

.TypeParagraph

.TypeText strMessage

.TypeParagraph

.TypeParagraph

‘ Название товара

.TypeText Text:=»Продано товара:» & vbTab &

strProduct

.TypeParagraph

‘ Сумма за товар

.TypeText Text:=»На сумму:» & vbTab & _

Format(strSum, «$#,##0»)

End With

‘ Сохранение документа

.ActiveDocument.SaveAs FileName:=strOutFileName

End With

Next i

‘ Удаление объекта Word

objWord.Quit

Set objWord = Nothing

‘ Обновление строки состояния

Application.StatusBar = False

‘ Вывод на экран информационного сообщения

MsgBox intReportCount & » заметки создано и сохранено в папке » _

& ThisWorkbook.path

End Sub

В результате написания кода в окне выбора макросов станет доступным макрос ReportToWord. После его запуска начнется формирование отчетов (информация о состоянии процесса будет отображаться в строке состояния). По окончании процесса на экране отобразится окно с сообщением о том, что документы сформированы и помещены в ту папку, в которой хранится текущая рабочая книга. В рассматриваемом примере будут созданы три документа с именами Магазин 1.doc, Магазин 2.doc и Магазин 3.doc. Содержимое документа Магазин 1. doc показано на рис. 3.32 (другие документы выглядят аналогичным образом).

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

Рис. 3.32. Документ Word, созданный на основе данных таблицы Excel

Время на прочтение
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) — тут скобки нужны постоянно.

Формула предписывает программе Excel порядок действий с числами, значениями в ячейке или группе ячеек. Без формул электронные таблицы не нужны в принципе.

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

Формулы в Excel для чайников

Чтобы задать формулу для ячейки, необходимо активизировать ее (поставить курсор) и ввести равно (=). Так же можно вводить знак равенства в строку формул. После введения формулы нажать Enter. В ячейке появится результат вычислений.

Ввод формул.

В Excel применяются стандартные математические операторы:

Оператор Операция Пример
+ (плюс) Сложение =В4+7
— (минус) Вычитание =А9-100
* (звездочка) Умножение =А3*2
/ (наклонная черта) Деление =А7/А8
^ (циркумфлекс) Степень =6^2
= (знак равенства) Равно
< Меньше
> Больше
<= Меньше или равно
>= Больше или равно
<> Не равно

Символ «*» используется обязательно при умножении. Опускать его, как принято во время письменных арифметических вычислений, недопустимо. То есть запись (2+3)5 Excel не поймет.

Программу Excel можно использовать как калькулятор. То есть вводить в формулу числа и операторы математических вычислений и сразу получать результат.

Математическое вычисление.

Но чаще вводятся адреса ячеек. То есть пользователь вводит ссылку на ячейку, со значением которой будет оперировать формула.

Ссылки на ячейки.

При изменении значений в ячейках формула автоматически пересчитывает результат.

Изменение результата.

Ссылки можно комбинировать в рамках одной формулы с простыми числами.

Умножение ссылки на число.

Оператор умножил значение ячейки В2 на 0,5. Чтобы ввести в формулу ссылку на ячейку, достаточно щелкнуть по этой ячейке.

В нашем примере:

  1. Поставили курсор в ячейку В3 и ввели =.
  2. Щелкнули по ячейке В2 – Excel «обозначил» ее (имя ячейки появилось в формуле, вокруг ячейки образовался «мелькающий» прямоугольник).
  3. Ввели знак *, значение 0,5 с клавиатуры и нажали ВВОД.

Если в одной формуле применяется несколько операторов, то программа обработает их в следующей последовательности:

  • %, ^;
  • *, /;
  • +, -.

Поменять последовательность можно посредством круглых скобок: Excel в первую очередь вычисляет значение выражения в скобках.



Как в формуле Excel обозначить постоянную ячейку

Различают два вида ссылок на ячейки: относительные и абсолютные. При копировании формулы эти ссылки ведут себя по-разному: относительные изменяются, абсолютные остаются постоянными.

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

  1. Вручную заполним первые графы учебной таблицы. У нас – такой вариант:
  2. Исходный прайс-лист.

  3. Вспомним из математики: чтобы найти стоимость нескольких единиц товара, нужно цену за 1 единицу умножить на количество. Для вычисления стоимости введем формулу в ячейку D2: = цена за единицу * количество. Константы формулы – ссылки на ячейки с соответствующими значениями.
  4. Формула для стоимости.

  5. Нажимаем ВВОД – программа отображает значение умножения. Те же манипуляции необходимо произвести для всех ячеек. Как в Excel задать формулу для столбца: копируем формулу из первой ячейки в другие строки. Относительные ссылки – в помощь.

Находим в правом нижнем углу первой ячейки столбца маркер автозаполнения. Нажимаем на эту точку левой кнопкой мыши, держим ее и «тащим» вниз по столбцу.

Автозаполнение формулами.

Отпускаем кнопку мыши – формула скопируется в выбранные ячейки с относительными ссылками. То есть в каждой ячейке будет своя формула со своими аргументами.

Ссылки аргументы.

Ссылки в ячейке соотнесены со строкой.

Формула с абсолютной ссылкой ссылается на одну и ту же ячейку. То есть при автозаполнении или копировании константа остается неизменной (или постоянной).

Чтобы указать Excel на абсолютную ссылку, пользователю необходимо поставить знак доллара ($). Проще всего это сделать с помощью клавиши F4.

  1. Создадим строку «Итого». Найдем общую стоимость всех товаров. Выделяем числовые значения столбца «Стоимость» плюс еще одну ячейку. Это диапазон D2:D9
  2. Диапазон.

  3. Воспользуемся функцией автозаполнения. Кнопка находится на вкладке «Главная» в группе инструментов «Редактирование».
  4. Инструмент Сумма.

  5. После нажатия на значок «Сумма» (или комбинации клавиш ALT+«=») слаживаются выделенные числа и отображается результат в пустой ячейке.

Результат автосуммы.

Сделаем еще один столбец, где рассчитаем долю каждого товара в общей стоимости. Для этого нужно:

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

  3. Чтобы получить проценты в Excel, не обязательно умножать частное на 100. Выделяем ячейку с результатом и нажимаем «Процентный формат». Или нажимаем комбинацию горячих клавиш: CTRL+SHIFT+5
  4. Процентный формат.

  5. Копируем формулу на весь столбец: меняется только первое значение в формуле (относительная ссылка). Второе (абсолютная ссылка) остается прежним. Проверим правильность вычислений – найдем итог. 100%. Все правильно.

Сумма процентов.

При создании формул используются следующие форматы абсолютных ссылок:

  • $В$2 – при копировании остаются постоянными столбец и строка;
  • B$2 – при копировании неизменна строка;
  • $B2 – столбец не изменяется.

Как составить таблицу в Excel с формулами

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

Простейшие формулы заполнения таблиц в Excel:

  1. Перед наименованиями товаров вставим еще один столбец. Выделяем любую ячейку в первой графе, щелкаем правой кнопкой мыши. Нажимаем «Вставить». Или жмем сначала комбинацию клавиш: CTRL+ПРОБЕЛ, чтобы выделить весь столбец листа. А потом комбинация: CTRL+SHIFT+»=», чтобы вставить столбец.
  2. Назовем новую графу «№ п/п». Вводим в первую ячейку «1», во вторую – «2». Выделяем первые две ячейки – «цепляем» левой кнопкой мыши маркер автозаполнения – тянем вниз.
  3. Новая графа.

  4. По такому же принципу можно заполнить, например, даты. Если промежутки между ними одинаковые – день, месяц, год. Введем в первую ячейку «окт.15», во вторую – «ноя.15». Выделим первые две ячейки и «протянем» за маркер вниз.
  5. Дата.

  6. Найдем среднюю цену товаров. Выделяем столбец с ценами + еще одну ячейку. Открываем меню кнопки «Сумма» — выбираем формулу для автоматического расчета среднего значения.

Среднее.
Результат.

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

Понравилась статья? Поделить с друзьями:
  • Написание простого макроса excel
  • Написал текст word не сохранил
  • Написание простейших макросов excel
  • Написал документ в word как сохранить документ
  • Написание программ на vba в excel