Обращение к ячейке на листе Excel из кода VBA по адресу, индексу и имени. Чтение информации из ячейки. Очистка значения ячейки. Метод ClearContents объекта Range.
Обращение к ячейке по адресу
Допустим, у нас есть два открытых файла: «Книга1» и «Книга2», причем, файл «Книга1» активен и в нем находится исполняемый код VBA.
В общем случае при обращении к ячейке неактивной рабочей книги «Книга2» из кода файла «Книга1» прописывается полный путь:
Workbooks(«Книга2.xlsm»).Sheets(«Лист2»).Range(«C5») Workbooks(«Книга2.xlsm»).Sheets(«Лист2»).Cells(5, 3) Workbooks(«Книга2.xlsm»).Sheets(«Лист2»).Cells(5, «C») Workbooks(«Книга2.xlsm»).Sheets(«Лист2»).[C5] |
Удобнее обращаться к ячейке через свойство рабочего листа Cells(номер строки, номер столбца), так как вместо номеров строк и столбцов можно использовать переменные. Обратите внимание, что при обращении к любой рабочей книге, она должна быть открыта, иначе произойдет ошибка. Закрытую книгу перед обращением к ней необходимо открыть.
Теперь предположим, что у нас в активной книге «Книга1» активны «Лист1» и ячейка на нем «A1». Тогда обращение к ячейке «A1» можно записать следующим образом:
ActiveCell Range(«A1») Cells(1, 1) Cells(1, «A») [A1] |
Точно также можно обращаться и к другим ячейкам активного рабочего листа, кроме обращения ActiveCell, так как активной может быть только одна ячейка, в нашем примере – это ячейка «A1».
Если мы обращаемся к ячейке на неактивном листе активной рабочей книги, тогда необходимо указать этот лист:
‘по основному имени листа Лист2.Cells(2, 7) ‘по имени ярлыка Sheets(«Имя ярлыка»).Cells(3, 8) |
Имя ярлыка может совпадать с основным именем листа. Увидеть эти имена можно в окне редактора VBA в проводнике проекта. Без скобок отображается основное имя листа, в скобках – имя ярлыка.
Обращение к ячейке по индексу
К ячейке на рабочем листе можно обращаться по ее индексу (порядковому номеру), который считается по расположению ячейки на листе слева-направо и сверху-вниз.
Например, индекс ячеек в первой строке равен номеру столбца. Индекс ячеек во второй строке равен количеству ячеек в первой строке (которое равно общему количеству столбцов на листе, зависящему от версии Excel) плюс номер столбца. Индекс ячеек в третьей строке равен количеству ячеек в двух первых строках плюс номер столбца. И так далее.
Для примера, Cells(4) та же ячейка, что и Cells(1, 4). Используется такое обозначение редко, тем более, что у разных версий Excel может быть разным количество столбцов и строк на рабочем листе.
По индексу можно обращаться к ячейке не только на всем рабочем листе, но и в отдельном диапазоне. Нумерация ячеек осуществляется в пределах заданного диапазона по тому же правилу: слева-направо и сверху-вниз. Вот индексы ячеек диапазона Range(«A1:C3»):
Обращение к ячейке Range("A1:C3").Cells(5)
соответствует выражению Range("B2")
.
Обращение к ячейке по имени
Если ячейке на рабочем листе Excel присвоено имя (Формулы –> Присвоить имя), то обращаться к ней можно по присвоенному имени.
Допустим одной из ячеек присвоено имя – «Итого», тогда обратиться к ней можно – Range("Итого")
.
Запись информации в ячейку
Содержание ячейки определяется ее свойством «Value», которое в VBA Excel является свойством по умолчанию и его можно явно не указывать. Записывается информация в ячейку при помощи оператора присваивания «=»:
Cells(2, 4).Value = 15 Cells(2, 4) = 15 Range(«A1») = «Этот текст записываем в ячейку» ActiveCell = 28 + 10*36 |
Вместе с числами и текстом можно использовать переменные. Примеры здесь и ниже приведены для активного листа. Для неактивных листов дополнительно необходимо указывать имя листа, как в разделе «Обращение к ячейке».
Чтение информации из ячейки
Считать информацию из ячейки в переменную можно также при помощи оператора присваивания «=»:
Sub Test() Dim a1 As Integer, a2 As Integer, a3 As Integer Range(«A3») = 6 Cells(2, 5) = 15 a1 = Range(«A3») a2 = Cells(2, 5) a3 = a1 * a2 MsgBox a3 End Sub |
Точно также можно обмениваться информацией между ячейками:
Cells(2, 2) = Range(«A4») |
Очистка значения ячейки
Очищается ячейка от значения с помощью метода ClearContents. Кроме того, можно присвоить ячейке значение нуля. пустой строки или Empty:
Cells(10, 2).ClearContents Range(«D23») = 0 ActiveCell = «» Cells(5, «D») = Empty |
В приложении Excel все данные как правило находятся в ячейках на листах, с которыми макросы работают как с базой данных. Поэтому, начинающему программисту VBA важно понимать как читать значения из ячейки Excel в переменные или массивы и, наоборот, записывать какие-либо значения на лист в ячейки.
Обращение к конкретной ячейке
Прежде чем читать или записывать значение в ячейке, нужно определиться с тем, как можно указать какая именно ячейка нам необходима.
Полный путь к ячейке A1 в Книге1 на Листе1 можно записать двумя вариантами:
- С помощью Range
- С помощью Cells
Пример 1: Обратиться к ячейке A3 находящейся в Книге1 на Листе1
Workbooks("Книга1.xls").Sheets("Лист1").Range("A3") ' Обратиться к ячейке A3 Workbooks("Книга1.xls").Sheets("Лист1").Cells(3, 1) ' Обратиться к ячейке в 3-й строке и 1-й колонке (A3)
Однако, как правило, полный путь редко используется, т.к. макрос работает с Книгой, в которой он записан и часто на активном листе. Поэтому путь к ячейке можно сократить и написать просто:
Пример 2: Обратиться к ячейке A1 в текущей книге на активном листе
Range("A1") Cells(1, 1)
Если всё же путь к книге или листу необходим, но не хочется его писать при каждом обращении к ячейкам, можно использовать конструкцию With End With. При этом, обращаясь к ячейкам, необходимо использовать в начале «.» (точку).
Пример 3: Обратиться к ячейке A1 и B1 в Книге1 на Листе2.
With Workbooks("Книга1").Sheets("Лист2") ' Вывести значение ячейки A1, которая находится на Листе2 MsgBox .Range("A1") ' Вывести значение ячейки B1, которая находится на Листе2 MsgBox .Range("B1") End With
Так же, можно обратиться и к активной (выбранной в данный момент времени) ячейке.
Пример 4: Обратиться к активной ячейке на Листе3 текущей книги.
Application.ActiveCell ' полная запись ActiveCell ' краткая запись
Чтение значения из ячейки
Есть 3 способа получения значения ячейки, каждый из которых имеет свои особенности:
- Value2 — базовое значение ячейки, т.е. как оно хранится в самом Excel-е. В связи с чем, например, дата будет прочтена как число от 1 до 2958466, а время будет прочитано как дробное число. Value2 — самый быстрый способ чтения значения, т.к. не происходит никаких преобразований.
- Value — значение ячейки, приведенное к типу ячейки. Если ячейка хранит дату, будет приведено к типу Date. Если ячейка отформатирована как валюта, будет преобразована к типу Currency (в связи с чем, знаки с 5-го и далее будут усечены).
- Text — визуальное отображение значения ячейки. Например, если ячейка, содержит дату в виде «число месяц прописью год», то Text (в отличие от Value и Value2) именно в таком виде и вернет значение. Использовать Text нужно осторожно, т.к., если, например, значение не входит в ячейку и отображается в виде «#####» то Text вернет вам не само значение, а эти самые «решетки».
По-умолчанию, если при обращении к ячейке не указывать способ чтения значения, то используется способ Value.
Пример 5: В ячейке A1 активного листа находится дата 01.03.2018. Для ячейки выбран формат «14 марта 2001 г.». Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.
MsgBox Cells(1, 1) ' выведет 01.03.2018 MsgBox Cells(1, 1).Value ' выведет 01.03.2018 MsgBox Cells(1, 1).Value2 ' выведет 43160 MsgBox Cells(1, 1).Text ' выведет 01 марта 2018 г. Dim d As Date d = Cells(1, 1).Value2 ' числовое представление даты преобразуется в тип Date MsgBox d ' выведет 01.03.2018
Пример 6: В ячейке С1 активного листа находится значение 123,456789. Для ячейки выбран формат «Денежный» с 3 десятичными знаками. Необходимо прочитать значение ячейки всеми перечисленными выше способами и отобразить в диалоговом окне.
MsgBox Range("C1") ' выведет 123,4568 MsgBox Range("C1").Value ' выведет 123,4568 MsgBox Range("C1").Value2 ' выведет 123,456789 MsgBox Range("C1").Text ' выведет 123,457р. Dim c As Currency c = Range("C1").Value2 ' значение преобразуется в тип Currency MsgBox c ' выведет 123,4568 Dim d As Double d = Range("C1").Value2 ' значение преобразуется в тип Double MsgBox d ' выведет 123,456789
При присвоении значения переменной или элементу массива, необходимо учитывать тип переменной. Например, если оператором Dim задан тип Integer, а в ячейке находится текст, при выполнении произойдет ошибка «Type mismatch». Как определить тип значения в ячейке, рассказано в следующей статье.
Пример 7: В ячейке B1 активного листа находится текст. Прочитать значение ячейки в переменную.
Dim s As String Dim i As Integer s = Range("B1").Value2 ' успех i = Range("B1").Value2 ' ошибка
Таким образом, разница между Text, Value и Value2 в способе получения значения. Очевидно, что Value2 наиболее предпочтителен, но при преобразовании даты в текст (например, чтобы показать значение пользователю), нужно использовать функцию Format.
Запись значения в ячейку
Осуществить запись значения в ячейку можно 2 способами: с помощью Value и Value2. Использование Text для записи значения не возможно, т.к. это свойство только для чтения.
Пример 8: Записать в ячейку A1 активного листа значение 123,45
Range("A1") = 123.45 Range("A1").Value = 123.45 Range("A1").Value2 = 123.45
Все три строки запишут в A1 одно и то же значение.
Пример 9: Записать в ячейку A2 активного листа дату 1 марта 2018 года
Cells(2, 1) = #3/1/2018# Cells(2, 1).Value = #3/1/2018# Cells(2, 1).Value2 = #3/1/2018#
В данном примере тоже запишется одно и то же значение в ячейку A2 активного листа.
Визуальное отображение значения на экране будет зависеть от того, какой формат ячейки выбран на листе.
Всё о работе с ячейками в Excel-VBA: обращение, перебор, удаление, вставка, скрытие, смена имени.
Содержание:
Table of Contents:
- Что такое ячейка Excel?
- Способы обращения к ячейкам
- Выбор и активация
- Получение и изменение значений ячеек
- Ячейки открытой книги
- Ячейки закрытой книги
- Перебор ячеек
- Перебор в произвольном диапазоне
- Свойства и методы ячеек
- Имя ячейки
- Адрес ячейки
- Размеры ячейки
- Запуск макроса активацией ячейки
2 нюанса:
- Я почти везде стараюсь использовать ThisWorkbook (а не, например, ActiveWorkbook) для обращения к текущей книге, в которой написан этот код (считаю это наиболее безопасным для новичков способом обращения к книгам, чтобы случайно не внести изменения в другие книги). Для экспериментов можете вставлять этот код в модули, коды книги, либо листа, и он будет работать только в пределах этой книги.
- Я использую английский эксель и у меня по стандарту листы называются Sheet1, Sheet2 и т.д. Если вы работаете в русском экселе, то замените Thisworkbook.Sheets(«Sheet1») на Thisworkbook.Sheets(«Лист1»). Если этого не сделать, то вы получите ошибку в связи с тем, что пытаетесь обратиться к несуществующему объекту. Можно также заменить на Thisworkbook.Sheets(1), но это менее безопасно.
Что такое ячейка Excel?
В большинстве мест пишут: «элемент, образованный пересечением столбца и строки». Это определение полезно для людей, которые не знакомы с понятием «таблица». Для того, чтобы понять чем на самом деле является ячейка Excel, необходимо заглянуть в объектную модель Excel. При этом определения объектов «ряд», «столбец» и «ячейка» будут отличаться в зависимости от того, как мы работаем с файлом.
Объекты в Excel-VBA. Пока мы работаем в Excel без углубления в VBA определение ячейки как «пересечения» строк и столбцов нам вполне хватает, но если мы решаем как-то автоматизировать процесс в VBA, то о нём лучше забыть и просто воспринимать лист как «мешок» ячеек, с каждой из которых VBA позволяет работать как минимум тремя способами:
- по цифровым координатам (ряд, столбец),
- по адресам формата А1, B2 и т.д. (сценарий целесообразности данного способа обращения в VBA мне сложно представить)
- по уникальному имени (во втором и третьем вариантах мы будем иметь дело не совсем с ячейкой, а с объектом VBA range, который может состоять из одной или нескольких ячеек). Функции и методы объектов Cells и Range отличаются. Новичкам я бы порекомендовал работать с ячейками VBA только с помощью Cells и по их цифровым координатам и использовать Range только по необходимости.
Все три способа обращения описаны далее
Как это хранится на диске и как с этим работать вне Excel? С точки зрения хранения и обработки вне Excel и VBA. Сделать это можно, например, сменив расширение файла с .xls(x) на .zip и открыв этот архив.
Пример содержимого файла Excel:
Далее xl -> worksheets и мы видим файл листа
Содержимое файла:
То же, но более наглядно:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac xr xr2 xr3" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr2="http://schemas.microsoft.com/office/spreadsheetml/2015/revision2" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" xr:uid="{00000000-0001-0000-0000-000000000000}">
<dimension ref="B2:F6"/>
<sheetViews>
<sheetView tabSelected="1" workbookViewId="0">
<selection activeCell="D12" sqref="D12"/>
</sheetView>
</sheetViews>
<sheetFormatPr defaultRowHeight="14.4" x14ac:dyDescent="0.3"/>
<sheetData>
<row r="2" spans="2:6" x14ac:dyDescent="0.3">
<c r="B2" t="s">
<v>0</v>
</c>
</row>
<row r="3" spans="2:6" x14ac:dyDescent="0.3">
<c r="C3" t="s">
<v>1</v>
</c>
</row>
<row r="4" spans="2:6" x14ac:dyDescent="0.3">
<c r="D4" t="s">
<v>2</v>
</c>
</row>
<row r="5" spans="2:6" x14ac:dyDescent="0.3">
<c r="E5" t="s">
<v>0</v></c>
</row>
<row r="6" spans="2:6" x14ac:dyDescent="0.3">
<c r="F6" t="s"><v>3</v>
</c></row>
</sheetData>
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>
Как мы видим, в структуре объектной модели нет никаких «пересечений». Строго говоря рабочая книга — это архив структурированных данных в формате XML. При этом в каждую «строку» входит «столбец», и в нём в свою очередь прописан номер значения данного столбца, по которому оно подтягивается из другого XML файла при открытии книги для экономии места за счёт отсутствия повторяющихся значений. Почему это важно. Если мы захотим написать какой-то обработчик таких файлов, который будет напрямую редактировать данные в этих XML, то ориентироваться надо на такую модель и структуру данных. И правильное определение будет примерно таким: ячейка — это объект внутри столбца, который в свою очередь находится внутри строки в файле xml, в котором хранятся данные о содержимом листа.
Способы обращения к ячейкам
Выбор и активация
Почти во всех случаях можно и стоит избегать использования методов Select и Activate. На это есть две причины:
- Это лишь имитация действий пользователя, которая замедляет выполнение программы. Работать с объектами книги можно напрямую без использования методов Select и Activate.
- Это усложняет код и может приводить к неожиданным последствиям. Каждый раз перед использованием Select необходимо помнить, какие ещё объекты были выбраны до этого и не забывать при необходимости снимать выбор. Либо, например, в случае использования метода Select в самом начале программы может быть выбрано два листа вместо одного потому что пользователь запустил программу, выбрав другой лист.
Можно выбирать и активировать книги, листы, ячейки, фигуры, диаграммы, срезы, таблицы и т.д.
Отменить выбор ячеек можно методом Unselect:
Selection.Unselect
Отличие выбора от активации — активировать можно только один объект из раннее выбранных. Выбрать можно несколько объектов.
Если вы записали и редактируете код макроса, то лучше всего заменить Select и Activate на конструкцию With … End With. Например, предположим, что мы записали вот такой макрос:
Sub Macro1()
' Macro1 Macro
Range("F4:F10,H6:H10").Select 'выбрали два несмежных диапазона зажав ctrl
Range("H6").Activate 'показывает только то, что я начал выбирать второй диапазон с этой ячейки (она осталась белой). Это действие ни на что не влияет
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535 'залили желтым цветом, нажав на кнопку заливки на верхней панели
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Почему макрос записался таким неэффективным образом? Потому что в каждый момент времени (в каждой строке) программа не знает, что вы будете делать дальше. Поэтому в записи выбор ячеек и действия с ними — это два отдельных действия. Этот код лучше всего оптимизировать (особенно если вы хотите скопировать его внутрь какого-нибудь цикла, который должен будет исполняться много раз и перебирать много объектов). Например, так:
Sub Macro11()
'
' Macro1 Macro
Range("F4:F10,H6:H10").Select '1. смотрим, что за объект выбран (что идёт до .Select)
Range("H6").Activate
With Selection.Interior '2. понимаем, что у выбранного объекта есть свойство interior, с которым далее идёт работа
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Sub Optimized_Macro()
With Range("F4:F10,H6:H10").Interior '3. переносим объект напрямую в конструкцию With вместо Selection
' ////// Здесь я для надёжности прописал бы ещё Thisworkbook.Sheet("ИмяЛиста") перед Range,
' ////// чтобы минимизировать риск любых случайных изменений других листов и книг
' ////// With Thisworkbook.Sheet("ИмяЛиста").Range("F4:F10,H6:H10").Interior
.Pattern = xlSolid '4. полностью копируем всё, что было записано рекордером внутрь блока with
.PatternColorIndex = xlAutomatic
.Color = 55555 '5. здесь я поменял цвет на зеленый, чтобы было видно, работает ли код при поочерёдном запуске двух макросов
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Пример сценария, когда использование Select и Activate оправдано:
Допустим, мы хотим, чтобы во время исполнения программы мы одновременно изменяли несколько листов одним действием и пользователь видел какой-то определённый лист. Это можно сделать примерно так:
Sub Select_Activate_is_OK()
Thisworkbook.Worksheets(Array("Sheet1", "Sheet3")).Select 'Выбираем несколько листов по именам
Thisworkbook.Worksheets("Sheet3").Activate 'Показываем пользователю третий лист
'Далее все действия с выбранными ячейками через Select будут одновременно вносить изменения в оба выбранных листа
'Допустим, что тут мы решили покрасить те же два диапазона:
Range("F4:F10,H6:H10").Select
Range("H6").Activate
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Единственной причиной использовать этот код по моему мнению может быть желание зачем-то показать пользователю определённую страницу книги в какой-то момент исполнения программы. С точки зрения обработки объектов, опять же, эти действия лишние.
Получение и изменение значений ячеек
Значение ячеек можно получать/изменять с помощью свойства value.
'Если нужно прочитать / записать значение ячейки, то используется свойство Value
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value 'записать значение ячейки А1 листа "Sheet1" в переменную "a"
ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value = 1 'задать значение ячейки А1 (первый ряд, первый столбец) листа "Sheet1"
'Если нужно прочитать текст как есть (с форматированием), то можно использовать свойство .text:
ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text = "1"
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text
'Когда проявится разница:
'Например, если мы считываем дату в формате "31 декабря 2021 г.", хранящуюся как дата
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Value 'эапишет как "31.12.2021"
a = ThisWorkbook.Sheets("Sheet1").Cells (1,1).Text 'запишет как "31 декабря 2021 г."
Ячейки открытой книги
К ячейкам можно обращаться:
'В книге, в которой хранится макрос (на каком-то из листов, либо в отдельном модуле или форме)
ThisWorkbook.Sheets("Sheet1").Cells(1,1).Value 'По номерам строки и столбца
ThisWorkbook.Sheets("Sheet1").Cells(1,"A").Value 'По номерам строки и букве столбца
ThisWorkbook.Sheets("Sheet1").Range("A1").Value 'По адресу - вариант 1
ThisWorkbook.Sheets("Sheet1").[A1].Value 'По адресу - вариант 2
ThisWorkbook.Sheets("Sheet1").Range("CellName").Value 'По имени ячейки (для этого ей предварительно нужно его присвоить)
'Те же действия, но с использованием полного названия рабочей книги (книга должна быть открыта)
Workbooks("workbook.xlsm").Sheets("Sheet1").Cells(1,1).Value 'По номерам строки и столбца
Workbooks("workbook.xlsm").Sheets("Sheet1").Cells(1,"A").Value 'По номерам строки и букве столбца
Workbooks("workbook.xlsm").Sheets("Sheet1").Range("A1").Value 'По адресу - вариант 1
Workbooks("workbook.xlsm").Sheets("Sheet1").[A1].Value 'По адресу - вариант 2
Workbooks("workbook.xlsm").Sheets("Sheet1").Range("CellName").Value 'По имени ячейки (для этого ей предварительно нужно его присвоить)
Ячейки закрытой книги
Если нужно достать или изменить данные в другой закрытой книге, то необходимо прописать открытие и закрытие книги. Непосредственно работать с закрытой книгой не получится, потому что данные в ней хранятся отдельно от структуры и при открытии Excel каждый раз производит расстановку значений по соответствующим «слотам» в структуре. Подробнее о том, как хранятся данные в xlsx см выше.
Workbooks.Open Filename:="С:closed_workbook.xlsx" 'открыть книгу (она становится активной)
a = ActiveWorkbook.Sheets("Sheet1").Cells(1,1).Value 'достать значение ячейки 1,1
ActiveWorkbook.Close False 'закрыть книгу (False => без сохранения)
Скачать пример, в котором можно посмотреть, как доставать и как записывать значения в закрытую книгу.
Код из файла:
Option Explicit
Sub get_value_from_closed_wb() 'достать значение из закрытой книги
Dim a, wb_path, wsh As String
wb_path = ThisWorkbook.Sheets("Sheet1").Cells(2, 3).Value 'get path to workbook from sheet1
wsh = ThisWorkbook.Sheets("Sheet1").Cells(3, 3).Value
Workbooks.Open Filename:=wb_path
a = ActiveWorkbook.Sheets(wsh).Cells(3, 3).Value
ActiveWorkbook.Close False
ThisWorkbook.Sheets("Sheet1").Cells(4, 3).Value = a
End Sub
Sub record_value_to_closed_wb() 'записать значение в закрытую книгу
Dim wb_path, b, wsh As String
wsh = ThisWorkbook.Sheets("Sheet1").Cells(3, 3).Value
wb_path = ThisWorkbook.Sheets("Sheet1").Cells(2, 3).Value 'get path to workbook from sheet1
b = ThisWorkbook.Sheets("Sheet1").Cells(5, 3).Value 'get value to record in the target workbook
Workbooks.Open Filename:=wb_path
ActiveWorkbook.Sheets(wsh).Cells(4, 4).Value = b 'add new value to cell D4 of the target workbook
ActiveWorkbook.Close True
End Sub
Перебор ячеек
Перебор в произвольном диапазоне
Скачать файл со всеми примерами
Пройтись по всем ячейкам в нужном диапазоне можно разными способами. Основные:
- Цикл For Each. Пример:
Sub iterate_over_cells() For Each c In ThisWorkbook.Sheets("Sheet1").Range("B2:D4").Cells MsgBox (c) Next c End Sub
Этот цикл выведет в виде сообщений значения ячеек в диапазоне B2:D4 по порядку по строкам слева направо и по столбцам — сверху вниз. Данный способ можно использовать для действий, в который вам не важны номера ячеек (закрашивание, изменение форматирования, пересчёт чего-то и т.д.).
- Ту же задачу можно решить с помощью двух вложенных циклов — внешний будет перебирать ряды, а вложенный — ячейки в рядах. Этот способ я использую чаще всего, потому что он позволяет получить больше контроля над исполнением: на каждой итерации цикла нам доступны координаты ячеек. Для перебора всех ячеек на листе этим методом потребуется найти последнюю заполненную ячейку. Пример кода:
Sub iterate_over_cells() Dim cl, rw As Integer Dim x As Variant 'перебор области 3x3 For rw = 1 To 3 ' цикл для перебора рядов 1-3 For cl = 1 To 3 'цикл для перебора столбцов 1-3 x = ThisWorkbook.Sheets("Sheet1").Cells(rw + 1, cl + 1).Value MsgBox (x) Next cl Next rw 'перебор всех ячеек на листе. Последняя ячейка определена с помощью UsedRange 'LastRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 'LastCol = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count - 1 'For rw = 1 To LastRow 'цикл перебора всех рядов ' For cl = 1 To LastCol 'цикл для перебора всех столбцов ' Действия ' Next cl 'Next rw End Sub
- Если нужно перебрать все ячейки в выделенном диапазоне на активном листе, то код будет выглядеть так:
Sub iterate_cell_by_cell_over_selection() Dim ActSheet As Worksheet Dim SelRange As Range Dim cell As Range Set ActSheet = ActiveSheet Set SelRange = Selection 'if we want to do it in every cell of the selected range For Each cell In Selection MsgBox (cell.Value) Next cell End Sub
Данный метод подходит для интерактивных макросов, которые выполняют действия над выбранными пользователем областями.
- Перебор ячеек в ряду
Sub iterate_cells_in_row() Dim i, RowNum, StartCell As Long RowNum = 3 'какой ряд StartCell = 0 ' номер начальной ячейки (минус 1, т.к. в цикле мы прибавляем i) For i = 1 To 10 ' 10 ячеек в выбранном ряду ThisWorkbook.Sheets("Sheet1").Cells(RowNum, i + StartCell).Value = i '(i + StartCell) добавляет 1 к номеру столбца при каждом повторении Next i End Sub
- Перебор ячеек в столбце
Sub iterate_cells_in_column() Dim i, ColNum, StartCell As Long ColNum = 3 'какой столбец StartCell = 0 ' номер начальной ячейки (минус 1, т.к. в цикле мы прибавляем i) For i = 1 To 10 ' 10 ячеек ThisWorkbook.Sheets("Sheet1").Cells(i + StartCell, ColNum).Value = i ' (i + StartCell) добавляет 1 к номеру ряда при каждом повторении Next i End Sub
Свойства и методы ячеек
Имя ячейки
Присвоить новое имя можно так:
Thisworkbook.Sheets(1).Cells(1,1).name = "Новое_Имя"
Для того, чтобы сменить имя ячейки нужно сначала удалить существующее имя, а затем присвоить новое. Удалить имя можно так:
ActiveWorkbook.Names("Старое_Имя").Delete
Пример кода для переименования ячеек:
Sub rename_cell()
old_name = "Cell_Old_Name"
new_name = "Cell_New_Name"
ActiveWorkbook.Names(old_name).Delete
ThisWorkbook.Sheets(1).Cells(2, 1).Name = new_name
End Sub
Sub rename_cell_reverse()
old_name = "Cell_New_Name"
new_name = "Cell_Old_Name"
ActiveWorkbook.Names(old_name).Delete
ThisWorkbook.Sheets(1).Cells(2, 1).Name = new_name
End Sub
Адрес ячейки
Sub get_cell_address() ' вывести адрес ячейки в формате буква столбца, номер ряда
'$A$1 style
txt_address = ThisWorkbook.Sheets(1).Cells(3, 2).Address
MsgBox (txt_address)
End Sub
Sub get_cell_address_R1C1()' получить адрес столбца в формате номер ряда, номер столбца
'R1C1 style
txt_address = ThisWorkbook.Sheets(1).Cells(3, 2).Address(ReferenceStyle:=xlR1C1)
MsgBox (txt_address)
End Sub
'пример функции, которая принимает 2 аргумента: название именованного диапазона и тип желаемого адреса
'(1- тип $A$1 2- R1C1 - номер ряда, столбца)
Function get_cell_address_by_name(str As String, address_type As Integer)
'$A$1 style
Select Case address_type
Case 1
txt_address = Range(str).Address
Case 2
txt_address = Range(str).Address(ReferenceStyle:=xlR1C1)
Case Else
txt_address = "Wrong address type selected. 1,2 available"
End Select
get_cell_address_by_name = txt_address
End Function
'перед запуском нужно убедиться, что в книге есть диапазон с названием,
'адрес которого мы хотим получить, иначе будет ошибка
Sub test_function() 'запустите эту программу, чтобы увидеть, как работает функция
x = get_cell_address_by_name("MyValue", 2)
MsgBox (x)
End Sub
Размеры ячейки
Ширина и длина ячейки в VBA меняется, например, так:
Sub change_size()
Dim x, y As Integer
Dim w, h As Double
'получить координаты целевой ячейки
x = ThisWorkbook.Sheets("Sheet1").Cells(2, 2).Value
y = ThisWorkbook.Sheets("Sheet1").Cells(3, 2).Value
'получить желаемую ширину и высоту ячейки
w = ThisWorkbook.Sheets("Sheet1").Cells(6, 2).Value
h = ThisWorkbook.Sheets("Sheet1").Cells(7, 2).Value
'сменить высоту и ширину ячейки с координатами x,y
ThisWorkbook.Sheets("Sheet1").Cells(x, y).RowHeight = h
ThisWorkbook.Sheets("Sheet1").Cells(x, y).ColumnWidth = w
End Sub
Прочитать значения ширины и высоты ячеек можно двумя способами (однако результаты будут в разных единицах измерения). Если написать просто Cells(x,y).Width или Cells(x,y).Height, то будет получен результат в pt (привязка к размеру шрифта).
Sub get_size()
Dim x, y As Integer
'получить координаты ячейки, с которой мы будем работать
x = ThisWorkbook.Sheets("Sheet1").Cells(2, 2).Value
y = ThisWorkbook.Sheets("Sheet1").Cells(3, 2).Value
'получить длину и ширину выбранной ячейки в тех же единицах измерения, в которых мы их задавали
ThisWorkbook.Sheets("Sheet1").Cells(2, 6).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).ColumnWidth
ThisWorkbook.Sheets("Sheet1").Cells(3, 6).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).RowHeight
'получить длину и ширину с помощью свойств ячейки (только для чтения) в поинтах (pt)
ThisWorkbook.Sheets("Sheet1").Cells(7, 9).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).Width
ThisWorkbook.Sheets("Sheet1").Cells(8, 9).Value = ThisWorkbook.Sheets("Sheet1").Cells(x, y).Height
End Sub
Скачать файл с примерами изменения и чтения размера ячеек
Запуск макроса активацией ячейки
Для запуска кода VBA при активации ячейки необходимо вставить в код листа нечто подобное:
3 важных момента, чтобы это работало:
1. Этот код должен быть вставлен в код листа (здесь контролируется диапазон D4)
2-3. Программа, ответственная за запуск кода при выборе ячейки, должна называться Worksheet_SelectionChange и должна принимать значение переменной Target, относящейся к триггеру SelectionChange. Другие доступные триггеры можно посмотреть в правом верхнем углу (2).
Скачать файл с базовым примером (как на картинке)
Скачать файл с расширенным примером (код ниже)
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' имеем в виду, что триггер SelectionChange будет запускать эту Sub после каждого клика мышью (после каждого клика будет проверяться:
'1. количество выделенных ячеек и
'2. не пересекается ли выбранный диапазон с заданным в этой программе диапазоном.
' поэтому в эту программу не стоит без необходимости писать никаких других тяжелых операций
If Selection.Count = 1 Then 'запускаем программу только если выбрано не более 1 ячейки
'вариант модификации - брать адрес ячейки из другой ячейки:
'Dim CellName as String
'CellName = Activesheet.Cells(1,1).value 'брать текстовое имя контролируемой ячейки из A1 (должно быть в формате Буква столбца + номер строки)
'If Not Intersect(Range(CellName), Target) Is Nothing Then
'для работы этой модификации следующую строку надо закомментировать/удалить
If Not Intersect(Range("D4"), Target) Is Nothing Then
'если заданный (D4) и выбранный диапазон пересекаются
'(пересечение диапазонов НЕ равно Nothing)
'можно прописать диапазон из нескольких ячеек:
'If Not Intersect(Range("D4:E10"), Target) Is Nothing Then
'можно прописать несколько диапазонов:
'If Not Intersect(Range("D4:E10"), Target) Is Nothing or Not Intersect(Range("A4:A10"), Target) Is Nothing Then
Call program 'выполняем программу
End If
End If
End Sub
Sub program()
MsgBox ("Program Is running") 'здесь пишем код того, что произойдёт при выборе нужной ячейки
End Sub
Как записать значение в ячейку
Смотрите такжеvit-271 библиотеку эксель, вверху всем. Всё понял. назначено это имя: игнорируем ошибки (они
в архиве похожий v, равно 2184 свойство Value не параллельно хранится и длиной 4096 End Private Declare PtrSafeIf Nothing Then ‘n, ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!))))) ÷òîáû êîïèðîâГ*ëñÿ ГІГҐГЄГ±ГІbboyRALFbboyRALF: Приветствую форумчани подскажите нажимаем ПроектДобавить ссылкуCOMMicrosoftAlex_ST
Set rRng = могут возникнуть при
вопрос: (888h) MsgBox myObj.Value
просто равно значерию число 555 в Sub Sub RtlMoveMemory Lib, = n + НАШЕЛ!!! ññûëêè Г*Г* Г§Г*ГЄГ*Г§: В строке №: Уважаемые! какой функцией кто может как office 14 object: Как раз наоборот, Range(oName.RefersTo) отсутствии в книгепост №17 содержит ‘ 1092 End `v`. Сделано это стандарте , чтобыAlex.Karev «kernel32» (Dst AsFor 1: Debug.Print «Г’ГҐГ¬Г*Продолжаю, ломать голову Set ra = 5 должна быть сделать вывод не получить последнюю записть library если обращаться к(это, к стати,
требуемых имён) For
пример, в котором Sub было для наглядности,
при вычислениях не: Казанский, спасибо за
Any, Src As, В№» & n,
теперь над вложенным GetQueryRange(URL$, «1») ‘ хоть какая проверка в окно, а определёного столбцаvb.net Public Class именованным диапазонам как вполне можно было Each oName In я хочу разобратьсяКак видно, в чтобы иметь возможность преобразовывать каждый раз пояснения! Не скрою,
Any, ByVal bytesDo oCell.Text ‘ Debug.Print циклом возврата загрузки.Не
ïåðåáèðГ*Гї ÿ÷åéêè ГІГ*áëèöû-ðåçóëüòГ*ГІГ*, ошибки или ее
в ячейку наq = .AvShGeneral.ListObjects(1).TotalsRowRange.Cells(3).Value Form1 Dim Exc к элементам коллекции бы заменить на Names ‘ цикл , что бы решении мы смогли отличить, значение какой
текст в число. не знал подробного As Long) #Elseниже строго по
c & c.Offset(, могу перевести в âûâîäèì ñïèñîê ГІГҐГ¬ обход, например: лист.DataBodyRange As Object = Names, то ненужных
Set rRng = по элементам (объектам) применить к своему добраться до внутренней именно переменной мыВ общем, обращение
механизма работы RtlMoveVemory Private Declare Sub вертикали должен соответствовать 1) ‘ ‘.outprint синтаксис VBA выражение
Гў îêГ*Г® ImmediateIf Not ranSet ra =
это код возращает CreateObject(«Excel.Application») Private Sub ошибок не возникнет oName.RefersToRange. Посмотрите Справку. коллекции Names данной
случаю.
переменной класса и
найдём в обход
к свойству объекта и того, что
RtlMoveMemory Lib «kernel32″ свой Worksheets(«Г‹ГЁГ±ГІ3»).Cells(1 + i,Код for i=1 If Not rz
Is Nothing Then GetQueryRange(URL$, «2») ‘ итог, следущий возрозает Form1_Load(ByVal sender As
и макрос будет Там вполне понятно книги sNAME =Растолкуйте пожалуйста значения искусственно повлиять на нормального интерфейса - — это не RtlMoveVemory на самом (Dst As Any,End If(Else(If)), Next, Loop 3) = c.Cells(1) to n then Is Nothing Then «c» должен быть выполняем веб-запрос If первую ячейку после System.Object, ByVal e
работать наверняка. А и просто написано UCase(oName.Name) ‘ имя (смысл) команд по-порядку значения свойства класса свойства Value. обращение к определенному деле не была Src As Any,) ‘Worksheets(«Г‹ГЁГ±ГІ3»).Range(«B1»).Cells(1 + i) do if x=230000000 If Not ra обязательно объявлен как Not ra Is заголовка. ппример прилогается As System.EventArgs) Handles если использовать более про свойства имён объекта oName ЗАГЛАВНЫМИ в макросе: Value.’модуль класса clsValueKeeper адресу памяти, как задействована. ByVal bytes AsА у вас = c & then do код Is Nothing Then Range Nothing Then Setfever brain MyBase.Load Exc.workbooks.open(«C:UsersКонстантинDesktopБД.xlsx») ‘Открываем простое обращение типа RefersTo и RefersToRange.) буквами (сравнение оператором’ ZVI:2010-07-25Тем, кто заинтересовался Private v, w обращение к переменной,Я предполагал следующее: Long) #End If кашаУберите c.Offset(, 1) ‘& загрузки Set c =А далее по c = ra.Columns(1).Find(«Add*»,: Option Explicit Dim книгу эксель по Range(«MyRangeName»).Value или ещё2. Проверяется «родитель» Like чувствительно к’ Значение ячеек задачей, посоветую в ‘As Variant Public а вызов процедуры.предположим, открыта книга Excel ‘————————— Sub test()On Error Resume Right(ThisWorkbook.Sheets(«Г‹ГЁГ±ГІ3», «B»).Cells(i, 1),Код else i:=i+1 ra.Columns(1).Find(«Add*», , xlValues, коду обязательно используйте , xlValues, xlWhole) lLastCol&, lLastRow& Private указанному адресу Exc.visible проще [MyRangeName].Value , диапазона rRng регистру) If sNAME с именами «ОТКУДА*» окне «Locals» (VBE) Property Let Value(x Поэтому-то считывание значений (не сохранена на Dim b() As NextМожет, еще ошибки 19) ‘ With ; xlWhole) If Not свойство Rang-а. If Not c Sub CommandButton1_Click() ‘Последний = True ‘Видимость то могут возникнутьЕсли диапазон rRng Like «ОТКУДА*» Then будут автоматически скопированы последить за значениями
As Variant) v диапазона в массив
диске), в ячейку Byte ReDim b(1 всплывут.Доброй ночи.
Sheets(«Г‹ГЁГ±ГІ3»).Cells(1 + i,Sub Г‡Г*ãðóçêГ*ÑïèñêГ*ÍîìåðîâExcel() Dim (c Is Nothing)В данном случае,
Is Nothing Then заполненный столбец в книги Эксель - ошибки, которые будут (и имя, начинающееся ‘ если имя
в ячейки с
всех переменных класса = x *
и последующая работа A1 занесено 555, To 4096) RtlMoveMemory
Sub Excel() Dim «B») End If
CStart As Range, Then Debug.Print c.Offset(, когда хотите забрать MsgBox c & строке №1 lLastCol
False — Невидима проигнорированы и макрос с ОТКУДА, соответственно начинается с ОТКУДА именами «КУДА*» clsValueKeeper. Там наглядно 2 w = с массивом вместо курсор вышел из b(1), ByVal StrPtr(Cells(1, CStart As Range, End If End BaseStart As Range, 1).Value ‘ If из него значение c.Offset(, 1) ‘ = Cells(1, Columns.Count).End(xlToLeft).Column и выполняется все отработает не верно. тоже), находится на (* — любая’ Например: видно, что у x * 5 обращения к ячейкам ячейки 1)), 4096 MsgBox BaseStart As Range, If ‘End If Firm$, Mail$, Face$, Not c Is — пишите нечто здесь выводит в
MsgBox Replace(Cells(1, lLastCol).Address, в срытном режимеit.k.bondarev том же листе, последовательность символов) ‘
’ Имя ячейки объекта myObj есть End Property Public дает ускорение вчисло 555 где-то же
b End Sub Firm$, Mail$, Face$, ‘End With ‘Else:
Ex$, NotEx$, Success Nothing Then ‘ вроде c.Offset(, 1).value окно, с outprint «$», «») End
Exc.sheets(1).activate() ‘Активируем первый: Добрый вечер, коллеги. где был пересчёт т.к. используются только B3: «Откуда1″
3 поля (переменных), Property Get Value()
десятки раз. хранится в памяти,Подскажите пожалуйста, а Ex$, NotEx$, Success i = i As Boolean Dim n = nУбрать часть не разобрался End Sub Private Sub лист в книгеМало пока понимаю листа, то из однозначные номера ОТКУДА-КУДА,’ Имя ячейки хотя в коде Value = vМожете поэкспериментировать с и, кроме того, как можно и As Boolean Dim + 1 Next yBase&, Rng As + 1: Debug.Printc & If End If CommandButton2_Click() ‘Последняя заполненная (Если необходимо) Label1.Text в макросах, но имени берётся СЕДЬМОЙ то корректнее было B4: «Куда1″ доступно лишь одно / 2 End простейшим объектом - ассоциируется с элементом можно ли yBase&, Rng As i Loop End Range Dim ra «Г’ГҐГ¬Г* В№» &Не по теме:bboyRALF строка в колонке = Exc.sheets(1).range(«A1»).value ‘ передо мной возникла символ (ОТКУДА - бы записать: ‘If’ При пересчете - Property экземпляром класса, у Cells(1,1)?изменить Range Dim ra If End With As Range, rak n, oCell.Text ‘И прекращаем писать мне: Не функция, метод: A lLastRow = Присваиваем Label1 Значение задача хранения формул 6 символов, 7-й sNAME Like «ОТКУДА?» формул значение изValueдополненный решением обычный модуль которого есть единственноеТогда скажите, развезначение этой ячейки As Range, rak End SubПри компиляции As Range, ran Debug.Print c & в ЛС.Worksheets(«Лист3″).Cells(1,1)=»Текст» Worksheets(«Лист3»).Range(«A1″)=»Текст» Worksheets(«Лист3»).[A1]=»Текст» Cells(Rows.Count, 1).End(xlUp).Row MsgBox из ячейки Label2.Text в одном экземпляре — номер этого Then’ если имя B3 будет скопировано. ( свойство Value, котороеStrPtr(CStr(Cells(1, 1))) с помощью win As Range, ran : ENd if As Range, raq c.Offset(, 1) ‘.outprintВ ЛС только Range(«Лист3!A1»)=»Текст» lLastRow End Sub = Exc.sheets(1).range(«A2»).value ‘ для уменьшения объема ОТКУДА) и диапазону начинается с ОТКУДА в B4Каюсь — константыобращаю внимание можно использовать дляне даёт указатель api? As Range, raq whithout block if. As Range, raw Worksheets(«Г‹ГЁГ±ГІ3»).Cells(1 + i, ссылку на даннуюbboyRALFHugo121 Присваиваем Label2 Значение файла. (ячейке), имеющему имя, и имеет ещёPrivate Sub смещений offset_v иуважаемых читателей, что чтения и для именно на строкуЗаранее благодарю за As Range, raw
все равно, что As Range, rae 2) = c тему, или за:: В этой конкретной
из ячейки ‘ExcТ.е. имеется массив
состоящее из «КУДА» 1 символ(? -Workbook_SheetCalculate(ByVal Sh As Object) offset_w были подобраны приведённое решение реализовано записи: `555` в памяти, предложения. As Range, rae он хочет я As Range, rar & c.Offset(, 1) плату если нужноDragokas задаче без примера — объект эксель: («умная таблица»), где и этого седьмого любой одиночный символ)Dim Rng As «вручную», я пока для win7/x’модуль класса clsValueKeeper что должно бытьvikttur As Range, rar понять не могу… As Range, rat End If End уж очень срочно., Спасибо, Вы меня качественно не ответить sheets(1) — лист половина полей (колонок) символа (Range(Names(«КУДА» & Set rRng = Range, N As не нашел точного64 Private v ‘As представлено байтами: ActiveSheet.Cells(1, 1).Value=555 Cells(1, As Range, rat что делать ?24 As Range, oCell If End IfbboyRALF все время выручаете.И вопрос уже в книге : — результаты вычислений Mid(sNAME, 7)).RefersTo), присваивается Range(oName.RefersTo) ‘ диапазон Name, s As описания, как именно): Variant Public Property00 35 00 1).Value=555 Range(«A1»).Value=555 As Range, oCell строка - As Range, n Next i End: Set c = решён.
.range(«A1») — ячейка — массив занимает значение из ОТКУДА (ячейка), имеющий имя, String инициированный объект (экземпляр)’=============================== ‘обычный модуль Let Value(x As 35 00 35Alex.Karev As Range Dim
If Not Rng As Long: On
With End SubноDragokas ra.Columns(1).Find(«Add*», , xlValues,
Берём у DataBodyRange End Sub End всю оперативную памятьНу, блин, и начинающееся с ОТКУДАApplication.EnableEvents = False класса размещается в #If VBA7 Then Variant) v =?: vikttur, спасибо! Прошу c As Range, Is Nothing Then Error Resume Next он выводит все, Огромное спасибо, xlWhole) If Not число строк, смотрим Class и не дает написАл! Не уверен, If rRng.Parent Is ‘ откюч. обработку памяти, кроме того, Private Declare PtrSafe x End PropertyПро пояснение про прощения за недосказанность ray As Range, DOПодобная запись должна Dim c As равно все значения…Реализовал дополнительную проверку c Is Nothing в последнюю.Водяной Змей работать с собой. что стало понятнее, Sh Then ‘ событий что первые 8/16 Sub RtlMoveMemory Lib Public Property Get 2048 отдельное спасибо и дополняю свой rau As Range, подразумевать однострочный синтаксис Range, ray AsFind («23000000000») If по коду «23000000000», Then n =vit-271: …А вот здесь Поэтому для уменьшения но я старался если имя, начинающеесяOn Error Resume байт для x86/x64 «kernel32» (Dst As Value() Value = — я бы вопрос: а как rai As Range,
оператора Range, rau As Not Find ThenТак? для того чтобы n + 1:: работать только с Visual Basic .NET объема файла хочу
ArtemonX с ОТКУДА, находится Next ‘ вкл. — это `заголовок`
Any, Src As
v End Property не обратил внимание это можно было rao As Range,If
Range, rai AsЕсли так, то
CyberForum.ru
Записать значение в ячейку Excel с помощью win api
если он на Debug.Print «Г’ГҐГ¬Г* В№»
листом аванс, мне FAQ. Готовые решения, хранить формулы в
: Спасибо, очень доходчиво.
на том же
игнорирование ошибок выполнения класса, следующие 4/8 Any, ByVal bytes ‘=============================== ‘обычный модуль на этот момент. бы реализовать с rap As Range,А вы доводите Range, rao As помоги пожалуйста продолжить скрытом листе не & n, oCell.Text для примера нужет полезные коды всё единственном экземпляре (наЯ спросил про листе, где былFor Each N байт — вспомогательные, As Long) #Else
Sub test() Dim (Для неискушенных читателей) помощью raa As Range до абсурда Range, rap As мысль)
находит данный код, Debug.Print c &
лист аванс спасибо это ещё и отдельном листе), и
RefersTo потому, что пересчёт листа Range(Names(«КУДА» In Names и т.п. Private Declare Sub myObj As New Имелось ввиду, чтоwin api rz = 23000000000#Sub ЗагрузкаСпискаНомеровExcel() Dim
Range, raa AsАпострофф значения в ячейку c.Offset(, 1) Worksheets(«Г‹ГЁГ±ГІ3»).Range(«B1»).Cells(1 большое без библиотеки Excel применять эти формулы у меня без & Mid(sNAME, 7)).RefersTo)
s = UCase(N.Name)Большое Спасибо RtlMoveMemory Lib «kernel32″ clsValueKeeper myObj.Value = данные, занесённые в? With ThisWorkbook.Sheets(«????3») Set CStart As Range, Range rz =: Лень икать на с этого листа + i) =Hugo121 делается! по запуску макроса
его применения получилось = rRng.Value ‘ ‘ переводит значениеуважаемому Казанскому за (Dst As Any, 555 MsgBox myObj.Value ячейку, хранятся вThe_Prist CStart = .[A1] BaseStart As Range, 23000000000# ‘With Sheets(3) форуме книгу с не печатаются, а ra.Columns(1).Find(«Add*», , xlValues,: Что конкретно нужноHDR
— нажатию кнопки. решить задачку (упрощенно скопировать в ячейку строковой переменной на предложенный эксперимент, за Src As Any, End SubВаша задача формате Unicode и: Позвольте поинтересоваться - ‘?????????? ?????? ?????? Firm$, Mail$, Face$, With ThisWorkbook.Sheets(«Г‹ГЁГ±ГІ3») ‘Íèæåñëåäóþùåå Вашим проектом.
печатаются только с xlWhole) ‘ With найти?: Необходимо последовательно добавлятьВнимание вопрос: выглядит так) с именем «КУДА» все заглавные буквы помощь и активное ByVal bytes As — добраться до занимают количество байт, а зачем API ? ????? ?
Ex$, NotEx$, Success ïðèñâîåГ*ГЁГҐ ññûëêè Г*Г*А без нее тех у которых Sheets(«Г‹ГЁГ±ГІ3»).Cells(1 + i,Для каждой из записи в однуПравильно ли яWorksheets(«Лист2»).Range(«ячейка2») = Worksheets(«Лист1»).Range(«ячейка1»)
& Mid(sNAME, 7)
- If s Like участие в рассуждениях, Long) #End If внутренней переменной v, равное двойному размеру для изменения значения
- 3 (?????? ?5) As Boolean Dim îáúåêò Гў Г¤Г*Г*Г*îì не понятно, что данный код присутствует
«B») ‘.Value =
таблиц нужен свой
ячейку, оставляя в понимаю, что всеи так — седьмой символ «ОТКУДА*» Then
а Ваш покорный Sub test() Dim
в которой хранится
длины строки. То ячейки? И это For i = yBase&, Rng As Г¬Г*êðîñå Г*ГҐ èñïîëüçóåòñÿ. за скрытый лист, («23000000000») If Not ra.Range(«J2»).c.Offset(, 1) ‘Worksheets(«Г‹ГЁГ±ГІ3»).Cells(1, подход (в этом ней старые данные. выше описанное вWorksheets(«Лист2»).Range(Names(«ячейка2»).RefersTo) = Worksheets(«Лист1»).Range(Names(«ячейка1»).RefersTo) имени диапазона ОТКУДАSet Rng = слуга пока попробует myObj As New значение, в обход
есть строка `555` при том, что 1 To .UsedRange.End(xlDown).Row Range Dim ra Set CStart = где искать. Какие rz Is Nothing «B») = «Add» виде листа). Другими словами нужно теме решает иРезультат одинаковый. (его номер) End Range(N.RefersTo)
применить полученные результаты clsValueKeeper ‘ инициирован нормального интерфейса, т.е.
(3 символа на Вы все равно + 1000 If As Range, rak .[A1] ‘ðååñòðîâûå Г*îìåðГ* значения, в какую Then, где rz
‘MsgBox c &vit-271 просто постоянно дописывать мою задачу вВ чем разница If End IfIf Rng.Parent Is для решения поставленной
(вызван) класс, в свойства Value. экране) == 6 обращаетесь к ячейке: Val(Right(.Cells(i, 1), 19)) As Range, ran Г§Г*ГЄГ*Г§Г* Г± ëèñòГ* ячейку. =23000000000, rz = c.Offset(, 1) ‘End: в листе аванс её содержимое. Имеется т.ч., но с по-существу не пойму. Application.EnableEvents = True Sh Then задачи топика - динамической памяти созданAlex.Karev байт в памяти. Cells(1, 1) > 1 Then As Range, raq В№ 3 (ÿ÷åéêГ*Какие другие листы. 23000000000#Cам код With End Ifвыводит нужно найти соледгюю ли такая функция? небольшими доработками? Или
The_Prist ‘ включаем возникновениеRange(Names(«КУДА» & Mid(s, изменить свойство Value его экземпляр (myObj): Казанский, ещё разПолучается, если применитьAlex.Karev URL$ = «http://www.bus.gov.ru/public/print-form/show.html?pfid=» As Range, raw ГЂ5) ‘For iВообщем, ничего неSub Г‡Г*ãðóçêГ*ÑïèñêГ*ÍîìåðîâExcel() Dim теперь в строчку
записьи значения каждогоВсем заранее благодарен. посоветуете создать отдельную: Разница в том, событий Next End 7)).RefersTo) = Rng.Value элемента Cells.Item(1,1). Dim v As
БОЛЬШОЕ спасибо за ReDim независимо от: The_Prist, спасибо, что & Right(ThisWorkbook.Sheets(«????3»).Cells(i, 1), As Range, rae = 1 To понятно. CStart As Range, просто add, а столбца записать вBusine2009 тему для обсуждения? что нашли Вы SubEnd IfbboyRALF Long ‘ сюда подробные понятные комментарии длины считываемой из заинтересовались, вопрос задан 19) Set ra
As Range, rar 100 For ibboyRALF BaseStart As Range, не то что
переменую и добавить: Sub P1() ActiveCell.Value
Если мой вопрос для своей целиArtemonXEnd If: Уважаемые! какой функцией мы будем считывать и разъяснения! ячейки строки, то исключительно в = GetQueryRange(URL$, «1») As Range, rat = 1 To: Прилагаю книгу во
Firm$, Mail$, Face$, ищет по идеи запись в последню = ActiveCell.Value & не является аналогом макрос сильно нагруженный: Спасибо.Application.EnableEvents = True сделать вывод не из памяти значениеПозвольте поделиться результатами предложенного считывание может выйтипознавательных целях Set Rng = As Range, oCell .UsedRange.End(xlDown).Row + 1000 вложении. Ex$, NotEx$, Success функция.. в чем троку, а также » новый текст» или логическим продолжением совершенно иным функционалом.Вот не пойму
‘ включ. обработку в окно, а внутренней переменной v Вами эксперимента. за пределы размера
- , в частности, о ra.Columns(2).Find(«23000000000 ????????????? ????», As Range, n If Val(Right(.Cells(i, 1),Заранее очень Вам As Boolean Dim косяк ? что бы последняя End Sub темы, прошу неВот попроще: зачем в этих событий в ячейку на Dim w AsИтак, речь шла строки содержимого ячейки возможностях работы с
, xlValues, xlPart, As Long: On 19)) > 1 благодарен. yBase& Dim raЯ разобрался!!!)))))) запись подкраселась вHDR продолжать обсуждение, аAlex_ST конструкциях применяется RefersToNext лист.
- Long ‘ сюда о классе и «залезть» дальше, памятью, ускорении вычислений xlWhole) If Not Error Resume Next Then ‘ ôîðìèðóåìbboyRALF
As Range, rakWorksheets(«Г‹ГЁГ±ГІ3»).Range(«B1»).Cells(1 + i) определённый цвет и: а по другому послать меня в: Действительно, Range(«RngSh1»).Value чащеSet rRng =End SubSet ra = мы будем считыватьclsValueKeeper на область памяти при работе с Rng Is Nothing Dim c As ññûëêó ‘ Г‘Г*éò: И еще, пытался As Range, ran = c & перед выходом из больше нельзя? нужном направлении. всего вернёт то Range(oName.RefersTo)Хочу не только GetQueryRange(URL$, «2») ‘ из памяти значениеи его экземпляре в лучшем случае большими объёмами данных. Then Do Set Range, ray As ГЁ ïîèñêîâûé Г§Г*ïðîñ сделать так чтобы As Range, raq c.Offset(, 1) процедуры заливка очищаласьBusine2009Немного подробностей: в же значение, чтоRange(Names(«КУДА» & Mid(sNAME, решить задачку, но выполняем веб-запрос If внутренней переменной wmyObj с пустыми, а Информации по VBA ra = GetQueryRange(URL$, Range, rau As ГЄ Г±Г*éòó. ‘ÑèГ*ГІГ*ГЄГ±ГЁГ± нашел значение и As Range, rawbboyRALF полностю но только: Вот так можно столбце не все и ThisWorkbook.Names(«RngSh1»).RefersToRange.Value , 7)).RefersTo) = rRng.Value и понять этот Not ra Is Const offset_v =. В классе было в худшем случае и win api «1») If Not Range, rai As ïîñòðîåГ*ГЁГї Г§Г*ïðîñГ* îïðåäåëÿåòñÿ вывел As Range, rae: Тогда уж так: по ширене таблицы, добавлять, сохраняя форматирование ячейки имеют одинаковые НО прямое обращениеи про Parent макрос конкретно. Nothing Then Set 104 ‘ смещение объявлено — с «чужими»
не много, в ra Is Nothing Range, rao As ïîèñêîâîé Г¬Г*ГёГЁГ*îé Г±Г*éòГ*If Not ra As Range, rarWorksheets(«Лист3»).Cells(1 + i,
а также при текста (например, цвет): формулы, поэтому хочу к диапазону по не понятно.например подчеркнутое - c = ra.Columns(1).Find(«Add*», первой переменной классаPrivate данными. основном на форумах, Then Set c Range, rap As URL$ = «http://www.bus.gov.ru/public/print-form/show.html?pfid=»
Is Nothing Then As Range, rat 2) = c удалений последней записиSub Макрос2() ActiveCell.Characters(Start:=ActiveCell.Characters.Count создать не формулу его имени (первыйThe_Prist это имя процедуры , xlValues, xlWhole) в порядке ихполе (внутренняя переменная)Казанский вот, пытаюсь разобраться. = ra.Columns(2).Find(«*23000000000 ?????????????
Range, raa As & Right(ThisWorkbook.Sheets(«Г‹ГЁГ±ГІ3»).Cells(i, 1), Set c = As Range, oCell & c.Offset(, 1) что бы она + 1, Length:=1).Text для всего столбца, вариант) иногда вызывает: Будет понятно, если , а SheetCalculate- If Not c
planetaexcel.ru
Как записать значение в ячейку
описания в модулеv: Может да, аКазанский ????*», , xlValues, Range rz =
19) ‘- ïîñëå ra.Columns(1).Find(«*23000000000*», , xlValues, As Range, nbboyRALF подсветивалась перед удалением. = «text» End а наборы формул ошибку если именованный или книжку прочитать это событие или Is Nothing Then класса, байт Const, не доступная напрямую может нет: А Вы понимаете,
xlWhole, xlPart) If 23000000000# With ThisWorkbook.Sheets(«Лист3») Г°Г*ГўГ*Г® äîëæГ*Г® ГўГ±ГІГ*âëÿòüñÿ xlPart) If Not As Long: On: Еще вопрос, не
зарание большое спасибо. Sub для строк определенного диапазон находится в или хотя бы что? и что MsgBox c &
offset_w = 128 при работе сЯ был не
как выполняется эта Not c Is Set CStart = ïîëå Г± ðååñòðîâûì
(c Is Nothing)
CyberForum.ru
VBA — запись в ячейку 2 результата вычисления формулой 1
Error Resume Next могу организовать следующую
Hugo121Ципихович Эндрю вида — вид другом модуле (на справку по методам. должно передаваться на c.Offset(, 1) ‘ ‘ смещение второй
экземплярами класса. до конца подробен команда? Фактически это Nothing Then Worksheets(«????3»).Cells(1 .[A1] ‘реестровые номера
Г*îìåðîì Г§Г*ГЄГ*Г§Г* (ГЂ4) Then Debug.Print c.Offset(, Dim c As операцию : с: Вообще ничего не: что-то опробовал, нифига
буду прописывать в другом листе) по В именах содержатся
вход процедуры в
здесь выводит в переменной класса вСправочно в предыдущем сообщении. RtlMoveMemory b(1), ByVal
+ i, 3)
заказа с листа ГЁ ГІГ*ГЄ ГЇГ®
1).Value ‘If Not Range, ray As
find. К примеру понял. Попробуйте расписать было красным в отдельной колонке в
сравнению с модулем, ссылки — RefersTo,
качестве Sh. окно, с outprint порядке их описаниясообщу, что при поиске
Cells(1,1) StrPtr(Cstr(Cells(1, 1).Value)), 4096То = c.Cells(1) End
№ 3 (ячейка ïîðÿäêó, ïîòîì Г*Г*äî c Is Nothing
Range, rau As находит строчку adress,
по пунктам, с ячейке, дописалось, всё массиве. где выполняется код.
которые и определяютAlex_ST
не разобрался End в модуле класса,
решения встретился примерэто укороченная запись
есть Бейсик берет If End If
А5) For i
÷òîáû êîïèðîâГ*ëñÿ ГІГҐГЄГ±ГІ
Then ‘n = Range, rai As при этом копирует
адресами ячеек для
красное!!
meatlaЭти ошибки («Object диапазон имени.: Вот «за обеденным
If End If байт ‘ Поехали! (листинг 8.6) изCells.Item(1,1) значение ячейки, конвертирует Loop End If = 1 To ññûëêè Г*Г* Г§Г*ГЄГ*Г§
n + 1: Range, rao As не строку адрес, этого конкретного примера.esenko: Подскажите, есть кнопка Variable not set»,Parent — даже бутербродом» добавил комментарииbboyRALF myObj.Value = 555 учебника Джесса Либерти. его в строку End If Next .UsedRange.End(xlDown).Row + 1000 Set ra = Debug.Print «Г’ГҐГ¬Г* В№» Range, rap As а ту котораяvit-271: Привет! на форме выгрузить кажется) при обращении Google переведет, что и подправил имена: ‘ внутренним переменным на С++, оченьТо есть объекты (чтобы было к i End With If Val(Right(.Cells(i, 1), GetQueryRange(URL$, «1») ‘ & n, oCell.Text Range, raa As находится на соседнем: Пример перезалит иЕсть необходимость решить в ексель в к диапазону по это родитель. В переменных (по фэншуюHugo121 класса — v похожий на наш Cells(1,1), Cells(1,2) и чему применить StrPtr), End Subсейчас ошибки 19)) > 1 ïåðåáèðГ*Гї ÿ÷åéêè ГІГ*áëèöû-ðåçóëüòГ*ГІГ*, ‘ Debug.Print c Range rz = столбце. Я имею описано заранее большое задачу с помощью ней набираю код, имени возникают «непонятно программировании это родительский) ‘ ZVI:2010-07-25, на данный момент и w - экспериментальный пример: т.д. не хранятся потом строка копируется не выдаетНо не Then URL$ = âûâîäèì ñïèñîê ГІГҐГ¬ & c.Offset(, 1) 23000000000# ‘With Sheets(3) ввиду адрес на спасибою макроса и назначитьсоздается лист книга когда» и поэтому объект(т.е. тот, к http://www.planetaexcel.ru/forum.php?thread_id=17730 ‘ Значение так и есть, уже присвоены значения#include #include class отдельно и статически в массив. То работает логика… «http://www.bus.gov.ru/public/print-form/show.html?pfid=» & Right(ThisWorkbook.Sheets(«Лист3»).Cells(i, Гў îêГ*Г® Immediate ‘ ‘.outprint Worksheets(«Г‹ГЁГ±ГІ3»).Cells(1 With ThisWorkbook.Sheets(«Г‹ГЁГ±ГІ3») ‘Íèæåñëåäóþùåå А1, а беретHugo121
его на кнопку. в ексель
чтобы её наверняка которому принадлежит объект, ячеек с именами
могу скинуть код 1100 и 2775
SimpleCat { public:код (посчитайте, сколько надо
есть непосредственно кв каком выражении
1), 19) Set ‘If Not rz + i, 2) ïðèñâîåГ*ГЁГҐ ññûëêè Г*Г* значение с В1.: Не вижу описания1) В колонкеvb.net Dim _excel избежать часто используется
из которого сам «ОТКУДА*» будут автоматическивот только что (44Ch и AD7h) SimpleCat() {itsAge = было бы хранить ячейке RtlMoveMemory не сделать, чтобы если
ra = GetQueryRange(URL$, Is Nothing Then = c & îáúåêò Гў Г¤Г*Г*Г*îìпереставлял данные для задачи. A найти значение
As New Microsoft.Office.Interop.Excel.Application более сложное, но метод вызван). скопированы в ячейки после then узказывать.. MsgBox myObj.Value ‘ 2;} ~SimpleCat() {} таких объектов для
применяется. он не находит «1») Set Rng Set Rng =
c.Offset(, 1)Но без Г¬Г*êðîñå Г*ГҐ èñïîëüçóåòñÿ. Offset(, 1) наvit-271
«Сделано». Dim _workbook As и 100%-надёжное обращениеAlex_ST
с именами «КУДА*» остается загадкой, если
555 RtlMoveMemory v, int GetAge() const одного листа!)Кстати, если длина 230000000 то дальнейшие = ra.Columns(2).Find(«23000000000 Краснодарский ra.Columns(2).Find(«23000000000 ГЉГ°Г*Г±Г*îäГ*ðñêèé ГЄГ°Г*Г©», успешно, такое чувство, Set CStart =
(1,1); (1,2). не: Сразу при запуске
2) Скопировать значение Microsoft.Office.Interop.Excel.Workbook Dim page через коллекцию Names.: Для диапазона (Range) ‘ Например: ‘ пишу exit do ByVal ObjPtr(myObj) + {return itsAge;} voidСуществует некая структура получаемой строки меньше, опреации не проводились край», , xlValues, , xlValues, xlPart, что ищет только .[A1] ‘ðååñòðîâûå Г*îìåðГ* помогает… формы, и такмже напротив, с колонки
As New Microsoft.Office.Interop.Excel.WorksheetВ нашем случае «родитель» (Parent) - Имя ячейки B3:
он просто переходит offset_v, 4& ‘
SetAge(int age) {itsAgeCells чем 2048, в и он переходил xlPart, xlWhole) If xlWhole) If Not
по столбцу А
Г§Г*ГЄГ*Г§Г* Г± ëèñòГ*
bboyRALF
нужно получать запись
B. _excel.Visible = True
это тем более лист (Sheet), для «Откуда1» ‘ Имя дальше в глобальный считали в переменную = age;} private:
, в которой хранится
массив попадет «мусор», на следующий i Not Rng Is Rng Is Nothing (на скрытом листе), В№ 3 (ÿ÷åéêГ*: Так: последней строки в3) Вставить значение ‘отображаем пустой эксель актуально, т.к. ошибки листа — книга ячейки B4: «Куда1″ цикл for v её значение
int itsAge; }; содержимое использованных (непустых) т.к. будет скопирован … Nothing Then Do Then Do ‘If А мне нужно ГЂ5) ‘For idim c as переменую нак любом напротив, в колонку
на экране _workbook в коде игнорируются (Workbook), для книги ‘ При пересчетеbboyRALF из памяти (4 int main() { ячеек листа. При участок памяти ся так понимаю, Set ra = ra.Columns(1) WhatFind(«*ÈÍÍ*»,,xlValues,xlPart,xlWhole) Then
чтобы это значение = 1 To range Set c листе
С. = _excel.Workbooks.Add() »»’затем и о том, — приложение (Application) формул значение из: Вопрос закрыт, макрос байта) RtlMoveMemory w,
using namespace std; обращении к
неопределенным содержимым, который что возвращать через GetQueryRange(URL$, «1») If do Set ra программа находила и 100 For i = ra.Columns(1).Find(«Add*», ,Hugo1214) Сделать такое пытаюсь записать данные что они возникают,При возникновении события B3 будет скопировано готов!) ByVal ObjPtr(myObj) + SimpleCat*Frisky=newSimpleCat; cout GetAge()Cells.Item(x, y).Value
находится после строки. else, а как
Not ra Is = GetQueryRange(URL$, «1») если это значение = 1 To xlValues, xlWhole) ‘xlWhole: Т.е. я должен же со всеми
или произвести форматирование мы даже и изменения любого листа в B4 PrivateВыражаю огромную благодарность offset_w, 4& ‘ SetAge(5); cout GetAge()происходит вызов процедуры, А можно и вернуть не знаю.. Nothing Then Set ‘ ïåðåáèðГ*Гї ÿ÷åéêè отсутствует на скрытом .UsedRange.End(xlDown).Row + 1000 — полное совпадение, понять что означает
значениями в колонке
ячейки, выдает ошибку не узнаем, пока возникает событие Workbook_SheetCalculate, Sub Workbook_SheetCalculate(ByVal Sh всем участвующим в считали в переменнуюЗдесь в классе SimpleCat которая извлекает из вылет программы словить
Не по теме: c = ra.Columns(2).Find(«*23000000000 ГІГ*áëèöû-ðåçóëüòГ*ГІГ*, âûâîäèì ñïèñîê листе то цикл If Val(Right(.Cells(i, 1), xlPart — вхождение.»Смотрим ModNewAvans этот
А-B. page.Range(«A1»).Value = «111»‘ не обнаружим, что которое в качестве As Object) ‘ наставлении меня на w её значение также объявлена private-переменная структуры значение соотв. из-за обращения кbboyRALF Краснодарский край*», ,
planetaexcel.ru
Как записать значение в ячейку книги Excel
ГІГҐГ¬ Гў îêГ*Г® загрузки не продолжается… 19)) > 1 If Not (c модуть и этот
Пример во вложении. подскажите пожалуйста
на некоторых листах аргумента получает ссылку обработчик событий «пересчёт путь истины. из памяти (4 itsAge. ячейки. При использовании участку памяти, выделенному, при копировании кода xlValues, xlWhole, xlPart) Immediate ‘If Not Уже голову сломал Then ‘ ôîðìèðóåì Is Nothing) Then
клас Cl_Employee кhaminВодяной Змей макрос не переносит
на лист, на
листа» (Sh -Ваше здоровье байта) Debug.Print «vТеперь о решении.
этого выражения для другой программе. с русскими буквами If Not c rz Is Nothing ничего сделать не ññûëêó ‘ Г‘Г*éò debug.? c.offset(,1).value любому из первых
: почему не сделать: vb.net As New данные. котором это событие лист, на которомArtemonX = » & Для начала я присваиванияИ то же не забывай переключаться Is Nothing Then Then ‘Find («23000000000») получается… Помогите пожалуйста ГЁ ïîèñêîâûé Г§Г*ïðîñbboyRALF -4 листов по формулой?) Microsoft.Office.Interop.Excel.Worksheetтак нельзя, насколькоArtemonX произошло (Sh). произошло событие) Dim: Здравствуйте. v ‘ v немногоCells.Item(x, y).Value = 555 самое можно сделать на русскую раскладку. Worksheets(«Лист3»).Cells(1 + i, ‘If Not Find
Апострофф ГЄ Г±Г*éòó. ‘ÑèГ*ГІГ*ГЄГ±ГЁГ±: кнопке Розрахувати»Sub copy() Dim знаю.: Отличная подсказка, The_Prist,Процедура обработки события
CyberForum.ru
Как дописать значение в ячейку
rRng As Range,Задачка: в ячейку2 = 1110 Debug.Printусложнилпроисходит вызов другой так, без APIИ предварительный просмотр 3) = c.Cells(1) Then If Not
: эта часть отвечает
ïîñòðîåГ*ГЁГї Г§Г*ïðîñГ* îïðåäåëÿåòñÿDragokasОчевидно мне сперва rng As RangeМожно так:
спасибо. Мне это перебирает все имена oName As Name,
(лист2) нужно записать «w = «исходное задание: процедуры, которая помещает
и проблем Sub используй… End If End ra Is Nothing
за ограничения зоны ïîèñêîâîé Г¬Г*ГёГЁГ*îé Г±Г*éòГ*, Работает, огромное спасибо. нужно пойти посмотреть Set rng =
CyberForum.ru
Поиск значения и запись в ячейку
vb.net Dim page тоже пригодится.
(oName) в коллекции sNAME As String число получившееся в & w ‘
в классе я увеличил новое значение в test() Dim b()
Alex.Karev If End If Then Set c
поиска столбцом № URL$ = «http://www.bus.gov.ru/public/print-form/show.html?pfid=»но он копирует
экстрасенсов по ТНТ. Range(«A3:C12») For i As Microsoft.Office.Interop.Excel.Worksheet pageВ моем случае
Names
Application.EnableEvents = False результате вычисления формулой w = 2775
количество private-переменных (теперь структуру. В каком As Byte b: Здравствуйте, уважаемые форумчане! Next i Loop = ra.Columns(2).Find(«*23000000000 ГЉГ°Г*Г±Г*îäГ*ðñêèé 1 (т.е. «А»). & Right(ThisWorkbook.Sheets(«Г‹ГЁГ±ГІ3»).Cells(i, 1), так же «Add» Ну а там = 1 To
CyberForum.ru
Получить значение последней записи ячейки определённого столбца VBA Excel
= _workbook.ActiveSheet ‘после лучше узнать оЕсли имя очередного ‘ отключаем возникновение в ячейке1 (лист1)
‘ теперь искусственно
это `v` и
виде — точно = CStr(Cells(1, 1))Считать значение ячейки End If End
ГЄГ°Г*Г©*», , xlValues,* — в 19) ‘- ïîñëå в ячейку, а и «Танцы на rng.Rows.Count If rng.Cells(i, _workbook = _excel.Workbooks.Add() сбое в работе элемента коллекции совпадает ЛЮБЫХ событий чтобы (но не формулу, поменяем значение переменной `w`) и изменил знают только создатели ‘нижний индекс 0
A1 на текущем With End SubЭто xlWhole, xlPart) ‘If поисковой строке не
Г°Г*ГўГ*Г® äîëæГ*Г® ГўГ±ГІГ*âëÿòüñÿ как сделать чтобы
ТНТ» 1) = «Сделано»kOS_77
программы через ошибку с шаблоном «ОТКУДА*», не возникало пересчёта как у меня v RtlMoveMemory ByVal формулы их расчёта
Excel. Может быть, If UBound(b) < листе можно так:
ваш код после Not (c Is обязательны, если стоит ïîëå Г± ðååñòðîâûì
он не попадалvit-271 Then rng.Cells(i, 3): Вот полный пример , чем быть то: формул при изменениях, получилось). ObjPtr(myObj) + offset_v, — теперь они только в виде 4095 Then ReDimMsgBox ActiveSheet.Cells(1, 1).Value удаления комментариев и Nothing) Then Debug.Print модификатор xlPart (искать Г*îìåðîì Г§Г*ГЄГ*Г§Г* (ГЂ4) ? а попадало: вкласе описано и = rng.Cells(i, 2)
работы с эксель, в неведении и1. Переменной rRange вносимых макросом наВ связи с &H888, 8& ‘
не просто равны формулы, т.е. текста Preserve b(4095) ‘еслиА можно так:
расстановки отступов, c.Offset(, 1).Value If без точного совпадения)
ГЁ ГІГ*ГЄ ГЇГ® значение с соседней стоят + что End If Next только перед этим допустить неправильные расчеты. присваивается ссылка на
лист On Error этим поискал на теперь содержимое памяти,
аргументу `x`, и «555». Может быть, надо получить массив#If VBA7 ThenЧитайте, разбирайтесь (каждому Not c Is
Dragokas ïîðÿäêó, ïîòîì Г*Г*äî строки нужно виполнить. i End Sub вам необходимо подключить
В общем спасибо диапазон (ячейку), которому Resume Next ‘ форуме и нашел
CyberForum.ru
относящееся к переменной
AnSo
Пользователь
Сообщений: 15
Регистрация: 20.03.2017
Всем привет!
Есть ячейка A1, в которой содержатся строки с разным форматированием (см. вложение):
3. Жирный текст
2. Красный текст
1. Обычный текст
Как с помощью VBA в ячейку, в начало, добавить еще одну строку обычного текста, чтобы существующее форматирование не нарушилось, т.е. 3-я строка осталась жирной, 2-я Красной, а 1-я осталась без форматирования?
Уточнение: приведенное форматирование текста внутри ячейки это просто пример, т.е. на самом деле оно может быть произвольным.
Если я делаю так:
Код |
---|
Cells(1, 1).FormulaR1C1 = "4. Обычный текст" & Chr(10) & Cells(1, 1).FormulaR1C1 |
то форматирование нарушается, становиться одинаковым для всей ячейки (т.е. для всего текста внутри ячейки).
РЕШЕНИЕ №1 от Alec Perle, в ответе #12:
Ограничение: работает только если в ячейке содержится не более 255 символов.
Код |
---|
ActiveCell.Characters(0, 0).Insert "Дополнительная строка" & Chr(10) |
РЕШЕНИЕ №2 от БМВ, в ответе #11:
Ограничения:
1. В процессе вставки подменяются некоторые цвета текста внутри ячейки, например стандартный зеленый #00B050.
2. Если на листе используется условное форматирование, то после вставки целевая ячейка исключается из диапазонов существующих условий условного форматирования.
Код |
---|
Sub insertText() sXml = Cells(1, 1).Value(xlRangeValueXMLSpreadsheet) sXml = Application.Trim(Replace$(Replace$(Replace$(sXml, vbCrLf, " "), vbLf, " "), vbCr, " ")) s = "Type=""String"" xmlns=""http://www.w3.org/TR/REC-html40"">" p = InStr(sXml, s) + Len(s) sXml = Left(sXml, p - 1) & "<Font html:Color=""#000000"">4. Обычный текст </Font>" & Mid(sXml, p, 32768) Cells(1, 1).Value(xlRangeValueXMLSpreadsheet) = sXml End Sub |
ОГРОМНОЕ СПАСИБО: Alec Perle (Решение1), БМВ (Решение 2), Jack Famous (комментарий про MID) и конечно автору первоисточника — ZVI.
Результат того, что мне было нужно в ответе #27.
Прикрепленные файлы
- cell.jpg (12.47 КБ)
Изменено: AnSo — 18.10.2019 09:41:35
VBA-Урок 5. Свойства (Properties)
В данной статье мы будем учиться писать VBA код, чтобы управлять содержимым ячеек, самими ячейками и листами.
1. Запись значений в ячейку
Для начала откроем редактор, добавим модуль, скопируем туда этот макрос:
Мы обратились к ячейке A1 . Теперь давайте попробуем управлять данной ячейкой. Чтобы увидеть, что мы можем сделать, добавим точку после Range («A1»).
Выберите значение Value и нажмите Tab. Получим такой код:
Значение Value отображает содержимое ячейки.
Теперь давайте запишем значение 35 в ячейку A1:
Попробуем теперь записать текст в ячейку (когда присваиваем текстовое значение, его нужно брать в двойные кавычки «»):
Заметим, что макрос будет отображать значение в том листе, который вы последний раз открывали. Поэтому, чтобы управлять содержимым ячейки на любом листе книги, нам нужно будет прописать полный путь к ячейке, а именно добавить впереди кода название листа, например:
Вариант 1. Обращаемся по названию листа — Sheets(«Sheet2»).
Вариант 2. Обращаемся не по названию листа, а по его порядковому номеру — Sheets(2).
Аналогично, если мы хотим обратиться к ячейке в другой книге, нам нужно в начале кода прописать название книги:
Хотя мы указываем параметр Value в наших примерах, на самом деле его можно не использовать, поскольку он стоит по умолчанию. То есть, эти две строки кода будут эквивалентными:
2. Удаление значений
Удалим значение 35 из ячейки A1, которое мы записали в начале урока:
3. Форматирование значений
Если вы выберете значение Font , то появится список параметров, которые вы сможете применить к ячейке:
Форматирование: изменение размера текста
Давайте присвоим ячейке значение 35 и уменьшим размер шрифта до 8:
Работа с Excel — записать в ячейку значение из TextBox
Что еще можно почитать
Дозапись в файл на FTP (Декабрь 8, 2015)
Генератор QR-кода на VB .NET (Март 13, 2016)
Plazma — Black Bird Fly (Cover) (Сентябрь 2, 2015)
Magic Mystery (Systems In Blue Cover) (Март 30, 2016)
Получить имя компьютера по его IP-адресу (Декабрь 4, 2015)
13 комментариев: Работа с Excel — записать в ячейку значение из TextBox
Добрый вечер!
Как сделать, что б запись выполнялась в пустую строку таблицы excel т.е. программа ищет пустую стоку и в нее записывает значение?
@ Игорь:
Добрый.
Вам нужен UsedRange, можете загуглить.
Пример будет выглядеть так (строка 7):
@ Игорь:
Добрый.
Вам нужен UsedRange, можете загуглить.
БОЛЬШОЕ Спасибо! Сейчас попробую погуглить и разобраться!
Но я вот, что имел ввиду:
есть два поля textbox1 и textbox2, кнопка button1 «Записать». Необходимо при нажатии кнопки выполнить запись из textbox1 и textbox2 в таблицу excel (например файл 1.xlsx). Причем textbox1 в столбец «В», а textbox2 в столбец «С», но в свободную строку (не заполненную), например 1, 2, 3 строки заполнены, а 4 пустая — так вот в нее!
В cells второй параметр — это и есть индекс столбца. Там указана 1, т.е. первый столбец. Вы пишите нужный.
Что Вас смущает?
VBA Excel. Ячейки (обращение, запись, чтение, очистка)
Обращение к ячейке на листе Excel из кода VBA. Запись информации в ячейку. Чтение информации из ячейки. Очистка значения ячейки. Метод ClearContents объекта Range.
Обращение к ячейке
Допустим, у нас есть два открытых файла: «Книга1» и «Книга2», причем, файл «Книга1» активен и в нем находится исполняемый код VBA.
В общем случае при обращении к ячейке неактивной рабочей книги «Книга2» из кода файла «Книга1» прописывается полный путь:
Удобнее обращаться к ячейке через свойство рабочего листа Cells(номер строки, номер столбца), так как вместо номеров строк и столбцов можно использовать переменные. Обратите внимание, что при обращении к любой рабочей книге, она должна быть открыта, иначе произойдет ошибка. Закрытую книгу перед обращением к ней необходимо открыть.
Теперь предположим, что у нас в активной книге «Книга1» активны «Лист1» и ячейка на нем «A1». Тогда обращение к ячейке «A1» можно записать следующим образом:
Точно также можно обращаться и к другим ячейкам активного рабочего листа, кроме обращения ActiveCell, так как активной может быть только одна ячейка, в нашем примере — это ячейка «A1».
Если мы обращаемся к ячейке на неактивном листе активной рабочей книги, тогда необходимо указать этот лист:
Имя ярлыка может совпадать с основным именем листа. Увидеть эти имена можно в окне редактора VBA в проводнике проекта. Без скобок отображается основное имя листа, в скобках — имя ярлыка.
Кроме того к ячейке на рабочем листе можно обращаться по ее индексу (порядковому номеру), который считается по расположению ячейки на листе слева-направо и сверху-вниз. Например, индекс ячеек в первой строке равен номеру столбца. Индекс ячеек во второй строке равен количеству ячеек в первой строке (которое равно общему количеству столбцов на листе — зависит от версии Excel) плюс номер столбца. Индекс ячеек в третьей строке равен количеству ячеек в двух первых строках плюс номер столбца. И так далее. Для примера, Cells(4) та же ячейка, что и Cells(1, 4). Используется такое обозначение редко, тем более, что у разных версий Excel может быть разным количество столбцов и строк на рабочем листе.
Запись информации в ячейку
Содержание ячейки определяется ее свойством «Value», которое в VBA Excel является свойством по умолчанию и его можно явно не указывать. Записывается информация в ячейку при помощи оператора присваивания «=»:
Вместе с числами и текстом можно использовать переменные. Примеры здесь и ниже приведены для активного листа. Для неактивных листов дополнительно необходимо указывать имя листа, как в разделе «Обращение к ячейке».
Чтение информации из ячейки
Считать информацию из ячейки в переменную можно также при помощи оператора присваивания «=»:
Точно также можно обмениваться информацией между ячейками:
Очистка значения ячейки
Очищается ячейка от значения с помощью метода ClearContents. Кроме того, можно присвоить ячейке значение нуля или пустой строки:
Чтение и запись значения ячейки в 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 активного листа.
Визуальное отображение значения на экране будет зависеть от того, какой формат ячейки выбран на листе.
Запись значения в ячейку, которая не вызывает функцию, через функцию VBA
Мне интересно, можно ли записывать значения в ячейку в Excel через функцию VBA?
Аки ни строки в следующей функции будут называть:
Но следующим пустышки Sub будет работать правильно:
Есть ли что-то, что нужно сделать, чтобы быть в состоянии записать в ячейку, которая не является ячейкой, вызывающей конкретную функцию?
Создан 12 сен. 16 2016-09-12 05:33:09 Matt
Уже описано здесь, поиск этой ссылке: //stackoverflow.com/questions/9476282/cannot-vba-write-data-to-cells-in-excel-2007-2010-within-a-функция – Shai Rado 12 сен. 16 2016-09-12 05:37:14
может быть это временное решение может сделать для вас:
сократить вниз вашу OffsetValue функцию:
место следующие подвиды в кодовой области рабочего листа вы хотите использовать Function OffsetValue() в:
Если вы не хотите удалять звонок OffsetValue() из той ячейки, которую вы написали, а затем просто удалить/комментарий Target.ClearContents
это только базовый код, который вы можете улучшить с:
некоторые проверка Target диапазона, передаваемым в Worksheet_Change()
вы можете проверить, если он соответствует конкретным Значение (например: проверка Target.Value с некоторым диапазоном значений) или Диапазон (например: проверка Target сам диапазон, принадлежащий предопределенному Range ) критерии
обрабатывать ту же потребность на протяжении всей книги
, то вы должны переключиться на использование обработчика Sub ThisWorkbook_Change() событий в коде панели ThisWorkbook
На чтение 18 мин. Просмотров 75.2k.
сэр Артур Конан Дойл
Это большая ошибка — теоретизировать, прежде чем кто-то получит данные
Эта статья охватывает все, что вам нужно знать об использовании ячеек и диапазонов в VBA. Вы можете прочитать его от начала до конца, так как он сложен в логическом порядке. Или использовать оглавление ниже, чтобы перейти к разделу по вашему выбору.
Рассматриваемые темы включают свойство смещения, чтение
значений между ячейками, чтение значений в массивы и форматирование ячеек.
Содержание
- Краткое руководство по диапазонам и клеткам
- Введение
- Важное замечание
- Свойство Range
- Свойство Cells рабочего листа
- Использование Cells и Range вместе
- Свойство Offset диапазона
- Использование диапазона CurrentRegion
- Использование Rows и Columns в качестве Ranges
- Использование Range вместо Worksheet
- Чтение значений из одной ячейки в другую
- Использование метода Range.Resize
- Чтение Value в переменные
- Как копировать и вставлять ячейки
- Чтение диапазона ячеек в массив
- Пройти через все клетки в диапазоне
- Форматирование ячеек
- Основные моменты
Краткое руководство по диапазонам и клеткам
Функция | Принимает | Возвращает | Пример | Вид |
Range | адреса ячеек |
диапазон ячеек |
.Range(«A1:A4») | $A$1:$A$4 |
Cells | строка, столбец |
одна ячейка |
.Cells(1,5) | $E$1 |
Offset | строка, столбец |
диапазон | .Range(«A1:A2») .Offset(1,2) |
$C$2:$C$3 |
Rows | строка (-и) | одна или несколько строк |
.Rows(4) .Rows(«2:4») |
$4:$4 $2:$4 |
Columns | столбец (-цы) |
один или несколько столбцов |
.Columns(4) .Columns(«B:D») |
$D:$D $B:$D |
Введение
Это третья статья, посвященная трем основным элементам VBA. Этими тремя элементами являются Workbooks, Worksheets и Ranges/Cells. Cells, безусловно, самая важная часть Excel. Почти все, что вы делаете в Excel, начинается и заканчивается ячейками.
Вы делаете три основных вещи с помощью ячеек:
- Читаете из ячейки.
- Пишите в ячейку.
- Изменяете формат ячейки.
В Excel есть несколько методов для доступа к ячейкам, таких как Range, Cells и Offset. Можно запутаться, так как эти функции делают похожие операции.
В этой статье я расскажу о каждом из них, объясню, почему они вам нужны, и когда вам следует их использовать.
Давайте начнем с самого простого метода доступа к ячейкам — с помощью свойства Range рабочего листа.
Важное замечание
Я недавно обновил эту статью, сейчас использую Value2.
Вам может быть интересно, в чем разница между Value, Value2 и значением по умолчанию:
' Value2 Range("A1").Value2 = 56 ' Value Range("A1").Value = 56 ' По умолчанию используется значение Range("A1") = 56
Использование Value может усечь число, если ячейка отформатирована, как валюта. Если вы не используете какое-либо свойство, по умолчанию используется Value.
Лучше использовать Value2, поскольку он всегда будет возвращать фактическое значение ячейки.
Свойство Range
Рабочий лист имеет свойство Range, которое можно использовать для доступа к ячейкам в VBA. Свойство Range принимает тот же аргумент, что и большинство функций Excel Worksheet, например: «А1», «А3: С6» и т.д.
В следующем примере показано, как поместить значение в ячейку с помощью свойства Range.
Sub ZapisVYacheiku() ' Запишите число в ячейку A1 на листе 1 этой книги ThisWorkbook.Worksheets("Лист1").Range("A1").Value2 = 67 ' Напишите текст в ячейку A2 на листе 1 этой рабочей книги ThisWorkbook.Worksheets("Лист1").Range("A2").Value2 = "Иван Петров" ' Запишите дату в ячейку A3 на листе 1 этой книги ThisWorkbook.Worksheets("Лист1").Range("A3").Value2 = #11/21/2019# End Sub
Как видно из кода, Range является членом Worksheets, которая, в свою очередь, является членом Workbook. Иерархия такая же, как и в Excel, поэтому должно быть легко понять. Чтобы сделать что-то с Range, вы должны сначала указать рабочую книгу и рабочий лист, которому она принадлежит.
В оставшейся части этой статьи я буду использовать кодовое имя для ссылки на лист.
Следующий код показывает приведенный выше пример с использованием кодового имени рабочего листа, т.е. Лист1 вместо ThisWorkbook.Worksheets («Лист1»).
Sub IspKodImya () ' Запишите число в ячейку A1 на листе 1 этой книги Sheet1.Range("A1").Value2 = 67 ' Напишите текст в ячейку A2 на листе 1 этой рабочей книги Sheet1.Range("A2").Value2 = "Иван Петров" ' Запишите дату в ячейку A3 на листе 1 этой книги Sheet1.Range("A3").Value2 = #11/21/2019# End Sub
Вы также можете писать в несколько ячеек, используя свойство
Range
Sub ZapisNeskol() ' Запишите число в диапазон ячеек Sheet1.Range("A1:A10").Value2 = 67 ' Написать текст в несколько диапазонов ячеек Sheet1.Range("B2:B5,B7:B9").Value2 = "Иван Петров" End Sub
Свойство Cells рабочего листа
У Объекта листа есть другое свойство, называемое Cells, которое очень похоже на Range . Есть два отличия:
- Cells возвращают диапазон только одной ячейки.
- Cells принимает строку и столбец в качестве аргументов.
В приведенном ниже примере показано, как записывать значения
в ячейки, используя свойства Range и Cells.
Sub IspCells() ' Написать в А1 Sheet1.Range("A1").Value2 = 10 Sheet1.Cells(1, 1).Value2 = 10 ' Написать в А10 Sheet1.Range("A10").Value2 = 10 Sheet1.Cells(10, 1).Value2 = 10 ' Написать в E1 Sheet1.Range("E1").Value2 = 10 Sheet1.Cells(1, 5).Value2 = 10 End Sub
Вам должно быть интересно, когда использовать Cells, а когда Range. Использование Range полезно для доступа к одним и тем же ячейкам при каждом запуске макроса.
Например, если вы использовали макрос для вычисления суммы и
каждый раз записывали ее в ячейку A10, тогда Range подойдет для этой задачи.
Использование свойства Cells полезно, если вы обращаетесь к
ячейке по номеру, который может отличаться. Проще объяснить это на примере.
В следующем коде мы просим пользователя указать номер столбца. Использование Cells дает нам возможность использовать переменное число для столбца.
Sub ZapisVPervuyuPustuyuYacheiku() Dim UserCol As Integer ' Получить номер столбца от пользователя UserCol = Application.InputBox("Пожалуйста, введите номер столбца...", Type:=1) ' Написать текст в выбранный пользователем столбец Sheet1.Cells(1, UserCol).Value2 = "Иван Петров" End Sub
В приведенном выше примере мы используем номер для столбца,
а не букву.
Чтобы использовать Range здесь, потребуется преобразовать эти значения в ссылку на
буквенно-цифровую ячейку, например, «С1». Использование свойства Cells позволяет нам
предоставить строку и номер столбца для доступа к ячейке.
Иногда вам может понадобиться вернуть более одной ячейки, используя номера строк и столбцов. В следующем разделе показано, как это сделать.
Использование Cells и Range вместе
Как вы уже видели, вы можете получить доступ только к одной ячейке, используя свойство Cells. Если вы хотите вернуть диапазон ячеек, вы можете использовать Cells с Range следующим образом:
Sub IspCellsSRange() With Sheet1 ' Запишите 5 в диапазон A1: A10, используя свойство Cells .Range(.Cells(1, 1), .Cells(10, 1)).Value2 = 5 ' Диапазон B1: Z1 будет выделен жирным шрифтом .Range(.Cells(1, 2), .Cells(1, 26)).Font.Bold = True End With End Sub
Как видите, вы предоставляете начальную и конечную ячейку
диапазона. Иногда бывает сложно увидеть, с каким диапазоном вы имеете дело,
когда значением являются все числа. Range имеет свойство Address, которое
отображает буквенно-цифровую ячейку для любого диапазона. Это может
пригодиться, когда вы впервые отлаживаете или пишете код.
В следующем примере мы распечатываем адрес используемых нами
диапазонов.
Sub PokazatAdresDiapazona() ' Примечание. Использование подчеркивания позволяет разделить строки кода. With Sheet1 ' Запишите 5 в диапазон A1: A10, используя свойство Cells .Range(.Cells(1, 1), .Cells(10, 1)).Value2 = 5 Debug.Print "Первый адрес: " _ + .Range(.Cells(1, 1), .Cells(10, 1)).Address ' Диапазон B1: Z1 будет выделен жирным шрифтом .Range(.Cells(1, 2), .Cells(1, 26)).Font.Bold = True Debug.Print "Второй адрес : " _ + .Range(.Cells(1, 2), .Cells(1, 26)).Address End With End Sub
В примере я использовал Debug.Print для печати в Immediate Window. Для просмотра этого окна выберите «View» -> «в Immediate Window» (Ctrl + G).
Свойство Offset диапазона
У диапазона есть свойство, которое называется Offset. Термин «Offset» относится к отсчету от исходной позиции. Он часто используется в определенных областях программирования. С помощью свойства «Offset» вы можете получить диапазон ячеек того же размера и на определенном расстоянии от текущего диапазона. Это полезно, потому что иногда вы можете выбрать диапазон на основе определенного условия. Например, на скриншоте ниже есть столбец для каждого дня недели. Учитывая номер дня (т.е. понедельник = 1, вторник = 2 и т.д.). Нам нужно записать значение в правильный столбец.
Сначала мы попытаемся сделать это без использования Offset.
' Это Sub тесты с разными значениями Sub TestSelect() ' Понедельник SetValueSelect 1, 111.21 ' Среда SetValueSelect 3, 456.99 ' Пятница SetValueSelect 5, 432.25 ' Воскресение SetValueSelect 7, 710.17 End Sub ' Записывает значение в столбец на основе дня Public Sub SetValueSelect(lDay As Long, lValue As Currency) Select Case lDay Case 1: Sheet1.Range("H3").Value2 = lValue Case 2: Sheet1.Range("I3").Value2 = lValue Case 3: Sheet1.Range("J3").Value2 = lValue Case 4: Sheet1.Range("K3").Value2 = lValue Case 5: Sheet1.Range("L3").Value2 = lValue Case 6: Sheet1.Range("M3").Value2 = lValue Case 7: Sheet1.Range("N3").Value2 = lValue End Select End Sub
Как видно из примера, нам нужно добавить строку для каждого возможного варианта. Это не идеальная ситуация. Использование свойства Offset обеспечивает более чистое решение.
' Это Sub тесты с разными значениями Sub TestOffset() DayOffSet 1, 111.01 DayOffSet 3, 456.99 DayOffSet 5, 432.25 DayOffSet 7, 710.17 End Sub Public Sub DayOffSet(lDay As Long, lValue As Currency) ' Мы используем значение дня с Offset, чтобы указать правильный столбец Sheet1.Range("G3").Offset(, lDay).Value2 = lValue End Sub
Как видите, это решение намного лучше. Если количество дней увеличилось, нам больше не нужно добавлять код. Чтобы Offset был полезен, должна быть какая-то связь между позициями ячеек. Если столбцы Day в приведенном выше примере были случайными, мы не могли бы использовать Offset. Мы должны были бы использовать первое решение.
Следует иметь в виду, что Offset сохраняет размер диапазона. Итак .Range («A1:A3»).Offset (1,1) возвращает диапазон B2:B4. Ниже приведены еще несколько примеров использования Offset.
Sub IspOffset() ' Запись в В2 - без Offset Sheet1.Range("B2").Offset().Value2 = "Ячейка B2" ' Написать в C2 - 1 столбец справа Sheet1.Range("B2").Offset(, 1).Value2 = "Ячейка C2" ' Написать в B3 - 1 строка вниз Sheet1.Range("B2").Offset(1).Value2 = "Ячейка B3" ' Запись в C3 - 1 столбец справа и 1 строка вниз Sheet1.Range("B2").Offset(1, 1).Value2 = "Ячейка C3" ' Написать в A1 - 1 столбец слева и 1 строка вверх Sheet1.Range("B2").Offset(-1, -1).Value2 = "Ячейка A1" ' Запись в диапазон E3: G13 - 1 столбец справа и 1 строка вниз Sheet1.Range("D2:F12").Offset(1, 1).Value2 = "Ячейки E3:G13" End Sub
Использование диапазона CurrentRegion
CurrentRegion возвращает диапазон всех соседних ячеек в данный диапазон. На скриншоте ниже вы можете увидеть два CurrentRegion. Я добавил границы, чтобы прояснить CurrentRegion.
Строка или столбец пустых ячеек означает конец CurrentRegion.
Вы можете вручную проверить
CurrentRegion в Excel, выбрав диапазон и нажав Ctrl + Shift + *.
Если мы возьмем любой диапазон
ячеек в пределах границы и применим CurrentRegion, мы вернем диапазон ячеек во
всей области.
Например:
Range («B3»). CurrentRegion вернет диапазон B3:D14
Range («D14»). CurrentRegion вернет диапазон B3:D14
Range («C8:C9»). CurrentRegion вернет диапазон B3:D14 и так далее
Как пользоваться
Мы получаем CurrentRegion следующим образом
' CurrentRegion вернет B3:D14 из приведенного выше примера Dim rg As Range Set rg = Sheet1.Range("B3").CurrentRegion
Только чтение строк данных
Прочитать диапазон из второй строки, т.е. пропустить строку заголовка.
' CurrentRegion вернет B3:D14 из приведенного выше примера Dim rg As Range Set rg = Sheet1.Range("B3").CurrentRegion ' Начало в строке 2 - строка после заголовка Dim i As Long For i = 2 To rg.Rows.Count ' текущая строка, столбец 1 диапазона Debug.Print rg.Cells(i, 1).Value2 Next i
Удалить заголовок
Удалить строку заголовка (т.е. первую строку) из диапазона. Например, если диапазон — A1:D4, это возвратит A2:D4
' CurrentRegion вернет B3:D14 из приведенного выше примера Dim rg As Range Set rg = Sheet1.Range("B3").CurrentRegion ' Удалить заголовок Set rg = rg.Resize(rg.Rows.Count - 1).Offset(1) ' Начните со строки 1, так как нет строки заголовка Dim i As Long For i = 1 To rg.Rows.Count ' текущая строка, столбец 1 диапазона Debug.Print rg.Cells(i, 1).Value2 Next i
Использование Rows и Columns в качестве Ranges
Если вы хотите что-то сделать со всей строкой или столбцом,
вы можете использовать свойство «Rows и
Columns» на рабочем листе. Они оба принимают один параметр — номер строки
или столбца, к которому вы хотите получить доступ.
Sub IspRowIColumns() ' Установите размер шрифта столбца B на 9 Sheet1.Columns(2).Font.Size = 9 ' Установите ширину столбцов от D до F Sheet1.Columns("D:F").ColumnWidth = 4 ' Установите размер шрифта строки 5 до 18 Sheet1.Rows(5).Font.Size = 18 End Sub
Использование Range вместо Worksheet
Вы также можете использовать Cella, Rows и Columns, как часть Range, а не как часть Worksheet. У вас может быть особая необходимость в этом, но в противном случае я бы избегал практики. Это делает код более сложным. Простой код — твой друг. Это уменьшает вероятность ошибок.
Код ниже выделит второй столбец диапазона полужирным. Поскольку диапазон имеет только две строки, весь столбец считается B1:B2
Sub IspColumnsVRange() ' Это выделит B1 и B2 жирным шрифтом. Sheet1.Range("A1:C2").Columns(2).Font.Bold = True End Sub
Чтение значений из одной ячейки в другую
В большинстве примеров мы записали значения в ячейку. Мы
делаем это, помещая диапазон слева от знака равенства и значение для размещения
в ячейке справа. Для записи данных из одной ячейки в другую мы делаем то же
самое. Диапазон назначения идет слева, а диапазон источника — справа.
В следующем примере показано, как это сделать:
Sub ChitatZnacheniya() ' Поместите значение из B1 в A1 Sheet1.Range("A1").Value2 = Sheet1.Range("B1").Value2 ' Поместите значение из B3 в лист2 в ячейку A1 Sheet1.Range("A1").Value2 = Sheet2.Range("B3").Value2 ' Поместите значение от B1 в ячейки A1 до A5 Sheet1.Range("A1:A5").Value2 = Sheet1.Range("B1").Value2 ' Вам необходимо использовать свойство «Value», чтобы прочитать несколько ячеек Sheet1.Range("A1:A5").Value2 = Sheet1.Range("B1:B5").Value2 End Sub
Как видно из этого примера, невозможно читать из нескольких ячеек. Если вы хотите сделать это, вы можете использовать функцию копирования Range с параметром Destination.
Sub KopirovatZnacheniya() ' Сохранить диапазон копирования в переменной Dim rgCopy As Range Set rgCopy = Sheet1.Range("B1:B5") ' Используйте это для копирования из более чем одной ячейки rgCopy.Copy Destination:=Sheet1.Range("A1:A5") ' Вы можете вставить в несколько мест назначения rgCopy.Copy Destination:=Sheet1.Range("A1:A5,C2:C6") End Sub
Функция Copy копирует все, включая формат ячеек. Это тот же результат, что и ручное копирование и вставка выделения. Подробнее об этом вы можете узнать в разделе «Копирование и вставка ячеек»
Использование метода Range.Resize
При копировании из одного диапазона в другой с использованием присваивания (т.е. знака равенства) диапазон назначения должен быть того же размера, что и исходный диапазон.
Использование функции Resize позволяет изменить размер
диапазона до заданного количества строк и столбцов.
Например:
Sub ResizePrimeri() ' Печатает А1 Debug.Print Sheet1.Range("A1").Address ' Печатает A1:A2 Debug.Print Sheet1.Range("A1").Resize(2, 1).Address ' Печатает A1:A5 Debug.Print Sheet1.Range("A1").Resize(5, 1).Address ' Печатает A1:D1 Debug.Print Sheet1.Range("A1").Resize(1, 4).Address ' Печатает A1:C3 Debug.Print Sheet1.Range("A1").Resize(3, 3).Address End Sub
Когда мы хотим изменить наш целевой диапазон, мы можем
просто использовать исходный размер диапазона.
Другими словами, мы используем количество строк и столбцов
исходного диапазона в качестве параметров для изменения размера:
Sub Resize() Dim rgSrc As Range, rgDest As Range ' Получить все данные в текущей области Set rgSrc = Sheet1.Range("A1").CurrentRegion ' Получить диапазон назначения Set rgDest = Sheet2.Range("A1") Set rgDest = rgDest.Resize(rgSrc.Rows.Count, rgSrc.Columns.Count) rgDest.Value2 = rgSrc.Value2 End Sub
Мы можем сделать изменение размера в одну строку, если нужно:
Sub Resize2() Dim rgSrc As Range ' Получить все данные в ткущей области Set rgSrc = Sheet1.Range("A1").CurrentRegion With rgSrc Sheet2.Range("A1").Resize(.Rows.Count, .Columns.Count) = .Value2 End With End Sub
Чтение Value в переменные
Мы рассмотрели, как читать из одной клетки в другую. Вы также можете читать из ячейки в переменную. Переменная используется для хранения значений во время работы макроса. Обычно вы делаете это, когда хотите манипулировать данными перед тем, как их записать. Ниже приведен простой пример использования переменной. Как видите, значение элемента справа от равенства записывается в элементе слева от равенства.
Sub IspVar() ' Создайте Dim val As Integer ' Читать число из ячейки val = Sheet1.Range("A1").Value2 ' Добавить 1 к значению val = val + 1 ' Запишите новое значение в ячейку Sheet1.Range("A2").Value2 = val End Sub
Для чтения текста в переменную вы используете переменную
типа String.
Sub IspVarText() ' Объявите переменную типа string Dim sText As String ' Считать значение из ячейки sText = Sheet1.Range("A1").Value2 ' Записать значение в ячейку Sheet1.Range("A2").Value2 = sText End Sub
Вы можете записать переменную в диапазон ячеек. Вы просто
указываете диапазон слева, и значение будет записано во все ячейки диапазона.
Sub VarNeskol() ' Считать значение из ячейки Sheet1.Range("A1:B10").Value2 = 66 End Sub
Вы не можете читать из нескольких ячеек в переменную. Однако
вы можете читать массив, который представляет собой набор переменных. Мы
рассмотрим это в следующем разделе.
Как копировать и вставлять ячейки
Если вы хотите скопировать и вставить диапазон ячеек, вам не
нужно выбирать их. Это распространенная ошибка, допущенная новыми пользователями
VBA.
Вы можете просто скопировать ряд ячеек, как здесь:
Range("A1:B4").Copy Destination:=Range("C5")
При использовании этого метода копируется все — значения,
форматы, формулы и так далее. Если вы хотите скопировать отдельные элементы, вы
можете использовать свойство PasteSpecial
диапазона.
Работает так:
Range("A1:B4").Copy Range("F3").PasteSpecial Paste:=xlPasteValues Range("F3").PasteSpecial Paste:=xlPasteFormats Range("F3").PasteSpecial Paste:=xlPasteFormulas
В следующей таблице приведен полный список всех типов вставок.
Виды вставок |
xlPasteAll |
xlPasteAllExceptBorders |
xlPasteAllMergingConditionalFormats |
xlPasteAllUsingSourceTheme |
xlPasteColumnWidths |
xlPasteComments |
xlPasteFormats |
xlPasteFormulas |
xlPasteFormulasAndNumberFormats |
xlPasteValidation |
xlPasteValues |
xlPasteValuesAndNumberFormats |
Чтение диапазона ячеек в массив
Вы также можете скопировать значения, присвоив значение
одного диапазона другому.
Range("A3:Z3").Value2 = Range("A1:Z1").Value2
Значение диапазона в этом примере считается вариантом массива. Это означает, что вы можете легко читать из диапазона ячеек в массив. Вы также можете писать из массива в диапазон ячеек. Если вы не знакомы с массивами, вы можете проверить их в этой статье.
В следующем коде показан пример использования массива с
диапазоном.
Sub ChitatMassiv() ' Создать динамический массив Dim StudentMarks() As Variant ' Считать 26 значений в массив из первой строки StudentMarks = Range("A1:Z1").Value2 ' Сделайте что-нибудь с массивом здесь ' Запишите 26 значений в третью строку Range("A3:Z3").Value2 = StudentMarks End Sub
Имейте в виду, что массив, созданный для чтения, является
двумерным массивом. Это связано с тем, что электронная таблица хранит значения
в двух измерениях, то есть в строках и столбцах.
Пройти через все клетки в диапазоне
Иногда вам нужно просмотреть каждую ячейку, чтобы проверить значение.
Вы можете сделать это, используя цикл For Each, показанный в следующем коде.
Sub PeremeschatsyaPoYacheikam() ' Пройдите через каждую ячейку в диапазоне Dim rg As Range For Each rg In Sheet1.Range("A1:A10,A20") ' Распечатать адрес ячеек, которые являются отрицательными If rg.Value < 0 Then Debug.Print rg.Address + " Отрицательно." End If Next End Sub
Вы также можете проходить последовательные ячейки, используя
свойство Cells и стандартный цикл For.
Стандартный цикл более гибок в отношении используемого вами
порядка, но он медленнее, чем цикл For Each.
Sub PerehodPoYacheikam() ' Пройдите клетки от А1 до А10 Dim i As Long For i = 1 To 10 ' Распечатать адрес ячеек, которые являются отрицательными If Range("A" & i).Value < 0 Then Debug.Print Range("A" & i).Address + " Отрицательно." End If Next ' Пройдите в обратном порядке, то есть от A10 до A1 For i = 10 To 1 Step -1 ' Распечатать адрес ячеек, которые являются отрицательными If Range("A" & i) < 0 Then Debug.Print Range("A" & i).Address + " Отрицательно." End If Next End Sub
Форматирование ячеек
Иногда вам нужно будет отформатировать ячейки в электронной
таблице. Это на самом деле очень просто. В следующем примере показаны различные
форматы, которые можно добавить в любой диапазон ячеек.
Sub FormatirovanieYacheek() With Sheet1 ' Форматировать шрифт .Range("A1").Font.Bold = True .Range("A1").Font.Underline = True .Range("A1").Font.Color = rgbNavy ' Установите числовой формат до 2 десятичных знаков .Range("B2").NumberFormat = "0.00" ' Установите числовой формат даты .Range("C2").NumberFormat = "dd/mm/yyyy" ' Установите формат чисел на общий .Range("C3").NumberFormat = "Общий" ' Установить числовой формат текста .Range("C4").NumberFormat = "Текст" ' Установите цвет заливки ячейки .Range("B3").Interior.Color = rgbSandyBrown ' Форматировать границы .Range("B4").Borders.LineStyle = xlDash .Range("B4").Borders.Color = rgbBlueViolet End With End Sub
Основные моменты
Ниже приводится краткое изложение основных моментов
- Range возвращает диапазон ячеек
- Cells возвращают только одну клетку
- Вы можете читать из одной ячейки в другую
- Вы можете читать из диапазона ячеек в другой диапазон ячеек.
- Вы можете читать значения из ячеек в переменные и наоборот.
- Вы можете читать значения из диапазонов в массивы и наоборот
- Вы можете использовать цикл For Each или For, чтобы проходить через каждую ячейку в диапазоне.
- Свойства Rows и Columns позволяют вам получить доступ к диапазону ячеек этих типов