Excel 将变量应用于循环错误-“;For Each只能在集合对象或数组上迭代;

Excel 将变量应用于循环错误-“;For Each只能在集合对象或数组上迭代;,excel,vba,Excel,Vba,我正在创建一个表格来组织我的研究,我有一个带有Comcluido值的combox的工作表,正在进行中,尚未开始。 选中后,它将激活my markStatus功能,该功能将作为参数接收要标记的日期和状态值 我无法将月份的值动态分配给循环。因为循环只有在通过后才能正确运行 显式地修改参数 明确地: 动态地: 返回: 编译错误: For-Each只能在集合对象或数组上迭代 我试图在文档和一些教程中搜索作为参考,但我找不到解决方案。 你能帮助我吗? 这是mes函数的正确语法。仅当它是从另一个代码模块调

我正在创建一个表格来组织我的研究,我有一个带有Comcluido值的combox的工作表,正在进行中,尚未开始。 选中后,它将激活my markStatus功能,该功能将作为参数接收要标记的日期和状态值

我无法将月份的值动态分配给循环。因为循环只有在通过后才能正确运行 显式地修改参数

明确地:

动态地:

返回: 编译错误: For-Each只能在集合对象或数组上迭代

我试图在文档和一些教程中搜索作为参考,但我找不到解决方案。 你能帮助我吗?


这是
mes
函数的正确语法。仅当它是从另一个代码模块调用时才将其公开

Private Function mes(refMonth As Integer) As String
    'Returns the month in full
    Dim months As Variant
    months = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "December")
    mes = months(refMonth - 1)
End Function
[currMonth]中每个单元格的
假定
currMonth
是一个范围。因此,将
[currMonth]'替换为一个范围,如
ActiveSheet.range(“D2:D30”)`

您的项目中似乎有一个表。如果是,请尝试以下方法:-

Dim Tbl         As ListObject

Set Tbl = ActiveSheet.ListObjects(1)
For Each Cell In Tbl.DataBodyRange.Columns(8)
此处范围定义为表的第8列

最后,不要
选择
激活
任何内容。选择和激活是用户需要的,Excel不需要。因此,您可以在将控制权交还给用户时激活或选择某些内容

代替

Sheets("Calendar").Activate
ActiveSheet.Cells(3, "A").Select
status = ActiveCell.Value
只用

status = Sheets("Calendar").Cells(3, "A").Value
or
status =  Sheets("Calendar").Range(A3").Value

当您寻址多个单元格的范围时,您会发现使用寻址范围的语法是有利的,但当您希望寻址单个单元格时,使用寻址单元格的语法是有利的。将单元格命名为
工作表(“SheetName”)。单元格([行编号],[列编号])
如果您觉得更容易阅读(更难计算),则可以在其中指定列名而不是列编号。

这是
mes
函数的正确语法。仅当它是从另一个代码模块调用时才将其公开

Private Function mes(refMonth As Integer) As String
    'Returns the month in full
    Dim months As Variant
    months = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "December")
    mes = months(refMonth - 1)
End Function
[currMonth]中每个单元格的
假定
currMonth
是一个范围。因此,将
[currMonth]'替换为一个范围,如
ActiveSheet.range(“D2:D30”)`

您的项目中似乎有一个表。如果是,请尝试以下方法:-

Dim Tbl         As ListObject

Set Tbl = ActiveSheet.ListObjects(1)
For Each Cell In Tbl.DataBodyRange.Columns(8)
此处范围定义为表的第8列

最后,不要
选择
激活
任何内容。选择和激活是用户需要的,Excel不需要。因此,您可以在将控制权交还给用户时激活或选择某些内容

代替

Sheets("Calendar").Activate
ActiveSheet.Cells(3, "A").Select
status = ActiveCell.Value
只用

status = Sheets("Calendar").Cells(3, "A").Value
or
status =  Sheets("Calendar").Range(A3").Value

当您寻址多个单元格的范围时,您会发现使用寻址范围的语法是有利的,但当您希望寻址单个单元格时,使用寻址单元格的语法是有利的。将单元格命名为
工作表(“SheetName”)。单元格([行编号],[列编号])
如果您觉得更容易阅读(计算起来更困难),则可以使用列名代替列编号。

使用:
对范围(currMonth)中的每个单元格使用
返回:对象的“Range”方法失败。
[currMonth]
-表示组成月份的一组单元格,我使用name属性来引用它您不能使用
[]
带变量。指定的范围是工作表还是工作簿范围?我想是工作簿范围,我不知道为什么我不理解这个问题,我用这个视频作为参考,如果工作簿
用于范围内的每个单元格(currMonth)
应该可以工作。如果是工作表,则需要添加其作用域所在的工作表:
用于工作表中的每个单元格(“Sheet1”)。范围(currMonth)
使用:
用于范围(currMonth)中的每个单元格。
返回:对象的“Range”方法“\u工作表”失败。
[currMonth]
-表示组成月份的一组单元格,我使用name属性来引用它。您不能将
[]
与变量一起使用。命名范围是工作表还是工作簿范围?我想是工作簿范围,我不确定为什么我不理解这个问题,我使用此视频作为范围内每个单元格的
的参考(currMonth)
应该有效。如果是工作表,则需要添加其作用域的工作表:
对于工作表中的每个单元格(“Sheet1”)。范围(currMonth)
感谢提示,它确实更简洁。但在我的情况下,我需要激活我的电子表格,以确保引用(日历在另一个电子表格中)之后,我选择下面的一行调用函数,该函数将以任何方式格式化我的单元格,以避免在我运行调用时必须将用户带到日历表?Excel确切地知道工作表(“MyCalendar”)的位置。范围(“A2”A30)
是您激活该工作表还是其他工作表。正如您所说,关键是您希望用户看到的内容。如果您激活该工作表,他将看到它。他不需要通过Excel查看它来在其上查找单元格。视觉和动作不相关。Excel可以在用户看不到对象的情况下进行操作。请记住,无论您采取何种操作-阅读或写入-发生在计算机的内存中,而不是在屏幕上,屏幕直接获取信息:VBA设置内存,内存设置屏幕。事实上,屏幕的输出类似于打印机的输出。相反,当您在屏幕上选择某个内容时,CPU将屏幕区域与ROM中的存储位置相匹配。VBA访问直接使用ROM,然后与屏幕上的内容同步。对于大型操作,在所有操作完成之前完全关闭同步非常有用,可以节省60%的程序运行时间。创建
选择
对象是为了将用户的点击和键盘笔划传递到Excel的内存。VBA不需要它。感谢提示,它可以lly要简洁得多。但在我的例子中,我需要激活我的电子表格,以保证引用