Excel VBA循环命名列表

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

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 

我尝试切换第5行,如下所示:

 For Each c In Sheets("Servers").Range("L" & Rows.Count).End(x1Up).Row 

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

首先, dim c as range ,然后将代码更新为:

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

要么

 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 

您还可以更新命名范围的定义,使其成为一个dynamic的命名范围,可以使用=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 

您可以通过使命名范围dynamic来使用您的原始代码。

例如,在命名范围的“引用到”字段中input下面的公式,将从A2:C中select一个范围,其中是最后一个填充行的行号。

= OFFSET(Sheet1中$ A $ 1,1,0,COUNTA(Sheet1中$ A:!$ A)-1,3)

(假设数据从col A扩展到col 1,并在第1行中包含标题)