【问题标题】:Compile Error: for each control variable must be variant or object编译错误:对于每个控制变量必须是变量或对象
【发布时间】:2020-12-31 14:40:58
【问题描述】:

我得到错误:

编译错误:对于每个控制变量必须是变量或对象

我正在尝试:
从 Excel 的列表中打开文件(路径、文件名和扩展名在 A 列中),
然后将相应行(D列)中的特定帐户信息复制到打开文件中的指定单元格,
将文件另存为新文件名(在 C 列中指定扩展名),
关闭然后转到下一行并重复。

这是代码。需要设置数据列表的大小吗?

Sub CM_Details()

Dim wb1 As Workbook 'Details
Dim wb2 As Workbook 'New CM
Dim i As Long   'row
Dim rng As Range

Set wb1 = ThisWorkbook
Set rng = Range("A2", Range("A" & Rows.Count).End(xlUp))

With wb1
    For Each i In rng
        If .Sheets("Detail").Range("A" & i).Value <> "" Then

            Set wb2 = Workbooks.Open(.Sheets("Detail").Range("A" & i).Value)

            wb1.Sheets("Detail").Range("D" & i).Copy    'RoC
            wb2.Sheets("Home").Range("B1").PasteSpecial Paste:=xlPasteValues
            Application.CutCopyMode = False

            wb2.SaveAs Filename:="R:\ASSL v4\" & wb1.Sheets("Detail").Range("C" & i).Value
            wb2.Close

        End If
    Next i
End With

End Sub

【问题讨论】:

  • 控制变量是'i'。您已将 i 声明为 long。对于“for each”循环,“i”(控制变量)必须声明为变体或与迭代集合/数组(rng)传递的相同类型的对象。尝试阅读手册/帮助页面。它通常对这些类型的错误有很大帮助。
  • 另外,当您 Set rng = 指定所有 3 个范围对象的工作簿时,就像您在代码中的其他地方所做的那样
  • @chris neilsen - 谢谢,我不是一个特别高级的用户,所以不完全确定如何引用“Rng”之类的东西,所以我会试试这个,这样以后更容易重用
  • @freeflow 感谢您的宝贵时间 - 结果 Dim i 需要是整数(用于行号),而不是 long(我认为它需要覆盖 A 列中包含的文件路径的长度)所以肯定学到了一些东西。我尝试了很多搜索来找到如何做到这一点,这就是我接近解决方案的方式。如果您可以参考一本易于使用的手册,那就太好了

标签: excel vba loops


【解决方案1】:

第一次替换:

For Each i In rng

与:

for i = 2 to Range("A" & Rows.Count).End(xlUp).Row

然后继续调试。

【讨论】:

  • 或者,已经设置了rng,对于i = rng.row to rng.row + rng.rows - 1
  • @chrisneilsen 是的......这是一个好方法......如果rng 更改,只需更改一个代码行...... ........谢谢!
  • @Gary'sStudent 谢谢,一旦我将 Dim i 修复为 Integer 就可以了 - 这将为我节省很多时间:)
  • @chrisneilsen 感谢您的回复 - 我已经尝试过您的建议,但得到“运行时错误 13:类型不匹配”现在我有一些可行的方法,我将继续使用它
猜你喜欢
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多