Progress-servis55.ru

Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel получить значение ячейки

Как получить старое значение измененной ячейки в Excel VBA?

Я обнаруживаю изменения в значениях определенных ячеек в электронной таблице Excel, как это.

предполагая, что это не слишком плохой способ кодирования, как мне получить значение ячейки до изменения?

14 ответов

объявить переменную say

и SelectionChange событие

и в Worksheet_Change событие

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

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

удалить его, когда книга закрыта.

и измените событие Worksheet_Change следующим образом.

вот способ, который я использовал в прошлом. Обратите внимание, что вам нужно добавить ссылку на среду выполнения сценариев Microsoft, чтобы вы могли использовать объект Dictionary — если вы не хотите добавлять эту ссылку, вы можете сделать это с коллекциями, но они медленнее, и нет элегантного способа проверить .Существует (вы должны поймать ошибку).

Как и любой подобный метод, у этого есть свои проблемы-во-первых, он не будет знать «старое» значение, пока значение не будет фактически изменено. Фиксировать это вам нужно будет поймать открытое событие в книге и пройти через лист.UsedRange населяя OldVals. Кроме того, он потеряет все свои данные, если вы сбросите проект VBA, остановив отладчик или что-то подобное.

Мне тоже пришлось это сделать. Я нашел решение от «Chris R» действительно хорошо, но подумал, что оно может быть более совместимым, не добавляя никаких ссылок. Крис, ты говорил об использовании коллекции. Итак, вот еще одно решение с использованием Collection. И в моем случае это не так уж и медленно. Кроме того, с помощью этого решения при добавлении события «_SelectionChange» он всегда работает (нет необходимости в workbook_open).

  • напишите это в ThisWorkbook модуль
  • закройте и откройте книгу

попробуйте это, он не будет работать для первого выбора, тогда он будет работать хорошо:)

мне нужно было захватить и сравнить старые значения с новыми значениями, введенными в сложную таблицу планирования. Мне нужно было общее решение, которое работало, даже когда пользователь менял много строк одновременно. Решение реализовало класс и коллекцию этого класса.

есть три листа, на которых я отслеживаю ячейки. Каждый лист получает свою собственную коллекцию как глобальную переменную в модуле с именем ProjectPlan как следует:

суб InitDictionaries вызывается из рабочего листа.откройте, чтобы установить коллекции.

для управления каждой коллекцией объектов oldValue используются три модуля: Add, Exists и Value.

тяжелый подъем выполняется в обратном вызове Worksheet_SelectionChange. Один из четырех показан ниже. Единственное отличие-это коллекция, используемая в вызовах ADD и EXIST.

значение вызов вызывается из кода, выполненного, например, из обратного вызова Worksheet_Change. Мне нужно назначить правильную коллекцию на основе имени листа:

и затем я могу вычислить сравнение некоторого текущего значения с исходным значением.

давайте сначала посмотрим, как обнаружить и сохранить значение одной ячейки интереса. Предположим Worksheets(1).Range(«B1») ваша ячейка интереса. В обычном модуле используйте следующее:

затем в модуле рабочих листов (1):

это будет захватить изменение Worksheets(1).Range(«B1») , происходит ли изменение из-за того, что пользователь активно выбирает эту ячейку на листе и изменяет значение, или из-за других кодов VBA, которые изменяют значение Worksheets(1).Range(«B1») .

Читать еще:  Как построить спарклайны в excel

С мы объявили переменную StorageArray как public, вы можете ссылаться на его последнее значение в других модулях в том же проекте VBA.

чтобы расширить нашу область до обнаружения и сохранения значений нескольких интересующих ячеек, вам необходимо:

  • объявить StorageArray как двумерный массив с количеством строк, равным числу ячеек ведется наблюдение.
  • изменить Sub SaveToStorageArray процедура для более общего Sub SaveToStorageArray(TargetSingleCell as Range) и изменить соответствующий коды.
  • изменить Private Sub Worksheet_Change процедура для размещения мониторинга этих нескольких ячеек.

приложение: Для получения дополнительной информации о времени жизни переменных, пожалуйста, обратитесь к:https://msdn.microsoft.com/en-us/library/office/gg278427.aspx

в ответ на ответ Мэтта Роя я нашел этот вариант отличным ответом, хотя я не мог опубликовать как таковой с моим текущим рейтингом. 🙁

Итак, спасибо Мэтту Рою за доведение этого кода до нашего сведения и Крису.R для размещения исходного кода.

мне нужна была эта функция, и мне не понравились все решения выше, попробовав большинство, поскольку они либо

  1. медленно
  2. имеют сложные последствия, такие как использование приложения.расстегивать.
  3. не захватывать, если они не были выбраны
  4. не захватывает значения, если они не были изменены до
  5. слишком сложно

Ну, я очень много думал об этом, и я завершил решение для полной отмены, повтора история.

захватить старое значение на самом деле очень легко и очень быстро.

мое решение-захватить все значения, как только пользователь откроет лист, откроется в переменную, и она обновляется после каждого изменения. эта переменная будет использоваться для проверки старого значения ячейки. В решениях выше всех из них используется для loop. На самом деле есть способ попроще.

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

Да, просто это, на самом деле excel вернет массив, если диапазон является несколькими ячейками, поэтому нам не нужно использовать для каждой команды, и это очень быстро

следующий подраздел-это полный код, который должен быть вызван в Workbook_SheetActivate. Для фиксации изменений необходимо создать еще одну подзаголовок. Например, у меня есть sub под названием «catchChanges», который работает на Workbook_SheetChange. Он будет захватывать изменения, а затем сохранять их на другом листе истории изменений. затем выполняется UpdateCache, чтобы обновить кэш новые значения

Теперь получить старое значение очень просто, так как массив имеет тот же адрес ячеек

примеры если мы хотим ячейку D12, мы можем использовать следующее

Это фрагмент, объясняющий метод, я надеюсь, что всем это нравится

Чтение и запись значения ячейки в 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 одно и то же значение.

Читать еще:  Показать этапы вычисления excel

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

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

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

Vba excel получить значение ячейки

ПОЛУЧИТЬ.ЯЧЕЙКУ( ном_типа ; ссылка )

Ном_типа — число, определяющее, какой тип информации о ячейке вы хотите получить. Следующий список показывает возможные значения аргумента и соответствующие результаты.

1 Абсолютную ссылку верхней левой ячейки в аргументе ссылка в виде текста в текущем стиле рабочего пространства.
2 Номер строки верхней ячейки в аргументе ссылка.
3 Номер столбца самой верхней ячейки в аргументе ссылка.
4 То же, что и ТИП(ссылка).
5 Содержимое аргумента ссылка.
6 Формула в аргументе ссылка в виде текста, стиль которого А1 или R1C1 — в зависимости от параметров рабочего пространства.
7 Номер формата ячейки (например, «М/Д/ГГ» или «Основной»).
8 Число, показывающее горизонтальное выравнивание ячейки:

1 = Нормальное
2 = Левое
3 = По центру
4 = Правое
5 = Заполнить
6 = По обоим краям
7 = Центрировать через ячейки

0 = Без границы
1 = Тонкая линия
2 = Средняя линия
3 = Штриховая линия
4 = Пунктирная линия
5 = Толстая линия
6 = Двойная линия
7 = Самая тонкая линия

0 = Не разбивается
1 = По строкам
2 = По столбцам
3 = И по строкам и по столбцам

1 = Вверх
2 = По центру
3 = Вниз
4 = По обоим краям

0 = Горизоонтальная
1 = Вертикальная
2 = Направленная вверх
3 = Направленная вниз

52 Символ префикса ячейки (или выравнивание текста) или пустой текст (««), если ячейка не содержит текста.
53 Содержимое ячейки, если она в данных момент выведена на экран в виде текста, включающего любые дополнительные цифры или символы, являющиеся результатом форматирования ячейки.
54 Возвращает имя сводной таблицы, содержащей активную ячейку.
55 Возвращает положение ячейки внутри сводной таблицы.
56 Возвращает имя поля, содержащего ссылку на активную ячейку, если оно находится внутри сводной таблицы.
57 Если все символы ячейки или только первый символ форматированы с надстрочным шрифтом, возвращается значение ИСТИНА, иначе возвращается ЛОЖЬ.
58 Возвращает стиль шрифта в виде текста всех символов ячейки или только первого символа, как показано в диалоговом окне Формат ячеек на вкладке «Шрифт». Например, «полужирный курсив».

59 Возвращает цифру для стиля «подчеркивание»:

1 = Нет
2 = Одиночное
3 = Двойное
4 = Одиночное денежное
5 = Двойное денежное

60 Если все символы ячейки или только первый символ форматированы с подстрочным шрифтом, возвращается значение ИСТИНА, иначе возвращается ЛОЖЬ.
61 Возвращается имя элемента сводной таблицы для активной ячейки в виде текста.
62 Возвращает имя рабочей книги и текущего листа в форме «[Книга1]лист1».
63 Заполняет цветом ячейку (фон).
64 Возвращает узор фона ячейки.
65 Возвращает значение ИСТИНА, если включен параметр выравнивания доб_отступ (только для Microsoft Excel версии Far East); иначе возвращает ЛОЖЬ.
66 Возвращает имя рабочей книги, содержащей ячейку в форме BOOK1.XLS.

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

Если ссылка является интервалом ячеек, в ней используется ячейка в верхнем левом углу первого интервала. Если аргумент опущен, предполагается активная ячейка.

Следующая макроформула возвращает значение ИСТИНА, если ячейка B4 на листе Лист1 выделена полужирным шрифтом:

Информацию, возвращенную функцией ПОЛУЧИТЬ.ЯЧЕЙКУ можно использовать для определения действия. Следующая макроформула выполняет пользовательскую функцию с именем BoldCell, если формула ПОЛУЧИТЬ.ЯЧЕЙКУ возвращает значение ЛОЖЬ:

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