Foreversoft.ru

IT Справочник
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel текущая ячейка

Чтение и запись значения ячейки в 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». Как определить тип значения в ячейке, рассказано в следующей статье.

Читать еще:  Ограничение строк в excel 2020

Пример 7: В ячейке B1 активного листа находится текст. Прочитать значение ячейки в переменную.

Таким образом, разница между Text, Value и Value2 в способе получения значения. Очевидно, что Value2 наиболее предпочтителен, но при преобразовании даты в текст (например, чтобы показать значение пользователю), нужно использовать функцию Format.

Запись значения в ячейку

Осуществить запись значения в ячейку можно 2 способами: с помощью Value и Value2. Использование Text для записи значения не возможно, т.к. это свойство только для чтения.

Пример 8: Записать в ячейку A1 активного листа значение 123,45

Все три строки запишут в A1 одно и то же значение.

Пример 9: Записать в ячейку A2 активного листа дату 1 марта 2018 года

В данном примере тоже запишется одно и то же значение в ячейку A2 активного листа.

Визуальное отображение значения на экране будет зависеть от того, какой формат ячейки выбран на листе.

Vba excel текущая ячейка

вполне подходит — только запоминайте адрес прямо в ячейку на листе.

С другой стороны, сам Excel действительно сохраняет где-то в книге адреса всех последних активных ячеек каждого листа, так что задачка интересная. Быстрое гугление не дало ответа на вопрос

вполне подходит — только запоминайте адрес прямо в ячейку на листе.

С другой стороны, сам Excel действительно сохраняет где-то в книге адреса всех последних активных ячеек каждого листа, так что задачка интересная. Быстрое гугление не дало ответа на вопрос AndreTM

Skype: andre.tm.007
Donate: Q iwi: 9517375010

Ответить

вполне подходит — только запоминайте адрес прямо в ячейку на листе.

С другой стороны, сам Excel действительно сохраняет где-то в книге адреса всех последних активных ячеек каждого листа, так что задачка интересная. Быстрое гугление не дало ответа на вопрос Автор — AndreTM
Дата добавления — 27.05.2013 в 14:11

pswДата: Понедельник, 27.05.2013, 20:46 | Сообщение № 8

Пользователь и VB-программа (для краткости — демон) работают параллельно.
Активация Листа1 демоном ведет к деактивации Листа2 пользователя,
на котором пользователь в это время работает. Это недопустимо.

Кроме того, демон м.б. стартован после того как пользователь
побывал на Листе1 демона и покинул его — «вручную деактивировал» Лист1.
Поэтому демону нечего запоминать «в ячейку на листе»[1].
В процессе совместной работы пользователя и демона, у демона
м.б. несколько жизней (от своего старта до своего завершения),
и очередной старт жизни м.б. необязательно на Листе1.

Почему-то народ пытается обойти именно
изначально сформулированное, главное (и единственное!)
условие задачки — запрет активации неактивного листа))))

Пользователь и VB-программа (для краткости — демон) работают параллельно.
Активация Листа1 демоном ведет к деактивации Листа2 пользователя,
на котором пользователь в это время работает. Это недопустимо.

Кроме того, демон м.б. стартован после того как пользователь
побывал на Листе1 демона и покинул его — «вручную деактивировал» Лист1.
Поэтому демону нечего запоминать «в ячейку на листе»[1].
В процессе совместной работы пользователя и демона, у демона
м.б. несколько жизней (от своего старта до своего завершения),
и очередной старт жизни м.б. необязательно на Листе1.

Почему-то народ пытается обойти именно
изначально сформулированное, главное (и единственное!)
условие задачки — запрет активации неактивного листа)))) psw

Сообщение Пользователь и VB-программа (для краткости — демон) работают параллельно.
Активация Листа1 демоном ведет к деактивации Листа2 пользователя,
на котором пользователь в это время работает. Это недопустимо.

Кроме того, демон м.б. стартован после того как пользователь
побывал на Листе1 демона и покинул его — «вручную деактивировал» Лист1.
Поэтому демону нечего запоминать «в ячейку на листе»[1].
В процессе совместной работы пользователя и демона, у демона
м.б. несколько жизней (от своего старта до своего завершения),
и очередной старт жизни м.б. необязательно на Листе1.

Почему-то народ пытается обойти именно
изначально сформулированное, главное (и единственное!)
условие задачки — запрет активации неактивного листа)))) Автор — psw
Дата добавления — 27.05.2013 в 20:46

AndreTMДата: Понедельник, 27.05.2013, 20:56 | Сообщение № 9

Вы не понимаете? Excel не поддерживает такого функционала (по крайней мере, стандартными средствами).

Вам же советуют реальный обходной путь. Который исходит из того, что «текущую ячейку» на неактивном листе может изменить только пользователь. Который при этом должен хотя бы раз активировать лист. И затем деактивировать (!) А вы ударяетесь в пояснения, не имеющие отношения к задаче, — видимо, не знаете, как правильно организовать событийную модель своей задачи.

Вы не понимаете? Excel не поддерживает такого функционала (по крайней мере, стандартными средствами).

Вам же советуют реальный обходной путь. Который исходит из того, что «текущую ячейку» на неактивном листе может изменить только пользователь. Который при этом должен хотя бы раз активировать лист. И затем деактивировать (!) А вы ударяетесь в пояснения, не имеющие отношения к задаче, — видимо, не знаете, как правильно организовать событийную модель своей задачи. AndreTM

Skype: andre.tm.007
Donate: Q iwi: 9517375010

Сообщение Вы не понимаете? Excel не поддерживает такого функционала (по крайней мере, стандартными средствами).

Вам же советуют реальный обходной путь. Который исходит из того, что «текущую ячейку» на неактивном листе может изменить только пользователь. Который при этом должен хотя бы раз активировать лист. И затем деактивировать (!) А вы ударяетесь в пояснения, не имеющие отношения к задаче, — видимо, не знаете, как правильно организовать событийную модель своей задачи. Автор — AndreTM
Дата добавления — 27.05.2013 в 20:56

pswДата: Понедельник, 27.05.2013, 21:30 | Сообщение № 10
Alex_STДата: Понедельник, 27.05.2013, 21:45 | Сообщение № 11


С уважением,
Алексей
MS Excel 2003 — the best.

Ответить

pswДата: Понедельник, 27.05.2013, 23:16 | Сообщение № 12

..и вообще-то при Worksheet_Deactivate для Листа1
в ActiveCell.Address(0, 0) содержится
адрес ячейки Листа2 НА который делается переход
а не
адрес ячейки Листа1 С которого делается переход..

[admin]Оформляйте коды тегами![/admin]

..и вообще-то при Worksheet_Deactivate для Листа1
в ActiveCell.Address(0, 0) содержится
адрес ячейки Листа2 НА который делается переход
а не
адрес ячейки Листа1 С которого делается переход..

[admin]Оформляйте коды тегами![/admin] psw

Сообщение ..и вообще-то при Worksheet_Deactivate для Листа1
в ActiveCell.Address(0, 0) содержится
адрес ячейки Листа2 НА который делается переход
а не
адрес ячейки Листа1 С которого делается переход..

[admin]Оформляйте коды тегами![/admin] Автор — psw
Дата добавления — 27.05.2013 в 23:16

PoltavaДата: Вторник, 28.05.2013, 01:20 | Сообщение № 13
AndreTMДата: Вторник, 28.05.2013, 06:14 | Сообщение № 14

Я придумал немного другой вариант (с доп.переменной в модуле каждого «нужного» листа), построенный на исключениях.
Правда, что-то там не дает переключаться на другие открытые книги (есть обход — можно создать новую книгу, а в ней уже открыть нужную, но тогда до закрытия «новооткрытого» — не вернуться в книгу с демоном), хотя и продолжает считать и записывать верно. Что-то там с событиями — надо посмотреть.
Зато в рабочей книге даже удаление/добавление/копирование листов (во время работы демона) — без нареканий (при добавлении — надо озаботиться прописыванием переменной, при копировании — достаточно переместить курсор в нужную ячейку. Ибо демон пропускает активный лист при обработке, а пишет только на неактивные. И кода — минимум

Да, ещё. Переменные в модулях листа — Variant с расчетом на Object/Range, поэтому смотрите внимательно, как выполняете присваивание. Зато можно обращаться прямо к «активной» ячейке и её свойствам/методам. Конечно, можно сделать String (будет надёжнее при написании кода), но это уж проблемы разработчика.

Я придумал немного другой вариант (с доп.переменной в модуле каждого «нужного» листа), построенный на исключениях.
Правда, что-то там не дает переключаться на другие открытые книги (есть обход — можно создать новую книгу, а в ней уже открыть нужную, но тогда до закрытия «новооткрытого» — не вернуться в книгу с демоном), хотя и продолжает считать и записывать верно. Что-то там с событиями — надо посмотреть.
Зато в рабочей книге даже удаление/добавление/копирование листов (во время работы демона) — без нареканий (при добавлении — надо озаботиться прописыванием переменной, при копировании — достаточно переместить курсор в нужную ячейку. Ибо демон пропускает активный лист при обработке, а пишет только на неактивные. И кода — минимум

Да, ещё. Переменные в модулях листа — Variant с расчетом на Object/Range, поэтому смотрите внимательно, как выполняете присваивание. Зато можно обращаться прямо к «активной» ячейке и её свойствам/методам. Конечно, можно сделать String (будет надёжнее при написании кода), но это уж проблемы разработчика. AndreTM

Skype: andre.tm.007
Donate: Q iwi: 9517375010

Сообщение Я придумал немного другой вариант (с доп.переменной в модуле каждого «нужного» листа), построенный на исключениях.
Правда, что-то там не дает переключаться на другие открытые книги (есть обход — можно создать новую книгу, а в ней уже открыть нужную, но тогда до закрытия «новооткрытого» — не вернуться в книгу с демоном), хотя и продолжает считать и записывать верно. Что-то там с событиями — надо посмотреть.
Зато в рабочей книге даже удаление/добавление/копирование листов (во время работы демона) — без нареканий (при добавлении — надо озаботиться прописыванием переменной, при копировании — достаточно переместить курсор в нужную ячейку. Ибо демон пропускает активный лист при обработке, а пишет только на неактивные. И кода — минимум

Да, ещё. Переменные в модулях листа — Variant с расчетом на Object/Range, поэтому смотрите внимательно, как выполняете присваивание. Зато можно обращаться прямо к «активной» ячейке и её свойствам/методам. Конечно, можно сделать String (будет надёжнее при написании кода), но это уж проблемы разработчика. Автор — AndreTM
Дата добавления — 28.05.2013 в 06:14

Ссылка на основную публикацию
Adblock
detector