Замените 2 одинаковых значения из 2 разных таблиц одновременно - PullRequest
2 голосов
/ 28 апреля 2020

Это мой первый пост здесь.

У меня есть две таблицы в Excel, полученные из VBA-данных из другого программного обеспечения.

tables

Я бы хотел получить общие значения в столбце NAME каждой таблицы, которая будет связана, что означает: если, например, я заменил ABC02 во второй таблице на ABC03, то ABC02 первой таблицы также будет заменен на ABC03.

replacement of values

и наоборот (изменение в первой таблице приведет к изменению во второй).

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

Sub Test1()
Dim i, y As Integer
For i = 10 To 11
    y = 7
    Do Until y = 5
        y = y - 1
        If Range("C" & y).Value = Range("C" & i).Value Then
            Range("D" & y).Value = Range("B" & i).Value
        End If
    Loop
'' Action :
Next i
End Sub

, который дал такой результат:

first result

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

intermediate desired result

и как go оттуда (или даже если бы я вообще должен был это сделать)

Я старался быть максимально ясным, но если есть что-то, Можно уточнить, не стесняйтесь, сообщите мне.

Спасибо за чтение и за любой вклад.

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Кто-то из другого форума опубликовал следующий ответ (поэтому я размещаю его здесь на тот случай, если кто-то ищет то же самое):

Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As Variant
Application.EnableEvents = False
Set f2 = Sheets("Image")
If Not Intersect(Target, Columns(3)) Is Nothing Then
    If Range(Target.Address).Value <> f2.Range(Target.Address).Value Then
        TargetImage = f2.Range(Target.Address).Value
        With f2
            Set x = Columns(3).Find(TargetImage)
            If Not x Is Nothing Then
                Pos = x.Address
                Do
                    If x.Row <> Target.Row Then
                        Cells(x.Row, "C") = Target.Value
                        'Modification of the Image sheet
                        f2.Cells(x.Row, "C") = Target.Value
                        f2.Range(Target.Address).Value = Target.Value
                    Else
                        Set x = .FindNext(x)
                    End If
                Loop While Not x Is Nothing And x.Address <> Pos
            End If
        End With
    End If
End If
Set f2 = Nothing
Application.EnableEvents = True
End Sub

Этот код предполагает, что:

  1. Существует 2 идентичных листа, а второй называется «Изображение»
  2. Пользовательский ввод находится на первом листе
  3. Значения, которые мы хотим заменить, находятся в 3-м столбце
  4. В одной и той же таблице нет повторяющихся значений

Если вы хотите выполнить другой макрос заранее (как я это делаю с извлечением данных), вы должны использовать этот бит кода внутри этого макрос

    On Error GoTo ErrHandler
    Application.EnableEvents = False

'Your code here...

ErrHandler:
   Application.EnableEvents = True

Если каким-то образом вы измените этот макрос Worksheet_Change и получите ошибку, вам нужно исправить эту ошибку и снова включить события с помощью другого макроса, подобного этому:

Sub ReenableEventsAfterError()
Application.EnableEvents = True
End Sub
0 голосов
/ 29 апреля 2020

Это проблема синхронизации, и быстрого и простого решения для этого не существует. Я бы использовал 2 обработчика событий VBA: Worksheet_SelectionChange и Worksheet_Change. С помощью Worksheet_SelectionChange вы можете определить, где пользователь нажал, и сохранить исходное значение и адрес ячейки в некоторых глобально доступных переменных. Затем с помощью Worksheet_Change вы можете обнаружить, что пользователь изменяет значение ячейки. Тогда у вас будет оригинальное и новое значение ячейки. Вам также нужно управлять множественным выбором, я приведу простой пример в следующем фрагменте.

Public origval As Variant, origaddr As Variant

Public Sub Worksheet_SelectionChange(ByVal Target As Range)
    origval = Target.Cells(1).Value
    origaddr = Target.Cells(1).Address  ' this is to handle multiple selection
    Range(origaddr).Select              ' reset multiple selection
End Sub

Public Sub Worksheet_Change(ByVal Target As Range)
    ' at this point 
    '     - origval contains the original value
    '     - origaddr and Target.Address contains the cell address (should be the same)
    '     - Target.Value contains the new value of the cell
    '     - Target.Address contains the cell address
    '     - Target.Parent.Name contains the name of worksheet
    '     - Target.Parent.Parent.Name contains the name of workbook
    '  so you know everything you need and you can decide how to go on
End Sub

Примечание: уловка в SelectionChange довольно "грязная". Это просто напоминание о необходимости множественного выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...