Макросы excel ввод данных в ячейку

В приложении 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 по адресу, индексу и имени. Чтение информации из ячейки. Очистка значения ячейки. Метод 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

Добрый день, уважаемые читатели блога и зрители канала! 

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

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

Ввод данных -> Tab -> ввод данных -> Tab -> ввод данных -> Enter

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

последовательный ввод данных в Excel

Если сбиться и по привычке нажать Enter вместо Tab, то придётся устанавливать курсор в начало диапазона данных и снова повторять всю процедуру. Не удобно. Особенно если у нас идёт первоначальный ввод данных и их много.

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

Построим работу на диалоговых окнах. В них будем вводить соответственно три переменных — «Название магазина», «Дата», «Выручка».

Переходим на вкладку «Разработчик» и добавляем новый модуль в книгу. О том как это сделать — ЗДЕСЬ.

  1. Вкладка «Разработчик», блок кнопок «Код», кнопка «Visual Basic»;
  2. Далее «Insert» — > «Module».

Теперь внесём туда следующий код. Его вы можете модифицировать по своему желанию.

Sub SerialInput()
Dim strDate As String
Dim strSum As String
Dim strMag As String
Dim lngRow As Long

Do
lngRow = Range(«A65536»).End(xlUp).Row + 1

‘ Вводим название магазина
strMag = InputBox(«Введите название магазина»)
If strMag = «» Then Exit Sub

‘ Вводим дату
strDate = InputBox(«Введите дату»)
If strDate = «» Then Exit Sub

‘ Вводим выручку
strSum = InputBox(«Введите выручку»)
If strSum = «» Then Exit Sub

‘ Записываем данные в ячейки таблицы
Cells(lngRow, 1) = strMag
Cells(lngRow, 2) = strDate
Cells(lngRow, 3) = strSum

Loop

End Sub

Пояснения

Как вы уже поняли, первым делом мы объявляем три переменных как и договаривались — strMag, strDate, strSum. Даём им значение — СТРОКА (String).

Также необходимо объявить переменную lngRow, она будет определять конец нашего диапазона. В примере у нас три столбца и 65536 строк. Также эта переменная будет цикличной (в конце макроса стоит команда Loop, петля).

Далее мы выводим три диалоговых окна (InputBox) с условием If str*** = «» Then Exit Sub, то есть если любое из полей будет пустым, макрос закончит свою работу.

Оставшиеся значения (Cells) записывают в соответствующие ячейки то, что введено в диалоговые окна.

Проверим правильность работы макроса. На вкладке «Разработчик» жмём кнопку макросы (альтернатива Alt+F8) и нажимаем кнопку «Выполнить».

последовательный ввод данных в Excel

Всё работает! Если же нам нужно продолжить ввод данных, просто устанавливаем курсор в первую ячейку (А10, А20, А30 и т.д.) и снова запускаем макрос.

Что-то было непонятно? Смотрим обучающее видео!

Ввод данных в ячейки макросом

alexandr_fors

Дата: Суббота, 02.11.2013, 15:29 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 11


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Добрый вечер господа.
Вот встретился с такой проблемой, с макросами со всем разобрался, а вот как сделать правильно не знаю.Может кто-то подскажет.
Смотрите вот это условия задачи:
Створити макрос, який передбачає ввести прізвище студента і вивести його в комірки з А1 по А20.

Вот как сделал я в макросе:
[vba]

Код

Sub Фамилия()

‘ Фамилия Макрос
‘ Макрос записан 02.11.2013 (Portable)

‘ Сочетание клавиш: Ctrl+й

ActiveCell.FormulaR1C1 = «Иванов»
End Sub

[/vba]

Но это же только на один столб, а как что бы с А1 по А20 , я пробывал много, но что-то не получается, ошибки выдаёт.
Подскажите в чем проблема?
Спасибо…

 

Ответить

doober

Дата: Суббота, 02.11.2013, 15:40 |
Сообщение № 2

Группа: Друзья

Ранг: Ветеран

Сообщений: 913


Репутация:

317

±

Замечаний:
0% ±


Excel 2010


Где они?
[vba]

Код

Dim Комiрка As Integer
For Комiрка = 1 To 20
Range(«A» & Комiрка) = InputBox(«Введите  ФИО студента», «Ввод фамилий»)
Next

[/vba]


 

Ответить

AndreTM

Дата: Суббота, 02.11.2013, 15:42 |
Сообщение № 3

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

О, великий и могучий окраинный язык! Ты заповедовал нам сначала спросить о имени, а затем удвадцатить это Имя! Исполним желание твое:
[vba]

Код

sub InAndStore()
      Имя = InputBox(«А введите-ка вы заповеданное имя:»)
      if Имя=»»  then exit sub
      ActiveSheet.[a1:a20] = Имя
      MsgBox «И заповедовал я значения для региону A1:A20 — » & Имя
end sub

[/vba]


Skype: andre.tm.007
Donate: Qiwi: 9517375010

Сообщение отредактировал AndreTMСуббота, 02.11.2013, 15:47

 

Ответить

alexandr_fors

Дата: Суббота, 02.11.2013, 16:01 |
Сообщение № 4

Группа: Пользователи

Ранг: Новичок

Сообщений: 11


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Я не знаю…
Вот попробывал ваше вставить, все равно что-то не то >(

 

Ответить

alexandr_fors

Дата: Суббота, 02.11.2013, 16:07 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 11


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Sub Макрос1()

‘ Макрос1 Макрос
‘ Макрос записан 02.11.2013 (Portable)

‘ Сочетание клавиш: Ctrl+й

ActiveCell.FormulaR1C1 = «Имя»
Имя = InputBox(«А введите-ка вы заповеданное имя:»)
If Имя = «» Then Exit Sub
ActiveSheet.[a1:a20] = Имя

MsgBox «И заповедовал я значения для региону A1:A20 — » & Имя

ActiveCell.FormulaR1C1 = «Имя»
End Sub
Range(«A9»).Select

 

Ответить

alexandr_fors

Дата: Суббота, 02.11.2013, 16:18 |
Сообщение № 6

Группа: Пользователи

Ранг: Новичок

Сообщений: 11


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

ооооо)))
Спасибо вам всем большое !!!
Все получилось, просто клавиша почему-то не работала(та и не работает) а через панель попробовал, все работает !!!
СПАСИБО !!!

 

Ответить

SkyPro

Дата: Суббота, 02.11.2013, 16:33 |
Сообщение № 7

Группа: Друзья

Ранг: Старожил

Сообщений: 1206


Репутация:

255

±

Замечаний:
0% ±


2010

[offtop]комiрка :D
Не знав що в нас це так називають..


skypro1111@gmail.com

 

Ответить

AndreTM

Дата: Суббота, 02.11.2013, 17:39 |
Сообщение № 8

Группа: Друзья

Ранг: Старожил

Сообщений: 1762


Репутация:

498

±

Замечаний:
0% ±


2003 & 2010

SkyPro, ну так: комiрка. Насколько я понимаю — это аналог русского «коморка»/»каморка». То бишь ячейка.
Али вы не киевлянин? Али не владеете в полной мере языком? :D
Впрочем, язык общения отношения к вопросу не имеет — а я так вообще в ответе просто немного прикололся (надеюсь, извините мну?) yes


Skype: andre.tm.007
Donate: Qiwi: 9517375010

Сообщение отредактировал AndreTMСуббота, 02.11.2013, 17:48

 

Ответить

alexandr_fors

Дата: Суббота, 02.11.2013, 17:48 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 11


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

hands

 

Ответить

Wasilich

Дата: Суббота, 02.11.2013, 17:58 |
Сообщение № 10

Группа: Друзья

Ранг: Старожил

Сообщений: 1232


Репутация:

326

±

Замечаний:
0% ±


2003

[offtop]

Не знав що в нас це так називають..

Интересно здесь http://translate.google.ru/# переводится — ячейка на украинский, а комiрка на русский. :)
[/offtop]

 

Ответить

Pelena

Дата: Суббота, 02.11.2013, 18:26 |
Сообщение № 11

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

[offtop]Ха, а на белорусский ещё интереснее: если в яндексе перевести ЯЧЕЙКА на белорусский, а потом снова на русский, получим ГЛАЗОК girl_smile [/offtop]


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

alexandr_fors

Дата: Суббота, 02.11.2013, 18:54 |
Сообщение № 12

Группа: Пользователи

Ранг: Новичок

Сообщений: 11


Репутация:

0

±

Замечаний:
0% ±


Excel 2007

Pelena, :D :D :D hands

 

Ответить

Автоматическая вставка текущей даты в ячейку при вводе данных

Предположим, у нас имеется таблица заказов, куда пользователь вводит номер заказа, имя клиента, сумму и т.д. Необходимо сделать так, чтобы при внесении номера заказа в столбец А — в столбце B напротив введенного заказа автоматически появлялись дата и время его занесения:

date_auto_enter3.png

Чтобы реализовать такой ввод даты, нам потребуется простой макрос, который надо добавить в модуль рабочего листа. Для этого щелкните правой кнопкой мыши по ярлычку листа с таблицей и выберите в контекстном меню команду Исходный текст (View code).

В открывшееся окно редактора Visual Basic скопируйте этот текст этого макроса:

Private Sub Worksheet_Change(ByVal Target As Range)
    
    For Each cell In Target   'проходим по всем измененным ячейкам
       If Not Intersect(cell, Range("A2:A100")) Is Nothing Then  'если изменененная ячейка попадает в диапазон A2:A100
            With cell.Offset(0, 1)         'вводим в соседнюю справа ячейку дату
               .Value = Now
               .EntireColumn.AutoFit  'выполняем автоподбор ширины для столбца B, чтобы дата умещалась в ячейке
            End With
       End If
    Next cell
End Sub

При необходимости измените «чувствительный» диапазон «А2:А100» на свой собственный. Если необходимо вставлять дату не в соседний столбец, а правее — подставьте в оператор Offset(0,1) вместо 1 число побольше.

Закройте редактор Visual Basic и попробуйте ввести что-нибудь в диапазон А2:А100. В соседней ячейке тут же появится текущая дата-время!

Ссылки по теме

  • Как сделать выпадающий календарь для быстрого ввода любой даты мышью в любую ячейку.
  • Как Excel работает с датами
  • Что такое макрос, как он работает, куда копировать текст макроса, как запустить макрос?

Понравилась статья? Поделить с друзьями:
  • Макросы excel vba синтаксис
  • Макрос удаления формул в excel
  • Макроса в excel для формул
  • Макрос удаление пробела excel
  • Макросы excel vba 2003