从打开的工作簿转置单元格的集合

时间:2013-09-25 15:32:49

标签: vba foreach excel-2007

这是背景故事:我一直在享受VBA在Excel 2007中的多功能性,但是我一直试图从另一个工作簿中引用一系列单元格。更明确地说,我想创建一个从ThisWorkbook中的单元格I12开始的列表列表,使用For Each Next过程,该过程将从工作表的第一行(工作表变量是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地址,OldFile中工作表的CompShtName = namei = counter。当我尝试运行代码时,我在包含箭头的行中得到run-time error 1004

我想也许问题在于从另一本书中拉出来。但是,如果我将范围更改为更简单的范围,例如Range("A1:A5"),则可行。我甚至尝试删除OldFile.Sheets(CompShtName).并让它使用活跃的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行。

1 个答案:

答案 0 :(得分:0)

假定未限定的Range对象Range("A1").End(xlRight) 始终以引用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