2014-04-01 74 views
0

我有什么:

  1. 我在我的形式下拉列表中我是从一个 工作表填充。
  2. 我的代码只适用于命名范围。

我需要什么:

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

我的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崩溃。

回答

0

更明智的使用命名范围,而不是它的代码固定的。想象一下,有人在D之前添加了一列!你将不得不改变所有硬编码的代码。最好将With块放在For循环的顶部。您可能还需要清除它之前的列表。

只需确保命名范围客户端列表工作表( “2.1客户端”)的范围。( “d:d”)。如果你这样做,下面的使用方法:用数据开始向右下方

  • 客户端列表指向

    1. 列表包含一个头,:

      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 
      

      ,可以实现更好的性能,如果头,说D1在工作表中( “2.1客户端”)

    代码:

    ' 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 
    
  • +0

    返回“End With”,没有“With”错误。我尝试将第三行改为“如果结束”和“如果不是”,但没有运气。 (我已按照建议创建了命名范围。) –

    +0

    已更新,但这可能会影响性能,因为它会经历范围内的所有行。如果** ClientList **是一个表头并更改一些代码,则可以获得快速性能。 – PatricK

    +0

    这两个工作,但我不能解决如何折扣方法二(“客户端”,标题单元格,填充在我的下拉列表中)的标题单元格。是否将D2设置为我的命名范围而不是D1? –

    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 
    
    +0

    由于某些原因,当我应用上述代码时,Excel崩溃。我想不出为什么。猜测,我会说Excel是无休止地循环遍历列的。该列由五个行组成,每个单元格中都有文本。没有什么不寻常的。 –

    +1

    查看我的编辑#1 ................ –

    +0

    谢谢。我能够在我的最后重现您的工作代码。这是对范围的有用确认。我无法将它与我的原始代码缝合在一起,而没有产生相同的“崩溃”效果。 –