删除行不会删除特定行

时间:2013-11-01 19:25:48

标签: excel vba excel-vba

我有两个相同的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

2 个答案:

答案 0 :(得分:0)

好的,你可以考虑一些事情。第一个很简单,你写了

i = i + i

现在,您可能需要i = i + 1,因为我认为您希望2, 3, 4, 5, ...不是2, 4, 8, 16, ...

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

答案 1 :(得分: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

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

如果你的肯定存在这些值,那么它应该可以正常工作......如果你想要一个替代脚本,首先检查下面的行中是否存在值,只需给我留言,我就会扯掉一些东西: )