2017-02-25 4 views
0

Ich habe zwei "Combo-Boxen" und eine "Txtbox" in meinem Benutzerformular, In Arbeitsmappe "Blatt1" habe ich Namen in Spalte A und Monat in Spalte B und Spalten C bis N sind Jan. bis Dezember, diefüllen Sie eine Textbox basierend auf 2 Comboboxen

-cboName 
-cboMonth 
-txtHours 
verwenden Code unten

I txtHours für jeden Namen/bestimmten Monat Produktionsstunden enthalten

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 

aber unabhängig von Monat Auswahl auf cboMonth wird TXTPRODUCT bevölkert mit Spalte 3 cuz diese zu füllen Linie

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

Bitte helfen Sie mir Dank

Antwort

2

Sie einige Probleme hatte:

  • Ihre Case Aussagen wurden überprüft den Wert der String-Variable Month gegen undefinierte Variablen wie Jan, Feb usw. Dies sollte haben gegen String-Literale wie "Jan", "Feb" usw. gecheckt
  • In Ihrem GetMonthNum Unterprogramm, Sie w Zuweisen eines Werts zu einer undefinierten Variablen Col.
  • In Ihrer cboName_Change Unterroutine verwendeten Sie eine Variable Col, die nie einen Wert zugewiesen hatte, also hätte es den Standardwert von Null.

Sie hatte auch einige kleinere Probleme, die Ihren Code hätte nicht aufgehört zu arbeiten, aber zu Problemen auf der Spur führen könnte:

  • Sie mehrere Variablennamen verwendet (, Month), die sind die gleichen wie in Funktionen/Eigenschaften in VBA eingebaut. Dies ist normalerweise eine sehr schlechte Idee.
  • Sie haben als Variant deklariert, obwohl Col als Integer deklariert wurde.
  • Es ist eine gute Idee, Zeilen- und Spaltenvariablen zu definieren Long anstatt Integer zu sein - die maximale Anzahl von Zeilen in Excel ist jetzt 1048576, aber ein Integer kann nur Zahlen halten bis zu 65536.

Es ist Es ist auch eine gute Idee, immer die Option Explicit-Anweisung als erste Zeile jedes Ihrer Codemodule anzugeben. Dies weist den Compiler an, zu überprüfen, dass alle Ihre Variablen deklariert wurden, und verhindert so viele Tippfehler und Versuche, Variablen in einer Subroutine zu verwenden, die lokal für eine andere Subroutine sind.

Ich habe Ihren Code überarbeitet und hoffentlich sollte es jetzt funktionieren.

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

Danke @ YowE3K, Sie lehrte und half mir sogar mehr als ich fragte, klingt nett. Bitte vergib mir meine Unhöflichkeit, wenn ich deinen Tippfehler erwähne. Der zweite End-Sub sollte sich in End-Funktion ändern – Mansour

+0

@Mansour - Fehler korrigiert. (Und ich halte es definitiv nicht für unhöflich, auf eine Ungenauigkeit hinzuweisen! Vielen Dank.) – YowE3K

0

Sie könnten einige von Excel Date & Time integrierten Funktionen, nutzen Sie Ihre gesamte Private Sub GetMonthNum(Month As String) mit 1 Zeile Code unten zu ersetzen:

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

Erklärung: da Ihr cboMonth Combo-Box hat Monatszeichenfolgen im Monatsformat mmm. Wenn Sie "Feb" auswählen, erhalten Sie in diesem Abschnitt ("1/" & Me.cboMonth.Text & "/2017") "1/Feb/2017".

Wenn DateValue vor der Zugabe, erhalten Sie 1/Feb/2017, und wenn vor der Month Zugabe, das Ergebnis ist .

+0

@Mansour hast du meine Antwort hier gelesen, wie du deinen Code kürzen kannst? –

+0

Ja, ich habe es überprüft, es ist wunderbar, dass dein Code viel kürzer und einfacher ist. Aber es gibt nur einen Punkt, funktioniert dieser Code mit anderen Kalendern als Gregorian? Ich benutze persischen Kalender (solar based Kalender mit Persisch oder Farsi Monat Namen) und ich bin in der Lage, @ YowE Code zu meinem Kalender anzupassen. Wenn ich Gregorian Kalender verwende ich sicherlich Ihren fantastischen Code. – Mansour

+0

@Mansour habe es nicht versucht, versuchen und sehen. Lassen Sie mich wissen, ich bin neugierig, ob es tut –

Verwandte Themen