我对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
答案 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
例如:
修改#1 强>
我创建了一个名为 Demo 的UserForm,其中包含一个名为 MyBox 的组合框
在标准模块中,我把:
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()会产生:
答案 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表上显示标题行。