Сравните с рабочими книгами другую папку и другую ячейку - PullRequest
0 голосов
/ 07 апреля 2020

Я новичок в Excel VBA кодирования. То, что я пытаюсь сделать, это сравнить две разные книги CSV, которые находятся в двух разных папках, а также сравнить столбцы на листах (которые имеют разное положение). Мне также нужно сравнить более одной пары файлов CSV.

Объяснить:

  1. Папка A содержит 123 CSV-файла, каждый CSV-файл имеет лист с двумя столбцами (A и B)
  2. Папка B содержит 123 CSV-файла, каждый CSV-файл файл имеет лист с тремя столбцами (A, B, C)

Так что я ищу, чтобы сравнить файл cvs, содержащийся в FolderA, с файлом cvs, содержащимся в FolderB. Но также проверьте, равны ли столбцы A и B, содержащиеся в CSV-файле в FolderA, или отличаются от них столбцы A и C, содержащиеся в CSV-файле в FolderB, а затем создайте отчет, чтобы показать разницу между сравниваемыми столбцами.

Например,

FolderA                   FolderB
WoorbookA                 WoorbookA
ColumnA   ColunmB         ColumnA   ColunmB     ColunmC
fff       123             fff       ita         123    
ddd       897             ddd       eng         897 
ccc       345             ccc       fr          345 

сообщает о новой книге с 2 столбцами, чтобы отметить разницу

Код, который я пытаюсь использовать ниже. В ней нет какой-то инструкции, которую я знаю, но я ничего не узнаю, см.

        Sub CompareWorkBooksNew()

    Const File_LocationA = "D:\SteamLibrary\steamapps\common\Crusader Kings II\localisation\"
    Const File_LocationB = "D:\_GAMES\_TRADUZIONI\Traduzione CKII\Trad. Ita 3.3.2 OXYG\Trad. Ita Ck2 3.3.2\localisation\"

    Dim wbkA As Workbook, wbkB As Workbook
    Dim SheetA As Worksheet, SheetB As Worksheet
    Dim File_NameA As String, File_NameB As String
    Dim count As Integer, i As Long
    Dim arA As Variant, arB As Variant

    File_NameA = Dir(File_LocationA & "*.csv")

     ' report workbook
    Dim wbReport As Workbook, iRow As Long
    Set wbReport = Workbooks.Add()
    wbReport.Sheets(1).Range("A1:F1") = Array("File", "Row", "A", "B", "A new", "C new")
    iRow = 2

    Do While File_NameA <> ""
         File_NameB = "traduzione_" & File_NameA
        'Debug.Print File_NameA, File_NameB

        'Get the worksheets from the workbooks
        Set wbkA = Workbooks.Open(File_LocationA & File_NameA, , True)
        Set SheetA = wbkA.Worksheets(1)
        arA = wbkA.Sheets(1).UsedRange.Columns("A:B").Value2
        wbkA.Close False

        Set wbkB = Workbooks.Open(File_LocationB & File_NameB, , True)
        Set SheetB = wbkB.Worksheets(1)
        SheetB.Columns(2).Delete
        arB = wbkB.Sheets(1).UsedRange.Columns("A:B").Value2
        wbkB.Close False
        'Debug.Print UBound(arA), UBound(arA, 2), UBound(arB), UBound(arB, 2)

        ' check equal size
        If UBound(arA) <> UBound(arB) Then
            MsgBox "Rows in A = " & UBound(arA) & vbCr & _
                   "Rows in B = " & UBound(arB), vbCritical, "Error"
            Exit Sub
        End If

        ' compare arrays
        For i = LBound(arA) To UBound(arA)
            If arA(i, 1) <> arB(i, 1) Or arA(i, 2) <> arB(i, 2) Then

                ' report here
                With wbReport.Sheets(1)
                    .Cells(iRow, 1) = File_NameA
                    .Cells(iRow, 2) = i
                    .Cells(iRow, 3) = arA(i, 1)
                    .Cells(iRow, 4) = arA(i, 2)
                    .Cells(iRow, 5) = arB(i, 1)
                    .Cells(iRow, 6) = arB(i, 2)
                End With
                iRow = iRow + 1

                'Debug.Print arA(i, 1), arA(i, 2), arB(i, 1), arB(i, 2)

            End If
        Next

        File_NameA = Dir() ' get next file
        count = count + 1
    Loop
    wbReport.SaveAs ("D:\_GAMES\_TRADUZIONI\Traduzione CKII\Controllo Versioni2.xlsx")
    wbReport.Close False
    MsgBox count & " files compared in " & File_LocationA, vbInformation

End Sub

Спасибо всем, кто мог мне помочь

1 Ответ

1 голос
/ 07 апреля 2020

Изменения, сообщенные в новой книге. Report.xlsx

обновление - local:=True добавлено к Workbooks.Open() для использования точки с запятой вместо запятой в CSV.

Sub CompareWorkBooks()

    Const File_LocationA = "D:\SteamLibrary\steamapps\common\Crusader Kings II\localisation\"
    Const File_LocationB = "D:\_GAMES\_TRADUZIONI\Traduzione CKII\Trad. Ita 3.3.2 OXYG\BoPItalia Trad. Ita Ck2 3.3.2\localisation\"

    Dim wbkA As Workbook, wbkB As Workbook
    Dim SheetA As Worksheet, SheetB As Worksheet
    Dim File_NameA As String, File_NameB As String
    Dim count As Integer, i As Long
    Dim arA As Variant, arB As Variant

    File_NameA = Dir(File_LocationA & "*.csv")

     ' report workbook
    Dim wbReport As Workbook, iRow As Long
    Set wbReport = Workbooks.Add()
    wbReport.Sheets(1).Range("A1:H1") = Array("File", "#Code", "ENGLISH", "#CODE", "ITALIAN", "ENGLISH", _
                                               "A=A", "B=C")
    iRow = 2

    Do While File_NameA <> ""
        File_NameB = "new_" & File_NameA
        Debug.Print File_NameA, File_NameB

        'Get the worksheets from the workbooks
        Set wbkA = Workbooks.Open(File_LocationA & File_NameA, ReadOnly:=True, local:=True)

        Set SheetA = wbkA.Worksheets(1)
        arA = wbkA.Sheets(1).UsedRange.Columns("A:B").Value2
        wbkA.Close False

        Set wbkB = Workbooks.Open(File_LocationB & File_NameB, ReadOnly:=True, local:=True)

        Set SheetB = wbkB.Worksheets(1)
        'SheetB.Columns(2).Delete
        arB = wbkB.Sheets(1).UsedRange.Columns("A:C").Value2
        wbkB.Close False
        'Debug.Print UBound(arA), UBound(arA, 2), UBound(arB), UBound(arB, 2)

        ' check equal size
        If UBound(arA) <> UBound(arB) Then
            MsgBox "Rows in A = " & UBound(arA) & vbCr & _
                   "Rows in B = " & UBound(arB), vbCritical, "Error"
            Exit Sub
        End If

        ' compare arrays
        For i = LBound(arA) To UBound(arA)
            'If arA(i, 1) <> arB(i, 1) Or arA(i, 2) <> arB(i, 3) Then

                ' report here
                With wbReport.Sheets(1)
                    .Cells(iRow, 1) = File_NameA
                    .Cells(iRow, 2) = arA(i, 1)
                    .Cells(iRow, 3) = arA(i, 2)
                    .Cells(iRow, 4) = arB(i, 1)
                    .Cells(iRow, 5) = arB(i, 2)
                    .Cells(iRow, 6) = arB(i, 3)
                    .Cells(iRow, 7).FormulaR1C1 = "=IF(RC[-5]=RC[-3],True,False)"
                    .Cells(iRow, 8).FormulaR1C1 = "=IF(RC[-5]=RC[-2],True,False)"

                End With
                iRow = iRow + 1

                'Debug.Print arA(i, 1), arA(i, 2), arB(i, 1), arB(i, 2)

            'End If
        Next

        File_NameA = Dir() ' get next file
        count = count + 1
    Loop
    wbReport.SaveAs ("Report.xlsx")
    wbReport.Close False
    MsgBox count & " files compared in " & File_LocationA, vbInformation

End Sub


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