Код VBA для обновления данных из одной книги в другую - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть 2 файла Excel

Трекер

**Grp**   **Current Status**   **Prior Status**      **Any Changes**
  grp1      Implementation       Approved               Change 
  grp2      Approved             Approved               No Change 
  grp3      Doc Recd             Doc Recd               No Change
  grp4      Implementation       Approved               Change

Инвентарь

 **Grp**    **Current Status**        **Col02**     
  grp1           Approved               789
  grp2           Approved               123
  grp3           Doc Recd               456
  grp4           Approved               000

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

В файлах трекера , если Grp имеет разные значения в состоянии и предшествующем статусе затем любых изменениях будет считаться изменением.

Если Текущий статус & Предыдущий статус такой же, он будет рассматриваться как Без изменений

для приведенного ниже примера grp1 & grp4 Текущий статус изменился с Предыдущий статус

Я просто хочу код:

  1. Эта проверка Изменение в Любые изменения столбец «Если изменить»
  2. Тогда grp1 & grp4 Текущий статус из Трекер Файл должен быть обновлен в Инвентарь file Текущий статус столбец на основе имени группы.

Примечание. Иногда между полями обоих файлов grp могут быть дополнительные пробелы.

Я делаю это вручную и обновляю записи из Tracker в Inventory каждый день.

Код VBA должен активировать соответствующие файлы и столбцы и изменить значения.

Код, который я пробовал, не работает, прикрепление ниже

Sub Lookup()

Dim rnge as Range
Dim cl As Range


Workbooks("Trackers 040620 PM.xlsx").Activate
Worksheets("Central").Activate
lastrow = Range("A" & Rows.Count).End(xlUp).Row

   For i = 1 To lastrow

     If Range("g" & i).Value = "Change" Then
        srchval = Trim(Range("d" & i).Value)
        chgval = Trim(Range("e" & i).Value)

            Workbooks("Interim Inventory Tracker - All States 040620 v1.xlsx").Activate
            Sheets("Main Data input").Activate

             get_row_number = Workbooks("Interim Inventory Tracker - All States 040620 v1.xlsx"). _
                              Sheets("Main Data input").Range("D:D").Find( _
              What:=srchval, _
              LookIn:=xlValues, _
              LookAt:=xlPart, _
              SearchOrder:=xlByColumns, _
              SearchDirection:=xlNext, _
              MatchCase:=True _
              ).Row

        If get_row_number = "" Then
            'do nothing
        Else
            Workbooks("Interim Inventory Tracker - All States 040620 v1.xlsx").Activate
            Sheets("Main Data input").Range("H" & get_row_number).Value = chgval
            chgval = ""
        End If
        Workbooks("Trackers 040620 PM.xlsx").Activate
        Worksheets("Central").Activate
     End If
    Next i
End Sub

1 Ответ

0 голосов
/ 10 апреля 2020

Попробуйте

Option Explicit

Sub Lookup()

    Const WB_TRACKER = "Trackers 040620 PM.xlsx"
    Const WB_INVENTORY = "Interim Inventory Tracker - All States 040620 v1.xlsx"

    Dim wbTracker As Workbook, wsTracker As Worksheet
    Dim wbInventory As Workbook, wsInventory As Worksheet
    Dim rng As Range
    Dim iLastRow As Long, iRow As Long, count As Long
    Dim srchval As String, chgval As String

    Set wbTracker = Workbooks(WB_TRACKER)
    Set wsTracker = wbTracker.Sheets("Central")

    Set wbInventory = Workbooks(WB_INVENTORY)
    Set wsInventory = wbInventory.Sheets("Main Data input")

    iLastRow = wsTracker.Range("G" & Rows.count).End(xlUp).Row
    count = 0
    For iRow = 2 To iLastRow
        If wsTracker.Range("G" & iRow).Value = "Change" Then

            srchval = Trim(wsTracker.Range("D" & iRow).Value)
            chgval = Trim(wsTracker.Range("E" & iRow).Value)

            Set rng = wsInventory.Range("D:D").Find( _
                    What:=srchval, _
                    LookIn:=xlValues, _
                    LookAt:=xlPart, _
                    SearchOrder:=xlByColumns, _
                    SearchDirection:=xlNext, _
                    MatchCase:=True)

            If rng Is Nothing Then
                'do nothing
            Else
                wsInventory.Range("H" & rng.Row) = chgval
                count = count + 1
            End If
         End If
     Next
     MsgBox iLastRow - 1 & " rows scanned on " & wsTracker.Name & vbCr & _
            count & " rows updated on " & wsInventory.Name, vbInformation
End Sub

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