Обычно при обновлении ячейки новым содержимым предыдущее значение будет закрыто, если не отменить операцию в Excel. Однако, если вы хотите сохранить предыдущее значение для сравнения с обновленным, сохранение предыдущего значения ячейки в другую ячейку или в комментарий к ячейке будет хорошим выбором. Метод, описанный в этой статье, поможет вам в этом.
Сохранить предыдущее значение ячейки с кодом VBA в Excel
Сохранить предыдущее значение ячейки с кодом VBA в Excel
Предположим, у вас есть таблица, как показано на скриншоте ниже. Если какая-либо ячейка в столбце C изменилась, вы хотите сохранить ее предыдущее значение в соответствующей ячейке столбца G или автоматически сохранить в комментарии. Для этого сделайте следующее.
1. На рабочем листе содержится значение, которое вы сохраните при обновлении, щелкните правой кнопкой мыши вкладку листа и выберите Просмотреть код из контекстного меню. Смотрите скриншот:
2. В дебюте Microsoft Visual Basic для приложений Скопируйте приведенный ниже код VBA в окно кода.
Следующий код VBA помогает сохранить предыдущее значение ячейки указанного столбца в другой столбец.
Код VBA: сохранить предыдущее значение ячейки в другую ячейку столбца
Dim xRg As Range
Dim xChangeRg As Range
Dim xDependRg As Range
Dim xDic As New Dictionary
Private Sub Worksheet_Change(ByVal Target As Range)
Dim I As Long
Dim xCell As Range
Dim xDCell As Range
Dim xHeader As String
Dim xCommText As String
On Error Resume Next
Application.ScreenUpdating = False
Application.EnableEvents = False
xHeader = "Previous value :"
x = xDic.Keys
For I = 0 To UBound(xDic.Keys)
Set xCell = Range(xDic.Keys(I))
Set xDCell = Cells(xCell.Row, 7)
xDCell.Value = ""
xDCell.Value = xDic.Items(I)
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim I, J As Long
Dim xRgArea As Range
On Error GoTo Label1
If Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
Set xDependRg = Target.Dependents
If xDependRg Is Nothing Then GoTo Label1
If Not xDependRg Is Nothing Then
Set xDependRg = Intersect(xDependRg, Range("C:C"))
End If
Label1:
Set xRg = Intersect(Target, Range("C:C"))
If (Not xRg Is Nothing) And (Not xDependRg Is Nothing) Then
Set xChangeRg = Union(xRg, xDependRg)
ElseIf (xRg Is Nothing) And (Not xDependRg Is Nothing) Then
Set xChangeRg = xDependRg
ElseIf (Not xRg Is Nothing) And (xDependRg Is Nothing) Then
Set xChangeRg = xRg
Else
Application.EnableEvents = True
Exit Sub
End If
xDic.RemoveAll
For I = 1 To xChangeRg.Areas.Count
Set xRgArea = xChangeRg.Areas(I)
For J = 1 To xRgArea.Count
xDic.Add xRgArea(J).Address, xRgArea(J).Formula
Next
Next
Set xChangeRg = Nothing
Set xRg = Nothing
Set xDependRg = Nothing
Application.EnableEvents = True
End Sub
Чтобы сохранить предыдущее значение ячейки в комментарии, примените приведенный ниже код VBA.
Код VBA: сохранить предыдущее значение ячейки в комментарии
Dim xRg As Range
Dim xChangeRg As Range
Dim xDependRg As Range
Dim xDic As New Dictionary
Private Sub Worksheet_Change(ByVal Target As Range)
Dim I As Long
Dim xCell As Range
Dim xHeader As String
Dim xCommText As String
On Error Resume Next
Application.ScreenUpdating = False
Application.EnableEvents = False
xHeader = "Previous value :"
For I = 0 To UBound(xDic.Keys)
Set xCell = Range(xDic.Keys(I))
If Not xCell.Comment Is Nothing Then xCell.Comment.Delete
With xCell
.AddComment
.Comment.Visible = False
.Comment.Text xHeader & vbCrLf & xDic.Items(I)
End With
Next
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim I, J As Long
Dim xRgArea As Range
On Error GoTo Label1
If Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
Set xDependRg = Target.Dependents
If xDependRg Is Nothing Then GoTo Label1
If Not xDependRg Is Nothing Then
Set xDependRg = Intersect(xDependRg, Range("C:C"))
End If
Label1:
Set xRg = Intersect(Target, Range("C:C"))
If (Not xRg Is Nothing) And (Not xDependRg Is Nothing) Then
Set xChangeRg = Union(xRg, xDependRg)
ElseIf (xRg Is Nothing) And (Not xDependRg Is Nothing) Then
Set xChangeRg = xDependRg
ElseIf (Not xRg Is Nothing) And (xDependRg Is Nothing) Then
Set xChangeRg = xRg
Else
Application.EnableEvents = True
Exit Sub
End If
xDic.RemoveAll
For I = 1 To xChangeRg.Areas.Count
Set xRgArea = xChangeRg.Areas(I)
For J = 1 To xRgArea.Count
xDic.Add xRgArea(J).Address, xRgArea(J).Text
Next
Next
Set xChangeRg = Nothing
Set xRg = Nothing
Set xDependRg = Nothing
Application.EnableEvents = True
End Sub
Внимание: В коде цифра 7 указывает столбец G, в который вы сохраните предыдущую ячейку, а C: C — столбец, в котором вы сохраните предыдущее значение ячейки. Пожалуйста, измените их в соответствии с вашими потребностями.
3. Нажмите Tools
> Рекомендации для открытия Ссылки — VBAProject диалоговое окно, проверьте Среда выполнения сценариев Microsoft поле и, наконец, щелкните OK кнопка. Смотрите скриншот:
4. нажмите другой + Q ключи, чтобы закрыть Microsoft Visual Basic для приложений окно.
С этого момента, когда значение ячейки в столбце C обновляется, предыдущее значение ячейки будет сохранено в соответствующие ячейки в столбце G или будет сохранено в комментариях, как показано на скриншотах ниже.
Сохраните предыдущие значения ячеек в других ячейках:
Сохраните предыдущие значения ячеек в комментариях:
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
Комментарии (20)
Оценок пока нет. Оцените первым!
Подскажите пожалуйста как можно зафиксировать,скопировать,запомнить значение ячейки скажем если оно больше нуля? Значение меняется динамически |
|
Есть ли в Excel функция правило или ещё что-то, что позволило бы скопировать из А1 в ячейку A2 число и оставило бы его там неизменным до того момента пока следующее число в ячейке А1(здесь значения меняются) опять не стало удовлетворять условию. |
|
Sh_Alex Пользователь Сообщений: 732 |
Это вопрос “vikttur”, он большой любитель итераций. |
Punker Пользователь Сообщений: 429 |
Так ведь формула в ячейке не может ссылаться на результат этой же ячейки. Циклическая ссылка. |
Punker Пользователь Сообщений: 429 |
А прошу прощенья, с установленной галкой действительно работает. |
Спасибо Большое, очень признателен :-). |
|
Юркин Гость |
#7 06.09.2010 00:23:21 Очень благодарю Александра, мне тоже помогло! |
Skip to content
При написании формулы Excel знак $ в ссылке на ячейку сбивает с толку многих пользователей. Но объяснение очень простое: это всего лишь способ ее зафиксировать. Знак доллара в данном случае служит только одной цели — он указывает, следует ли изменять ссылку при копировании. И это короткое руководство предоставляет полную информацию о том, какими способами можно закрепить адрес ячейки, чтобы он не менялся при копировании формулы.
Если вы создаете формулу только для одной клетки вашей таблицы Excel, то проблема как зафиксировать ячейку вас не волнует. А вот если её нужно копировать или перемещать по таблице, то здесь-то и скрываются подводные камни. Чтобы не сломать расчеты, некоторые ячейки следует зафиксировать в формулах, чтобы их адреса уже не менялись.
Как упоминалось ранее, относительные ссылки на ячейки являются основными по умолчанию для любой формулы, созданной в Excel. Но их главная особенность — изменение при копировании и перемещении. Во многих же случаях необходимо зафиксировать адрес ячейки в формуле, чтобы не потерять эту ссылку при изменении таблицы. Ниже мы рассмотрим следующие способы:
- Как зафиксировать ячейку вручную.
- Использование функциональной клавиши.
- Выборочная фиксация по строке или столбцу.
- Закрепите адрес ячейки при помощи имени.
Чтобы предотвратить изменение ссылок на ячейку, строку или столбец, используют абсолютную адресацию , которая отличается тем, что перед координатой строки или столбца ставится знак доллара $.
Поясним на простом примере.
=A1*B1
Здесь используются относительные ссылки. Если переместить это выражение на 2 ячейки вниз и 2 вправо, то мы увидим уже
=C3*D3
На 2 позиции изменилась буква столбца и на 2 единицы – номер строки.
Если в ячейке A1 у нас записана информация, которую нам нужно использовать во многих клетках нашей таблицы (например, курс доллара, размер скидки и т.п.), то желательно зафиксировать ее, чтобы ссылка на ячейку A1 никогда не «сломалась»:
=$A$1*B1
В результате, если мы повторим предыдущую операцию, то получим в результате формулу
=$A$1*D3
Ссылка на A1 теперь не относительная, а абсолютная. Более подробно об относительных и абсолютных ссылках вы можете прочитать в этой статье на нашем блоге.
В этом и состоит решение проблемы фиксации ячейки — нужно превратить ссылку в абсолютную.
А теперь рассмотрим подробнее, какими способами можно закрепить ячейку, строку или столбец в формуле.
Как вручную зафиксировать ячейку в формуле.
Предположим, у нас уже имеется формула в одной из клеток нашей таблицы.
В ячейке D2 подсчитаем сумму скидки:
=B2*F2
Записывать подобный расчет для каждого товара — хлопотно и нерационально. Хочется скопировать его из C2 вниз по столбцу. Но при этом ссылка на F2 не должна измениться. Иначе наши расчеты окажутся неверными.
Поэтому ссылку на ячейку F2 в нашем расчёте нужно каким-то образом зафиксировать, чтобы предотвратить ее изменение. Для этого мы при помощи знаков $ превратим ее из относительной в абсолютную.
Самый простой выход – отредактировать C2, для чего можно дважды кликнуть по ней мышкой, либо установить в нее курсор и нажать функциональную клавишу F2.
Далее при помощи курсора и клавиатуры вставляем в нужные места знак $ и нажимаем Enter. Получаем:
=B2*$F$2
Другими словами, использование $ в ссылках на ячейки делает их фиксированными и позволяет перемещать формулу в Excel без их изменения. Вот теперь можно и копировать, как показано на скриншоте ниже.
Фиксируем ячейку при помощи функциональной клавиши.
Вновь открываем ячейку для редактирования и устанавливаем курсор на координаты нужной нам ячейки.
Нажимаем функциональную клавишу F4 для переключения вида ссылки.
Неоднократно нажимая F4, вы будете переключать ссылки в следующем порядке:
Для того, чтобы зафиксировать ссылку на ячейку, достаточно нажать F4 всего один раз.
Думаю, это несколько удобнее, чем вводить знак доллара вручную.
Частичная фиксация ячейки по строке или по столбцу.
Часто случается, что необходимо зафиксировать только строку или столбец в адресе ячейки. Для этого используются смешанные ссылки.
Вы можете использовать два вида смешанных ссылок:
- Строка фиксируется, а столбец изменяется при копировании.
- Столбец блокируется, а строка изменяется при копировании.
Смешанная ссылка содержит одну относительную и одну абсолютную координату, например $A1 или A$1. Проще говоря, знак доллара используется только единожды.
Получить такую ссылку вы можете любым из описанных выше способов. Либо вручную выбираете место и устанавливаете знак $, либо нажимаете F4 не один, а два или три раза. Вы это видите на рисунке чуть выше.
В результате мы имеем следующее:
В таблице ниже показано, как может быть закреплена ссылка на ячейку.
Зафиксированная ячейка | Что происходит при копировании или перемещении | Клавиши на клавиатуре |
$A$1 | Столбец и строка не меняются. | Нажмите F4. |
A$1 | Строка не меняется. | Дважды нажмите F4. |
$A1 | Столбец не изменяется. | Трижды нажмите F4. |
Рассмотрим пример, когда нужно закрепить только одну координату: либо столбец, либо строку. И все это в одной формуле.
Предположим, нужно рассчитать цены продажи при разных уровнях наценки. Для этого нужно умножить колонку с ценами (столбец В) на 3 возможных значения наценки (записаны в C2, D2 и E2). Вводим выражение для расчёта в C3, а затем копируем его сначала вправо по строке, а затем вниз:
=$B3*(1+C$2)
Так вы можете использовать силу смешанной ссылки для расчета всех возможных цен с помощью всего одной формулы.
В первом множителе мы зафиксировали в координатах ячейки адрес столбца. Поэтому при копировании вправо по строке адрес $B3 не изменится: ведь строка по-прежнему третья, а буква столбца у нас зафиксирована и меняться не может.
А вот во втором множителе знак доллара мы поставили перед номером строки. Поэтому при копировании вправо координаты столбца изменятся и вместо C$2 мы получим D$2. В результате в D3 у нас получится выражение:
=$B3*(1+D$2)
А когда будем копировать вниз по столбцу, всё будет наоборот: $B3 изменится на $B4, $B5 и т.д. А вот D$2 не изменится, так как «заморожена» строка. В результате в С4 получим:
=$B4*(1+C$2)
Самый приятный момент заключается в том, что формулу мы записываем только один раз, а потом просто копируем ее. Одним махом заполняем всю таблицу и экономим очень много времени.
И если ваши наценки вдруг изменятся, просто поменяйте числа в C2:E2, и проблема пересчёта будет решена почти мгновенно.
В случае, если вам нужно поменять относительные ссылки на абсолютные (или наоборот) в группе ячеек, в целом столбце или большой области, то описанный выше способ ручной корректировки может стать весьма обременительным и скучным занятием. При помощи специального инструмента преобразования формул вы можете выделить целый диапазон, а затем преобразовать формулы в этих ячейках в абсолютные либо в относительные ссылки. Или же можно просто заменить все формулы их значениями одним кликом мышки.
Как зафиксировать ячейку, дав ей имя.
Отдельную ячейку или целый диапазон ячеек в Excel также можно определить по имени. Для этого вы просто выбираете нужную ячейку, вводите желаемое имя в поле Имя и нажимаете клавишу Enter.
Вернёмся к нашему примеру со скидками. Давайте попробуем ячейке F2 присвоить собственное имя, чтобы затем использовать его в расчетах.
Установите курсор в F2, а затем присвойте этому адресу имя, как это показано на рисунке выше. При этом можно использовать только буквы, цифры и нижнее подчёркивание, которым можно заменить пробел. Знаки препинания и служебные символы не допускаются. Не будем мудрствовать и назовём его «скидка».
Это имя теперь вы можете использовать в формулах вашей рабочей книги. Это своего рода абсолютная ссылка, поскольку за ним навсегда закрепляются координаты определенной ячейки или диапазона.
Таким образом, ячейку F2 мы ранее фиксировали при помощи абсолютной ссылки и знака $ —
=B2*$F$2
а теперь то же самое делаем при помощи её имени «скидка»:
=B2*скидка
Ячейка так же надёжно зафиксирована, а формула же при этом становится более понятной и читаемой.
Эксель понимает, что если в формуле встречается имя «скидка», то вместо него нужно использовать содержимое ячейки F2.
Вот какими способами можно зафиксировать ячейку в формуле в Excel. Благодарю вас за чтение и надеюсь, что эта информация была полезной!
запоминание значения ячеек |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
@Shelbie1288
Here are two possible solutions that you could use in brief. The first is for the current cell. Even if several cells are selected, only the current cell is converted:
Sub RngFormelZuWert ()
Dim c As Range
For Each c In Selection
c.Value = c.Value
Next c
End Sub
Yes, you can also do without the word Value, because in this case it is the default property. But better safe than sorry, and this is how it will work 10 years from now.
The second possibility would be that all cells in a marked area should be «treated» in this way. Then this code leads to the goal:
Sub RngFormelZuWert ()
Dim c As Range
For Each c In Selection
c.Value = c.Value
Next c
End Sub
You can see that this is hardly more code than in the first example.
Is for everyone who would like to have it short and sweet:
Sub Sel2Val ()
Selection.Value = Selection.Value
End Sub
I hope that I was able to help you further, or to provide a solution.
I would be happy to know if I could help.
Nikolino
I know I don’t know anything (Socrates)
* Kindly Mark and Vote this reply if it helps please, as it will be beneficial to more Community members reading here.