选择整列作为范围而不是命名范围

时间:2014-04-01 22:58:38

标签: excel vba excel-vba

我拥有的:

  1. 我的表格中有下拉列表,我正在填写 工作表。
  2. 我的代码仅适用于命名范围。
  3. 我需要什么:

    我需要从整列而不是命名范围填充我的下拉列表。

    我的VBA代码:

    使用命名范围的工作代码:

    'Populate drop-down list (combo box) from range...
    Dim range_b As Range
    
    For Each range_b In Worksheets("2.1 Clients").Range("ClientList")
      With Me.cs_ClientName1
        .AddItem range_b.Value
        .List(.ListCount - 1, 1) = range_b.Offset(0, 1).Value
      End With
    Next range_b
    

    我尝试了什么:

    我尝试了For Each行的各种排列:

    'For Each range_b In Worksheets("2.1 Clients").Columns(4)
    'For Each range_b In Worksheets("2.1 Clients").Range(Columns(4))
    'For Each range_b In Worksheets("2.1 Clients").Columns("D:D")
    

    ......最后一个似乎导致Excel崩溃。

2 个答案:

答案 0 :(得分:1)

For Each range_b In Worksheets("2.1 Clients").Range("D:D")

RANGE()对字符串地址感到满意。

修改#1:

这是一个有效的例子:

Sub dural()
    Dim range_b As Range
    For Each range_b In Worksheets("2.1 Clients").Range("D:D")
        If range_b.Value = "good" Then
            MsgBox "good found"
            Exit Sub
        End If
    Next range_b
End Sub

答案 1 :(得分:0)

使用命名范围而不是在代码中修复它更为明智。想象一下有人在D之前添加了一个列!您必须更改所有硬编码的代码。将With块放在For循环的顶部也更好。您可能还需要清除它之前的列表。

确保命名范围 ClientList 引用工作表(“2.1客户端”)。范围(“D:D”)。如果您已经这样做,请使用以下内容:

With Me.cs_ClientName1
    For Each range_b In ThisWorkbook.Names("ClientList").RefersToRange
        If Not IsEmpty(range_b) Then
            .AddItem range_b.Value
            .List(.ListCount - 1, 1) = range_b.Offset(0, 1).Value
        End If
    Next range_b
End With

如果符合以下条件,可以实现更好的表现:

  1. List包含一个标题,数据从它下面开始
  2. ClientList 指向标题,例如工作表中的D1(“2.1客户”)
  3. 代码:

    ' Data Starts right below the Header (Named Range)
    Set range_b = ThisWorkbook.Names("ClientList").RefersToRange.Offset(1,0)
    With Me.cs_ClientName1
        .Clear ' Clear existing data
        Do Until IsEmpty(range_b)
            .AddItem range_b.Value
            .List(.ListCount - 1, 1) = range_b.Offset(0, 1).Value
            Set range_b = range_b.Offset(1, 0)
        Loop
    End With
    Set range_b = Nothing