Excel 如何将窗体中的选择传递给VBA中的变量

Excel 如何将窗体中的选择传递给VBA中的变量,excel,vba,Excel,Vba,我在以下活动中遇到了一些问题:我需要将5个不同的驱动程序(STIMA、STIMA_SEDE、LOTTO、STORICO、UNIFORME)的选择以表格形式传递到VBA中的变量,并在工作表中搜索相应的列 到目前为止,我尝试了两种方法,不幸的是没有结果: 第一种方式: Private Sub UserForm_Initialize() Dim rngDriver As Range Dim ws As Worksheet Set ws = Worksheets("Data validat

我在以下活动中遇到了一些问题:我需要将5个不同的驱动程序(STIMA、STIMA_SEDE、LOTTO、STORICO、UNIFORME)的选择以表格形式传递到VBA中的变量,并在工作表中搜索相应的列

到目前为止,我尝试了两种方法,不幸的是没有结果:

第一种方式:

    Private Sub UserForm_Initialize()

Dim rngDriver  As Range
Dim ws As Worksheet

Set ws = Worksheets("Data validation")

For Each rngDriver In ws.Range("Drivers")
    Me.cbDriver.AddItem rngDriver.Value
Next rngDriver

End Sub

Private Sub OKbtn_Click()
Dim destValues() As Variant, driverValues() As Variant, totalDriver As Double
    Dim totalValue As Double, offsetDriverCol As Integer, deltaPerc() As Double
    Dim i As Long, j As Long, k As Long, decimalPart As Double, driverRange As Range
    Dim driverCol As Integer, modCol As Integer, DestRange As Range
...
 driverCol = 2
    Do While Cells(23, driverCol).Value <> frmDistribuisci.cbDriver.Value
        driverCol = driverCol + 1
    Loop
...
If frmDistribuisci.cbDriver.Value Is LOTTO Then
        driverCol = 2
        Do While Cells(23, driverCol).Value <> "Lotto"
            driverCol = driverCol + 1
        Loop
        End If
        'Identificazione colonna driver Stima
        If frmDistribuisci.cbDriver.Value Is STIMA Then
        driverCol = 2
        Do While Cells(23, driverCol).Value <> "Stima"
            driverCol = driverCol + 1
        Loop
        End If
        'Identificazione colonna driver Stima da sede
        If frmDistribuisci.cbDriver.Value Is STIMA_SEDE Then
        driverCol = 2
        Do While Cells(23, driverCol).Value <> "Stima da sede"
            driverCol = driverCol + 1
        Loop
        End If
        'Identificazione colonna driver Storico
        If frmDistribuisci.cbDriver.Value Is STORICO Then
        driverCol = 2
        Do While Cells(23, driverCol).Value <> "Storico"
            driverCol = driverCol + 1
        Loop
        End If
Private子用户表单_Initialize()
Dim Rngdas河山脉
将ws设置为工作表
设置ws=工作表(“数据验证”)
对于ws.范围内的每个rngDriver(“驱动程序”)
Me.cbDriver.AddItem rngDriver.Value
下一条河
端接头
私有子系统OKbtn_单击()
Dim destValues()作为变量,driverValues()作为变量,totalDriver作为双精度
Dim totalValue为双精度,offsetDriverCol为整数,deltaPerc()为双精度
Dim i为长,j为长,k为长,decimalPart为双精度,driverRange为射程
Dim driverCol为整数,modCol为整数,DestRange为范围
...
driverCol=2
执行While单元格(23,driverCol)。值frmDistribuisci.cbDriver.Value
driverCol=driverCol+1
环
第二种方式:

    Private Sub UserForm_Initialize()

Dim rngDriver  As Range
Dim ws As Worksheet

Set ws = Worksheets("Data validation")

For Each rngDriver In ws.Range("Drivers")
    Me.cbDriver.AddItem rngDriver.Value
Next rngDriver

End Sub

Private Sub OKbtn_Click()
Dim destValues() As Variant, driverValues() As Variant, totalDriver As Double
    Dim totalValue As Double, offsetDriverCol As Integer, deltaPerc() As Double
    Dim i As Long, j As Long, k As Long, decimalPart As Double, driverRange As Range
    Dim driverCol As Integer, modCol As Integer, DestRange As Range
...
 driverCol = 2
    Do While Cells(23, driverCol).Value <> frmDistribuisci.cbDriver.Value
        driverCol = driverCol + 1
    Loop
...
If frmDistribuisci.cbDriver.Value Is LOTTO Then
        driverCol = 2
        Do While Cells(23, driverCol).Value <> "Lotto"
            driverCol = driverCol + 1
        Loop
        End If
        'Identificazione colonna driver Stima
        If frmDistribuisci.cbDriver.Value Is STIMA Then
        driverCol = 2
        Do While Cells(23, driverCol).Value <> "Stima"
            driverCol = driverCol + 1
        Loop
        End If
        'Identificazione colonna driver Stima da sede
        If frmDistribuisci.cbDriver.Value Is STIMA_SEDE Then
        driverCol = 2
        Do While Cells(23, driverCol).Value <> "Stima da sede"
            driverCol = driverCol + 1
        Loop
        End If
        'Identificazione colonna driver Storico
        If frmDistribuisci.cbDriver.Value Is STORICO Then
        driverCol = 2
        Do While Cells(23, driverCol).Value <> "Storico"
            driverCol = driverCol + 1
        Loop
        End If
。。。
如果frmDistribuisci.cbDriver.Value为乐透,则
driverCol=2
Do While单元格(23,driverCol)。值“乐透”
driverCol=driverCol+1
环
如果结束
“识别colonna司机Stima
如果frmDistribuisci.CBDRIVE.Value为STIMA,则
driverCol=2
执行While单元格(23,driverCol)。值为“Stima”
driverCol=driverCol+1
环
如果结束
“识别colonna的司机Stima da sede
如果frmDistribuisci.cbDriver.Value为STIMA\u SEDE,则
driverCol=2
执行While单元格(23,driverCol)。值为“Stima da sede”
driverCol=driverCol+1
环
如果结束
“识别colonna司机Storico
如果frmDistribuisci.CBDRIVE.Value为STORICO,则
driverCol=2
执行While单元格(23,driverCol)。值为“Storico”
driverCol=driverCol+1
环
如果结束
调试这段代码似乎跳过了If步骤以及第一个解决方案,所以我被卡住了


有人知道怎么做吗?非常感谢,提前感谢

这对于值比较来说是无效的语法:

If frmDistribuisci.cbDriver.Value Is LOTTO Then
它应该是
如果…=…那么
乐透
被视为一个类型/类(因为
操作符,它完全用于其他内容),而不是预期的字符串。字符串文字必须用双引号分隔:

If frmDistribuisci.cbDriver.Value = "LOTTO" Then

这应该可以正常工作。

您的
If
语句的语法应该采用
If…=…Then
格式,如
If frmDistribuisci.cbDriver.Value=“LOTTO”然后
否则它假定
LOTTO
是一个变量而不是字符串。如果你没有找到你要找的值,你的
Do
循环将从工作表中消失。该死,就是这么简单!谢谢你,Pᴇʜ!@CloseAsTypo投票者:这不仅仅是一个打字错误,这是对语言基础的一个重大误解,下面给出了充分的回答。这段代码甚至可以运行,这意味着OP没有启用“require variable declaration”设置,并且缺少
选项Explicit
。这很可能隐藏了更多的bug。@MathieuGuindon是的,很有道理。我忘了建议激活
选项显式
:在VBA编辑器中,转到工具›选项›。