0

我有两个相同的 Excel 表,它们具有相同的列但不同的值。我让它们按第 5 列排序。此列中的值是字母数字。虽然大多数值是相等的,但一张表中的某些值不在另一张表中。在我的代码中,当我将 TPGPRIOR 工作表的单元格范围更改为 (i,1) 时,脚本会起作用并删除工作表中的每一行。这是有道理的,因为列是不同的类别并且永远不会相等。但是,当我将该范围更改为 (i,5) 以比较两个相同类别时,脚本什么也不做。最终目标是让两张表在第 5 列中包含相同的值。我的代码是否有任何编辑可以解决这个问题?

Dim objTPG, objTPG_PRIOR

Set objXL = CreateObject("Excel.Application")
objXL.Visible = True
objXL.DisplayAlerts = False

Set objEXPO = objXL.Application.Workbooks.Open(FinalExposure)

Const xlAscending = 1
Const xlYes = 1

Set objEXPOSHEET = objEXPO.Worksheets(1)
Set objRange = objEXPOSHEET.UsedRange
Set objRange2 = objEXPOSHEET.Range("I2:I9999")
objRange.Sort objRange2, xlAscending,,,,,, xlYes



Set objTPGPRIOR = objXL.Application.Workbooks.Open(FilePath & "TPG Prior.csv")
                                                                                                                'REMEMBER TO MAKE SHEETS RUN IN BACKGROUND
Set objTPGPRIORSHEET = objTPGPRIOR.Worksheets(1)
Set objRange = objTPGPRIORSHEET.UsedRange
Set objRange2 = objTPGPRIORSHEET.Range("E2:E9999")
objRange.Sort objRange2, xlAscending,,,,,, xlYes



Set objTPG = objXL.Application.Workbooks.Open(FilePath & "TPG.csv")

Set objTPGSHEET = objTPG.Worksheets(1)
Set objRange = objTPGSHEET.UsedRange
Set objRange2 = objTPGSHEET.Range("E2:E9999")
objRange.Sort objRange2, xlAscending,,,,,, xlYes


i = 2

Do Until objTPG.Worksheets(1).Cells(i,1).Value = ""
If objTPG.Worksheets(1).Cells(i,5).Value <> objTPGPRIOR.Worksheets(1).Cells(i,5).Value
Then
Set objRange = objTPG.Worksheets(1).Cells(i,1).EntireRow
objRange.Delete
i = i - 1
End If
i = i + i
Loop
4

2 回答 2

0

好的,有几件事供您考虑。第一个很简单,你写的

i = i + i

现在,您可能的意思是i = i + 1,因为我假设您2, 3, 4, 5, ...不想2, 4, 8, 16, ...

要考虑的第二件事是,您只是从 objTPG 工作表中删除一行。这意味着当它遇到不匹配的行时,它将继续从 objTPG 中删除并检查 objTPGPRIOR 中的同一行,直到找到匹配项或删除该匹配项下的所有内容。这可能是您想要的行为,但我想我会指出以防万一。

于 2013-11-01T19:41:24.807 回答
0

我稍微重写了你的代码......

正如 AndASM 指出的那样,您可能想要i = i +/- 1而不是i = i + i

试试下面的

Dim objRange as Range
Dim I as Long

For I = 2 To objTPGPRIOR.Worksheets(1).Range("E" & objTPGPRIOR.Worksheets(1).Rows.Count).End(xlUp).Row
    Set objRange = objTPG.Worksheets(1).Cells(I, 5)
    Do Until objRange.Value = objTPGPRIOR.Worksheets(1).Cells(I, 5).Value
        objRange.EntireRow.Delete
        Set objRange = objTPG.Worksheets(1).Cells(I, 5)
        If objTPG.Worksheets(1).Cells(objTPG.Worksheets(1).UsedRange.Rows.Count, 5).End(xlUp).Row < I Then
            Exit Do
        End If
    Loop
Next

这将继续删除行,直到同一行列中的单元格与您的其他工作表匹配...如果此值不存在,它可能会删除您的所有行。我添加了一些检查以确保这不会导致无限循环。

如果您肯定这些值确实存在,那么它应该可以正常工作...如果您想要一个替代脚本,该脚本将首先检查该值是否存在于下面的一行中,只需给我留言,我会整理一下:)

于 2013-11-01T19:51:39.970 回答