在代码之前,VBA无法引用到表单中的范围

我目前正在build立一些代码,在一个工作表,活动工作表中创build一堆格式化的数据,然后将该数据传输到一个新的工作表。

问题是,当我尝试按名称指定表单时,如果表单在代码运行之前存在,则不起作用。

因此,在下面的代码中,我得到的错误“范围”obect“_Worksheet”失败“行”单元格(1,1),单元格(7,3))。Interior.Color = RGB 100,100,100)“只有在运行代码之前存在”Topline“工作表。 如果我删除工作表并让代码添加并命名“Topline”工作表,我会得到相同的错误,但在“Data.Range(Cells(x + 2,1),Cells(x + a,3))行。复制”

我已经试过Googlesearch,但是完全不知道为什么这个代码只能在运行之前不存在的工作表上工作。 任何帮助是极大的赞赏。 我几乎愿意打赌答案是显而易见的。

这是困扰我的代码:

For i = 1 To Worksheets.Count If Worksheets(i).Name = "Topline" Then TE = True If Worksheets(i).Name = "Data" Then DE = True Next i If TE = False Then Worksheets.Add(After:=Worksheets(1)).Name = "Topline" If DE = False Then ActiveSheet.Name = "Data" For i = 1 To Worksheets.Count If Worksheets(i).Name = "Topline" Then Set Topline = Worksheets(i) If Worksheets(i).Name = "Data" Then Set Data = Worksheets(i) Next i With Topline .Range(Cells(1, 1), Cells(7, 3)).Interior.Color = RGB(100, 100, 100) With .Range(Cells(3, 1), Cells(3, 3)) .Merge .Font.Bold = True .Value = "Total" End With With .Range(Cells(4, 2), Cells(5, 3)) .Font.Bold = True End With .Cells(1, 1) = "Topline" .Cells(1, 1).Font.Bold = True .Cells(4, 2) = "Count" .Cells(4, 3) = "Percent" End With Data.Range(Cells(x + 2, 1), Cells(x + a, 3)).Copy Topline.Range(Cells(8, 1), Cells(a + 6, 3)).PasteSpecial (xlPasteAll) 

问题是你有不合格的范围引用。 如果没有先指定工作表,而引用任何Range对象,则不合格。 这些引用遵循幕后规则,并在其中使用带有下划线的对象。 所以你可能会遇到涉及_Worksheets_Global错误。

表单的类模块中的非限定引用将引用该表单。 所有其他不合格的引用(ThisWorkbook,标准模块,用户表单)将引用Activesheet。 这个

 With Topline .Range(Cells(1, 1), Cells(7, 3)).Interior.Color = RGB(100, 100, 100) End With 

就像在说

 Topline.Range(Activesheet.Cells(1, 1), Activesheet.Cells(7, 3)).Interior.Color = RGB(100, 100, 100) 

由于Topline上没有包含Activesheet单元格的范围,因此会出现错误。

为什么当一张表已经存在时会发生? 可能是因为在排除代码故障的时候,你去了UI,创build了工作表,然后返回到代码来运行它。 你离开新创build的Topline表格活动,当Topline和Activesheet是同一件事,没有错误。

第一个问题是: –

 .Range(Cells(1, 1), Cells(7, 3)).Interior.Color = RGB(100, 100, 100) 

问题在于Cells(1, 1)返回一个范围,但.Range(x, y)只需要一个地址,即Cells(1,1).AddressLocal

如果你修改所有: –

 .Range(Cells(x, y), Cells(x, y)) 

条目到: –

  .Range(Cells(x, y).AddressLocal, Cells(x, y).AddressLocal)) 

你应该更接近一个工作的答案。 我来到另一个问题:

 Data.Range(Cells(x + 2, 1).AddressLocal, Cells(x + a, 3).AddressLocal).Copy 

但我相信这是一个单独的问题,由于只获得一小段代码或没有明确的选项,而定义在xa