【问题标题】:Excel VBA - issue deleting row/col from incorrect workbookExcel VBA - 从不正确的工作簿中删除行/列的问题
【发布时间】:2019-02-17 05:53:25
【问题描述】:

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

这是我面临的挑战。如果 test.csv 已关闭,宏将打开它,粘贴数据,然后删除行和列,并按预期工作 ,但是,如果 test.csv 已经打开,那么它会按预期粘贴值,但会删除行和 col 它在 主工作表。我尝试将删除代码放在 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

【问题讨论】:

  • 如果 wb.sheets("test") 不是活动工作表,则需要用句点限定.Columns("A").Delete Shift:=xlShiftToLeft
  • BTW wb 作为变体变暗,现在是工作簿。应该是Dim wb as workbook, myData As Workbook

标签: excel vba delete-row


【解决方案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

【讨论】:

  • 我进行了建议的更改,但现在虽然调试代码看起来不错,但在任何一种情况下都不会删除行/列 - 这意味着无论 csv 是打开还是关闭。我认为是因为 - Set wb = ThisWorkbook ,而我试图在 csv 中删除。有什么建议吗?
  • 为 csv 重新定义 TR
  • 示例代码的想法是向您展示范围不符合所需的工作表。
【解决方案2】:

除了限定所有范围和其他与工作表相关的对象(如已发布的@Davesexcel)之外,您还应该使用Set wb = ActiveWorkbook 而不是Set wb = ThisWorkbook。后者指的是存储宏的工作簿,而您可能打算使用活动工作簿。

为了调试,启动 VBA 编辑器 (ALT+F11) 并在删除循环的第一行设置断点。检查工作簿的名称wb 指的是 ("?wb.name")。使用 If UCase(.Range("A" & LR).Value) = "OLD" Then 使比较与大小写无关。
如果您单步循环,您将看到为什么没有删除任何内容。

【讨论】:

    猜你喜欢
    • 2017-12-03
    • 1970-01-01
    • 2014-05-15
    • 2014-08-09
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多