Excel 将工作簿与不同文件夹和不同单元格进行比较

Excel 将工作簿与不同文件夹和不同单元格进行比较,excel,vba,csv,Excel,Vba,Csv,我是excel vba编码的新手。 我试图做的是比较两个不同文件夹中的两个不同csv工作簿,并比较工作表中的列(位置不同) 我还需要比较多个csv文件 解释: FolderA包含123个csv文件每个csv文件都有一张有两列(a和B)的表 FolderB包含123个csv文件每个csv文件都有一个带有三列(a、B、C)的工作表 所以我搜索要做的是比较FolderA中包含的cvs文件和FolderB中包含的cvs文件。 但还要检查FolderA中csv文件中包含的A列和B列是否与FolderB中c

我是excel vba编码的新手。 我试图做的是比较两个不同文件夹中的两个不同csv工作簿,并比较工作表中的列(位置不同) 我还需要比较多个csv文件

解释:

  • FolderA包含123个csv文件每个csv文件都有一张有两列(a和B)的表
  • FolderB包含123个csv文件每个csv文件都有一个带有三列(a、B、C)的工作表
  • 所以我搜索要做的是比较FolderA中包含的cvs文件和FolderB中包含的cvs文件。 但还要检查FolderA中csv文件中包含的A列和B列是否与FolderB中csv文件中包含的A列和C列相同或不同 然后创建一个报告以显示所比较列之间的差异

    比如说

    FolderA                   FolderB
    WoorbookA                 WoorbookA
    ColumnA   ColunmB         ColumnA   ColunmB     ColunmC
    fff       123             fff       ita         123    
    ddd       897             ddd       eng         897 
    ccc       345             ccc       fr          345 
    
    使用两列报告新工作簿以标记差异

    下面是我尝试使用的代码。 它缺乏一些指导,我知道,但我还没有找到任何参考

            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
    
    Sub CompareWorkBooksNew()
    Const File_LocationA=“D:\SteamLibrary\steamapps\common\Crusader Kings II\Localization”
    Const File\u LocationB=“D:\\游戏\传统游戏\传统游戏CKII\Trad.Ita 3.3.2 OXYG\Trad.Ita Ck2 3.3.2\本地化\”
    将wbkA设置为工作簿,将wbkB设置为工作簿
    将图纸A标注为工作表,将图纸B标注为工作表
    Dim File_NameA作为字符串,File_NameB作为字符串
    Dim计数为整数,i为长
    Dim arA作为变体,arB作为变体
    文件名a=Dir(文件名a&“*.csv”)
    '报告工作簿
    将WB报告作为工作簿,iRow尽可能长
    Set wbReport=Workbooks.Add()
    wbReport.Sheets(1).Range(“A1:F1”)=数组(“文件”、“行”、“A”、“B”、“A新”、“C新”)
    iRow=2
    当文件名为“”时执行此操作
    File_NameB=“traduzione”&File_NameA
    'Debug.Print File\u NameA,File\u NameB
    '从工作簿中获取工作表
    设置wbkA=Workbooks.Open(文件位置A和文件名称A,True)
    设置SheetA=wbkA。工作表(1)
    arA=wbkA.Sheets(1).UsedRange.Columns(“A:B”).Value2
    wbkA,关闭错误
    设置wbkB=Workbooks.Open(文件位置b和文件名称b,True)
    设置SheetB=wbkB。工作表(1)
    表B.列(2).删除
    arB=wbkB.Sheets(1).UsedRange.Columns(“A:B”).Value2
    wkb.Close为False
    'Debug.Print UBound(arA),UBound(arA,2),UBound(arB),UBound(arB,2)
    “检查大小是否相等
    如果UBound(arA)UBound(arB),则
    MsgBox“A=“&UBound(arA)&vbCr&_
    “B=“&UBound(arB),vbCritical”中的行出现错误”
    出口接头
    如果结束
    '比较数组
    对于i=LBound(arA)到UBound(arA)
    如果arA(i,1)arB(i,1)或arA(i,2)arB(i,2),那么
    “在这里报告
    带wbReport.Sheets(1)
    .Cells(iRow,1)=文件名a
    .单元格(iRow,2)=i
    .细胞(iRow,3)=arA(i,1)
    .细胞(iRow,4)=arA(i,2)
    .单元格(iRow,5)=arB(i,1)
    .单元格(iRow,6)=arB(i,2)
    以
    iRow=iRow+1
    'Debug.Print arA(i,1)、arA(i,2)、arB(i,1)、arB(i,2)
    如果结束
    下一个
    File_NameA=Dir()'获取下一个文件
    计数=计数+1
    环
    wbReport.SaveAs(“D:\\\游戏\\传统游戏i\传统游戏CKII\Controllo版本2.xlsx”)
    wbReport。关闭False
    MsgBox计数和“文件位置中比较的文件”A,VBA信息
    端接头
    

    感谢所有能够帮助我的工作

    新工作簿Report.xlsx中报告的更改

    更新-
    local:=True
    添加到
    工作簿中。Open()
    在CSV中使用分号而不是逗号

    子比较工作簿()
    Const File_LocationA=“D:\SteamLibrary\steamapps\common\Crusader Kings II\Localization”
    Const File_LocationB=“D:\\游戏\传统游戏\传统游戏CKII\Trad.Ita 3.3.2 OXYG\BoPItalia Trad.Ita Ck2 3.3.2\本地化\”
    将wbkA设置为工作簿,将wbkB设置为工作簿
    将图纸A标注为工作表,将图纸B标注为工作表
    Dim File_NameA作为字符串,File_NameB作为字符串
    Dim计数为整数,i为长
    Dim arA作为变体,arB作为变体
    文件名a=Dir(文件名a&“*.csv”)
    '报告工作簿
    将WB报告作为工作簿,iRow尽可能长
    Set wbReport=Workbooks.Add()
    wbReport.Sheets(1).Range(“A1:H1”)=数组(“文件”、“代码”、“英语”、“代码”、“意大利语”、“英语”_
    “A=A”、“B=C”)
    iRow=2
    当文件名为“”时执行此操作
    File\u NameB=“new”&文件名a
    调试。打印文件\u NameA,文件\u NameB
    '从工作簿中获取工作表
    设置wbkA=Workbooks.Open(文件位置a和文件名称a,只读:=True,本地:=True)
    设置SheetA=wbkA。工作表(1)
    arA=wbkA.Sheets(1).UsedRange.Columns(“A:B”).Value2
    wbkA,关闭错误
    设置wbkB=Workbooks.Open(文件位置B和文件名B,只读:=True,本地:=True)
    设置SheetB=wbkB。工作表(1)
    '表B.列(2).删除
    arB=wbkB.Sheets(1).UsedRange.Columns(“A:C”).Value2
    wkb.Close为False
    'Debug.Print UBound(arA),UBound(arA,2),UBound(arB),UBound(arB,2)
    “检查大小是否相等
    如果UBound(arA)UBound(arB),则
    MsgBox“A=“&UBound(arA)&vbCr&_
    “B=“&UBound(arB),vbCritical”中的行出现错误”
    出口接头
    如果结束
    '比较数组
    对于i=LBound(arA)到UBound(arA)
    '如果arA(i,1)arB(i,1)或arA(i,2)arB(i,3),则
    “在这里报告
    带wbReport.Sheets(1)
    .Cells(iRow,1)=文件名a
    .细胞(iRow,2)=arA(i,1)
    .细胞(iRow,3)=arA(i,2)
    .单元格(iRow,4)=arB(i,1)
    .单元格(iRow,5)=arB(i,2)
    .细胞