Excel 2007 范围和单元格语法问题
Excel 2007 Range and Cell Syntax issue
我正在尝试编写一个循环,从主工作表的一页中获取每一行,并将每一行放在相应的工作表中。例如,工作表一上的行 A1:A10 将被复制并放置在工作表 2 的 A1:A10 上。在工作表 3 上,A1:A10 值将来自工作表一的值 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) 被 select 编辑时。 所以我知道我需要 select 第一个工作表从中提取信息,到其他工作表或类似的东西。我错过了什么?是不是和我循环开头的"Worksheets(i).Activate"语句有关系?我是 VBA 的新手,不确定 Excel VBA 宏的权限。
只需在 For Next 结构前添加 x=1
。
x=1
For i = 2 To wsCount (...)
代码运行时,它会尝试 select 单元格 (0,2),但没有行 =0 (x=0)。我相信这是解决方案。
在此代码中:
Worksheets(1).Range(Cells(10, 2), Cells(10, 12)).Value = "Test"
Range
方法适用于 Worksheets(1)
,但 Cells
方法适用于活动 sheet。该代码相当于:
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
块中指定的对象。
在您无法运行的代码中,您需要在同一行中引用两个不同的作品sheet,因此仅靠 With ... End With
是不够的。使用变量来引用每个作品sheet 可能是完成这项工作的最清晰的方法。在For ... Next
循环开始之前,声明两个worksheet变量:
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)
的其他引用分别替换为 wsFirst
和 wsCurr
。
正如问题的评论中所指出的,您还可以删除所有选择和激活,这将使您的代码更高效,并停止依赖 sheet 恰好在代码运行。
只是改变
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赋初值
我正在尝试编写一个循环,从主工作表的一页中获取每一行,并将每一行放在相应的工作表中。例如,工作表一上的行 A1:A10 将被复制并放置在工作表 2 的 A1:A10 上。在工作表 3 上,A1:A10 值将来自工作表一的值 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) 被 select 编辑时。 所以我知道我需要 select 第一个工作表从中提取信息,到其他工作表或类似的东西。我错过了什么?是不是和我循环开头的"Worksheets(i).Activate"语句有关系?我是 VBA 的新手,不确定 Excel VBA 宏的权限。
只需在 For Next 结构前添加 x=1
。
x=1
For i = 2 To wsCount (...)
代码运行时,它会尝试 select 单元格 (0,2),但没有行 =0 (x=0)。我相信这是解决方案。
在此代码中:
Worksheets(1).Range(Cells(10, 2), Cells(10, 12)).Value = "Test"
Range
方法适用于 Worksheets(1)
,但 Cells
方法适用于活动 sheet。该代码相当于:
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
块中指定的对象。
在您无法运行的代码中,您需要在同一行中引用两个不同的作品sheet,因此仅靠 With ... End With
是不够的。使用变量来引用每个作品sheet 可能是完成这项工作的最清晰的方法。在For ... Next
循环开始之前,声明两个worksheet变量:
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)
的其他引用分别替换为 wsFirst
和 wsCurr
。
正如问题的评论中所指出的,您还可以删除所有选择和激活,这将使您的代码更高效,并停止依赖 sheet 恰好在代码运行。
只是改变
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赋初值