2016-07-08 12 views
0

Ich möchte allen danken, die sich im Voraus um mein Problem kümmern.Excel VBA - Textbox Eingabe optional

Wenn mein Code unten geschrieben nicht sehr effizient ist, beachten Sie bitte, dass ich gerade erst mit vba gestartet und nie Klassen hatte die Programmierung. Bitte verzeih mir auch mein Englisch. Bitte beachten Sie auch, dass ich sowohl Google als auch die interne Suche hier konsultiert habe.

kommend auf das Problem (e):

Userform visualization for understanding

(1) Ich habe ein combobx "CGselectionStrategies", die die Grundlage für die Eingabetextfelder unten sein sollte. Wenn das Benutzerformular gestartet wird, würde ich gerne die vorherige Eingabe für diese Felder anzeigen, abhängig von der Combobox-Auswahl.

Die Eingabe wird in dem Arbeitsblatt "Warengruppen" mit dem folgenden Code gespeichert:

Private Sub SaveCGStrategies_Click() 

'Just general stuff 
Dim outputBook As Workbook 
Set outputBook = ActiveWorkbook 

'Note-fields for PU Strategies, incl. Authors 
Dim CGselectionStrategies As String 
Dim NoteTargetMarket As String 
Dim AuthorTargetMarket As String 
Dim NotePUMStrategy As String 
Dim AuthorPUMStrategy As String 
Dim NotePUSStrategy As String 
Dim AuthorPUSStrategy As String 
Dim NotePULStrategy As String 
Dim AuthorPULStrategy As String 

CGselectionStrategies = Me.CGselectionStrategies 
NoteTargetMarket = Me.NoteTargetMarket 
AuthorTargetMarket = Me.NoteAuthorMarketInfo 
NotePUMStrategy = Me.NotePUMStrat 
AuthorPUMStrategy = Me.NoteAuthorPUMStratInfo 
NotePUSStrategy = Me.NotePUSStrat 
AuthorPUSStrategy = Me.NoteAuthorPUSStratInfo 
NotePULStrategy = Me.NotePULStrat 
AuthorPULStrategy = Me.NoteAuthorPULStratInfo 

'Save CG Strategies behind them in the List on CG Worksheet 
outputBook.Activate 
outputBook.Worksheets("Commodity Groups").Select 

With Me.CGselectionStrategies 
If Me.CGselectionStrategies.value = "Halbzeuge (und Rohstoffe)" Then 
    Range("K2").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Mechanische Konstruktionsteile" Then 
    Range("K62").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Norm- und Katalogteile (ausser Elektro)" Then 
    Range("K87").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Elektrische, elektronische und optische Komponenten und Baugruppen" Then 
    Range("K127").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Hilfs-, Betriebs- und Produktionshifsmittel" Then 
    Range("K180").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Subsysteme und Anlagen" Then 
    Range("K256").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Handelsware" Then 
    Range("K299").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Dienstleistungen" Then 
    Range("K310").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Allgemeines und Administration" Then 
    Range("K360").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
End With 

End Sub 

Mein Ansatz der folgenden ... wurde

'Show old Strategies when selecting a combobox-item 
'Start with short Text "Please choose a Commodity Group" 
If Me.CGselectionStrategies.value = "" Then 
    Me.NoteTargetMarket.Text = CStr(ThisWorkbook.Sheets("Commodity Groups").Range("K445").value) 
    Me.Next Variable 
    Me.Next Variable 
    Me.Next Variable 
End If 
If Me.CGselectionStrategies.value = "Halbzeuge (und Rohstoffe)" Then 
    Me.NoteTargetMarket.Text = CStr(ThisWorkbook.Sheets("Commodity Groups").Range("K2").value) 
    Me.Next Variable 
    Me.Next Variable 
    Me.Next Variable 
End If 

... und so weiter. Es ist unnötig zu sagen, dass es nicht funktioniert. Ich habe online folgendes gefunden und versucht, es so gut wie möglich anzupassen, aber ohne Erfolg.

Ein Problem war auch, dass es mehrere Eingabewerte gibt, nicht nur in Spalte 2, die auch durch viele andere Zeilen getrennt sind. Ich hoffe mein Problem wird verständlich erklärt.

(2) Mein zweites Problem, das viel kürzer ist, ist, wie man vermeidet, dass alle Textfelder in einem Benutzerformular ausgefüllt werden müssen. Die eine Frage hat mehr als 200 Eingaben auszufüllen und wann immer ich das testen möchte, d. H. Die Positionierung der Eingabe in der Datenbank, bekomme ich einen Laufzeitfehler 13 "Type Mismatch". Wenn ich jedoch eine Eingabe in jede Box einfüge, läuft sie reibungslos durch. Hier ist ein Codeauszug, wie ich meine Daten von der Userform Eingabe speichern:

Dim Datum As Date 
Dim SName As String 
Dim PotentialS As String 
Dim SuppNr As Long 
Dim Active As String 

Datum = Me.TextBox117 
SName = Me.SuppName 
PotentialS = Me.PotentialS 
SuppNr = Me.SuppNo 
Active = Me.Active 


'Go to the first empty line on the output sheet (Meta DB) in this workbook 
outputBook.Activate 
outputBook.Worksheets("Meta DB").Range("A3").Select 


If outputBook.Worksheets("Meta DB").Range("A3").Offset(1, 0) <> "" Then 
    outputBook.Worksheets("Meta DB").Range("A3").End(xlDown).Select 
End If 


'Go to A4 and from there always one below the last filled cell in A 
ActiveCell.Offset(1, 0).Select 
DatabaseRow = ActiveCell.row 


'Post Values for new Entry 
'Add a New Supplier Tab - Supplier Profile 
ActiveCell.value = Datum 
ActiveCell.Offset(0, 1).Select 
ActiveCell.value = SName 
ActiveCell.Offset(0, 1).Select 
ActiveCell.value = PotentialS 
ActiveCell.Offset(0, 1).Select 
ActiveCell.value = SuppNr 
ActiveCell.Offset(0, 1).Select 

Jede Hilfe und Tipps sind willkommen. Ich wünsche euch allen ein angenehmes Wochenende.

+0

So wählt der Benutzer aus einer Combobox, gibt einige Werte in einigen Textfeldern ein, die dann die Standardwerte in den Textfeldern werden, wenn der Benutzer das nächste Mal die gleiche Auswahl trifft, ist das korrekt? Ich weiß nicht, woher Sie den Select-Activecell-Offset-Ansatz übernommen haben, aber Sie könnten Ihren Code viel kürzer und weniger fehleranfällig machen, indem Sie direkt auf die Zellen verweisen. Denken Sie auch daran, oben im Code die Option explizite Option zu verwenden, in der Sie nicht definierte Variablen verwenden. Verweise auf Punkt 2, du kannst keine Variable einem Datentyp zuweisen, dann setze = null, überprüfe, ob es vorher Null ist –

+0

Ich will nur sagen, dass du es gut gemacht hast, und wie du es geschafft hast! Mach weiter! –

+0

Ignorieren Sie Ihr Problem: Sie können 'With ActiveCell' und' End With' verwenden, um viel Zeit beim Schreiben Ihres Codes zu sparen. http://www.homeandlearn.org/with_end_with.html _Greetings to Germany, ich denke: P_ –

Antwort

0

Erstens denke ich Verkürzung der SaveCGStrategies_Click Code wird dazu beitragen, VBA ein wenig besser zu verstehen, was Sie getan haben, ist eins nach dem anderen überprüfen jede Option, um die Werte zu speichern, aber die erste Option ausgewählt wurde, dann würden Sie nie überprüfen müssen Bei den anderen, wie Sie Ihre Übereinstimmung gefunden haben, wird der Code auch jedes Mal dupliziert, die unten prüft Auswahl und führt eine einzelne Instanz des Codes einmal aber gegen die relevanten Zellen.

Private Sub SaveCGStrategies_Click() 
Dim LngRow  As Long 
Dim outputBook As Workbook 
Dim outputSheet As Worksheet 

Set outputBook = ActiveWorkbook 
Set outputSheet = outputBook.Worksheets("Commodity Groups") 

'With Me.CGselectionStrategies 
Select Case Me.CGselectionStrategies.Value 

    Case "Halbzeuge (und Rohstoffe)" 
     LngRow = 2 
    Case "Mechanische Konstruktionsteile" 
     LngRow = 62 

    Case "Norm- und Katalogteile (ausser Elektro)" 
     LngRow = 87 

    Case "Elektrische, elektronische und optische Komponenten und Baugruppen" 
     LngRow = 127 

    Case "Hilfs-, Betriebs- und Produktionshifsmittel" 
     LngRow = 180 

    Case "Subsysteme und Anlagen" 
     LngRow = 256 

    Case "Handelsware" 
     LngRow = 299 

    Case "Dienstleistungen" 
     LngRow = 310 

    Case "Allgemeines und Administration" 
     LngRow = 360 

End Select 

outputSheet.Cells(LngRow, 11) = Me.NoteTargetMarket 
outputSheet.Cells(LngRow, 13) = Me.NoteAuthorMarketInfo 
outputSheet.Cells(LngRow, 14) = Me.NotePUMStrat 
outputSheet.Cells(LngRow, 15) = Me.NoteAuthorPUMStratInfo 
outputSheet.Cells(LngRow, 16) = Me.NotePUSStrat 
outputSheet.Cells(LngRow, 17) = Me.NoteAuthorPUSStratInfo 
outputSheet.Cells(LngRow, 18) = Me.NotePULStrat 
outputSheet.Cells(LngRow, 19) = Me.NoteAuthorPULStratInfo 

Set outputSheet = Nothing 
Set outputBook = Nothing 

End Sub 

In der gleichen Art und Weise Sie die Arbeitsmappe verwiesen, es verweist auch das Arbeitsblatt, damit wir in die Bereiche des Arbeitsblatt zu schreiben, die wir mit weniger Code wollen. Ich habe die .Select und Activate Funktionen nicht verwendet, die Sie hatten, da diese Leistungsprobleme haben können. Ich habe die Werte auch direkt referenziert und sie nicht zuerst in einer Variablen platziert. Wenn Sie sie manipulieren wollten, bevor Sie sie in eine Zelle schreiben, dann könnte eine Variable nützlich sein, aber wenn es eine direkte Einfügung von Textbox in Zelle ist kann es gerade durchgehen.

Ihr zweites Problem benötigt mehr Eingabe, um sicher zu sein, aber ich vermute, dass sich Datentypen beziehen.

Dim Datum As Date 
Datum = Me.TextBox117 

Ist Me.TextBox117 ein Datum in einem gültigen Datumsformat? dies könnte wie unten geprüft werden: -

If IsDate(Me.TextBox117) then Datum = CDate(Me.TextBox117) 

Die Funktion CDate sicherzustellen, wird der Wert in die Variable als ein Datum übergeben.

Dim SuppNr As Long 
SuppNr = Me.SuppNo 

Ist Me.SuppNo eine gültige Nummer? dies könnte wie unten geprüft werden: -

If IsNumeric(Me.SuppNo) then SuppNr = CLng(Me.SuppNo) 

Meine Empfehlung wäre, während sie arbeiten, bekommen Sie sie alle zu String gesetzt oder geben sie durch wie.

+0

Ihr verbesserter Code funktioniert wie ein Leckerbissen, vielen Dank so haha ​​ Ich werde auf der "Case" -Funktion nachlesen und versuchen, es mehr zu implementieren. Leider bin ich unter viel Zeitdruck, um diese und viel mehr Funktionen in das Excel-Tool zu bekommen ... und das ist nur der Teil, wo ich alles speichern muss Ich bin mir nicht sicher, ob es eine Frage der Daten ist Typen, weil ein Fehler nur auftritt, wenn ich den entsprechenden TextBox-Eingang leer lasse. Ich werde jetzt versuchen, alles durch Strings zu ersetzen und auf Sie zurückkommen. Nochmal, danke, dass du dir die Zeit für eine so umfangreiche Antwort genommen hast :) – InternInNeed

+0

Eigentlich sollte dein Code auch die vorherige Auswahl anzeigen? Weil das immer noch nicht funktioniert. Die Idee ist: "Benutzer wählt aus einer Combobox aus, gibt einige Werte in einige Textfelder ein, die dann die Standardwerte in den Textfeldern werden, wenn der Benutzer das nächste Mal die gleiche Auswahl an Kombinationsfeldern vornimmt." - Der Benutzer HelloWorld hat es in den ersten Kommentaren so schön erklärt – InternInNeed

+0

Ich habe es geschafft, es mit einer IF-Funktion für jeden Auswahlwert arbeiten zu lassen, also egal :) Ich habe auch den gesamten Auswahlansatz gelöscht und durch Referenzieren auf die Zelle ersetzt reicht direkt. – InternInNeed

0

Hallo eins ist sicher - Sie müssen all dieser .Select loszuwerden ‚s

Sie es unglaublich schwer zu lesen ist. Ich selbst habe gerade erst angefangen VBA zu lernen (vor ca. 3 Wochen). Bitte schauen Sie auf den folgenden Link - How to avoid using Select in Excel VBA macros. Es sollte Ihnen mit Ihrer VBA-Lesbarkeit helfen. Es wird Ihren Code auch um ein Vielfaches schneller machen.

Dies wird Ihnen auch jeder andere Befehl verwenden helfen ActiveCell aus mit.

Ein weiterer Tipp ist anstelle von Ihnen

Dim *StringVariable* as string 

als Codezeile, die die Sie mit am Anfang beginnen - , wenn Sie eine Zelle etwas nennen wollen, nur sein Angebot geben und es dann machen = zu "String" z

Range("A1") = "This is a String" 

Ich bin nicht genug, um mit VBA erfahren zu wissen, was die Angelegenheit mit Ihrem TextBox ist, aber ich hoffe, dass dies ein guter Anfang ist Ihr allgemeines VBA Schreiben zu unterstützen.

+0

Vielen Dank @lewisthegruffalo, ich werde mir das Tutorial ansehen und versuchen, meinen Code zu überarbeiten! – InternInNeed