2017-02-25 14 views
0

私はuserformに2つの "コンボボックス"と1つの "txtbox"を持っています。ブック "sheet1"にはA列に名前があり、B列には月があります。 12月に私はtxtHours2つのコンボボックスに基づいてテキストボックスにデータを入力

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このcuzのコラム3が移入され

​​

特定の月/それぞれの名前のための生産時間が含まれていますライン

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

あなたはいくつかの問題だった私に 感謝

答えて

2

を助けてください:あなたのCase文はこれがすべきなどなどJanとして未定義の変数、Feb、反対Month String変数の値をチェックして

  • "Jan""Feb"などの文字列リテラルをチェックしています。
  • GetMonthNumサブルーチンでは、未定義の変数Colに値を代入してください。
  • cboName_Changeサブルーチンでは、値が一度も割り当てられていない変数Colを使用していたため、デフォルト値は0でした。

ます。また、作業からあなたのコードを停止していないだろうが、トラックダウンの問題につながる可能性があるいくつかのマイナーな問題、持っていた:

  • あなたは、いくつかの変数名(、Month)を使用していますVBA内の組み込み関数/プロパティと同じです。これは通常非常に悪い考えです。
  • ColIntegerと指定していますが、はVariantと宣言しました。
  • それは、LongいうよりIntegerように、行と列変数を定義することをお勧めします - Excelの最大行数は現在1048576ですが、Integerは65536

までの数字を保持できることがありますOption Explicitステートメントを各コードモジュールの最初の行に常に含めることをお勧めします。これは、すべての変数が宣言されていることをコンパイラに確認させるため、多くのタイプミスや、別のサブルーチンのローカルな1つのサブルーチンで変数を使用することを防ぎます。

私はあなたのコードをリファクタリングしており、うまくいけばうまくいくはずです。

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、あなたは教えて、私が尋ねた以上に私を助けた、いいね。あなたのミスタイプに言及して私の無礼を許してください。第2のエンドサブは終了機能に変更する必要があります – Mansour

+0

@マンツー - 間違いが修正されました。 (そして、間違いを指摘するのは失礼だとは思っていません!ありがとうございます。) – YowE3K

0

あなたは以下のコードの1行でPrivate Sub GetMonthNum(Month As String)あなたの全体を交換するために、ExcelのDate & Time内蔵された機能の一部を使用することができます:

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

@マンサウは試してみたことがありません。私にそれがすれば私が好奇心を持っていることを知らせてください –

関連する問題