Excel Can';t添加数据验证后的传输列表框值
我有一个功能齐全的用户表单,在点击“提交”按钮时将值传输到工作表。当数据验证应用于所有文本框(出现一个消息框要求输入一个值)并且列表框上没有数据验证时,这种方法工作得很好 但是,由于为列表框添加了数据验证(请参见下面的代码),“提交”按钮仅传输表单生成器中的预选值,而不是所选值。例如,如果默认情况下未选择任何内容,则我进行选择,它将传输一个空单元格。如果默认情况下选择了“Alex”,并且在表单打开后我选择了“Hannah”,则表单将传输“Alex” 有人知道为什么列表框中的选定项没有被选中吗?所有其他值都可以正常传输(我还有大约10个没有问题的文本框)。这是数据验证的问题吗 我的代码如下所示:Excel Can';t添加数据验证后的传输列表框值,excel,vba,validation,listbox,Excel,Vba,Validation,Listbox,我有一个功能齐全的用户表单,在点击“提交”按钮时将值传输到工作表。当数据验证应用于所有文本框(出现一个消息框要求输入一个值)并且列表框上没有数据验证时,这种方法工作得很好 但是,由于为列表框添加了数据验证(请参见下面的代码),“提交”按钮仅传输表单生成器中的预选值,而不是所选值。例如,如果默认情况下未选择任何内容,则我进行选择,它将传输一个空单元格。如果默认情况下选择了“Alex”,并且在表单打开后我选择了“Hannah”,则表单将传输“Alex” 有人知道为什么列表框中的选定项没有被选中吗?所
Private Sub cbSubmit_Click()
'Name Selection Data Validation
If Not IsAnythingSelected(lbName) Then
MsgBox "Please select your name"
Exit Sub
End If
Unload Me
'Begin Transfer Information and Change Workbook
Dim nwb As Workbook
Set nwb = Workbooks.Open("G:\Test Dataset.xlsx")
'Determine emptyRow
Dim emptyRow As Long
emptyRow = WorksheetFunction.CountA(nwb.Sheets("daily_tracking_dataset").Range("A:A")) + 1
'Transfer Information
With nwb.Sheets("daily_tracking_dataset")
'Date
.Cells(emptyRow, 1).Value = CDate(txtDate.Text)
'Name
.Cells(emptyRow, 2).Value = lbName.Value
'Reference Checkss
.Cells(emptyRow, 3).Value = txtROT.Value
.Cells(emptyRow, 4).Value = txtROP.Value
End With
ActiveWorkbook.Save
ActiveWindow.Close
UserForm1.Hide
ActiveWindow.Close
End Sub
使用以下功能确定是否选择了列表框中的项目:
'Function to loop through Name list box and find a selection
Function IsAnythingSelected(lbName As Control) As Boolean
Dim i As Long
Dim selected As Boolean
selected = False
For i = 1 To lbName.ListCount
If lbName.selected(i) Then
selected = True
Exit For
End If
Next i
IsAnythingSelected = selected
End Function
End If
列表框索引从0开始,而不是从1开始。因此,请在函数中使用此选项:
For i = 0 To lbName.ListCount - 1
If lbName.selected(i) Then
selected = True
Exit For
End If
Next I
Edit1:尝试替换此行:
.Cells(emptyRow, 2).Value = lbName.Value
为此:
.Cells(emptyRow, 2).Value = lbName.List(lbname.ListIndex)
刚试过,但似乎没有影响。表单仍然提交一个空值(或者如果我在VBA中预选了一个名称,它会显示该值)。啊,糟糕,你只是在使用该函数检查是否选择了某个内容。但您应该将其更新为该值,因为如果选择第一项,您将错过选择。它也会使下标超出范围。顺便说一句,请参阅我的编辑以了解问题的可能来源。非常感谢。现在好像很好用!和往常一样,VBA似乎是一个无休止的故障排除领域。谢谢你的帮助:)