2017-02-25 68 views
0

我的用戶窗體中有兩個「組合框」和一個「txtbox」。在工作簿「工作表1」中,列B的列A和月份的名稱爲C,而列C的列N爲Jan。到/特定月份十二月含有生產時間對於每個名稱根據2個組合框填充文本框

​​

我使用以下代碼來填充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列的Cuz這line

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

請幫我 感謝

回答

2

你有幾個問題:

  • Case發了檢查字符串變量Month對不確定的變量,如JanFeb價值等,這應該一直在檢查字符串文字,如"Jan","Feb"
  • 在您的GetMonthNum子例程中,您w給一個未定義的變量Col分配一個值。
  • 在您的cboName_Change子例程中,您使用的是從未分配過值的變量Col,所以它的默認值爲零。

也有一些小問題,這不會從工作停止你的代碼,但可能會導致走下賽場的問題:

  • 您使用的幾個變量名(,Month),這與VBA中的函數/屬性內置相同。這通常是一個非常糟糕的主意。
  • 您宣稱爲Variant,儘管宣稱ColInteger
  • 這是一個好主意來定義行和列的變量是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 
+0

謝謝@YowE3K,你教我,甚至比我問的還多,聽起來不錯。請原諒我的無禮提到你的錯誤類型第二個結束小組應該改變結束功能 – Mansour

+0

@Mansour - 現在糾正錯誤。 (我絕對不會認爲這是粗魯的指出一個不準確的地方!非常感謝。) – YowE3K

0

你可以使用一些Excel的Date & Time內置功能,與1號線的下面的代碼替換整個Private Sub GetMonthNum(Month As String)

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

說明:因爲你的cboMonth組合框有月份字符串採用mmm月份格式。如果你選擇「Feb」,那麼當你到達("1/" & Me.cboMonth.Text & "/2017")這個部分時,你會得到「1/Feb/2017」。

當前加入DateValue,你1/Feb/2017,和之前添加Month時,結果是。

+0

@Mansour你有沒有在這裏看過我的答案,如何縮短你的代碼? –

+0

是的,我查過了,這很棒,你的代碼更短,更容易。但是,只有一點,這個代碼是否適用於格里高利以外的日曆?我使用波斯日曆(波斯語或波斯語月名稱的太陽能日曆),我可以將@YowE代碼適用於我的日曆。如果我使用公曆日曆,我當然會使用您的奇妙代碼。 – Mansour

+0

@Mansour還沒試過,試試看。讓我知道,我很好奇,如果它 –