根据2个组合框填充文本框

时间:2017-02-25 19:58:23

标签: excel-vba userform vba excel

我的用户表单中有两个“组合框”和一个“txtbox”,在工作簿“sheet1”中,我在B列的A列和月份上有名称,C到N列的列表是1月到12月,其中包含生产小时对于每个名称/特定月份

-cboName
-cboMonth
-txtHours

我使用下面的代码来填充txtHours

Private Sub cboName_Change()
    Dim EName As String
    Dim Row, Col As Integer
    EName = Me.cboName.Text        
    If EName <> "" Then
        With Application.WorksheetFunction
           Row = .Match(EName, Sheets("sheet1").Range("A2:A100"), 0)  
           GetMonthNum (Me.cboMonth.Text)
           txtShiftHours.Value = Sheets("sheet1").Cells(Row + 1, Col + 3)
        End With
    End If
End Sub

Private Sub GetMonthNum(Month As String)

    Select Case Month
        Case Jan
            Col = 3
        Case Feb
            Col = 4
        Case Mar
            Col = 5
        Case Apr
            Col = 6
        Case May
            Col = 7
        Case June
            Col = 8
        Case July
            Col = 9
        Case Aug
            Col = 10
        Case Sept
            Col = 11
        Case Oct
            Col = 12
        Case Nov
            Col = 13
        Case Dec
            Col = 14
        End Select
        End Sub

但无论cboMonth上的月份选择如何,txtProduct都填充了第3列,因为这行

txtShiftHours.Value = Sheets("sheet1").Cells(Row + 1, Col + 3)

请帮帮我 感谢

2 个答案:

答案 0 :(得分:2)

你有几个问题:

  • 您的Case语句正在检查字符串变量Month对未定义变量的值,例如JanFeb等。这应该是针对字符串文字进行检查例如"Jan""Feb"
  • GetMonthNum子例程中,您为未定义的变量Col分配了一个值。
  • 在您的cboName_Change子例程中,您使用的是从未赋值的变量Col,因此它的默认值为零。

您还遇到了一些小问题,这些问题不会阻止您的代码工作,但可能会导致问题:

  • 您使用了多个变量名称(RowMonth),它们与VBA中的内置函数/属性相同。这通常是一个非常糟糕的主意。
  • 您将Row声明为Variant,尽管将Col声明为Integer
  • 将行和列变量定义为Long而不是Integer是个好主意 - Excel中的最大行数现在为1048576,但Integer只能保存数字高达65536。

始终将Option Explicit语句作为每个代码模块的第一行包含在内也是一个好主意。这告诉编译器检查是否已声明所有变量,从而防止许多拼写错误,并尝试在一个子例程中使用变量,这些子例程是另一个子例程的本地变量。

我已经重构了你的代码,希望它现在可以正常工作。

Option Explicit

Private Sub cboName_Change()
    Dim EName As String
    Dim RowNum As Long, ColNum As Long
    EName = Me.cboName.Text        
    If EName <> "" Then
        With Application.WorksheetFunction
           RowNum = .Match(EName, Sheets("sheet1").Range("A2:A100"), 0)  
           ColNum = GetMonthNum(Me.cboMonth.Text) + 2
           txtShiftHours.Value = Sheets("sheet1").Cells(RowNum + 1, ColNum)
        End With
    End If
End Sub

Private Function GetMonthNum(Mth As String) As Long
    Select Case Mth
        Case "Jan":  GetMonthNum = 1
        Case "Feb":  GetMonthNum = 2
        Case "Mar":  GetMonthNum = 3
        Case "Apr":  GetMonthNum = 4
        Case "May":  GetMonthNum = 5
        Case "June": GetMonthNum = 6
        Case "July": GetMonthNum = 7
        Case "Aug":  GetMonthNum = 8
        Case "Sept": GetMonthNum = 9
        Case "Oct":  GetMonthNum = 10
        Case "Nov":  GetMonthNum = 11
        Case "Dec":  GetMonthNum = 12
    End Select
End Function

答案 1 :(得分:0)

您可以使用Excel的Date & Time内置函数,用以下1行代码替换整个Private Sub GetMonthNum(Month As String)

ColNum = Month(DateValue("1/" & Me.cboMonth.Text & "/2017")) + 2

解释:由于您的cboMonth组合框具有mmm月份格式的月份字符串。如果您选择“二月”,那么当您到达此部分("1/" & Me.cboMonth.Text & "/2017")时,您将收到“2017年2月1日”。

之前添加DateValue时,您会获得1/Feb/2017,而之前添加Month时,结果为 2