95 / 91 / 16 Регистрация: 13.04.2015 Сообщений: 545 |
|
1 |
|
20.04.2017, 18:37. Показов 5033. Ответов 10
Всем привет! Помогите. пожалуйста. Есть ли способ определить координаты ячейки Excel? Абсолютные относительно монитора.
0 |
ovva 4278 / 3417 / 827 Регистрация: 02.02.2013 Сообщений: 3,307 Записей в блоге: 2 |
||||
21.04.2017, 00:27 |
2 |
|||
Речь, вероятно, идет о VBA. Попробуйте так
0 |
Aleks777 95 / 91 / 16 Регистрация: 13.04.2015 Сообщений: 545 |
||||
21.04.2017, 09:16 [ТС] |
3 |
|||
ovva, нет, нет речь идет именно о VB.net в VS2015 пишу. Добавлено через 6 минут
0 |
SoftIce es geht mir gut 11264 / 4746 / 1183 Регистрация: 27.07.2011 Сообщений: 11,437 |
||||
21.04.2017, 09:25 |
4 |
|||
А так?
0 |
95 / 91 / 16 Регистрация: 13.04.2015 Сообщений: 545 |
|
21.04.2017, 09:27 [ТС] |
5 |
SoftIce, забыл написать, с типами игрался тоже. При Integer ошибка та же.
0 |
es geht mir gut 11264 / 4746 / 1183 Регистрация: 27.07.2011 Сообщений: 11,437 |
|
21.04.2017, 09:33 |
6 |
При Integer ошибка та же А это — ByRef lpRect As RECT ?
1 |
95 / 91 / 16 Регистрация: 13.04.2015 Сообщений: 545 |
|
21.04.2017, 09:34 [ТС] |
7 |
SoftIce, прошу прощения, сразу не заметил.
0 |
es geht mir gut 11264 / 4746 / 1183 Регистрация: 27.07.2011 Сообщений: 11,437 |
|
21.04.2017, 09:34 |
8 |
что вообще должно заходить в GetClientRect? Да ничего не должно заходить, передаете пустую структуру по ссылке в GetClientRect.
0 |
95 / 91 / 16 Регистрация: 13.04.2015 Сообщений: 545 |
|
21.04.2017, 09:35 [ТС] |
9 |
SoftIce, сейчас в Paint’е проверю как отрабатывает))
0 |
95 / 91 / 16 Регистрация: 13.04.2015 Сообщений: 545 |
|
21.04.2017, 09:44 [ТС] |
10 |
SoftIce, либо оно криво отрабатывает, либо я не понимаю что есть ClientRect. Правильно понимаю (на картинке)? Миниатюры
0 |
es geht mir gut 11264 / 4746 / 1183 Регистрация: 27.07.2011 Сообщений: 11,437 |
|
21.04.2017, 09:57 |
11 |
Мне кажется, ABCDEF…. и 123456… туда тоже должны входить. А что не так?
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
21.04.2017, 09:57 |
Помогаю со студенческими работами здесь
Почему в Opera v12.0 координаты окна браузера относительно экрана window.screenX или window.screenY выдает 0? Вывести поточные координаты курсора мыши относительно формы и экрана, при нажатии на кнопку-реверсное изменение кнопок мыши C++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 11 |
Хочу получить координаты ячейки экселя на экране компьютера, написал маркос:
[SRC vba]Sub Position()
Dim t As Integer
Dim l As Integer
t = Range(«T56»).Top
l = Range(«T56»).Left
Range(«T56»).Value = Str(t) + «:» + Str(l)
End Sub[/SRC]
загнал T56 в самый нижний правый угол и вижу результат 756 на 912
у меня же разрешение монитора 1280 на 1024 те врет примерно в 1.4 раза интересно с чем это связано?
Положение верхнего левого угла Экселя 0,0 учет высоты ленты и статусной строки сделан.
Если нужно разрешение, то см. функции АПИ
почти по Уокенбаху
'объявление функции API
Declare Function GetSystemMetrics Lib "user32" (ByVal nindex As Long) As Long
Public Const x_ = 0
Public Const y_ = 1
Sub razr_()
l_ = GetSystemMetrics(x_)
h_ = GetSystemMetrics(y_)
[a1] = l_ & "x" & h_
End Sub
Скажи мне, кудесник, любимец ба’гов…
Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995
Может это связано с другим?
Как правило координаты ячеек задаются в Points (см. хелп)
1 point = 20 твипов = 1/72 дюйма
Масштаб экрана по умолчанию 96 точек(пикселей) на дюйм
Получается: 1 point = 96 / 72 пикселей = 4/3 пикселя
Т.е. теоретически, если домножить пиксели на 3/4 вы получите те самые Point-ы.
t = Range("T56").Top*3/4
Эта формула будет работать при условии, что Вы не поменяете масштаб экрана (Экран-Параметры — Дополнительно)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…
www.excel-vba.ru
Просто СПАСИБО [+оказать+]
Считаешь СПАСИБО мало? Яндекс.Деньги: 41001332272872; WM: R298726502453
так и решил через соотношение 72/96
На мой взгляд, если рисовать между ячейками линию с помощью
ActiveSheet.Shapes.AddLine(x1, y1, x2, y2).Select
то логичнее меджу ними нарисовать границу, которая привязана к ячейкам.
Ведь как бы мы не изменяли размеры ячеек граница всегда будет привязана к ячейкам, хотя линия тоже может быть привязана, если в свойствах формат объекта задать перемещать и изменять объект вместе с ячейками.
Что такое координаты ячейки? На мой взгляд это какое-то вымышленное понятие, ведь в Excel они не задаются линейными размерами, например милиметрами, дюймами, points, pixel и т.п.
Например, высота строки измеряется в линейных размерах, т.е. points (pt),
а вот ширина столбца измеряется средним количеством знаков от 0 до 9 для установленного по умолчанию стандартного шрифта( например Arial 10). И это вносит свои сложности.
Вот приведу, как я нарисовал рамку с помощью метода границ (недостаток, что код громоздким получается)
Sub Рамка()
Range(«B1:AH61»).Select
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
End Sub
Конечно рамку можно нарисовать с помощью ActiveSheet.Shapes.AddLine(x1, y1, x2, y2).Select или BuildFreeform и код будет короче выглядеть,
но если рисовать линию между ячейками границами будет выглядеть логичнее.
Private Structure RECT Dim Left As Integer Dim Top As Integer Dim Right As Integer Dim Bottom As Integer End Structure Private Declare Function GetClientRect Lib "user32" (ByVal hWnd As Integer, ByRef lpRect As RECT) As Integer Private Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Integer Sub GetWindowClientSize(ByVal hWnd As Integer) ', Width as integer, Height as integer) Dim rc As RECT Dim Width As Integer, Height As Integer GetClientRect(hWnd, rc) ' тут ошибка Width = rc.Right - rc.Left Height = rc.Bottom - rc.Top MsgBox(Width) MsgBox(Height) End Sub Public Sub test() Dim hWnd As IntPtr = GetForegroundWindow() GetWindowClientSize(hWnd) End Sub
Sub Adr()
x = ActiveCell.Left
y = ActiveCell.Top
MsgBox ActiveCell.Address(0, 0)
End Sub
»»»»»»»»»»»»»»»»»»
‘тип
‘левая позиция
‘верхняя позиция
‘ширина
‘высота
ActiveSheet.Shapes.AddShape(msoShapeOval, ActiveCell.Left, ActiveCell.Top, ActiveCell.Width, ActiveCell.Height).Select
Selection.ShapeRange.ShapeStyle = msoShapeStylePreset1
Selection.ShapeRange.Fill.Visible = msoFalse
»»»»»»»»»»»»»»»»»»»»»»»»»»
Как определить Адрес ячейки по ее координатам?
Ура, получилось, большое спасибо!
Вот так прикрутил к своему коду
With sShapes ‘Add shape properties
WsNew.Cells(lLoop + 1, 1) = .Name
WsNew.Cells(lLoop + 1, 2) = .OLEFormat.Object.Name
WsNew.Cells(lLoop + 1, 3) = .Height
WsNew.Cells(lLoop + 1, 4) = .Width
WsNew.Cells(lLoop + 1, 5) = .Left
WsNew.Cells(lLoop + 1, 6) = .Top
WsNew.Cells(lLoop + 1, 7) = .TopLeftCell.Address
Как с помощью VBA в Excel можно получить координаты определенной ячейки?
Как с помощью VBA получить значение с ячейки таблицы MS Word в переменую?
Как с помощью VBA получить значение с ячейки таблицы MS Word в переменую. Range(x,y).
Можно ли получить доступ к содержимому определенной ячейки стека по адресу?
Здравствуйте, скажите пожалуйста, могу вывести по определенному адресу из стека, при этом не теряя.
Получить значение последней записи ячейки определённого столбца VBA Excel
Приветствую форумчани подскажите кто может как получить последнюю записть определёного столбца q.
Можно ли с помощью формы в одной книге Excel вносить данные в ячейки двух книг?
Можно ли с помощью формы в одной книге Excel вносить данные в ячейки двух книг?
Как я понимаю, вопрос должен звучать так: ‘Как привязать объект к ячейке, т.е. как получить координаты ячейки в пикселях или других физ. величинах, а затем их использовать’?
На этот вопрос я ответа не знаю: сложение ширин столбцов (так же как и высот строк), например, требуемого результата не даёт.
Поступать нужно след. образом:
1.Определить адрес ячейки Cells(k, m).Address.
2.Пересчитать в циклах суммы Columns(i).Width и Rows(j).Height
от i = 1 до i = k — 1 (аналогично For j = 1 To m — 1)
3.X = СУММАi, Y = СУММАj,
ширина и высота картинки — по размерам ячейки, если это необходимо:
Picture.Width = Columns(m).Width, Picture.Height = Rows(k).Height
ThisWorkbook.Sheets(‘Лист1’).Shapes.AddPicture name_of_File, _
True, True, X, Y, cOLUMNS(nSTOLB).wIDTH, rOWS(nSTROK).hEIGHT
Здесь (Columns(Nstolb).Width, Rows(Nstrok).Height) размер рисунка
устанавливается равным размеру ячейки и соответственно, центрируется.
Что-то не устраивает?
Вот так всё работает. Правда. длинновато получилось
Уважаемый, почему молчим? Погряз, решая задачу оптимизации?
Молчание удивительно, поскольку то, что я второпях набросал,
содержит несколько ошибок, что, конечно работоспособности коду не добавляет (типы объявленных переменных Long вместо Double,
использование переменной ‘i’ вместо ‘j’ в цикле
‘For j = Nstolb To Nstolb1’).
Держи протестированный вариант. Определение границ объединённой
ячейки теперь возложено на строковые функции, дабы ускорить
выполнение программы.
Убрано всё ‘лишнее’. Теперь код короткий, прозрачный и быстрый.
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.
Как программно определить фон определенной ячейки Excel?
Как программно определить фон определенной ячейки Excel. Заранее спасибо.
Как получить координаты определенной вкладки в QTabBar?
Я хочу получить QRect определенной вкладки в QTabBar, то есть её координаты и ширину с высотой.
Как извлечь текст примечания из определенной ячейки листа Excel?
Приложение работает с документом Excel. Как извлечь текст примечания из определенной ячейки листа.
Как получить при нажатии координаты определённой программы?
Нажав мышкой где-то на другой windows программе, получить той программы x и y, не самого windows, а.
Чтение и запись значения ячейки в VBA
В приложении Excel все данные как правило находятся в ячейках на листах, с которыми макросы работают как с базой данных. Поэтому, начинающему программисту VBA важно понимать как читать значения из ячейки Excel в переменные или массивы и, наоборот, записывать какие-либо значения на лист в ячейки.
Обращение к конкретной ячейке
Прежде чем читать или записывать значение в ячейке, нужно определиться с тем, как можно указать какая именно ячейка нам необходима.
Полный путь к ячейке A1 в Книге1 на Листе1 можно записать двумя вариантами:
- С помощью Range
- С помощью Cells
Пример 1: Обратиться к ячейке A3 находящейся в Книге1 на Листе1
Однако, как правило, полный путь редко используется, т.к. макрос работает с Книгой, в которой он записан и часто на активном листе. Поэтому путь к ячейке можно сократить и написать просто:
Пример 2: Обратиться к ячейке A1 в текущей книге на активном листе
Если всё же путь к книге или листу необходим, но не хочется его писать при каждом обращении к ячейкам, можно использовать конструкцию With End With. При этом, обращаясь к ячейкам, необходимо использовать в начале «.» (точку).
Пример 3: Обратиться к ячейке A1 и B1 в Книге1 на Листе2.
Так же, можно обратиться и к активной (выбранной в данный момент времени) ячейке.
Пример 4: Обратиться к активной ячейке на Листе3 текущей книги.
Чтение значения из ячейки
Есть 3 способа получения значения ячейки, каждый из которых имеет свои особенности:
- Value2 — базовое значение ячейки, т.е. как оно хранится в самом Excel-е. В связи с чем, например, дата будет прочтена как число от 1 до 2958466, а время будет прочитано как дробное число. Value2 — самый быстрый способ чтения значения, т.к. не происходит никаких преобразований.
- Value — значение ячейки, приведенное к типу ячейки. Если ячейка хранит дату, будет приведено к типу Date. Если ячейка отформатирована как валюта, будет преобразована к типу Currency (в связи с чем, знаки с 5-го и далее будут усечены).
- Text — визуальное отображение значения ячейки. Например, если ячейка, содержит дату в виде «число месяц прописью год», то Text (в отличие от Value и Value2) именно в таком виде и вернет значение. Использовать Text нужно осторожно, т.к., если, например, значение не входит в ячейку и отображается в виде «#####» то Text вернет вам не само значение, а эти самые «решетки».
По-умолчанию, если при обращении к ячейке не указывать способ чтения значения, то используется способ Value.
Пример 5: В ячейке A1 активного листа находится дата 01.03.2018. Для ячейки выбран формат «14 марта 2001 г.». Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.
Пример 6: В ячейке С1 активного листа находится значение 123,456789. Для ячейки выбран формат «Денежный» с 3 десятичными знаками. Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.
При присвоении значения переменной или элементу массива, необходимо учитывать тип переменной. Например, если оператором Dim задан тип Integer, а в ячейке находится текст, при выполнении произойдет ошибка «Type mismatch». Как определить тип значения в ячейке, рассказано в следующей статье.
Пример 7: В ячейке B1 активного листа находится текст. Прочитать значение ячейки в переменную.
Таким образом, разница между Text, Value и Value2 в способе получения значения. Очевидно, что Value2 наиболее предпочтителен, но при преобразовании даты в текст (например, чтобы показать значение пользователю), нужно использовать функцию Format.
Запись значения в ячейку
Осуществить запись значения в ячейку можно 2 способами: с помощью Value и Value2. Использование Text для записи значения не возможно, т.к. это свойство только для чтения.
Пример 8: Записать в ячейку A1 активного листа значение 123,45
Все три строки запишут в A1 одно и то же значение.
Пример 9: Записать в ячейку A2 активного листа дату 1 марта 2018 года
В данном примере тоже запишется одно и то же значение в ячейку A2 активного листа.
Визуальное отображение значения на экране будет зависеть от того, какой формат ячейки выбран на листе.
Объекты MS Excel
Аргументы задают координаты интервала:
- Cell1 — единственная ячейка (строка или столбец), задающая левый верхний угол интервала;
- Cell2 — единственная ячейка (строка или столбец), задающая правый нижний угол интервала. Необязательный аргумент.
Допустимо задание аргументов переменными, выражениями, свойствами или методами, представляющими объект Range — одну ячейку, одну строку или один столбец рабочего листа .
- Если свойство Range применяется к объекту Range , то ссылка на интервал ячеек считается относительной и возвращается смещенный объект Range .
Например, если выделен интервал C1:D5, то запись Selection.Range(«B2») возвратит ячейку D2.
Свойство Cells
Свойство Cells возвращает единственную ячейку рабочего листа , которая находится на пересечении строки и столбца, задаваемых целыми числами.
Синтаксис object. Cells (RowIndex,ColumnIndex)
- object — ссылка на объект. Ссылка необязательна. По умолчанию используется активный лист;
- RowIndex — индекс строки;
- ColumnIndex — индекс столбца.
- В свойстве Cells индекс строки является первым аргументом, а индекс столбца — вторым аргументом, тогда как при задании адреса ячейки в стиле A1 сначала указывается столбец, а затем строка.
- Понятие «индекс» ( Index, ColumnIndex, RowIndex ) всегда подразумевает целое число, целочисленную переменную или выражение, результат вычисления которого есть целое число или может быть преобразован в целое число.
Свойство Offset
Свойство Offset позволяет задавать ячейки или интервалы при помощи числа строк и колонок, которые отделяют нужную ячейку от исходной ячейки, т.е. указывая смещение относительно выбранной ячейки. Например, Range(«A5»).Offset(-2,1) возвращает ячейку B3.
- object — ссылка на объект Range . Ссылка обязательна и определяет объект, относительно которого задается смещение;
- RowOffset — смещение строки искомой ячейки относительно исходной ячейки;
- ColumnOffset — смещение столбца искомой ячейки относительно исходной ячейки.
Необязательные аргументы RowOffset и ColumnOffset — числовые выражения. Если какой-то аргумент не задан, то соответствующее смещение равно нулю.
Например, если выделен интервал C1:D5, то запись Selection.Offset(2,1).Select выделяет интервал D3:E7.
Метод Union и свойство Areas
Метод Union используется для объединения двух и более объектов Range , заданных ссылками на непересекающиеся интервалы, в один объект Range .
Синтаксис Object. Union (arg1,arg2. )
- object — всегда объект Application . Ссылка необязательна;
- arg1,arg2 — интервалы ячеек. Количество аргументов произвольно. Обязательно наличие хотя бы двух аргументов.
Например, оператор Union (Range(«A1:C5»),Range(«B10:D12»)).Select выделяет несмежные интервалы A1:C5 и B10:D12.
Свойство Areas выполняет обратное действие, разделяя объединенные интервалы на несколько объектов Range .
- object — ссылка на объект Range , состоящий из нескольких интервалов;
- index — номер интервала в объекте. Аргумент необязателен.
Свойства Column и Row (R/O Integer)
Свойства возвращают целое число, показывающее индекс первого столбца или первой строки соответственно для заданного объекта. Синтаксис свойств
- object — обязательная ссылка на объект Range .
Например, запись Range(«C5»).Column возвращает число 3, а запись Range(«C5»).Row возвращает число 5.
Свойства Columns и Rows
Свойство Columns (не путайте со свойством Column !) возвращает объект Range , представляющий колонку или коллекцию колонок в объекте, к которому это свойство было применено.
- object — ссылка на объект. Указание необязательно, по умолчанию используется активный рабочий лист ;
- index — индекс колонки в объекте.
Например, запись Columns(1) возвращает колонку A активного рабочего листа , а запись Range(«C1:D5»).Columns(1) возвращает колонку C заданного интервала, а именно, ячейки C1:C5.
- Если не указан индекс колонки, то возвращаются все колонки объекта в виде объекта Range .
- Индекс колонки можно указывать числом или буквой, при этом буква заключается в кавычки. Ссылки Columns(2) и Columns(«B») указывают на одну и ту же колонку B.
Свойство Rows (не путайте со свойством Row !) возвращает объект Range , представляющий строку или коллекцию строк в объекте, к которому это свойство было применено.
- object — ссылка на объект. Указание необязательно, по умолчанию используется активный рабочий лист ;
- index — индекс строки в объекте.
- Если не указан номер строки, то возвращаются все строки объекта в виде объекта Range .
Например, оператор nr=Selection.Rows(Selection.Rows.Count).Row позволяет получить номер последней строки в выделенном интервале ячеек.
Свойство CurrentRegion
Свойство CurrentRegion определяет объект Range , который соответствует интервалу ячеек, включающему заданную ячейку.
В процедуре сравниваются значения первой ячейки первой строки и первой ячейки каждой следующей строки заполненного данными интервала, включающего первую ячейку. Если значения совпадают, то очередная строка удаляется.
Предполагается, что данные начинаются с ячейки A1 и занимают несколько строк и столбцов, при этом расположены не плотно, т.е. внутри интервала с данными могут находиться пустые строки или пустые столбцы. Анализируются только строки заполненного данными интервала ячеек вокруг ячейки A1, не содержащего пустых строк и столбцов.
Vba excel координаты ячейки
По материалам эхоконференции RU.EXCEL (за июль-сентябрь 1997 года) Collected by Kirienko Andrew, 2:5020/239.21@fidonet
Cодержание
Как определить последнюю запись в таблице Excel?
Q: Необходимо найти последнюю запись вэлектронной таблице. Какой функцией VB это можно было бы организовать.
A: Первое что вспомнилось: Application.SpecialCells(xlLastCell)
Как отменить выделение диапазона ячеек?
Q: Как управиться с такой болячкой:
После прекращения работы макроса диапазон остается выделенным. Как это выделение убрать?
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
Q: Как сделать к «само нарисованным» кнопочкам на Toolbar’е подсказки? (Ну, те, что после 2-х секунд молчания мышки появляются)
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 эта проблема может быть решена вот как:
‘ Function IsCommentsPresent
‘ Возвращает TRUE, если на активном рабочем листе имеется хотя бы
‘ одна ячейка с комментарием, иначе возвращает FALSE
‘
Public Function IsCommentsPresent() As Boolean
IsCommentsPresent = ( ActiveSheet.Comments.Count <> 0 )
End Function
Подсказки к 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:
Set cForFind = Worksheets(sSheetName).Cells ‘ Диапазон поиска
With cForFind
Set c = .Find(What:=vValue, After:=ActiveCell, LookIn:=xlValues, _
LookAt:= xlРart, SearchOrder:=xlByRows,_
SearchDirection:=xlNext, MatchCase:=False)
Set cStart = c
While Not c Is Nothing
Set c = .FindNext(c)
If c.Address = cStart.Address Then
c.Select
Exit Sub
End If
Wend
End With
Exit Sub
errНandle:
MsgBox Err.Descriрtion, vbExclamation, «Error #» & Err.Number
End Sub
Нint: Достаточно выполнить этот код из макроса Auto_Oрen()!
Нint: Протестировано и отлажено в Excel’97.
ThisWorkBook или ActiveWorkBook?
Q: На листе модулей открытой рабочей книги присутствует процедура, которая копирует некий лист из другой (не активной) рабочей книги. В этом листе в некоторых ячейках находятся определенные пользователем формулы. Процедура работает без проблем.
Из workbook, содержащей эту процедуру, я делаю надстройку (.xla) и подключаю ее к Excel 95. При вызове вышеописанной процедуры она выдает сообщение:
Run time error 424 object required
Kак можно избежать это сообщение?
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
Set wsNewSheet = ActiveWorkBook.Worksheets.Add
With wsNewSheet
.Name = sSName
.Visible = bVisible
End With
Exit Sub
errНandle:
MsgBox Err.Descriрtion, vbExclamation, «Error #» & Err.Number
End Sub
Как проверить существует ли лист?
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?
Пример того, как из 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
Вопрос 19. VBA. Адресация ячеек в Excel. Ссылка на одиночную ячейку.
Адресация ячеек в экселе.
в эксель ячейка строка столбец и диапазон ячеек рассматривается как один обьект Range иногда для обозначения ячейки используется cells для ссылки используется два формата. формат а1-обычный. ссылка состояит из имени столбца и номера строки, например д4
ссылка может быть относительной и абсолютной, она может указывать диапазон ячеек, полный адрес диапазона может включать имя раб. листа
R1 и C1 в данном формате R задает номер строки C номер столбца, ссылка является абсотной. для указания относительной ссылки, задается смещение по отношению к активной ячейке, смещение указывается в квадратных скобках, знак указывает направление смещения.
Ссылка на одиночную ячейку имеет вид [ обьект.] Range
например workSheets(лист1) . Range(» A7″)=34
Cells используется для доступа к отдельной ячейке, в качестве аргументов указыв. номер строки и столбца
например, для ввода числа 34 неоходима команда sheets(1). cells(7,1). Value=34
номер строки и столбца могут задаваться с помощью переменных
для этого напишем процедуру с неявным обьявлением переменных где j- номер строки i-номер столбца.
Операторы, выражения и операции
различают простые операторы , записываемые в одну строку и сложные. самые простые операторы это операторы присваемые, используются для присвоения переменной нужного значения
операторы условия IF используются если нужно выполнить какие то действия взависимости от условия, синтаксическая конструкция этого оператора может иметь две формы:
1.безальтернативную-IF условие THEN
2 альтернативную -IF условие ELSE
Если условие принимает значение истина, то выполняется команды оператор 1
если условие принимает значение лож, то выполняются команды оператор2
Вопрос №20 VBA. Условный оператор. Примеры.
Вопрос №21. VBA. Циклы. Примеры.
Операторы циклов.
цикл со счетчиком
For Счётчик цикла=НачальноеЗначение
To
КонечноеЗначение [Step Шаг]
Операторы
[Exit For]
Next [счетчик цикла]
Цикл-это группа операторов, которые прогрмамма многократно выполняет
В вба существует два основных типов цикла:
-циклы со счетчиком
-циклы с условием
Step(шаг)-число, задающее шаг цикла,т.е. значение на которое увеличивается или уменьшается значение счетчика на каждом шаге. это число может быть отрицательным(в этом случае шаг будет уменьшаться), если слово step отсутствует, то значение шага равно 1.
Exit For-оператор досрочного выхода из цикла необязательный
Next-окончание цикла
Пример 1. Просуммировать четные числа натурального ряда до50 включительно, сумму плместить в ячейку рабочего листа excel
Sub sum()
Dim f As Integer, sum As Integer sum=0
For f=2 To 50 Step 2
sum=sum+f
Next
Range(«A1»).Value=sum
End sub
Главной особенностью циклов с условием является условие, которое может принимать значение истины или лжи.
В вба есть 2 основных типа циклов с условием:
-Do While. Loop (цикл с предусловием)
-Do Until..Loop (цикл с постусловием)
Цикл с предусловием
Do While/Until выражение
Операторы
[Exit do]
Loop
Цикл с постусловием
Вo
операторы
[Exit Do]
Loop While/Until выражение
В первом случае условие задается в операторе начала цикла, во втором — в операторе конца цикла
Do, Loop— ключевые слова, обозначающие начало и конец цикла
While, Until-ключевые слова определяющие тип цикла
Цикл Do While выполняется до тех пор, пока условие имеет значение истинf
Цикл Do Until выполняется до тех пор, пока условие имеет значение ложь
Exit do-принудительный выход из цикла
Пример 2. Написать программу, суммирующую на рабочем листе Excel. Выпуск продукции значения ежедневных прибылей из столбца D и помещающую результат в отдельную ячейку с поясняющей надписью, как показано на рисунке.
Can anyone tell me how to improve this macro?
All the macro does is it just reads an Excel file for a list a accounts to update in an application (SmarTerm Beta). It technically already accomplishes the goal, but is there a way to code it so that while it’s reading the Excel file, the coordinates of the cells from which to read the account numbers and also the coordinates of the cells in which to write an output don’t depend on a «pre-selected» a cell? The risk with selecting a cell is that if someone were to accidentally select a different cell while the macro is running, everything will get screwed up.
Here’s my current code:
Public oExcelObj As Object
Function WaitSystem(Optional NoDialog as Variant) As Boolean
Dim nContinue as Integer
Dim nTimeOut as Integer 'In seconds.
'The default timeout for each command is 3 minutes.
'Increase this value if your host requires more time
'for each command.
nTimeOut = 10
If IsMissing(NoDialog) then NoDialog = False
'Wait for response from host.
Session.EventWait.Timeout = nTimeOut
Session.EventWait.EventType = smlPAGERECEIVED
Session.EventWait.MaxEventCount = 1
WaitSystem = True
If Session.EventWait.Start = smlWAITTIMEOUT Then
If NoDialog Then
WaitSystem = False
Else
nContinue = QuerySyncError()
If nContinue <> ebYes then WaitSystem = False
End If
End If
Set LockStep = Nothing
End Function
'Establish link. Search for Excel.
Function OleLinkConnection
Const XlMaximized = &HFFFFEFD7
Titlebar$ = AppFind$("Microsoft Excel")
If Titlebar$ <> "" Then
bIsExcelActive = True
If AppGetState(Titlebar$) = ebMinimized Then
AppSetState 2, Titlebar$
End If
Else
bIsExcelActive = False
End If
If bIsExcelActive Then
'Create Excel Object using current instance of Excel.
Set oExcelObj = GetObject(, "Excel.Application")
Else
'Create Excel Object using a new instance of Excel.
Set oExcelObj = CreateObject("Excel.Application")
End If
Version = oExcelObj.Application.Version
oExcelObj.ScreenUpdating = True
oExcelObj.Displayalerts = True
oExcelObj.Visible = true
End Function
Sub JPBmacro
Dim AccountNumber As String
Dim Temp As Integer
Begin Dialog StartDialogTemplate ,,211,74,"Run JPBmacro?"
OKButton 60,12,92,20,.Proceed
CancelButton 60,40,92,20,.Exit
End Dialog
Dim StartDialog As StartDialogTemplate
r% = Dialog(StartDialog)
If r% = 0 Then End
g$ = "G:DATAoutputfile.xlsx"
oleCode = OleLinkConnection
oExcelObj.Workbooks.Open g$
oExcelObj.Range("A1").Select ‘<----This selects the cell from which all coordinates are based off of. The coordinates of oExcelObj.ActiveCell.Offset(Y,X).Value VBA depend on selecting a cell.
NEXTACCOUNT:
Temp = 0
AccountNumber = oExcelObj.ActiveCell.Offset(Temp,0).Value
While AccountNumber <> ""
Session.SendKey "CLEAR"
If WaitSystem = False Then End
Session.Send "ACTU " & AccountNumber
Session.SendKey "ENTER"
If WaitSystem = False Then End
If Trim(Session.ScreenText(4,6,1,22)) = "INVALID ACCOUNT NUMBER" Or Trim(Session.ScreenText(4,6,1,19)) = "ACCOUNT NOT ON FILE" Then
oExcelObj.ActiveCell.Offset(Temp,1).Value = Trim(Session.ScreenText(4,6,1,22))
GoTo RESTARTLOOP
End If
UPDATEIOV:
If Trim(Session.ScreenText(13,76,1,1)) = "Y" Then
oExcelObj.ActiveCell.Offset(Temp,1).Value = "Account already flagged as institutional."
Else
Session.Row = 13
Session.Column = 76
Session.send "Y"
Session.SendKey "ENTER"
If WaitSystem = False Then End
oExcelObj.ActiveCell.Offset(Temp,1).Value = Trim(Session.ScreenText(24,2,1,50))
End If
RESTARTLOOP:
Temp = Temp + 1
AccountNumber = oExcelObj.ActiveCell.Offset(Temp,0).Value
Wend
ENDNOW:
oExcelObj.Workbooks.Close
MsgBox "All Done!"
End Sub