Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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 VBA循环_Vba_Excel - Fatal编程技术网

用于命名列表的Excel VBA循环

用于命名列表的Excel VBA循环,vba,excel,Vba,Excel,我有一个电子表格,其中有一列每周的数据日,并使用宏执行VBA。A列是一周中的一天,B列是对象的名称。当我运行宏时,它通过一个命名列表运行For循环,并将在另一个工作表上的日历中填充项目。只要有固定长度的命名列表(即$L2:$A14),宏就可以正常工作,因此如果添加新数据,就需要修复命名列表 Sub UpdateCalendar() i = 2 Dim strRngName As String lngLast = Sheets("Servers").Range("B" &a

我有一个电子表格,其中有一列每周的数据日,并使用宏执行VBA。A列是一周中的一天,B列是对象的名称。当我运行宏时,它通过一个命名列表运行For循环,并将在另一个工作表上的日历中填充项目。只要有固定长度的命名列表(即$L2:$A14),宏就可以正常工作,因此如果添加新数据,就需要修复命名列表

Sub UpdateCalendar()
    i = 2
    Dim strRngName As String
    lngLast = Sheets("Servers").Range("B" & Rows.Count).End(xlUp).Row
    For Each c In Application.Range("ScheduledDates")
        strRngName = c.Text
        strUser = c.Offset(0, -1).Value
        User = c.Offset(0, -10).Value
        If (i > 45) Then
        <code stuff>
        i = i + 1
    Next
End Sub

但它不喜欢这样(我猜它不认为它是一个完整的数组?)。这种执行方式的问题是,如果“ScheduledDates”字段为空,它将抛出错误并停止脚本,因此我在命名列表中使用了固定长度。不确定是否有办法解决此问题。

首先,
将c设置为范围,然后将代码更新为:

For Each c In Sheets("Servers").Range("L2:L" & Sheets("Servers").cells(Rows.Count,"L").End(xlUp).Row).cells


您还可以更新命名范围的定义,使其成为动态命名范围,或者使用
=offset(/counta
结构,或者通过引用
listObject

假设列B始终有一个条目,我更喜欢这种方法:

Sub UpdateCalendar()
    Dim rng as Range
    Dim strRngName As String

    Set rng as Sheets("Servers").Range("B2")

    While rng <> ""
        strRngName = rng.Text
        strUser = rng.Offset(0, -1).Value

        '!!!Below line will cause an error in your code as B2 offset by -10 would be B-8!!!
        User = rng.Offset(0, -10).Value

        If (rng.Row > 45) Then
        '<code stuff>

        Set rng = rng.Offset(1)
    Wend
End Sub
Sub-UpdateCalendar()
变暗rng as范围
Dim strRngName作为字符串
将rng设置为工作表(“服务器”)。范围(“B2”)
而rng“
strRngName=rng.Text
strUser=rng.偏移量(0,-1).值
“!!!以下第行将导致代码中出现错误,因为B2偏移-10将是B-8!!!
用户=rng.偏移量(0,-10).值
如果(rng.Row>45),则
“
设置rng=rng偏移量(1)
温德
端接头

您可以通过使命名范围动态化来使用原始代码

例如,在命名范围的“引用”字段中输入以下公式,可以选择A2:C中的一个范围,其中是最后填充行的行号

=偏移量(表1!$A$1,1,0,COUNTA(表1!$A:$A)-1,3)

(假设数据从A列扩展到C列,标题在第1行中)

表格(“服务器”)中的每个C。范围(“L”和Rows.Count)。结束(x1Up)。行
您在那里有一个打字错误
x1Up
,而不是
xlUp
dim c as range, lLastRow as long
lLastRow=Sheets("Servers").cells(Rows.Count,"L").End(xlUp).Row

For Each c In Sheets("Servers").Range("L2:L" & lLastRow).cells
Sub UpdateCalendar()
    Dim rng as Range
    Dim strRngName As String

    Set rng as Sheets("Servers").Range("B2")

    While rng <> ""
        strRngName = rng.Text
        strUser = rng.Offset(0, -1).Value

        '!!!Below line will cause an error in your code as B2 offset by -10 would be B-8!!!
        User = rng.Offset(0, -10).Value

        If (rng.Row > 45) Then
        '<code stuff>

        Set rng = rng.Offset(1)
    Wend
End Sub