Vba excel написать в ячейке

Обращение к ячейке на листе 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")

Обращение к ячейке 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 нюанса:

  1. Я почти везде стараюсь использовать ThisWorkbook (а не, например, ActiveWorkbook) для обращения к текущей книге, в которой написан этот код (считаю это наиболее безопасным для новичков способом обращения к книгам, чтобы случайно не внести изменения в другие книги). Для экспериментов можете вставлять этот код в модули, коды книги, либо листа, и он будет работать только в пределах этой книги. 
  2. Я использую английский эксель и у меня по стандарту листы называются Sheet1, Sheet2 и т.д. Если вы работаете в русском экселе, то замените Thisworkbook.Sheets(«Sheet1») на Thisworkbook.Sheets(«Лист1»). Если этого не сделать, то вы получите ошибку в связи с тем, что пытаетесь обратиться к несуществующему объекту. Можно также заменить на Thisworkbook.Sheets(1), но это менее безопасно.

Что такое ячейка Excel?

В большинстве мест пишут: «элемент, образованный пересечением столбца и строки». Это определение полезно для людей, которые не знакомы с понятием «таблица». Для того, чтобы понять чем на самом деле является ячейка Excel, необходимо заглянуть в объектную модель Excel. При этом определения объектов «ряд», «столбец» и «ячейка» будут отличаться в зависимости от того, как мы работаем с файлом.

Объекты в Excel-VBA. Пока мы работаем в Excel без углубления в VBA определение ячейки как «пересечения» строк и столбцов нам вполне хватает, но если мы решаем как-то автоматизировать процесс в VBA, то о нём лучше забыть и просто воспринимать лист как «мешок» ячеек, с каждой из которых VBA позволяет работать как минимум тремя способами:

  1. по цифровым координатам (ряд, столбец),
  2. по адресам формата А1, B2 и т.д. (сценарий целесообразности данного способа обращения в VBA мне сложно представить)
  3. по уникальному имени (во втором и третьем вариантах мы будем иметь дело не совсем с ячейкой, а с объектом 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. На это есть две причины:

  1. Это лишь имитация действий пользователя, которая замедляет выполнение программы. Работать с объектами книги можно напрямую без использования методов Select и Activate.
  2. Это усложняет код и может приводить к неожиданным последствиям. Каждый раз перед использованием 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

Перебор ячеек

Перебор в произвольном диапазоне

Скачать файл со всеми примерами

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

  1. Цикл 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 по порядку по строкам слева направо и по столбцам — сверху вниз. Данный способ можно использовать для действий, в который вам не важны номера ячеек (закрашивание, изменение форматирования, пересчёт чего-то и т.д.).

  2. Ту же задачу можно решить с помощью двух вложенных циклов — внешний будет перебирать ряды, а вложенный — ячейки в рядах. Этот способ я использую чаще всего, потому что он позволяет получить больше контроля над исполнением: на каждой итерации цикла нам доступны координаты ячеек. Для перебора всех ячеек на листе этим методом потребуется найти последнюю заполненную ячейку. Пример кода:
    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​
  3. Если нужно перебрать все ячейки в выделенном диапазоне на активном листе, то код будет выглядеть так:
    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​

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

  4. Перебор ячеек в ряду
    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
  5. Перебор ячеек в столбце
    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 PtrSafe​If​ Nothing Then ‘n​, ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!)))))​ ÷òîáû êîïèðîâГ*ëñÿ ГІГҐГЄГ±ГІ​bboyRALF​bboyRALF​: Приветствую форумчани подскажите​ нажимаем ПроектДобавить ссылкуCOMMicrosoft​Alex_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 As​For​ 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 bytes​Do​ 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 выражение​
​ Гў îêГ*Г® Immediate​If Not ran​Set 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 Set​fever 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.Print​c &​ 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,​ ссылку на данную​bboyRALF​Hugo121​ Присваиваем 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 If​bboyRALF​ все время выручаете.​И вопрос уже​ в книге :​ — результаты вычислений​ Mid(sNAME, 7)).RefersTo), присваивается​ Range(oName.RefersTo) ‘ диапазон​ Name, s As​ описания, как именно​):​ Variant Public Property​00 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 35​​Alex.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 As​Find («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 If​If 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​ тему для обсуждения?​ что нашли Вы​ Sub​End If​bboyRALF​ Long ‘ сюда​ подробные понятные комментарии​ длины считываемой из​ заинтересовались, вопрос задан​ 19) Set ra​

​ As Range, rar​​ 100 For i​bboyRALF​ BaseStart As Range,​ не то что​
​ переменую и добавить​: Sub P1() ActiveCell.Value​
​Если мой вопрос​ для своей цели​​ArtemonX​​End 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​ конструкциях применяется RefersTo​Next​ лист.​

  • ​ Long ‘ сюда​ о классе​​ и «залезть» дальше,​​ памятью, ускорении вычислений​ xlWhole) If Not​ Error Resume Next​​ Then ‘ ôîðìèðóåì​​bboyRALF​

​ As Range, rak​Worksheets(«Г‹ГЁГ±ГІ3»).Range(«B1»).Cells(1 + i)​ определённый цвет и​: а по другому​ послать меня в​: Действительно, Range(«RngSh1»).Value чаще​Set rRng =​End Sub​Set 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​ внутренней переменной w​myObj​ с пустыми, а​ Информации по VBA​ ra = GetQueryRange(URL$,​ Range, rau As​ ГЄ Г±Г*éòó. ‘ÑèГ*ГІГ*ГЄГ±ГЁГ±​ нашел значение и​ As Range, raw​bboyRALF​ полностю но только​: Вот так можно​ столбце не все​ и 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, rar​Worksheets(«Лист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, n​bboyRALF​ подсветивалась перед удалением.​ = «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:​:D

​ он просто переходит​​ offset_v, 4& ‘​
​ SetAge(int age) {itsAge​Cells​ чем 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 i​dim 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*», ,​Hugo121​4) Сделать такое​ пытаюсь записать данные​ что они возникают,​При возникновении события​ 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 ReDim​MsgBox 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 КБ)

Изменено: AnSo18.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

сэр Артур Конан Дойл

Это большая ошибка — теоретизировать, прежде чем кто-то получит данные

Эта статья охватывает все, что вам нужно знать об использовании ячеек и диапазонов в VBA. Вы можете прочитать его от начала до конца, так как он сложен в логическом порядке. Или использовать оглавление ниже, чтобы перейти к разделу по вашему выбору.

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

Содержание

  1. Краткое руководство по диапазонам и клеткам
  2. Введение
  3. Важное замечание
  4. Свойство Range
  5. Свойство Cells рабочего листа
  6. Использование Cells и Range вместе
  7. Свойство Offset диапазона
  8. Использование диапазона CurrentRegion
  9. Использование Rows и Columns в качестве Ranges
  10. Использование Range вместо Worksheet
  11. Чтение значений из одной ячейки в другую
  12. Использование метода Range.Resize
  13. Чтение Value в переменные
  14. Как копировать и вставлять ячейки
  15. Чтение диапазона ячеек в массив
  16. Пройти через все клетки в диапазоне
  17. Форматирование ячеек
  18. Основные моменты

Краткое руководство по диапазонам и клеткам

Функция Принимает Возвращает Пример Вид
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, начинается и заканчивается ячейками.

Вы делаете три основных вещи с помощью ячеек:

  1. Читаете из ячейки.
  2. Пишите в ячейку.
  3. Изменяете формат ячейки.

В 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, вы должны сначала указать рабочую книгу и рабочий лист, которому она принадлежит.

В оставшейся части этой статьи я буду использовать кодовое имя для ссылки на лист.

code name worksheet

Следующий код показывает приведенный выше пример с использованием кодового имени рабочего листа, т.е. Лист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 . Есть два отличия:

  1. Cells возвращают диапазон только одной ячейки.
  2. 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).

ImmediateWindow

ImmediateSampeText

Свойство Offset диапазона

У диапазона есть свойство, которое называется Offset. Термин «Offset» относится к отсчету от исходной позиции. Он часто используется в определенных областях программирования. С помощью свойства «Offset» вы можете получить диапазон ячеек того же размера и на определенном расстоянии от текущего диапазона. Это полезно, потому что иногда вы можете выбрать диапазон на основе определенного условия. Например, на скриншоте ниже есть столбец для каждого дня недели. Учитывая номер дня (т.е. понедельник = 1, вторник = 2 и т.д.). Нам нужно записать значение в правильный столбец.

VBA Offset

Сначала мы попытаемся сделать это без использования 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.

VBA 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

Основные моменты

Ниже приводится краткое изложение основных моментов

  1. Range возвращает диапазон ячеек
  2. Cells возвращают только одну клетку
  3. Вы можете читать из одной ячейки в другую
  4. Вы можете читать из диапазона ячеек в другой диапазон ячеек.
  5. Вы можете читать значения из ячеек в переменные и наоборот.
  6. Вы можете читать значения из диапазонов в массивы и наоборот
  7. Вы можете использовать цикл For Each или For, чтобы проходить через каждую ячейку в диапазоне.
  8. Свойства Rows и Columns позволяют вам получить доступ к диапазону ячеек этих типов

Like this post? Please share to your friends:
  • Vba excel найти ячейку на листе
  • Vba excel найти ячейку в диапазоне
  • Vba excel найти число в строке
  • Vba excel найти строку по условию
  • Vba excel найти строку по значению ячейки