Как посмотреть предыдущий столбец при вставке данных

У меня есть код, который позволяет мне искать повторяющиеся значения из справочного листа и, если они не дублируются, вставляет это другое значение в лист «исторический комментарий». Это отслеживание комментариев, которые я сделал по теме. Комментарии меняются иногда, и я хочу сохранить исторический лист комментариев, чтобы отслеживать прошлые изменения, которые я сделал. У меня есть код, который будет выглядеть в первом листе и искать дубликаты и вставлять уникальные значения в этот задний лист, но мне было интересно, есть ли способ вставить код в следующий столбец, если текущая ячейка уже имеет значение в нем. Я просто хочу убедиться, что мой код не пишет прошлые исторические комментарии. Вот код:

Option Explicit Sub CopyPasteHistorical() Dim sht1Rng As Range, cell As Range With Worksheets("AAG") '<-- reference Sheet1 Set sht1Rng = .Range("I1", .Cells(.Rows.Count, "I").End(xlUp)).SpecialCells(xlCellTypeConstants) '<-- set range with its column "I" cells containing constant (ie not formulas) values End With With Worksheets("Sheet2") '<-- reference Sheet2 For Each cell In sht1Rng '<-- loop through Sheet1 range If cell.Value <> .Cells(cell.Row, "C") Then .Cells(cell.Row, "D") = cell.Value '<-- if sheet1 current cell content is different from Sheet2 column "C" cell content in the same row then write it in Sheet 2 column "D" corresponding row Next cell End With End Sub 

Надеюсь, это имеет смысл, и любая помощь будет оценена! Спасибо!

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

 Sub CopyPasteHistorical() Dim sht1Rng As Range, cell As Range Dim lastCol As Long With Worksheets("AAG") '<-- reference Sheet1 Set sht1Rng = .Range("I1", .Cells(.Rows.Count, "I").End(xlUp)).SpecialCells(xlCellTypeConstants) '<-- set range with its column "I" cells containing constant (ie not formulas) values End With With Worksheets("Sheet2") '<-- reference Sheet2 For Each cell In sht1Rng '<-- loop through Sheet1 range 'determine last used column in row we are processing lastCol = .Cells(cell.Row, .Columns.Count).End(xlToLeft).Column If lastCol < 3 Then 'if the last used column on the row is before column C 'we need to store this value in column C .Cells(cell.Row, 3).Value = cell.Value ElseIf cell.Value <> .Cells(cell.Row, lastCol).Value Then 'if the last value on the row is different to the current value 'we need to store this value in the next column to the right .Cells(cell.Row, lastCol + 1).Value = cell.Value End If Next cell End With End Sub 

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

 Sub CopyPasteHistorical() Dim sht1Rng As Range, cell As Range Dim Col As Long Dim lastCol As Long Dim blnMatched As Boolean With Worksheets("AAG") '<-- reference Sheet1 Set sht1Rng = .Range("I1", .Cells(.Rows.Count, "I").End(xlUp)).SpecialCells(xlCellTypeConstants) '<-- set range with its column "I" cells containing constant (ie not formulas) values End With With Worksheets("Sheet2") '<-- reference Sheet2 For Each cell In sht1Rng '<-- loop through Sheet1 range 'determine last used column in row we are processing lastCol = .Cells(cell.Row, .Columns.Count).End(xlToLeft).Column If lastCol < 3 Then 'if the last used column on the row is before column C 'we need to store this value in column C .Cells(cell.Row, 3).Value = cell.Value Else 'see if this value has already been stored blnMatched = False For Col = 3 To lastCol If cell.Value = .Cells(cell.Row, Col).Value Then blnMatched = True Exit For End If Next 'if the current value doesn't match any previous values 'we need to store this value in the next column to the right If Not blnMatched Then .Cells(cell.Row, lastCol + 1).Value = cell.Value End If End If Next cell End With End Sub 

Не уверен, чтобы понять вашу настоящую цель, но вы можете попробовать это

 Sub CopyPasteHistorical2() Dim sht1Rng As Range, cell As Range With Worksheets("AAG") '<-- reference worksheet "AAG" Set sht1Rng = .Range("I1", .Cells(.Rows.Count, "I").End(xlUp)).SpecialCells(xlCellTypeConstants) '<-- set range with its column "I" cells containing constant (ie not formulas) values End With With Worksheets("Sheet2") '<-- reference Worksheet "Sheet2" For Each cell In sht1Rng '<-- loop through Sheet1 range If cell.Value <> .Cells(cell.Row, "C") Then .Cells(cell.Row, .Columns.Count).End(xlToLeft).Offset(, IIf(.Cells(cell.Row, "D") = "", 3, 1)) = cell.Value '<-- if sheet1 current cell content is different from Sheet2 column "C" cell content in the same row then write it in Sheet 2 corresponding row first free cell from column "D" rightwards Next cell End With End Sub 
Interesting Posts

Экран ввода Excel появляется, если ячейка ложна

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

Изменение десятичного разделителя в VBA (не только в Excel)

Код VBA, который максимизирует площадь графика графика для заполнения всей области диаграммы

Определить источник строк для ComboBox как значения в столбце A, начинающемся с A2

Excel 2010: мне нужно смещать выделение ячейки на десять ячеек справа при вводе определенного текста

Функции кода по-разному используются при использовании на таблицах, а не в нестационарных ячейках

Ожидаемый массив компиляции ошибок – Ubound – VBA

Как использовать распространяемый PIA 2010 для создания приложения excel на компьютере, на котором не установлен клиент MS Office

Сравнение столбцов с двумя листами

Конкатенированные ячейки с условной настройкой форматирования

Цикл Do-While (VBA) не циклический

Эффективный способ чтения файла XLSX и хранения данных в Grails

Добавить счетчик для каждого цикла

Выбранные данные таблицы с веб-страницы, не отображающей первый столбец таблицы

Давайте будем гением компьютера.