Excel VBA-从不正确的工作簿中删除行/列的问题

时间:2018-09-12 14:35:50

标签: excel-vba delete-row

此代码从工作表中复制数据,并将数据粘贴到test.csv文件中。如果test.csv已关闭,则将其打开并粘贴 数据放入其中。如果已经打开,则只需将数据粘贴到其中。到此步骤为止,过程正常进行。粘贴数据后 进入test.csv,我需要删除第一列值为'Old'的行。然后删除整个Col“ A”。

这是我面临的挑战。如果关闭了test.csv,则宏将其打开,粘贴数据,然后删除行和col,并按预期工作 ,但是,如果test.csv已经打开,那么它将按预期的那样粘贴值,但是删除行和列 主要工作表。我尝试将删除代码放在 With 块中,但没有帮助。请提出建议!

Sub Macro()
    Dim LR As Long, PR As Long, X As Long, MyCopyRange, MyPasteRange
    Dim wb, myData As Workbook, shtPaste As Worksheet

    Set wb = ThisWorkbook
     'open target csv file if not already opened
    If CheckFileIsOpen("test.csv") = False Then
        Set myData = Workbooks.Open(strFinalizedForBulkImport & "test.csv")
    Else
        Set myData = Workbooks("test.csv")
    End If
    Set shtPaste = myData.Sheets("test")
    shtPaste.UsedRange.Clear

   With wb.Sheets("Report Grp")

        LR = .Range("A" & .Rows.Count).End(xlUp).Row
        MyCopyRange = Array("A4:A" & LR, "B4:B" & LR, "C4:C" & LR, "D4:D" & LR) 'Put ranges in an array
        MyPasteRange = Array("A1", "B1", "C1", "D1")



        If LR > 1 Then
            j = 0
            For X = LBound(MyCopyRange) To UBound(MyCopyRange) 'Loop the array copying and pasting based on element in the array
                .Range(MyCopyRange(j)).Copy
                 shtPaste.Range(MyPasteRange(j)).PasteSpecial xlPasteValuesAndNumberFormats
                j = j + 1
            Next

        Else
            Range("A1") = "No Data Found"
        End If

    End With

'Problem here, when trying to delete row with "Old" in Col "A" and finally Col "A" delete -
        With wb.Sheets("test")
            For LR = Range("A" & Rows.Count).End(xlUp).Row To 1 Step -1
                If Range("A" & LR).Value = "Old" Then
                    Rows(LR).EntireRow.Delete
                End If
            Next LR
            Columns("A").Delete Shift:=xlShiftToLeft
        End With
End Sub

2 个答案:

答案 0 :(得分:1)

使用with时,与该工作表相关的任何内容都必须带有句点

With wb.Sheets("test")
    For LR = .Range("A" & .Rows.Count).End(xlUp).Row To 1 Step -1
        If .Range("A" & LR).Value = "Old" Then
            .Rows(LR).EntireRow.Delete
        End If
    Next LR
    .Columns("A").Delete Shift:=xlShiftToLeft
End With

答案 1 :(得分:0)

除了对所有范围和已发布的其他依赖于表格的对象(例如@Davesexcel)进行资格验证之外,您还应该Set wb = ActiveWorkbook而不是Set wb = ThisWorkbook。后者指的是宏存储在其中的工作簿,而您可能打算使用活动的工作簿。

要进行调试,请启动VBA编辑器(ALT + F11),然后在删除循环的第一行设置一个断点。检查工作簿的名称wb是指(“?wb.name”)。使用If UCase(.Range("A" & LR).Value) = "OLD" Then使比较不区分大小写。
如果您单步执行第一个循环,您将了解为什么什么都没有删除。