Excel 2007 区域和单元格语法问题



我正在尝试编写一个循环,该循环从主工作表的页面中获取每一行,并将每一行放在相应的工作表中。例如,工作表 1 上的行 A1:A10 将被复制并放置在工作表 1 上的 A1:A10 上。在工作表3上,A1:A10值将来自工作表1值A2:A10。但我的问题是,我找不到正确的语法来使用 Range 和 Cell 函数遍历我的循环。

我的代码:

'i is set to the first worksheet I am writting to
'wsCount is set to the last worksheet I want to write to
For i = 2 To wsCount
    Worksheets(i).Activate
    'This code shifts old information down so the most recent is always on top
    Worksheets(i).Range("A3:L262").Select
    Selection.Copy
    Worksheets(i).Range("A4").Select
    ActiveSheet.Paste
    'This sets the first cell in the row to be the current date
    Worksheets(i).Range("A3").Value = Format(Now, "ddd, d mmmm yyyy")
    'This is my problem, I am trying to set the range 
    'B3:L12 to the corresponding row in the main worksheet
    Worksheets(i).Range(Cells(3, 2), Cells(3, 12)).Value = Worksheets(1).Range(Cells(x, 2), Cells(x, 12)).Value
    Worksheets(i).Range("A1").Select
    x = x + 1
Next i

此错误引发"Run-time error '1004': Application-defined or object-defined error"

我觉得我的语法是正确的,因为当我运行时:

Worksheets(1).Range(Cells(10, 2), Cells(10, 12)).Value = "Test"

它运行良好,但仅当选择了工作表(1)时。所以我知道我需要选择第一个工作表才能从中提取信息,到其他工作表或类似的东西。我错过了什么?它与我的"工作表(i)"有关吗?激活"循环开头的语句?我是 VBA 的新手,不确定 Excel VBA 宏的权限。

在此代码中:

Worksheets(1).Range(Cells(10, 2), Cells(10, 12)).Value = "Test"

Range方法适用于Worksheets(1)Cells方法适用于活动工作表。该代码等效于:

Worksheets(1).Range(ActiveSheet.Cells(10, 2), ActiveSheet.Cells(10, 12)).Value = "Test"

如果您只是使用固定引用,则可以使用采用字符串参数的 Range 方法的版本:

Worksheets(1).Range("B10:L10")

如果您需要根据变量值而变化的引用,则可以使用 With ... End With 块:

With Worksheets(1)
  .Range(.Cells(x, 2), .Cells(x, 12)).Value
End With

其中,以 . 开头的非限定引用引用在 With ... End With 块中指定的对象。

在不起作用的代码中,您需要在同一行中引用两个不同的工作表With ... End With因此仅靠它是不够的。使用变量来引用每个工作表可能是完成此操作的最清晰方法。在For ... Next循环开始之前,声明两个工作表变量:

Dim wsFirst As Worksheet
Dim wsCurr As Worksheet

然后选择:

Set wsFirst = Worksheets(1)
For i = 2 To wsCount
  Set wsCurr = Worksheets(i)

然后,您的问题线将变为:

wsCurr.Range(wsCurr.Cells(3, 2), wsCurr.Cells(3, 12)).Value = wsFirst.Range(wsFirst.Cells(x, 2), wsFirst.Cells(x, 12)).Value

还应将对Worksheets(1)Worksheets(i)的其他引用分别替换为wsFirstwsCurr

正如问题注释中指出的那样,您还可以删除所有选择和激活,这将使您的代码更有效率,并停止它依赖于代码运行时碰巧处于活动状态的工作表。

只需在 For Next 结构之前添加 x=1

x=1
For i = 2 To wsCount (...)

当代码运行时,它会尝试选择单元格 (0,2),但没有 row=0 (x=0)。我相信这是解决方案。

只需更改

Worksheets(i).Range(Cells(3, 2), Cells(3, 12)).Value = Worksheets(1).Range(Cells(x, 2), Cells(x, 12)).Value

For Each cell In Worksheets(i).Range(Cells(3, 2), Cells(3, 12))
    Worksheets(1).Cells(x, cell.Column).Value = cell.Value
Next cell

并给出 x 的初始值

最新更新