Проблема при получении данных путем сравнения идентификаторов из двух разных листов в Excel VBA. Дает неверные данные - PullRequest
0 голосов
/ 07 ноября 2019

получение скриншота за неделю 1 зарплата Я написал VBA-код в Excel для извлечения еженедельных данных водителя в единой главной платежной ведомости. Я использую Driver ID имеет первичный ключ для получения данных драйвера. Всего имеется 4-недельные отчеты MCMSSummaryReport (Week1), MCMSSummaryReport (Week2), MCMSSummaryReport (Week3), MCMSSummaryReport (Week4).

Я пытаюсь получить данные в листе «Masterly Monthly Payment Master2» путем сравнения идентификатора драйвера. «Ежемесячный платеж Master2» имеет список идентификатора водителя. Я сравниваю идентификатор драйвера Monthly Payment Master2 с другими 4 еженедельными отчетами.

, однако, когда код не находит того же идентификатора в еженедельном отчете, который присутствует в таблице Monthly Payment Master2, он должен возвращать "" (пусто) в столбце 'Week1». Он возвращает пустое значение, где идентификаторы не совпадают, но после этого цикла пропускают строку и извлекают данные из строки 1 + 1.

не удалось устранить эту проблему в коде.

Ниже приведена ссылка на лист включения макросов Excel: https://drive.google.com/open?id=1aaidUeED7rkXaw-rMHoMK-4TNzkUJlN4

под кодом:

    Private Sub CommandButton1_Click()

Dim salary As String, fromdate As String
Dim lastcoluns As Long, lastrow As Long, erow As Long, ecol As Long, lastrow1 As Long
lastcoluns = Sheet1.Cells(1, Columns.Count).End(xlToLeft).Column
lastrow = Sheet1.Cells(Rows.Count, 1).End(xlUp).Row
lastrow1 = Sheet7.Cells(Rows.Count, 1).End(xlUp).Row + 1

MsgBox (lastrow1)


Dim i As Integer
i = 2
Do While i < lastrow1
    temp1 = Worksheets("Monthly Payment Master2").Cells(i, 1)
    For j = 2 To lastrow + 1
        temp2 = Worksheets("MCMSSummaryReport(week 1)").Cells(j, 1)
        If temp1 = temp2 Then
            salary = Sheet1.Cells(i, 18).Value
            Worksheets("Monthly Payment Master2").Cells(i, 7) = salary

        Else

        End If
    Next j
    i = i + 1
Loop
MsgBox ("Week-1 data submitted successfully, Please submit Week-2 Data.")
Application.CutCopyMode = False
Sheet6.Columns().AutoFit
Range("A1").Select

End Sub

1 Ответ

0 голосов
/ 07 ноября 2019

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

Dim salary As String
Dim wsMaster As Worksheet, wsReport As Worksheet
Set wsMaster = ThisWorkbook.Worksheets("Monthly Payment Master2")
Set wsReport = ThisWorkbook.Worksheets("MCMSSummaryReport(week 1)")

lastrow1 = wsMaster.Cells(Rows.Count, 1).End(xlUp).Row
lastrow2 = wsReport.Cells(Rows.Count, 1).End(xlUp).Row

Dim i As Long
Dim foundRange As Range

Dim temp1 As String

For i = 2 To lastrow
    temp1 = wsMaster.Cells(i, 1).Value2

    Set foundRange = wsReport.Range("A2:A" & lastrow2).Find(temp1, LookAt:=xlWhole, MatchCase:=True)

    If foundRange Is Nothing Then
        salary = vbNullString
    Else
        salary = foundRange.Offset(0, 17).Value2
    End If
    wsMaster.Cells(i, 7) = salary
Next i

Обратите внимание, что вы не используете lastcoluns, fromdate, ecolи erow. Также вам следует постоянно обращаться к своим рабочим листам, либо использовать Sheet1 или Worksheets("Name"), но не использовать оба для одного и того же рабочего листа, так как это сбивает с толку других читателей.

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