Как сделать таблицу в vba

Добавил пользователь Валентин П.
Обновлено: 04.10.2024

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

Таблица с переменным числом ячеек, управляемая двумя раскрывающимися списками

Далее в конструкторе WebForm1.aspx из панели элементов Toolbox в проектируемую форму перенесем элемент управления Table, два раскрывающихся списка DropDownList, две метки Label и командную кнопку Button. Теперь, используя, например, контекстное меню проекта Web-формы, выбираем команду View Code, попадаем на вкладку файла программной поддержки WebForm1.aspx.vb. В листинге ниже приведен соответствующий программный код.

[vb]‘ Таблица с переменным числом ячеек, управляемая двумя
‘ раскрывающимися списками. Web-страница позволяет с помощью
‘ двух раскрывающихся списков DropDownList заказать необходимое
‘ число рядов и столбцов в таблице, а затем строить заказанную
‘ таблицу.
PublicClass WebForm1
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)Handles Me.Load
Page.Title ="Укажите размерность таблицы"
If Page.IsPostBack = True Then Exit Sub
‘ Заполнять выпадающий список необходимо
‘ при первой загрузки страницы IsPostBack = False,
‘ иначе будут добавляться новые пункты в выпадающем
‘ списке при каждой перегрузке страницы:
DropDownList1.Items.Add("1")
DropDownList1.Items.Add("2")
DropDownList1.Items.Add("3")
DropDownList2.Items.Add("1")
DropDownList2.Items.Add("2")
DropDownList2.Items.Add("3")
Table1.Caption = "Название таблицы"
Table1.CaptionAlign = TableCaptionAlign.Right
Table1.ToolTip ="Укажи количество рядов и столбцов и нажми кнопку"
Table1.BorderStyle = BorderStyle.Solid
Table1.GridLines = GridLines.Both
Label1.Text ="Кол-во строк"
Label2.Text ="Кол-во столбцов"
Button1.Text = "Обновить таблицу"
End Sub
Private Sub Button1_Click(ByVal senderAs Object,ByVal e As System.EventArgs) Handles Button1.Click
Dim i, j AsInteger
For i = 1 ToInt32.Parse(DropDownList1.SelectedItem.Value)
Dim РЯДAsNew TableRow
For j = 1 ToInt32.Parse(DropDownList2.SelectedItem.Value)
Dim ЯЧЕЙКАAsNew TableCell
ЯЧЕЙКА.Text = "Ряд " & i & ", Кол " & j
ЯЧЕЙКА.HorizontalAlign = HorizontalAlign.Center
РЯД.Cells.Add(ЯЧЕЙКА)
Next
Table1.Rows.Add(РЯД)
Next
End Sub
EndClass[/vb]

Свойства других элементов управления также инициализированы при обработке события загрузки Web-страницы Page_Load. Мы могли бы это сделать в конструкторе, но, для удобства читателя, приводим их в программном коде. Назначения этих свойств очевидны и не требуют дополнительных комментариев.

При обработке события щелчок на кнопке Обновить таблицу имеем два вложенных цикла. Параметры обоих циклов i и j изменяются от 1 до значения, выбранного пользователем в соответствующем раскрывающемся списке. Метод Int32.Parse пространства имен System конвертирует строку из соответствующего свойства объекта DropDownList В переменную типа Integer. Внешний цикл перебирает ряды таблицы, а внутренний — ячейки таблицы. В теле внешнего цикла очередная итерация создает новый объект РЯД класса TableRow, аналогично в теле внутреннего цикла каждый раз создается новый Объект ЯЧЕЙКА класса TableCell.

Для старта созданного проекта нажмем клавишу. На этом можно закончить статью про создание таблицы в Vusial Basic с задаваемым количество ячеек в столбцах и строках.

1.Коллекция Tables .

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

Таблица Word имеет такую же структуру, как и электронная таблица Excel – элемент таблицы, находящийся на пересечении строки и столбца, называется ячейкой и идентифицируется по имени столбца и номеру строки.

В VBA для доступа к таблицам используется объект Tables , являющийся семейством объектов Table , каждый из которых связан с конкретной таблицей. Для получения ссылки на семейство Tables можно использовать свойство Tables объекта Document .

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

Set oblTable = objDocument.Tables.Item ( Key)

Параметр Key , является уникальным идентификатором каждой таблицы, хранящейся в объекте Tables .

Для создания новой таблицы используется метод Add объекта Tables . Этот метод возвращает ссылку на созданную таблицу( Table ).

objTables.Add (Range, NumRows , NumColums )

Параметр Range позволяет указать область документа, куда будет вставлена таблица. Если параметр не пустой, т.е. имеется выделенная область, то она будет заменена вставляемой таблицей.

Параметры NumRows , NumColums позволяют указать на число строк и столбцов таблицы.

Пример: создадим таблицу в выделенном месте или там где стоит курсор.

2.Форматирование таблицы.

После создания таблицы ее можно отформатировать нужным образом: добавить заливку, изменить формат границ, изменить стиль и т.д.

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

Для их применения используется метод AutoFormat .

objTable.AutoFormat ( Format, [ ApplyBorders , ApplyShading , ApplyFont , ApplyColor , ApplyHeadingRows , ApplyLastRow , ApplyFirstColumn , ApplyLastColumn , AutoFit])

Параметр Format содержит один из допустимых форматов. Список всех имеющихся форматов и результат их применения можно увидеть в списке Стили таблицы окна диалога Автоформат таблицы (таблица ® автоформат ).

Параметр ApplyBorders указывает, должны ли использоваться границы, установленные по умолчанию для данного формата. Если True (значение по умолчанию), то текущие границы будут заменены границами, предусмотренными в применяемом автоформате .

Параметр ApplyShading указывает, должна ли использоваться заливка. Если True (значение по умолчанию), то для таблицы будет установлена заливка в соответствии со значением, предусмотренном в применяемом автоформате .

Параметр ApplyFont указывает, должен ли изменятся шрифт таблицы. Если True , то для текста в таблице будет применен шрифт, предусмотренный в применяемом автоформате .

Параметр ApplyColor указывает на необходимость использования цветового оформления цветового оформления таблицы. По умолчанию имеет значение True .

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

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

Параметр ApplyFirstColumn указывает на необходимость изменение формата первого столбца таблицы. По умолчанию имеет значение True .

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

Параметр AutoFit указывает на автоматический подбор ширины столбцов в зависимости от размещаемых в них данных. По умолчанию имеет значение True .

Пример: применяем автоформат Классический 2 к таблице, расположенной первой от начала активного документа.

ActiveDocument.Tables ( 1).AutoFormat Format:=WdTableFormat.wdTableFormatClassic2

Тип используемого пользовательского форматирования содержится в свойстве AutoFormatType . Свойство возвращает одно из значений типа wdTableFormat .

Для форматирования границ таблицы используется свойство Borders , которое возвращает ссылку на объект типа В orders , связанный с границами данной таблицы.

Пример: назначение первой таблице в документе оформление границ.

With ActiveDocument.Tables ( 1).Borders

. OutsideLineStyle = wdLineStyleSingle внешние границы

. InsideLineStyle = wdLineStyleSingle внутренние границы

End With

3.Строки и столбцы.

Таблица состоит из набора строк и столбцов. Строки содержатся в семействе Rows , возвращаемое свойством Rows , а столбцы – в семействе Columns , возврщаемое свойством Columns .

Определенная строка или столбец связаны с объектами типа Row или Column . Доступ к конкретной строке или столбцу осуществляется с помощью метода Item , являющегося для объектов Rows и Columns методом по умолчанию.

MsgBox ActiveDocument.Tables ( 1). Columns.Count

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

Для добавления в таблицу новых строк (столбцов) используется метод Add .

Параметр Before – указывает, перед какой строкой будет вставлена строка. Если параметр опущен, то строка добавляется в конец таблицы.

Set tabv = ActiveDocument.Tables( 1).Rows.Add(beforerow:=ActiveDocument.Tables(1).Rows(1))

Чтобы установить высоту строки, используется метод SetHeight .

objRow.SetHeight ( RowHeight , HeightRule )

параметр RowHeight указывает на новую высоту строки в пунктах.

Параметр HeightRule – указывает на способ изменения высоты:

WdRowHeightAtLeast – размер, указанный в параметре RowHeigh , является минимальным.

WdRowHeightAuto - размер, указанный в параметре RowHeigh ,является точным.

WdRowHeightExactly – автоматический подбор высоты строк (параметр RowHeigh игнорируется).

Получить информацию о текущей ширине строки и правиле ее изменения можно с помощью свойств Height и HeightRule .

objRow . Height [ =Height ]

Параметр Height (тип Single ) позволяет задать необходимую высоту строки в пунктах.

objRow . HeightRule [ =Rule ]

Параметр Rule указывает на правило изменения ширины ячейки:

• wdRowHeightAtLeast — минимальная ширина, которая может быть на­значена строке, указывается в свойстве Height ;

• wdRowHeightExactly — ширина строки должна быть точно равна зна­чению, указанному в свойстве Height ;

• wdRowHeightAuto — ширина строки подбирается автоматически в за­висимости от размера используемого шрифта или размера вставок.

Чтобы установить одинаковую высоту всех строк, необходимо исполь­зовать метод DistributeHeight объекта Rows .

objRows . DistributeHeight

Для украшения текста документа часто используются прием создания отступа между левой границы ячейки и текстом. Этот прием часто применяют при создании таблиц на web-страницах. Для создания отступа в ячейках таблицы можно использовать свойство SpaceBetweenColumns . При использовании этого свойства в объекте Rows выполняется добавление отступа во все ячейки таблицы, а при использовании в Row — только для ячеек данной строки.

objRows.SpaceBetweenColumns [ = Space ]

Параметр Space (тип Single ) позволяет указать на ширину отступа в пунктах. Значение, передаваемое параметром Space , не может быть меньше 0 и больше ширины ячейки.

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

With ActiveDocument.Tables ( l)

. Rows( l). SpaceBetweenColumns = InchesToPoints (0.5)

Чтобы установить ширину столбца и правило ее изменения применя­ется метод SetWidth . Этот метод используется как в объекте типа Columns , так и объекте типа Column . Если используется метод объекта Columns , то изменения ширины касаются всех столбцов, а если метод объекта Column — то только данного столбца.

о bjColumns.SetWidth ( ColumnWidth , RulerStyle )

Параметр ColumnWidth (тип Single ) указывает на новую ширину столб­ца в точках, а параметр RulerStyle (тип WdRulerStyle ) — на способ изме­нения ширины. Параметр RulerStyle может принимать следующие значения:

• wdAdjustNone (значение по умолчанию) — ширина столбца соответ­ствует указанному значению. Изменение ширины столбца выполня­ется за счет смещения левой или правой границы таблицы (столбца).

• wdAdjustSameWidth — ширина столбца соответствует указанному значению. Изменение ширины выполняется за счет смещения внутрен­них границ таблицы. Правая граница сохраняет свое положение.

• wdAdjustFlrstColumn — ширина первого столбца соответствует указан­ному значению. Изменение ширины выполняется за счет смещения правой границы столбца. Размер остальных столбцов сохраняется. Если ширина превышает суммарную ширину первой и второй ячеек, то происходит сдвиг правой границы таблицы.

• wdAdjustProportional — ширина первого столбца соответствует ука­занному значению. Размер остальных столбцов подбирается авто­матически, так чтобы общая ширина таблицы сохранилась.

• Для получения информации о текущей ширине столбца можно использовать свойство Width .

• О bjColumns.Width [ =Width ]

• Параметр Width (типа Single ) позволяет указать нужную ширину столбца.

• Чтобы установить одинаковую ширину всех столбцов, необходимо использовать метод DistributeWidth объекта Columns .

• Для автоматического подбора ширины столбцов используется метод AutoFit .

• Для удаления строк (столбцов) используется метод Delete .

• Доступ к ячейкам данной строки или столбца осуществляется с помощью объекта Cells , который является семейством объектов Cell , связанных с конкретными ячейками.

• Set objCells = objTables.Rows (key).Cells

• Set objCells = objTables.Columns (key).Cells

• Здесь objTables указывает на таблицу, с ячейками которой будет выполняться работа, а key – строка или столбец в таблице, ячейки которой входят в семейство Cells .

• Ссылку на определенную ячейку можно получить с помощью метода Cell объекта Table .

Set instable = ActiveDocument.Tables.Add ( Selection.Range , 4, 10)

Для добавления новой ячейки используется метод Add .

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

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

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

Для выделения (активизации) текущей ячейки используется метод Select .

Для объединения нескольких ячеек в одну (инструмент слияния) используется метод Merge .

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

Для разбиения объединенных ячеек или одной ячейки на несколько используется метод Split .

ObjCell . Split [ ( NumRows , NumColumns )]

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

ActiveDocument.Tables ( 1).Cell(1, 1).Split 2, 3

5.Вычисления.

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

Для указания ячейке, что в ней будет выполнятся вычисление, используется метод Formula объекта Cell .

ObjCell.Formula (Formula, NumFormat )

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

При использовании стандартных инструментов вставки формул эти выражения содержатся в соответствующих полях. Например, выражение “= SUM ( A 4: C 4)” позволяет отобразить значение, получаемое в результате выполнения суммирования значений трех ячеек: А4, В4, С4. Кроме непосредственной ссылки на конкретные ячейки можно использовать общие ссылки, например на все ячейки, расположенные выше( Above ) или левее ( Left ).

По умолчанию в таблицах Word можно использовать следующие функции:

• Abs ( X ) — возвращает абсолютное значение числа или формулы (без знака);

• And ( X ; Y ) - возвращает значение 1, если оба логических выраже­ния, X и У, истинны, или 0 (ноль), если хотя бы одно из них ложно;

• Average ( List ) — возвращает среднее значение из списка значений List ,

• Count ( List ) — возвращает количество элементов в списке List ;

• Defined ( X ) - возвращает значение 1, если выражение X допустимо, или 0 (ноль), если выражение не может быть вычислено;

• Fal se — возвращает значение 0 (ноль);

• Int ( X ) — возвращает целую часть числа или значения формулы X ;

• Min ( List ) — возвращает наименьшее значение в списке List ;

• Max ( List ) — возвращает наибольшее значение в списке List ;

• Mod ( X ; Y ) — возвращает остаток от деления X на Y ;

• Not ( X ) — возвращает значение 0 (ложь), если логическое выражение X истинно, или 1 (истина), если оно ложно;

• Or ( X ; Y ) — возвращает значение 1 (истина), если хотя бы одно из двух логических выражений X и Y истинно, или 0 (ложь), если оба ложны;

• Round ( X ; У) — возвращает значение X , округленное до указанного десятичного разряда Y ;

• Sign ( X ) - указывает знак числа: возвращает значение 1, если X > О, или -1 в противном случае;

• Sum ( List ) — возвращает сумму значений или формул, включенных в список. List;

• True — возвращает значение 1.

• Параметр NumFormat , является маской, которая определяет формат числовых значений. Эта маска может содержать ряд специальных сим­волов, которые приведены ниже.

• минус) — добавляет минус к отрицательным или пробел — ко всем остальным значениям.

• + (плюс) — добавляет плюс к положительным, минус к отрицательным или пробел — к нулевым значениям.

• Для автоматического вычисления суммы значений можно использовать метод AutoSum .

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

Если в вашем предложении нужно вывести какой-то стандартный документ по утвержденной форме (платежка, кассовый ордер, командировочный отчет и т.п.), то, скорее всего, для форматирования вы будете использовать таблицу. Таблица во многих ситуациях позволяет гарантировать правильное расположение данных в форме относительно друг друга. Многие программисты изначально используют таблицу даже форм, которые на таблицы походи мало (сетку таблицы всегда можно скрыть, а ячейки — слить между собой).

Создание таблицы начинается с того, что в коллекцию Tables (она предусмотрена для объектов Document, Selection и Range) добавляется новый объект Table (в данном случае — с тремя строками и четырьмя столбцами):

Set Range1 = ThisDocument.Range(Start:=0, End:=0)

Dim Table1 As Table

Set Table1 = ThisDocument.Tables.Add(Range1, 3, 4)

Затем можно настроить свойства таблицы, например, воспользовавшись методом AutoFormat() (возможности у него — те же, что доступны через меню Таблица -> Автоформат):

Table1.AutoFormat wdTableFormatGrid 5

Чаще всего в итоге нам нужно ввести какие-либо данные в ячейку таблицы. Мы можем добраться до нужной ячейки через объекты Columns и Rows, Selection и Range, однако удобнее всего сделать так:

Мы ввели во первую строку первого столбца значение 10, во вторую строку первого столбца — значение 15, а в третьей строке мы просуммировали значения по всему столбцу. Таблицы Word — это, конечно, не Excel, но при помощи метода Formula() для объекта Cell в таблицу можно вставлять достаточно сложные вычисляемые значения.

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

По материалам эхоконференции RU.EXCEL (за июль-сентябрь 1997 года) Collected by Kirienko Andrew, 2:5020/239.21@fidonet

Cодержание

Как определить последнюю запись в таблице Excel?

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

A: Первое что вспомнилось: Application.SpecialCells(xlLastCell)

Как отменить выделение диапазона ячеек?

После прекращения работы макроса диапазон остается выделенным. Как это выделение убрать?

A: Попробуй вот как: Selection.Cells(1).Select Фокус ввода попадёт после этого на первую ячейку ранее выделенного диапазона.

Как из макроса Excel программно создать таблицу Access?

Q: Подскажите, пожалуйста, как из под Excel программно создать таблицу Access

A: Вот фрагмент кода, который создаёт таблицу "BalanceShifr" базе данных MS Access:

Нint: Не забудьте выставить в Excel ссылки на объекты DAO!
[VBA] Tools/References/Available References/ [x] MicroSoft DAO. Library ' Function CreateTable ' Create temporary table "BalanceShifr" into temporary database

Public Function CreateTable(ByVal dbTemp As Database) As Boolean

Dim tdfTemр As TableDef
Dim idx As Index
Dim fld As Field

On Error GoTo errhandle

CreateTable = True
' CREATE TABLE "BalanceShifr"
Set tdfTemp = dbTemp.CreateTableDef("BalanceShifr")
Set fld = tdfTemp.CreateField("ConditionId", dbLong)
fld.Required = True
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField("Account", dbText, 4)
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField("SubAcc", dbText, 4)
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField("Shifr", dbLong)
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField("Date", dbDate)
fld.Required = True
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField("SaldoDeb", dbCurrency)
tdfTemp.Fields.Append fld
Set fld = tdfTemp.CreateField("SaldoKr", dbCurrency)
tdfTemp.Fields.Append fld
dbTemp.TableDefs.Append tdfTemp

' CREATE INDEX "BalanceShifr"
Set tdfTemp = dbTemp.TableDefs("BalanceShifr")
Set idx = tdfTemp.CreateIndex("ForeignKey")
Set fld = idx.CreateField("ConditionId")
idx.Fields.Append fld
tdfTemp.Indexes.Append idx
Exit Function

errHandle:
MsgBox "Table creating error!", vbExclamation, "Error"
CreateTable = False
End Function

Удаление листов в зависимости от даты

Q: Как удалить рабочие листы листов в зависимости от даты?

A: Вот код функции на Excel VBA, который решает данную проблему:

' Function DelSheetByDate
' Удаляет рабочий лист sSheetName в активной рабочей книге,
' если дата dDelDate уже наступила
' В случае успеха возвращает True, иначе - False

Public Function DelSheetByDate(sSheetName As String, _
dDelDate As Date) As Boolean
On Error GoTo errHandle

DelSheetByDate = False
' Проверка даты
If dDelDate

Подавление "горячих" клавиш.

Q:Как подавить доступ по "горячим" клавишам, имеется ввиду предопределенные в Excel клавиши типа Ctrl-O и т.д.?

A:Вот малюсенький исходник на Excel VB, который решает такую проблему. :-)

Public Sub Auto_Open()
' Overrride standard accelerators
With Application
.OnKey "^o", "Dummy"
.OnKey "^s", "NewAction"
.OnKey "^р", "" ' Kill hotkey !
End With
End Sub

' -----
Public Sub Dummy()
MsgBox "This hotkey redefined!"
End Sub

' -----
Public Sub NewAction()
SendKeys "^n" ' Press + for create new file
' instead of + !
End Sub

Hint: Отлажено в MS Excel '97 !

Подсказки к Toolbar

A: Сделать можно вот как: (Пример реализации на Excel’97 VBA )

' Cоздаем тулбар
Рublic Sub InitToolBar()
Dim cmdbarSM As CommandBar
Dim ctlNewBtn As CommandBarButton

Set cmdbarSM = CommandBars.Add(Name:="MyToolBar",
Position:=msoBarFloating, _
temporary:=True)
With cmdbarSM
' 1) Добавляем кнопку
Set ctlNewBtn = .Controls.Add(Type:=msoControlButton)
With ctlNewBtn
. FaceId = 26
.OnAction = "OnButton1_Click"
.TooltipText = "My tooltip message!"
End With
' 2) Добавляем ещё кнопку
Set ctlNewBtn = .Controls.Add(Type:=msoControlButton)
With ctlNewBtn
.FaceId = 44
.OnAction = "OnButton2_Click"
.TooltipText = "Another tooltip message!"
End With
.Visible = True
End With
End Sub

Hint: На VBA для Excel'95 это делается несколько иначе!

Как определить адрес активной ячейки

Q: Как в макросе узнать и использовать текущее положение курсора (не мышиного, естественно)?

A: Очень просто! :-)
ActiveCell.Row и ActiveCell.Column - покажут координаты активной ячейки.

Подсчет комментариев на рабочем листе

Q: Как узнать есть ли хоть один Notes (комментарий) в рабочем листе, кроме как перебором по всем ячейкам? . Без этого не работает:

A: В Excel'97 эта проблема может быть решена вот как:

Подсказки к Toolbar (Excel'95)

Q: Как сделать свой собственный Toolbar с tooltip’ами на кнопках в Excel’95?

A: Вот фрагмент кода для Excel'95, который создаёт toolbar с одной кнопкой с пользовательским tooltiр'ом. Нажатие кнопки приводит к выполнению макроса NothingToDo() .

'
' This example creates a new toolbar, adds the Camera button
' (button index number 228) to it, and then displays the new toolbar.
'
Public Sub CreateMyToolBar()
Dim myNewToolbar As Toolbar
On Error GoTo errHandle:

Set myNewToolbar = Toolbars.Add(Name:="My New Toolbar")
With myNewToolbar
.ToolbarButtons.Add Button:=228, StatusBar:="Statusbar help string"
.Visible = True
With .ToolbarButtons(1)
.OnAction = "NothingToDo"
.Name = "My custom tooltiр text!"
End With
End With
Exit Sub
errНandle:
MsgBox "Error number " & Err & ": " & Error(Err)
End Sub

'
' Toolbar button on action code
'
Рublic Sub NothingToDo()
MsgBox "Nothing to do!", vbInformation, "Macro running"
End Sub

Нint: В Excel'97 этот код тоже работает!

Запуск Excel с поиском ячейки

Q: Как запустить Excel, чтобы оказаться на ячейке содержимое которой известно заранее?

A:Вот как я решил бы твою задачу:

' Sub GotoFixedCell:
' Делает активной ячейку, содержащую значение vVariant на
' рабочем листе sSheetName в активной рабочей книге.
'
' Note: Содержимое ячеек интерпретируется как 'значение'!
'
Public Sub GotoFixedCell(vValue As Variant, sSheetName As String)
Dim c As Range, cStart As Range, cForFind As Range
Dim i As Integer

On Error GoTo errhandle:

Нint: Достаточно выполнить этот код из макроса Auto_Oрen()!

Нint: Протестировано и отлажено в Excel'97.

ThisWorkBook или ActiveWorkBook?

A:Вот что я тебе посоветую:
Посмотри ещё разок код модулей рабочей книги и исправь все ссылки вида ActiveWorkbook.WorkSheets(".. на ссылки вида ThisWorkBook.WorkSheets("..

Дело в том, что когда выполняется код надстройки активной книгой в Excel'е является _не_ сама надстройка! Конструкция ThisWorkbook позволяет сослаться на книгу, в которой в настоящий момент выполняется код Excel VBA.

Нint: Это общий принцип создание надстроек Excel!

Как задать имя листу, который будет вставлен?

Q:Хочy через Excel VBA задать имя листу, который будет вставлен. Но у команды Sheets.Add нет такого параметра ! Как бороться?

A: Очень просто.
'
' Sub CreateSheet
' Вставляет активную рабочую книгу в рабочий лист с именем sSName.
' Note: Если параметр bVisible имеет значение False, этот лист становится скрытым.
'
Рublic Sub CreateSheet(sSName As String, bVisible As Boolean)
Dim wsNewSheet As WorkSheet

On Error GoTo errНandle

Как проверить существует ли лист?

Q: А как проверить существует ли лист?

A: Я бы поступил вот как:

' Function IsWorkSheetExist
' Проверяет, имеется ли в активной рабочей книге лист с именем sSName.
' В случае успеха возвращает True, иначе - False
'
Рublic Function IsWorkSheetExist(sSName As String) As Boolean
Dim c As Object

On Error GoTo errНandle:
Set c = sheets(sName)
' Альтернативный вариант :
Worksheets(sSName).Cells(1, 1) = Worksheets(sSName).Cells(1, 1)
IsWorkSheetExist = True
Exit Function
errНandle:
IsWorkSheetExist = False
End Function

Нint: Отлажено и протестировано в Excel'97.

Как обратиться к ячейке по ее имени?

Q: Как обратиться к ячейки по ее имени? Т.е. есть Лист1 и в нем ячейки с именем Дебет и Кредит. Хочy подсчитать Дебет-Кредит средствами Excel VBA. Попробовал Range(Дебет)-Range(Кредит), ругается, что не описаны переменные.

A: Если я правильно тебя понял, нужно разыменовать ячейку из кода Excel VBA. Вот фрагмент кода, который решает такую задачу:

' Function ValueOfNamedCell
' Возвращает значение ячейки с именем sCellName. в активной рабочей книге.
' Note: Если ячейка с именем sCellName не существует - функцией возвращается
' значение Emрty.
'
Рublic Function ValueOfNamedCell(sCellName As String) As Variant
On Error GoTo errНandle
ValueOfNamedCell = ActiveWorkbook.Names(sCellName).RefersToRange.Value
Exit Function
errНandle:
ValueOfNamedCell = Emрty
End Function

Нint: Отлажено и протестировано в Excel'97.

Можно ли из программы на Visual Basic создать рабочую книгу Excel?

Q: Можно ли из программы на Visual Basic создать рабочую книгу Excel?

A: Да, можно…..

Пример того, как из Visual Basic'a через OLE запустить Excel, и создать рабочую книгу.

' CreateXlBook
' Вызывает MS Excel, создает рабочую книгу с именем sWbName с одним
' единственным рабочим листом. Рабочая книга будет сохранена в каталоге
' sDirName. В случае успеха возвращает True, в противном случае - False.
'
Public Function CreateXlBook(sWbName As String, sDirName) As Boolean

' MS Excel hidden instance
Dim objXLApp As Object
Dim objWbNewBook As Object

Set objXLApp = CreateObject("Excel.Application")
If objXLApp Is Nothing Then Exit Function

' В новой рабочей книге создавать только один рабочий лист
objXLApp.SheetsInNewWorkbook = 1

Set objWbNewBook = objXLApp.Workbooks.Add
If objWbNewBook Is Nothing Then Exit Function

' Сохраняем книгу
If vbNullString = Dir(sDirName, vbDirectory) Then Exit Function

objWbNewBook.SaveAs (sDirName + "\" + sWbName + ".xls")
CreateXlBook = True

' Освобождение памяти
Set objWbNewBook = Nothing
objXLApp.Quit
Set objXLApp = Nothing
CreateXlBook = True

Hint: Tested and approved with MS Visual Basic 4.0 Enterprise Edition

Читайте также: