VBA运行时错误 - 在粘贴值后尝试格式化或删除单元格时为1004

时间:2014-07-18 15:45:48

标签: excel vba excel-vba copy-paste cell-formatting

我正在尝试使用VBA让我的生活更轻松,但我一直遇到一个我无法解决的问题。基本上我想要的是将我已经获得的几个输出csv文件中的一些值复制到一个很好的格式化的excel文件中。然后根据一些基数删除值或格式化单元格 但是我一直收到相同的错误消息运行时错误' 1004'应用程序定义或对象定义的错误。我正在使用许多输出文件并在同一个表文件中粘贴值,但在不同的工作表(10.2a,10.2b,10.2c,...)上通过为每个工作表添加宏来实现这一点。我使用另一个包含所有其他宏的宏来运行所有宏 我在其他帖子中看了很多,但不知道错误来自哪里。任何帮助将非常感激。我在下面的代码中使用的代码就是一个例子。

Sub Table_10_2a()
        '
        ' Copy Data from one file to another
        '
        Dim Output As Workbook
        Dim Table As Workbook
        Dim i As Integer

        'Open workbooks
        Set Output = Workbooks.Open("O:\...\Output.csv")
        Set Table = Workbooks.Open("O:\...\Table.xlsx") 

        'Copy paste data from output file to Table
        Output.Sheets("Output1").Range("B3:E7").Copy
        Table.Sheets("10.2a").Range("B11").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B9:E13").Copy
        Table.Sheets("10.2a").Range("B17").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B15:E15").Copy
        Table.Sheets("10.2a").Range("B23").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B17:E21").Copy
        Table.Sheets("10.2a").Range("B26").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B23:E27").Copy
        Table.Sheets("10.2a").Range("B32").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B29:E29").Copy
        Table.Sheets("10.2a").Range("B38").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B30:E30").Copy
        Table.Sheets("10.2a").Range("B40").PasteSpecial xlValues

        For i = 2 To 5
        'Delete cells for values below 30
         If Table.Sheets("10.2a").Cells(40, i).Value < 30 Then
            Table.Sheets("10.2a").Range(Cells(26, i), Cells(36, i)).ClearContents
            Table.Sheets("10.2a").Cells(38, i).NumberFormat = """[""0""]"""
            Table.Sheets("10.2a").Cells(40, i).NumberFormat = """[""0""]"""
         End If

    'Format cells for values below 50
        If Table.Sheets("10.2a").Cells(40, i).Value < 50 And Table.Sheets("10.2a").Cells(40, i).Value > 30 Then
            Table.Sheets("10.2a").Range(Cells(26, i), Cells(38, i)).NumberFormat = """[""0.0""]"""
            Table.Sheets("10.2a").Cells(40, i).NumberFormat = """[""0""]"""
        End If

        Next i

        'Save file
            Table.Save

        'Close files
            Output.Close
            Table.Close

        End Sub

1 个答案:

答案 0 :(得分:1)

Cells内使用Range来构建一个单元格块通常会成为不合格参考的受害者。在这种情况下,您使用Table.Sheets("10.2a")指定Range的工作表,但未在Cells上使用相同的限定符。这意味着Cells将使用可用的默认上下文,该上下文随代码的执行位置而变化。可能性:

  • 在代码模块或ThisWorkbook内,Cells引用ActiveSheet
  • 在后面的工作表代码中,Cells指的是Worksheet,无论ActiveSheet

使用Address绕过不同的表格

一种方法是使用Cells跟随Address的来电。这解决了问题,因为Address返回没有工作表名称的单元格地址。然后由Range在其上下文中解释Sheets("10.2a")

Range(Cells(26, i).Address, Cells(36, i).Address).ClearContents

限定参考资料(通常首选)

解决此错误的另一种方法是通过在CellsTable.Sheets("10.2a").Cells之前添加工作表名称来限定参考。全线:

Range(Table.Sheets("10.2a").Cells(26, i), Table.Sheets("10.2a").Cells(36, i)).ClearContents

这种类型的代码在With... End With块中看起来更好。