2017-10-04 73 views
2

我有一系列的细胞在一张我希望复制N次在另一个片: 对于n = 4人们必须:小姐东西在简单的循环

Input (Sheet1)    Output (Sheet2) 
ABC       ABC 
DEF       ABC 
GHI       ABC 
           ABC 
           DEF 
           DEF 
           DEF 
           DEF 
           GHI 
           GHI 
           GHI 
           GHI 

我所做的仅仅是:

Sub REPLICATE() 
    Dim i As Integer 
    Dim j As Integer 
    Dim TEMP As String 

    For i = 1 To 400 
    TEMP = Workbooks("Libro1").Sheets("Hoja1").Cell(i, 1).Value 
     For j = 1 To 4 
     Workbooks("Libro1").Sheets("Hoja2").Cell(j, 1) = TEMP 
     Next j 
    Next i 
End Sub 

我得到了错误438.我认为问题可能是我使用了字符串,但我在Sheet1中使用了简单的整数,并且遇到了同样的问题。感谢您的建议。

回答

5

这是Cells不是Cell。无论如何,你的代码将无法工作,因为它会覆盖(每次都重新启动j)。试试这个(调整工作表参考)。

Sub REPLICATE() 

Dim i As Long 

For i = 1 To Sheet1.Cells(Rows.Count, 1).End(xlUp).Row 
    Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp)(2).Resize(4).Value = Sheet1.Cells(i, 1).Value 
Next i 

End Sub 
+1

完美的作品,谢谢你' – IlvarNourtan

3

Sheets集合返回一个Object,这意味着什么,你访问后键入它不会给你智能感知或自动完成帮助和VBA会很乐意编译它,因为任何电话对Object接口进行是迟到的,因此只能在运行时解决。

解决方案是坚持早期绑定的代码并声明一个Worksheet对象。此外,如果您的意思是拉Worksheet,则使用Worksheets集合,因为Sheets集合可以为您提供Chart对象(即并非所有工作表均为工作表)。

Dim ws As Worksheet 
Set ws = Workbooks("Libro1").Worksheets("Hoja1") 

而现在,当你键入ws.你会看到Cell确实不Worksheet类型的成员(因此“对象不支持属性或方法”):

For i = 1 To ws.Cells(...) 

那表示如果Workbooks("Libro1")ThisWorkbook(包含VBA代码的书),那么您应该使用现有的工作表对象。

您在VBA项目中获得每个Worksheet文档模块的“免费”,全局范围Worksheet对象变量 - 只需使用它!

For i = 1 To Sheet1.Cells(...) 

SJR's answer那样。

您可以通过在项目浏览器(Ctrl + R)中查找表格,然后更改属性 toolwindow(F4)中的(Name)属性来重命名该全局范围对象变量。请注意,像这样更改名称将而不是自动更新您使用Sheet1的现有代码。如果你想重命名并且传播的变化,你需要重构你的代码。Rubberduck(一个开源VBIDE加载的项目,我管理),可以为你做的:

before refactoring

提供一个新的名字:

在Rubberduck的代码浏览器右键单击工作表:

supplying the new name

整个代码每次提到旧名称现在已更新:

after refactoring

您也可以尝试进行与按Ctrl + H“查找/替换”重构,但是这可能是乏味的,并引入更多的问题的风险。 Rubberduck为此构建了一个符号表,因此它比简单的查找&替换更为稳健。

+0

最有教育意义的,一如既往。 – SJR

+0

谢谢你的解释和你的时间质量,这是非常有用的。 – IlvarNourtan