Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 2007范围和单元格语法问题_Excel_Vba - Fatal编程技术网

Excel 2007范围和单元格语法问题

Excel 2007范围和单元格语法问题,excel,vba,Excel,Vba,我试图编写一个循环,从主工作表的页面中获取每一行,并将每一行放在相应的工作表中。例如,工作表1上的A1:A10行将被复制并放置在工作表2上的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

我试图编写一个循环,从主工作表的页面中获取每一行,并将每一行放在相应的工作表中。例如,工作表1上的A1:A10行将被复制并放置在工作表2上的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
此错误引发“运行时错误“1004”:应用程序定义或对象定义错误”

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

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

它运行正常,但仅在选择工作表(1)时运行。因此,我知道我需要选择第一个工作表,以便将信息从它拉到其他工作表或类似的东西。我错过了什么?它是否与循环开头的“工作表(i).Activate”语句有关?我是VBA新手,不确定Excel VBA宏的权限

只需在下一个结构之前添加
x=1

x=1
For i = 2 To wsCount (...)
当代码运行时,它尝试选择单元格(0,2),但没有行=0(x=0)。我相信这就是解决方案。

在此代码中:

Worksheets(1).Range(Cells(10, 2), Cells(10, 12)).Value = "Test"
范围
方法适用于
工作表(1)
单元格
方法适用于活动工作表。该代码相当于:

Worksheets(1).Range(ActiveSheet.Cells(10, 2), ActiveSheet.Cells(10, 12)).Value = "Test"
如果只是使用固定引用,则可以使用
Range
方法的版本,该方法采用字符串参数:

Worksheets(1).Range("B10:L10")
如果您需要一个根据变量值而变化的引用,那么您可以将
与。。。以
块结束:

With Worksheets(1)
  .Range(.Cells(x, 2), .Cells(x, 12)).Value
End With
其中以
开头的非限定引用引用在
中指定的对象,并使用。。。以
块结束

在不起作用的代码中,您需要在同一行中引用两个不同的工作表,以便使用。。。仅仅以结束是不够的。使用变量引用每个工作表可能是完成此任务的最清晰的方法。在…的
之前。。。接下来,循环开始,声明两个工作表变量:

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
您还应将对
工作表(1)
工作表(i)
的其他引用分别替换为
wsFirst
wsCurr

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

只需更改即可

工作表(i).范围(单元格(3,2),单元格(3,12)).Value=工作表(1).范围(单元格(x,2),单元格(x,12)).Value


给x一个初始值

@chrisneilsen谢谢!这是一篇关于我应该如何编写代码的内容丰富的帖子。谢谢你的关注!就我而言,我忘了添加代码行,因为我最初给了x第一行数据的值。谢谢@barrowc!我现在可以看到我的代码是如何抛出错误的。特别感谢您回答中的编码示例,它们帮助了我们很多!
For Each cell In Worksheets(i).Range(Cells(3, 2), Cells(3, 12))
    Worksheets(1).Cells(x, cell.Column).Value = cell.Value
Next cell