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

我正在尝试使用VBA使我的生活更轻松,但是我一直在遇到一个我无法解决的问题。 基本上我想要的是从几个输出CSV文件,我有一些不错的格式化的Excel文件复制一些值。 然后根据一些基数删除值或格式化单元格。
但是我不断收到相同的错误消息运行时错误'1004'应用程序定义或对象定义的错误。 我这样做,使用许多输出文件和粘贴值在同一个表格文件,但在不同的工作表(10.2a,10.2b,10.2c,…)通过每个工作表的macros。 我使用另一个macros运行所有的macros,其中包含所有其他macros,我看了很多其他的post,但不明白错误来自哪里。 任何帮助将非常感激。 下面我们以一张纸的代码为例。

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 

这种使用Range内的Cells来构build一个单元块通常会成为不合格引用的牺牲品。 在这种情况下,您使用Table.Sheets("10.2a")来指定Range的工作表,但在Cells格上不使用相同的限定符。 这意味着Cells将使用可用的默认上下文,这取决于代码的执行位置。 可能性:

  • 在代码模块或ThisWorkbookCells引用ActiveSheet
  • 在工作表代码后面, Cells引用该Worksheet而不pipeActiveSheet

使用Address来解决不同的工作表

一种方法是跟随呼叫CellsAddress 。 这解决了这个问题,因为Address返回没有表名的单元格地址。 然后在上下文Sheets("10.2a")Range内对Range进行解释。

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

确定参考资料(通常是首选)

解决此错误的另一种方法是通过在Cells之前添加表名称来限定引用: Table.Sheets("10.2a").Cells 。 全行:

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

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