我的用户表单中有两个“组合框”和一个“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)
请帮帮我 感谢
答案 0 :(得分:2)
你有几个问题:
Case
语句正在检查字符串变量Month
对未定义变量的值,例如Jan
,Feb
等。这应该是针对字符串文字进行检查例如"Jan"
,"Feb"
等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
答案 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 。