Как я могу обновить эти данные компенсации между массивами? - PullRequest
1 голос
/ 18 апреля 2019

У меня есть одна рабочая тетрадь с двумя листами (лист 1 и лист 2).На листе 1 есть столбцы A: E (TSR = целевой диапазон заработной платы)

Job Code job title TSR min TSR mid TSR max

10001 job 1 55k60k 65K

10003 job 3 65k 70k 75K

10005 job 3 75k 80k 85K

на моем Листе 2 я обновил данные только для двух заданий:

Job Code job title TSR min TSR mid TSR max

10001job 1 65k 70k 75K

10005 job 3 85k 90k 95K

на основе Sheet2, я хочу обновить только номерав столбцах C: E заданий 1 и 3 и не меняйте диапазоны окладов заданий 2.

Вот код, который я пробовал, но я не получаю сообщение об ошибке в этой строке: Set varSheetB = wbkA.Sheets(2), и я вообще не думаю, что я достаточно там (почему я обращаюсь сюда),

Option Explicit

Sub test()

Dim wbkA As Workbook
Dim varSheetA As Variant, varSheetB As Variant
Dim strRangeToCheck As String
Dim iRow As Long
Dim iCol As Long 'I'll want to check for differing values between columns C:E

Set wbkA = ThisWorkbook

Set varSheetA = wbkA.Sheets(1)
Set varSheetB = wbkA.Sheets(2)

strRangeToCheck = "A2:E3000"

varSheetA = Worksheets("Sheet1").Range(strRangeToCheck)
varSheetB = Worksheets("Sheet2").Range(strRangeToCheck)

For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)

    For iCol = LBound(varSheetA, 2) To UBound(varSheetA, 2)

        If varSheetA(iRow, iCol) <> varSheetB(iRow, iCol) Then '
           varSheetA(iRow, iCol) = varSheetB(iRow, iCol)
        Else
            'do nothing
        End If

    Next iCol

Next iRow

End Sub

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

worksheet

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

1 Ответ

2 голосов
/ 18 апреля 2019

Я сделал несколько изменений в вашем коде, чтобы очистить его и сделать его более эффективным.Во-первых, поскольку Sheet2 содержит все изменения, мы будем зацикливаться на этом листе и искать значения на листе 1. Это более эффективно, поскольку не тратит впустую операции, проходящие через ячейки в sheet1, которые не имеют каких-либо изменений..

Кроме того, я сделал динамические диапазоны, чтобы вы не ограничивались диапазоном «A2: E3000» во всех случаях.Если я правильно понимаю, sheet2 будет подмножеством sheet1, поэтому есть случаи, когда у него будет меньше строк.Нет причин перебирать пустые строки.

Наконец, я использую функцию Match для поиска совпадений.Имейте в виду, что функция возвращает положение относительно диапазона.Таким образом, если вы ищете совпадение в Range («A5: A10»), и совпадение найдено в ячейке A5, функция вернет 1 (не 5).Вот почему я смещаю переменную fndRow.

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

 Sub Test()
    Dim wbk As Workbook
    Dim wsA As Worksheet
    Dim wsB As Worksheet
    Dim rngA As Range
    Dim rngB As Range
    Dim rIterator As Range
    Dim fndRow As Long

    Set wbk = ThisWorkbook
    Set wsA = wbk.Sheets("Sheet1")
    Set wsB = wbk.Sheets("Sheet2")

    'CurrentRegion should work to bring in the entire
    'necessary range so long as it is contiguous data
    Set rngA = wsA.Range(wsA.Range("A2"), wsA.Range("A2").End(xlDown))
    Set rngB = wsB.Range(wsB.Range("A2"), wsB.Range("A2").End(xlDown))

    For Each rIterator In rngB
        On Error Resume Next
        fndRow = Application.Match(rIterator.Value, rngA, 0) + _
            rngA.Range("A1").Row - 1
        If Err.Number <> 0 Then
            'What happens if it isn't found?
        Else
            wsA.Cells(fndRow, 3).Value = rIterator.Offset(, 2).Value
            wsA.Cells(fndRow, 4).Value = rIterator.Offset(, 3).Value
            wsA.Cells(fndRow, 5).Value = rIterator.Offset(, 4).Value

            wsA.Cells(fndRow + 1, 3).Value = rIterator.Offset(, 2).Value * 1.1
            wsA.Cells(fndRow + 1, 4).Value = rIterator.Offset(, 3).Value * 1.1
            wsA.Cells(fndRow + 1, 5).Value = rIterator.Offset(, 4).Value * 1.1

            wsA.Cells(fndRow + 2, 3).Value = rIterator.Offset(, 2).Value * 1.2
            wsA.Cells(fndRow + 2, 4).Value = rIterator.Offset(, 3).Value * 1.2
            wsA.Cells(fndRow + 2, 5).Value = rIterator.Offset(, 4).Value * 1.2

            '.... Repeat for all rows
        End If

        Err.Clear

    Next rIterator

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