【问题标题】:populate a textbox based on 2 comboboxes根据 2 个组合框填充文本框
【发布时间】:2017-02-27 02:17:37
【问题描述】:

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

-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)

请帮帮我 谢谢

【问题讨论】:

    标签: excel userform vba


    【解决方案1】:

    你有几个问题:

    • 您的Case 语句正在检查字符串变量Month 与未定义变量(例如Jan、Feb 等)的值。这应该检查字符串文字(例如"Jan"、@987654326) @等
    • 在您的 GetMonthNum 子例程中,您为未定义的变量 Col 赋值。
    • 在您的 cboName_Change 子例程中,您使用的变量 Col 从未被赋值,因此它的默认值为零。

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

    • 您使用了几个变量名称(Row、Month),它们与 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
    

    【讨论】:

    • 谢谢你@YowE3K,你教我和帮助我的比我问的还要多,听起来不错。请原谅我提到您的错误输入的粗鲁第二个 End Sub 应该更改为 End 功能
    • @Mansour - 错误现已更正。 (而且我绝对不认为指出不准确之处是不礼貌的!非常感谢。)
    【解决方案2】:

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

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

    说明:因为您的cboMonth Combo-Box 具有mmm 月份格式的月份字符串。如果您选择“Feb”,那么当您访问此部分 ("1/" &amp; Me.cboMonth.Text &amp; "/2017") 时,您将获得“1/Feb/2017”。

    前面加上DateValue,得到1/Feb/2017,前面加上Month,结果是2。

    【讨论】:

    • @Mansour 你在这里读过我关于如何缩短代码的答案吗?
    • 是的,我检查过了,你的代码更短更容易了,真是太好了。但是只有一点,此代码是否适用于公历以外的日历?我使用波斯历(带有波斯语或波斯语月份名称的基于太阳的日历),我能够将@YowE 代码调整到我的日历。如果我使用公历,我当然会使用你的精彩代码。
    • @Mansour 没试过,试试看。让我知道,我很好奇它是否有
    • 正如我所说,它适用于公历(如果我是对的),但我认为它不适用于其他日历。我希望我能解释清楚。目前,我在表单上使用您的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多