首页 文章

Excel比较两张纸的数据

提问于
浏览
2

我有两个需要比较的定价表 . 共有4列 . 部件号,描述,折扣百分比和价格 .

我需要将旧表格与新表格进行比较,以查找任何定价和百分比更新 .

由于零件号列表可以在工作表之间添加矿石,因此无法按行进行比较,因此需要执行此类操作 .

查看第一张中的第一个零件号 . (旧价目表)

在表2中找到相同的部件号 . (新价目表)

比较百分比和价格,如果不同,则在表二中突出显示 .

2 回答

  • 0

    Export both Excel Sheets to CSV Format Compare the text differences using a file compare tool

    我的方法(我经常使用)是将两个工作表导出为CSV格式并比较两个文本文件 . 因此我写了这两个文件:

    Xls2Csv.vbs

    'Script for conversion of XLS-/XLSX-Files to CSV-Format
    'Michael Hutter / April 2016
    
    if WScript.Arguments.Count < 1 Then
        WScript.Echo "There has to be at least one parameter!" & vbCrLf & _
                     "Syntax:" & vbCrLf & _
                     "  Xls2Csv.vbs SourceFile.xls DestFile.xls\n" & vbCrLf & _
                     "  Xls2Csv.vbs SourceFile.xls (a file called SourceDate.xls.csv will be written)"
        Wscript.Quit
    End If
    
    csv_format = 6
    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    src_file = objFSO.GetAbsolutePathName(Wscript.Arguments.Item(0))
    if WScript.Arguments.Count = 1 then
      dest_file = src_file & ".csv"
    else
      dest_file = objFSO.GetAbsolutePathName(WScript.Arguments.Item(1))
    end if
    
    Dim oExcel
    Set oExcel = CreateObject("Excel.Application")
    
    Dim oBook
    Set oBook = oExcel.Workbooks.Open(src_file)
    
    oBook.SaveAs dest_file, csv_format
    
    oBook.Close False
    oExcel.Quit
    

    Xls2Csv.bat :(你可能不需要它);-)

    start %cd%\Xls2Csv.vbs %1 %2 %3
    

    如果您已经安装了Git,您还可以使用以下批处理文件通过Excel内部比较功能或自动CSV导出(使用上面的两个文件)比较两个xls文件 .

    DiffScript_xls.bat

    @echo off
    if X%1==X goto Syntax
    goto SyntaxOk
    
    :Syntax
    echo This script either compares two xls-/xlsx-files with the Excel-internal compare function
    echo or by exporting the sheet content to CSV format and comparing the text files.
    echo Written by Michael Hutter in April 2016
    echo.
    echo Syntax:
    echo %0 File1.xls File2.xls
    pause
    goto Ende
    
    :SyntaxOk
    set Datei=%0
    set Rcksprung=Pos0
    goto TeileDateipfadAuf
    :Pos0
    rem Pfad ermitteln, in dem die Batch-Datei liegt...
    set WorkPfad=%LAUFWERK%%PFAD%
    rem Leider liegt die Batch-Datei nicht am Urpsrungsort, da durch die Compilierung zur EXE während der Laufzeit ein Entpacken in einen anderen Ordner erfolgt :-(
    set WorkPfad=C:\Tools\Batch\Diff-Scripts\
    
    set base=%1
    set mine=%2
    echo Compared are the following files:
    echo   Base-File=%base%
    echo   Mine-File=%mine%
    echo.
    echo Do you want to compare by [E]xcel or by [C]sv-Format?
    C:\Windows\System32\choice /C ec /T 2 /D c
    if errorlevel 2 goto CsvVergleich
    if errorlevel 1 goto ExcelVergleich
    
    :ExcelVergleich
    echo Comparing by Excel...
    rem Datei1 vorbereiten
    set Datei=%base%
    set Rcksprung=PosExcel1
    goto TeileDateipfadAuf
    :PosExcel1
    echo Bei PosExcel1
    echo ###
    echo LAUFWERK=%LAUFWERK%
    echo PFAD=%PFAD%
    echo DATEI=%DATEI%
    echo ERWEITERUNG=%ERWEITERUNG%
    echo ###
    ren "%LAUFWERK%%PFAD%%DATEI%%ERWEITERUNG%" "%DATEI%(base)%ERWEITERUNG%"
    wscript.exe "C:\Program Files\TortoiseGit\Diff-Scripts\diff-xls.js" "%LAUFWERK%%PFAD%%DATEI%(base)%ERWEITERUNG%" %mine% //E:javascript
    goto Ende
    
    :CsvVergleich
    echo Comparing by CSV...
    
    set Datei=%1
    set Rcksprung=Pos1
    goto TeileDateipfadAuf
    :Pos1
    echo Bei Pos1
    echo ###
    echo LAUFWERK=%LAUFWERK%
    echo PFAD=%PFAD%
    echo DATEI=%DATEI%
    echo ERWEITERUNG=%ERWEITERUNG%
    echo ###
    
    set Datei1=%DATEI%%ERWEITERUNG%
    if not exist %TEMP%\CSV1\NUL md %TEMP%\CSV1
    if exist "%TEMP%\CSV1\%Datei1%.csv" del "%TEMP%\CSV1\%Datei1%.csv"
    if exist "%TEMP%\CSV1\%Datei1%.csv" echo Can't delete File1: "%TEMP%\CSV1\%Datei1%.csv"
    copy "%LAUFWERK%%PFAD%%DATEI%%ERWEITERUNG%" "%TEMP%\CSV1"
    echo Converting File1 to CSV-Format: "%TEMP%\CSV1\%Datei1%"
    %WorkPfad%Xls2Csv.vbs "%TEMP%\CSV1\%Datei1%"
    
    rem Prepare File2
    set Datei=%mine%
    echo Datei=%Datei%
    set Rcksprung=Pos2
    goto TeileDateipfadAuf
    :Pos2
    echo Bei Pos2
    echo ####
    echo LAUFWERK=%LAUFWERK%
    echo PFAD=%PFAD%
    echo DATEI=%DATEI%
    echo ERWEITERUNG=%ERWEITERUNG%
    echo ####
    set Datei2=%DATEI%%ERWEITERUNG%
    if not exist %TEMP%\CSV2\NUL md %TEMP%\CSV2
    if exist "%TEMP%\CSV2\%Datei1%.csv" del "%TEMP%\CSV2\%Datei1%.csv"
    if exist "%TEMP%\CSV2\%Datei1%.csv" echo Can't delete file: "%TEMP%\CSV2\%Datei1%.csv"
    copy %mine% "%TEMP%\CSV2"
    echo Converting File2 to CSV-Format: "%TEMP%\CSV2\%Datei2%"
    %WorkPfad%Xls2Csv.vbs "%TEMP%\CSV2\%Datei2%"
    
    "C:\Program Files\TortoiseGit\bin\TortoiseGitMerge.exe" "%TEMP%\CSV1\%Datei1%.csv" "%TEMP%\CSV2\%Datei2%.csv"
    goto Ende
    
    :TeileDateipfadAuf
    for /f "delims= tokens=1,2" %%i in ("%Datei%") do (
    set "LAUFWERK=%%~di"
    set "PFAD=%%~pi"
    set "DATEI=%%~ni"
    set "ERWEITERUNG=%%~xi"
    )
    goto %Rcksprung%
    
    :Ende
    
  • 1

    我发现自己做了很多类似的事情 . 我发现最好的方法是创建第三张表,只显示差异 .

    =IF(Sheet2!A1 =VLOOKUP(Sheet2!$A1,Sheet1!$A:A,COLUMN(Sheet1!A1),FALSE),"",Sheet2!A1 & " / " & VLOOKUP(Sheet2!$A1,Sheet1!$A:A,COLUMN(Sheet1!A1),FALSE))
    

    如果将其放在新工作表中的单元格a1中(根据需要替换工作表名称),然后将其拖动到所有列,然后向下移动它将显示不同的值,而不显示任何其他值 .

    然后,您可以应用过滤器使其更加明显 .

    这假设您的部件号列是A列,并且只会在每个列表中出现一次 .

相关问题