0

这是背景故事:我一直在享受 VBA 在 Excel 2007 中的多功能性,但我在尝试从另一个工作簿中引用一系列单元格时遇到了困难。更明确地说,我想使用 For Each Next 过程从 ThisWorkbook 中的单元格 I12 开始创建一个列式列表,该过程将从工作表的第一行(工作表变量为 CompShtName)中获取单元格值(不同数量) OldFile 工作簿。这是我编写的代码摘录:

CompShtName = Range("E12").Value 
For Each Cell In OldFile.Sheets(CompShtName).Range("A1", Range("A1").End(xlRight))  **<---Run-time error 1004**  
    Range("I" & 12 + i).Value = Cell.Value  
    i = i + 1  
Next

我已经声明并定义了变量,其中:旧文件的OldFile = file地址、旧文件中CompShtName = name的工作表和i = counter. 当我尝试运行代码时,我进入run-time error 1004了包含箭头的行。

我想也许问题出在从另一本书中提取。但是,如果我将范围更改为更简单的东西,例如Range("A1:A5"),它就可以工作。我什至尝试 OldFile.Sheets(CompShtName).使用 active 删除并让它运行ThisWorkbook,但这也有效。所以问题必须来自尝试创建一个笨拙的集合。


更新

我真的很喜欢@Zemens 使用转置而不是循环的方法。我还确保使用@mehow 的建议正确限定我的范围。不幸的是,我仍然收到 1004 错误。这是更新的代码摘录:

Dim OldSht As Worksheet
Dim EndOldHeader As Range
Set OldSht = OldFile.Sheets(CompShtName)
Set EndOldHeader = OldSht.Cells(1, OldSht.Cells(1, Columns.Count).End(xlToRight)) Compare.Range("I12").Resize(EndOldHeader.Columns.Count, 1).Value = Application.Transpose(EndOldHeader.Value)

错误发生Set EndOldHeader在行中。

4

1 回答 1

0

Range("A1").End(xlRight)假定未限定的 Range 对象始终引用ActiveWorkbook. 根据@mehow 的评论,您需要完全限定它。

引发 1004 错误是因为无法构造跨越多个工作簿的 Range 对象:)

我发现使用像这样的大型构造来创建对象变量来表示它们时会更好。它们在将来更易于阅读、更新、维护和调试。

但是,您可以在没有循环结构的情况下执行此操作。它应该更快,尽管可能不会明显更快。

Dim oldSheet as Worksheet
Dim oldRange as Range
Dim cl as Range
Set oldSheet = OldFile.Sheets(CompShtName)
Set oldRange = oldSheet.Cells(1, oldSheet.Cells(1, Columns.Count).End(xlToRight))

ActiveSheet.Range("I12").Resize(oldRange.Columns.Count,1).Value = Application.Transpose(oldRange.Value)

或者,在循环中执行如下操作:

For each cl in oldRange.Cells
    ActiveSheet.Range("I" & 12 + i).Value = cl.Value  
    i = i + 1  
Next
于 2013-09-25T15:59:44.180 回答