具有命名范围的VBA Select Case不起作用

时间:2015-05-19 14:51:18

标签: excel excel-vba vba

我正在尝试在命名范围中插入新行。用户从组合框中选择“类别”,例如Cool DrinksBeer and CiderBitters等...然后该类别的内容填充另一个组合框。

我已经命名了所有类别的范围,并希望它们填充第二个组合框。我有一个单独的代码:

Dim rng As Range
Dim DailySales As Worksheet
Set DailySales = Worksheets("Daily Sales")

Set rng = DailySales.Range("CoolDrinksDailySales")
For Each rng In DailySales.Range("CoolDrinksDailySales")
Me.CmboName.AddItem rng.Value
Next rng

但是,每当我尝试在Select Case中使用它时,它都不起作用。

Dim rng As Range
Dim DailySales As Worksheet
Set DailySales = Worksheets("Daily Sales")
Select Case Me.CmboType.Value
Case "Cool Drinks"
    Set rng = DailySales.Range("CoolDrinksDailySales")
    For Each rng In DailySales.Range("CoolDrinksDailySales")
    Me.CmboName.AddItem rng.Value
    Next rng
Case "Beer and Cider"
    Set rng = DailySales.Range("BeerCiderDailySales")
    For Each rng In DailySales.Range("BeerCiderDailySales")
    Me.CmboName.AddItem rng.Value
    Next rng
End Select

有人有什么想法吗?

以下是完整的代码:

Option Explicit
Private Sub UserForm_Initialize()
'InitializeTypeCombo
Dim Types() As String
Types = Split("Cool Drinks,Beer and    
Cider,Bitters,Brandy,Whiskey,Rum,Spirits,Sherry,White Wine,Red Wine", 
",")

Dim i As Integer
For i = LBound(Types) To UBound(Types)
Me.CmboType.AddItem Types(i)
Next

'InitializeNameCombo

Dim rng As Range
Dim DailySales As Worksheet
Set DailySales = Worksheets("Daily Sales")
 Select Case Me.CmboType.Value
Case "Cool Drinks"
    Set rng = DailySales.Range("CoolDrinksDailySales")
    For Each rng In DailySales.Range("CoolDrinksDailySales")
    Me.CmboName.AddItem rng.Value
    Next rng
Case "Beer and Cider"
    Set rng = DailySales.Range("BeerCiderDailySales")
    For Each rng In DailySales.Range("BeerCiderDailySales")
    Me.CmboName.AddItem rng.Value
    Next rng
End Select
End Sub

 Private Sub CmdExit_Click()
 Unload Me
 End Sub
Private Sub CmdEnter_Click()
Dim rng As Range

'Store Date Index
Dim colArray(32) As Integer

'Store Item Index
Dim rowArray(150) As Integer

'Store first value for Find and FindNext
Dim FirstAddress As String

Dim i As Integer
Dim j As Integer
i = 0
j = 0

With Range("B6:AD6")
Set rng = .Find(TxtDate.Value, LookIn:=xlValues)
If Not rng Is Nothing Then
    FirstAddress = rng.Address       
    Do
        Set rng = .FindNext(rng)
        colArray(i) = rng.Column
        i = i + 1            
        Loop While Not rng Is Nothing And rng.Address <> FirstAddress
End If
End With

With Range("A7:A150")
Set rng = .Find(CmboName.Value, LookIn:=xlValues)
If Not rng Is Nothing Then
    FirstAddress = rng.Address        
    Do
        Set rng = .FindNext(rng)
        rowArray(j) = rng.Row
        j = j + 1            
        Loop While Not rng Is Nothing And rng.Address <> FirstAddress
End If
End With

Dim c As Integer
Dim r As Integer

For c = 0 To i - 1
For r = 0 To j - 1
    Cells(rowArray(r), colArray(c)).Value = TxtNoSold.Value
Next r
Next c
Unload Me
End Sub

1 个答案:

答案 0 :(得分:0)

解决方案只是将Select Case移动到Combobox_Change事件中。正如Dick Kusleika所说,组合框的价值在运行时并不算什么。这是完成我想要做的事情的正确代码。

Option Explicit
Private Sub Userform_Initialize()
'Populate cmboTypes
Dim Types() As String
Types = Split("Cool Drinks,Beer and _
    Cider,Bitters,Brandy,Whiskey,Rum,Spirits,Sherry,White Wine,_
    Red Wine", ",")

 'Loop through the values populated in the split function above, and add 
 'each item to the combobox
Dim i As Integer
For i = LBound(Types) To UBound(Types)
Me.CmboType.AddItem Types(i)
Next
End Sub


Sub CmboType_Change()

Dim rng As Range
Dim DailySales As Worksheet

'Populate CmboName with named dynamic ranges of "Types"

Set DailySales = Worksheets("Daily Sales")
 Select Case Me.CmboType.Value
   Case "Cool Drinks"
    Set rng = DailySales.Range("CoolDrinksDailySales")
    For Each rng In DailySales.Range("CoolDrinksDailySales")
    Me.CmboName.AddItem rng.Value
    Next rng
   Case "Beer and Cider"
    CmboName.Clear
    Set rng = DailySales.Range("BeerCiderDailySales")
    For Each rng In DailySales.Range("BeerCiderDailySales")
    Me.CmboName.AddItem rng.Value
    Next rng
   Case "Bitters"
    CmboName.Clear
    Set rng = DailySales.Range("BittersDailySales")
    For Each rng In DailySales.Range("BittersDailySales")
    Me.CmboName.AddItem rng.Value
    Next rng
  Case "Brandy"
    CmboName.Clear
    Set rng = DailySales.Range("BrandyDailySales")
    For Each rng In DailySales.Range("BrandyDailySales")
    Me.CmboName.AddItem rng.Value
    Next rng
  Case "Whiskey"
    CmboName.Clear
    Set rng = DailySales.Range("WhiskeyDailySales")
    For Each rng In DailySales.Range("WhiskeyDailySales")
    Me.CmboName.AddItem rng.Value
    Next rng
End Select
End Sub