Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel Can';t添加数据验证后的传输列表框值_Excel_Vba_Validation_Listbox - Fatal编程技术网

Excel Can';t添加数据验证后的传输列表框值

Excel Can';t添加数据验证后的传输列表框值,excel,vba,validation,listbox,Excel,Vba,Validation,Listbox,我有一个功能齐全的用户表单,在点击“提交”按钮时将值传输到工作表。当数据验证应用于所有文本框(出现一个消息框要求输入一个值)并且列表框上没有数据验证时,这种方法工作得很好 但是,由于为列表框添加了数据验证(请参见下面的代码),“提交”按钮仅传输表单生成器中的预选值,而不是所选值。例如,如果默认情况下未选择任何内容,则我进行选择,它将传输一个空单元格。如果默认情况下选择了“Alex”,并且在表单打开后我选择了“Hannah”,则表单将传输“Alex” 有人知道为什么列表框中的选定项没有被选中吗?所

我有一个功能齐全的用户表单,在点击“提交”按钮时将值传输到工作表。当数据验证应用于所有文本框(出现一个消息框要求输入一个值)并且列表框上没有数据验证时,这种方法工作得很好

但是,由于为列表框添加了数据验证(请参见下面的代码),“提交”按钮仅传输表单生成器中的预选值,而不是所选值。例如,如果默认情况下未选择任何内容,则我进行选择,它将传输一个空单元格。如果默认情况下选择了“Alex”,并且在表单打开后我选择了“Hannah”,则表单将传输“Alex”

有人知道为什么列表框中的选定项没有被选中吗?所有其他值都可以正常传输(我还有大约10个没有问题的文本框)。这是数据验证的问题吗

我的代码如下所示:

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似乎是一个无休止的故障排除领域。谢谢你的帮助:)