如何填充组合框

时间:2015-04-10 15:59:10

标签: excel vba combobox

我对VBA很陌生,而且我一直在努力填充组合框。 我试图用电子表格中第一列的内容填充组合框,这样我就可以根据组合框选择删除相关的数据行。

在提出这个问题时,我已经在这里和其他地方查看了几个问题,但我还没有找到任何有效的方法。

以下是我尝试过的代码。我有点失落,因为我一直在努力拼凑其他问题的不同答案,以便让它发挥作用,但无济于事。我希望组合框填充第1列的值,但它仍然是空白的。

尝试#1这涉及创建动态范围:

=OFFSET(PC_DataSheet!$A$2,0,0, COUNTA(PC_DataSheet!$A$1:$A$65536)-1,1)
Private Sub UserForm1_Initialize()

    Dim rngPCNumber As Range
    Dim ws As Worksheet

    Set ws = Worksheets("Sheet1")

    For Each rngPCNumber In ws.Range("PCNumber")
        Me.PC_ListComboBox.AddItem rngPCNumber.Value
    Next rngPCNumber

End Sub

尝试#2

Private Sub UserForm1_Initialize()

    Dim arr() As Variant

    arr = Worksheets("Sheet1").Range("C2:" & lrow).Value
    PC_ListComboBox.List = arr

End Sub

尝试#3

Private Sub UserForm1_Initialize()

    Dim vArr As Variant
    Dim i As Integer

    vArr = Sheet1.Range("A:1").Value

    With PC_ListComboBox.Clear
         For i = LBound(vArr) To UBound(vArr)
            .AddItem vArr(i)
         Next i
    End With

End Sub

对此的任何帮助都会非常感激!


编辑:我已尝试将 Gary的学生建议的代码插入我的UserForm_Initialize()Sub,但当我尝试打开userform我收到以下错误消息:

  

运行时错误' 9':下标超出范围

当我点击调试时,会突出显示以下代码:

'Opens PC UserForm when pressed.
Private Sub AddPCButton_Click()

    UserForm.Show 'This line is the line highlighted by the debugger.

End Sub

我不知道造成这种情况的原因......当我使用建议的代码时,我收到一条错误消息,但是当我删除代码时,userform功能完美无瑕。 这里有Private Sub UserForm_Initialize(),包含和不包含建议的代码。

'Clears and Initializes the form when first loaded.
Private Sub UserForm_Initialize()

    'Empties combo boxes.
    PC_OSTypeComboBox = ""
    PC_HDTypeComboBox = ""

    'Populates combo boxes.
    With PC_OSTypeComboBox
        .Clear
        .AddItem "Windows 8"
        .AddItem "Windows 7"
        .AddItem "Windows Vista"
        .AddItem "Windows XP"
        .AddItem "Windows 2000"
        .AddItem "Windows 98"
        .AddItem "Windows NT"
        .AddItem "Windows 95"
    End With
    With PC_HDTypeComboBox
        .Clear
        .AddItem "SATA"
        .AddItem "IDE"
        .AddItem "SCSI"
    End With

End Sub

这包括建议的代码:

'Clears and Initializes the form when first loaded.
Private Sub UserForm_Initialize()

    Dim N As Long, i As Long
    With Sheets("Sheet1")
        N = .Cells(Rows.Count, 1).End(xlUp).Row
    End With

    With PC_NumberComboBox
        .Clear
        For i = 1 To N
            .AddItem Sheets("Sheet1").Cells(i, 1).Value
        Next i
    End With

    'Empties combo boxes.
    PC_OSTypeComboBox = ""
    PC_HDTypeComboBox = ""

    'Populates combo boxes.
    With PC_OSTypeComboBox
        .Clear
        .AddItem "Windows 8"
        .AddItem "Windows 7"
        .AddItem "Windows Vista"
        .AddItem "Windows XP"
        .AddItem "Windows 2000"
        .AddItem "Windows 98"
        .AddItem "Windows NT"
        .AddItem "Windows 95"
    End With
    With PC_HDTypeComboBox
        .Clear
        .AddItem "SATA"
        .AddItem "IDE"
        .AddItem "SCSI"
    End With

End Sub

3 个答案:

答案 0 :(得分:5)

以下是创建和填充 Forms 样式组合框的一个非常简单的示例:

Sub FormsStyleComboBox()
    ActiveSheet.DropDowns.Add(411, 14.25, 124.5, 188.25).Select
    N = Cells(Rows.Count, "A").End(xlUp).Row
    strng = Range("A1:A" & N).Address
    Selection.ListFillRange = strng
End Sub

例如:

enter image description here

修改#1

我创建了一个名为 Demo 的UserForm,其中包含一个名为 MyBox 的组合框

enter image description here

标准模块中,我把:

Sub DisplayIt()
    Demo.Show
End Sub

并在 UserForm代码区

Private Sub UserForm_Initialize()
    Dim N As Long, i As Long
    With Sheets("Sheet1")
        N = .Cells(Rows.Count, 1).End(xlUp).Row
    End With

    With MyBox
        .Clear
        For i = 1 To N
            .AddItem Sheets("Sheet1").Cells(i, 1).Value
        Next i
    End With
End Sub

运行 DisplayIt()会产生:

enter image description here

这基于this tutorial

答案 1 :(得分:0)

所以我尝试了Gary的学生建议的解决方案,当我使用他提供的代码创建一个新工作簿时,该解决方案有效,但出于某种原因,'下标超出范围'错误时,我仍然会出现错误在我的项目中实现它,无论我在工作簿中重命名我的工作表,包括设置一个子列表以列出所有工作表并从那里调用工作表。

我选择使用输入框而不是组合框,最终使代码变得更加直接。以下是任何好奇的人的代码。

Private Sub DeletePCButton_Click()

'Assigns variables for delete sequence.
Dim PCNumberEntry As String
Dim Confirm As Integer
Dim r As Range
Dim c As Range
Dim cellsToDelete As Range
Dim m As Integer

'Asks for PC entry to be deleted.
PCNumberEntry = InputBox("Enter the number of the PC you wish to remove:", "Delete PC Entry", "PC 1", vbOKCancel)

'Closes inputbox when cancel is pressed.
If PCNumberEntry = "" Then
    Exit Sub
End If

'Searches worksheet column "A" and finds any existing PC entries.
Set r = Sheet1.Range("A:A")
For Each c In r

    'Checks for matching entry in worksheet to begin delete sequence.
    If (c.Value) = PCNumberEntry Then
        m = True

        'Asks for confirmation from user before deleting entry.
        Confirm = MsgBox("Warning! Once deleted, an entry cannot be restored! Only proceed if you are sure you wish to delete a row.", vbYesNo Or vbExclamation)

        'Cancels delete operation when "No" button is pressed.
        If Confirm = vbNo Then
            Exit Sub
        End If

        'Deletes entry and informs user of successful operation.
        If cellsToDelete Is Nothing Then
            Set cellsToDelete = c
            Call cellsToDelete.EntireRow.delete
            MsgBox ("The entry was deleted.")
        End If

    End If

Next c

    'Displays error message if no matching entry is found.
    If m = False Then
        MsgBox ("No entry with that number was found!")
    End If

On Error Resume Next

End Sub

答案 2 :(得分:0)

Private Sub UserForm_Initialize()

    Dim CS As Integer
    Dim CR As Integer
    Dim RF As Integer
    Dim PW As Integer
    Dim CD As Integer

        CS = ActiveWorkbook.Sheets("LISTS").Columns(2).End(xlDown).Row      
        CR = ActiveWorkbook.Sheets("LISTS").Columns(3).End(xlDown).Row      
        RF = ActiveWorkbook.Sheets("LISTS").Columns(4).End(xlDown).Row      
        PW = ActiveWorkbook.Sheets("LISTS").Columns(5).End(xlDown).Row      
        CD = ActiveWorkbook.Sheets("LISTS").Columns(6).End(xlDown).Row      

    With CB_CS
        .Clear
        For i = 2 To CS + 1
            .AddItem ActiveWorkbook.Sheets("LISTS").Cells(i, 2).Value
        Next i
    End With

    With CB_CR
        .Clear
        For i = 2 To CR + 1
            .AddItem ActiveWorkbook.Sheets("LISTS").Cells(i, 3).Value
        Next i
    End With

    With CB_RF
        .Clear
        For i = 2 To RF + 1
            .AddItem ActiveWorkbook.Sheets("LISTS").Cells(i, 4).Value
        Next i
    End With

    With CB_PW
        .Clear
        For i = 2 To PW + 1
            .AddItem ActiveWorkbook.Sheets("LISTS").Cells(i, 5).Value
        Next i
    End With

    With CB_CD
        .Clear
        For i = 2 To CD + 1
            .AddItem ActiveWorkbook.Sheets("LISTS").Cells(i, 6).Value
        Next i
    End With
End Sub

上面的代码位于我的UserForm代码中(右键单击UserForm,然后单击“查看代码'”

我创建了一个工作表调用LISTS。该表上的每列都用于不同的组合框。一旦我填写并使代码工作,我就隐藏了LISTS工作表。

每个ComboBox我都命名为CB_XX,所以请注意代码中的这些名称

我通过定义列表的长度来启动代码(请注意,如果列表中只有一个项目,但如果您只有一个项目不使用组合框,则会失败)

获得长度后,我将正确的列添加到正确的组合框中。注意每个for / next循环中的+1。也就是在每个列表的末尾添加一个空白以允许用户清空选择。如果您不想要那个空白,请删除+1。我从i = 2开始,不在我的LISTS表上显示标题行。