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