Anzeige
Archiv - Navigation
1360to1364
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Frage zu VBA

Frage zu VBA
13.05.2014 19:08:08
Christian
Hallo Forum,
nachstehenden Code habe ich mit Hilfe vom euch hier im Forum (dafür nochmal Danke) und über die mailing-Seiten von hier zusammengebastelt.
Er macht auch das was er soll.
Im Forum ist oftmals von schlechten Programmierstil zu lesen ist, der von den VBA-Cracks kritisiert wird, und da ich noch wenig Ahnung davon habe, möchte ich mir nicht gleich von Anfang an unnütze Sachen angewöhnen.
Wie sieht das ein Profi, was ist noch zu verbessern, wo sind noch Schwachstellen?
Für Aufklärung danke ich euch im Vorraus!
MfG Christian

Private Sub CommandButton15_Click()
'Neue Position aus Userform ufposeintragen mit Kurztext eintragen und weiter und Abfrage ob in  _
Stamm eintragen
Dim FrageSpeichern&
FrageSpeichern = MsgBox("Neue Position auch im Stamm speichern?" & Chr(10) & "Ja      = In LV ü _
bernehmen und im Stamm speichern" & Chr(10) & "Nein = Nur im LV speichern", _
vbQuestion + vbYesNoCancel, "Neue Position")
If FrageSpeichern = vbCancel Then Exit Sub
If FrageSpeichern = vbYes Then
'In LVZ und Stamm eintragen
Call UserForm_Activate
'Eingaben prüfen
'Doppelte Nummer vermeiden
Dim Bereich As Range
Dim Letzte As Long
If [R2500] = "" Then
Letzte = [R2500].End(xlUp).Row
Else
Letzte = 2500
End If
Set Bereich = ActiveSheet.Range("R27:R" & Letzte) _
.Find(TextBox5, lookat:=xlWhole)
If Bereich Is Nothing Then
If Me.TextBox11 = "" Then
MsgBox "Bitte einen Kurztext eigeben", , "LVZ - Userform-Eingaben prüfen"
Me.TextBox11.SetFocus
Exit Sub
End If
If Me.TextBox12 = "" Then
MsgBox "Bitte einen Matchcode eingeben", , "LVZ - Userform-Eingaben prüfen"
Me.TextBox12.SetFocus
Exit Sub
End If
If Me.ComboBox2.ListIndex = -1 Then
MsgBox "Bitte erst einen Positionstyp wählen", , "LVZ - Userform-Eingaben prüfen"
Me.ComboBox2.SetFocus
Exit Sub
End If
If Me.TextBox5 = "" Then
MsgBox "Bitte erst die Pos.-Nr. eingeben", , "LVZ - Userform-Eingaben prüfen"
Me.TextBox5.SetFocus
Exit Sub
End If
If Me.TextBox3 = "" Then
MsgBox "Bitte erst eine Menge eingeben", , "LVZ - Userform-Eingaben prüfen"
Me.TextBox3.SetFocus
Exit Sub
End If
If Me.ComboBox3.ListIndex = -1 Then
MsgBox "Bitte erst eine Einheit wählen", , "LVZ - Userform-Eingaben prüfen"
Me.ComboBox3.SetFocus
Exit Sub
End If
If Me.ListBox3.ListIndex = -1 Then
MsgBox "Bitte erst einen Hersteller wählen", , "LVZ - Userform-Eingaben prüfen"
Me.ListBox3.SetFocus
Exit Sub
End If
If Me.ListBox4.ListIndex = -1 Then
MsgBox "Bitte erst einen Händler wählen", , "LVZ - Userform-Eingaben prüfen"
Me.ListBox4.SetFocus
Exit Sub
End If
If Me.ListBox5.ListIndex = -1 Then
MsgBox "Bitte erst eine Kategorie wählen", , "LVZ - Userform-Eingaben prüfen"
Me.ListBox5.SetFocus
Exit Sub
End If
'Position in LVZ
With wksLvz
wksLvz.Cells(lngZeileLvz + 1, 19).Value = (Me.TextBox11.Value) 'Spalte S-Kurztext
wksLvz.Cells(lngZeileLvz + 1, 20).Value = CDbl(Me.TextBox3.Value) 'Spalte T-Menge
wksLvz.Cells(lngZeileLvz + 1, 18).Value = (Me.TextBox5.Value) 'Spalte R-Pos-Nr.
wksLvz.Cells(lngZeileLvz + 1, 17).Value = Me.ComboBox2.Value 'Spalte Q-Pos.-Typ
wksLvz.Cells(lngZeileLvz + 1, 21).Value = Me.ComboBox3.Value 'Spalte U-Einheit
End With
'Neue Position in Stamm speichern
Dim lz As Long
Dim arrNumbers, varNumber, lngNumber As Long
Dim arrZ(1 To 94)
With Sheets("Positionen")
lz = .Range("B:B").Find("*", SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, SearchFormat:=False).Row + 1
If lz  2 Then
arrNumbers = .Range(.Cells(1, 1), .Cells(lz - 1, 1))
For Each varNumber In arrNumbers
If lngNumber 

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Frage zu VBA
13.05.2014 19:23:16
Spenski
hallo christian
bin selber auch anfänger
hier ein schöner code um alle textboxen und listboxen zurückzusetzen
Dim objControl As Control
For Each objControl In Controls
Select Case TypeName(objControl)
Case "TextBox"
objControl.Text = ""
Case "ComboBox"
objControl.ListIndex = -1
Case "CheckBox"
objControl.Value = False
Case "OptionButton"
objControl.Value = False
End Select
Next
End If
gruss
christian

AW: Frage zu VBA
13.05.2014 19:28:14
Tino
Hallo,
ohne Deinen Code in Einzelteile zu zerlegen nur mal was ich so sehe.
Ich würde die Deklarierung ausschließlich im Kopf der Prozedur machen
und nicht irgendwo mitten im Code.
Auch die Range-Schreibweise mit den eckigen Klammern mag ich nicht.
(ich bevorzuge ist Cells() oder auch Range())
Für die ganzen Controls würde ich wahrscheinlich mit Schleifen arbeiten
und den Fehlertext mit einer MSG ausgeben anstatt xxx.
Ich lass die Frage offen für weitere Diskussion-Beiträge
Gruß Tino

Anzeige
AW: Frage zu VBA
13.05.2014 19:44:08
Christian
Hallo Tino,
Danke für die Antwort.
Ich würde die Deklarierung ausschließlich im Kopf der Prozedur machen
und nicht irgendwo mitten im Code.

Werde ich ändern!
Auch die Range-Schreibweise mit den eckigen Klammern mag ich nicht.
(ich bevorzuge ist Cells() oder auch Range())

Wie schreibe ich das am besten?
Für die ganzen Controls würde ich wahrscheinlich mit Schleifen arbeiten
und den Fehlertext mit einer MSG ausgeben anstatt xxx.
Wie würde ein Beispielcode dazu aussehen?
MfG Christian

Anzeige
AW: Frage zu VBA
14.05.2014 02:35:17
fcs
Hallo Christian,
in deinem Makro wiederholen sich mehrer Codeabschnitte.
Hier ist es oft sinnvoll für die entsprecheden Aktionen separate Subs oder Functions zu schreiben.
Schaut bei dir etwa wie folgt aus, wobei ich keine Garantie übernehme, ob das so 100% läuft.
Außerdem ist es wichtig, dass für Zellen und Zellbereiche möglichst immer vollständig auf das zugehörige Tabellenblatt referenziert wird. Es sei denn man ist sicher, dass das aktive Tabellenblatt korrekt ist.
Wenn man eine Variable auf verschiedene Werte prüft, dann ist Select Case meist die besserere Wahl im Vergleich zu einer If..ElseIf..ElseIf..End If - Konstruktion.
Gruß
Franz
Private Sub CommandButton15_Click()
'Neue Position aus Userform ufposeintragen mit Kurztext eintragen und weiter und Abfrage _
ob in Stamm eintragen
Dim FrageSpeichern&
Dim lz As Long
Dim arrNumbers, varNumber, lngNumber As Long
Dim arrZ(1 To 94)
FrageSpeichern = MsgBox("Neue Position auch im Stamm speichern?" & Chr(10) _
& "Ja      = In LV übernehmen und im Stamm speichern" & Chr(10) _
& "Nein = Nur im LV speichern", _
vbQuestion + vbYesNoCancel, "Neue Position")
Select Case FrageSpeichern
Case vbCancel
Exit Sub
Case vbYes
'In LVZ und Stamm eintragen
Call UserForm_Activate
'Eingaben prüfen
If fncCheckDoppelte Is Nothing Then
If fncCheckEingaben(bolNurLVZ = False) = False Then Exit Sub
Call prcPosition_in_LVZ
'Neue Position in Stamm speichern
With Sheets("Positionen")
lz = .Range("B:B").Find("*", SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, SearchFormat:=False).Row + 1
If lz  2 Then
arrNumbers = .Range(.Cells(1, 1), .Cells(lz - 1, 1))
For Each varNumber In arrNumbers
If lngNumber 

Anzeige
AW: Frage zu VBA
15.05.2014 12:59:21
Christian
Hallo Franz,
Code läuft natürlich. Danke.
Hast Du meine E-Mail bezüglich dieser Mappe erhalten? Lohnt sich der Aufwand?
MfG Christian

AW: Frage zu VBA
16.05.2014 07:18:52
fcs
Hallo Christian,
die E-Mail hab ich bekommen, ich hat aber noch keine Zeit mich genauer damit zu befassen.
Gruß
Franz

AW: Frage zu VBA
13.05.2014 19:30:32
Hajo_Zi
Hallo Christian,
ich würde auch mit korrekten Einrückungen arbeiten, macht den Code übersichtlicher.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige