Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1064to1068
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

Code schlecht

Code schlecht
26.03.2009 10:00:41
Andrew
Hallöchen,
ich stehe noch auf der ersten Stufe auf dem Pfad mich dem VBA-Olymp zu nähern, was so viel bedeutet wie: ich bin totaler Rookie.
Ich hoffe aber dass die Kompetenz hier die Lösung meines Problems ist, da ich sonst keinen Ausweg mehr kenne ;-(
Grundsätzlich habe ich 2 Mappen in Verwendung:
Mappe1: "Eingabemaske Werker" - Dies ist eine Eingabemaske aus welcher meine Makros gestartet werden.
Mappe2: "Application" diese Datenbank befindet sich hier:
strPfad = "X:\A5\Prosial\Datenbank\mit comment\Datenbank2.xlsx"
Zum Hintergrund: Mittels der "Eingabemaske Werker" wird die Datenbank in "Application" gefüllt.
Unter anderem wird der Wert aus B2 in die Spalte B der Wert aus B4 in Spalte C & B5 in der Spalte G gespeichert.
Nun möchte ich aber vor dem Speichervorgang prüfen ob denn die Werte der Zellen B2; B4 und B5 schon in der Datenbank (in der gelichen Zeile) vorhanden sind. Falls ja soll eine msgBox erscheinen die den User auf diese tatsache hinweist, sprich die eingegebenen wert sind schon vorhanden & die Frage: möchten sie diese werte trotzdem speicher, bei ja - speichern, bei nein - zurück zur mappe.
Geht das Prinzipiell?
Ich hatte schon des öfteren solche Probleme wo ich absolut nicht mehr weiter wusste & ich habe immer jemanden gefunden der diese komplexen Sachen lösen konnte. ich hoffe das wird diesmal auch so sein, wobei ich mir das sehr schwierig vorstelle.....
Hoffe ich erhalte Feedback..
Liebe Grüße
Andrew

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

Betreff
Datum
Anwender
Anzeige
AW: Code schlecht
26.03.2009 10:57:59
Andrew
hier mein bisher erstellter Code, welcher aber leider nicht funktioniert:

Sub AnDatenbankSendenWerker()
Dim wkbQ As Workbook
Dim wkbZ As Workbook
Dim wksQ As Worksheet
Dim wksZ As Worksheet
Dim strPfad As String
Dim lngLZZ As Long
Dim i As Integer
For i = 2 To 12
If Sheets("Eingabemaske Werker").Cells(i, 2).Value = 0 Then
If i  3 Then
MsgBox "In Zelle B" & i & " fehlt ein Wert"
Exit Sub
End If
End If
Next i
strPfad = "X:\A5\Prosial\Datenbank\mit comment\Datenbank2.xlsx"
Set wkbZ = Workbooks.Open(strPfad, 0)
Set wkbQ = ThisWorkbook
Set wksZ = wkbZ.Worksheets("Application")
Set wksQ = wkbQ.Worksheets("Eingabemaske Werker")
lngLZZ = wksZ.Cells(wksZ.Rows.Count, 2).End(xlUp).Row
'Prüfung ob Datensatz vorhanden
For lngI = 3 To lngLZQ
If wksZ.Range("B" & lngI) = wksQ.Range("B2") And _
wksZ.Range("C" & lngI) = wksQ.Range("B4") And _
wksZ.Range("G" & lngI) = wksQ.Range("B5") Then
If MsgBox("Datensatz existiert bereits!" & vbLf & vbLf & _
"Soll dieser Datensatz überschrieben werden?" & vbLf _
, vbOKCancel + vbExclamation + vbDefaultButton2, _
"Hinweis: Datenbank") = vbOK Then
lngLZZ = lngI - 1
Exit For
Else
Exit Sub
End If
End If
Next
'Werte Speichern
lngLZZ = wksZ.Cells(wksZ.Rows.Count, 2).End(xlUp).Row + 1
wksZ.Cells(lngLZZ, 2).Value = wksQ.Cells(2, 2).Value
wksZ.Cells(lngLZZ, 2).NumberFormat = wksQ.Cells(2, 2).NumberFormat
wksZ.Cells(lngLZZ, 3).Value = wksQ.Cells(4, 2).Value
wksZ.Cells(lngLZZ, 6).Value = wksQ.Cells(2, 4).Value
wksZ.Cells(lngLZZ, 7).Value = wksQ.Cells(5, 2).Value
wksZ.Cells(lngLZZ, 8).Value = wksQ.Cells(6, 2).Value
wksZ.Cells(lngLZZ, 9).Value = wksQ.Cells(14, 2).Value
wksZ.Cells(lngLZZ, 12).Value = wksQ.Cells(7, 2).Value
wksZ.Cells(lngLZZ, 13).Value = wksQ.Cells(8, 2).Value
wksZ.Cells(lngLZZ, 14).Value = wksQ.Cells(9, 2).Value
wksZ.Cells(lngLZZ, 15).Value = wksQ.Cells(10, 2).Value
wksZ.Cells(lngLZZ, 16).Value = wksQ.Cells(11, 2).Value
wksZ.Cells(lngLZZ, 17).Value = wksQ.Cells(12, 2).Value
lngLZZ = wksZ.Cells(wksZ.Rows.Count, 2).End(xlUp).Row + 1
wksZ.Cells(lngLZZ, 2).Value = wksQ.Cells(20, 1).Value
wkbZ.Close SaveChanges:=True
MsgBox "Die Daten wurden erfolgreich in der Datenbank gespeichert. " & vbLf & _
"Zusätzlich wurde das heutige Datum: " & Format(Date, " DD.MM.YYYY ") & " mit eingefügt. " _
End Sub


Anzeige
AW: Code schlecht
26.03.2009 11:08:10
D.Saster
Hallo,
1. Option Explicit im Modulkopf eingeben!
lngLZQ ist 0 ergo wird
For lngI = 3 To lngLZQ
nicht durchlaufen.
Gruß
Dierk
AW: Code schlecht
26.03.2009 11:18:02
Andrew
als was müsste ich lngLZQ definieren? sorry für die Fage, aber bei dem Code hat mir jmd. geholfen ;)
Long owT
26.03.2009 11:22:02
D.Saster
AW: Code schlecht
26.03.2009 11:38:27
fcs
Hallo Andrew,
wenn ich die Logik der Datenübertragung richtig verstanden habe, dann muss du den Code wie folgt anpassen.
Wenn die Datenbank nicht zu viele Zeilen hat, dann ist die Suche nach einem vorhandenen Datensatz in einer For-Next-Schleife in Ordnung. Bei mehr Zeilen ist es deutlich schneller in einer Do-Loop-Schleife in Spalte B nach dem Wert in "B2" zu suchen und dann die Werte in den anderen Spalten der Zeile zu vergleichen.
Gruß
Franz

Sub AnDatenbankSendenWerker()
Dim wkbQ As Workbook
Dim wkbZ As Workbook
Dim wksQ As Worksheet
Dim wksZ As Worksheet
Dim strPfad As String
Dim lngI as Long, lngLZZ As Long                  '### geändert
Dim i As Integer
For i = 2 To 12
If Sheets("Eingabemaske Werker").Cells(i, 2).Value = 0 Then
If i  3 Then
MsgBox "In Zelle B" & i & " fehlt ein Wert"
Exit Sub
End If
End If
Next i
strPfad = "X:\A5\Prosial\Datenbank\mit comment\Datenbank2.xlsx"
Set wkbZ = Workbooks.Open(strPfad, 0)
Set wkbQ = ThisWorkbook
Set wksZ = wkbZ.Worksheets("Application")
Set wksQ = wkbQ.Worksheets("Eingabemaske Werker")
lngLZZ = wksZ.Cells(wksZ.Rows.Count, 2).End(xlUp).Row + 1   '### geändert
'Prüfung ob Datensatz vorhanden
For lngI = 3 To lngLZZ - 1                                   '### geändert
If wksZ.Range("B" & lngI) = wksQ.Range("B2") And _
wksZ.Range("C" & lngI) = wksQ.Range("B4") And _
wksZ.Range("G" & lngI) = wksQ.Range("B5") Then
If MsgBox("Datensatz existiert bereits!" & vbLf & vbLf & _
"Soll dieser Datensatz überschrieben werden?" & vbLf _
, vbOKCancel + vbExclamation + vbDefaultButton2, _
"Hinweis: Datenbank") = vbOK Then
lngLZZ = lngI                                    '### geändert
Exit For
Else
Exit Sub
End If
End If
Next
'Werte Speichern
'lngLZZ = wksZ.Cells(wksZ.Rows.Count, 2).End(xlUp).Row + 1   '### geändert
wksZ.Cells(lngLZZ, 2).Value = wksQ.Cells(2, 2).Value
wksZ.Cells(lngLZZ, 2).NumberFormat = wksQ.Cells(2, 2).NumberFormat
wksZ.Cells(lngLZZ, 3).Value = wksQ.Cells(4, 2).Value
wksZ.Cells(lngLZZ, 6).Value = wksQ.Cells(2, 4).Value
wksZ.Cells(lngLZZ, 7).Value = wksQ.Cells(5, 2).Value
wksZ.Cells(lngLZZ, 8).Value = wksQ.Cells(6, 2).Value
wksZ.Cells(lngLZZ, 9).Value = wksQ.Cells(14, 2).Value
wksZ.Cells(lngLZZ, 12).Value = wksQ.Cells(7, 2).Value
wksZ.Cells(lngLZZ, 13).Value = wksQ.Cells(8, 2).Value
wksZ.Cells(lngLZZ, 14).Value = wksQ.Cells(9, 2).Value
wksZ.Cells(lngLZZ, 15).Value = wksQ.Cells(10, 2).Value
wksZ.Cells(lngLZZ, 16).Value = wksQ.Cells(11, 2).Value
wksZ.Cells(lngLZZ, 17).Value = wksQ.Cells(12, 2).Value
lngLZZ = wksZ.Cells(wksZ.Rows.Count, 2).End(xlUp).Row + 1
wksZ.Cells(lngLZZ, 2).Value = wksQ.Cells(20, 1).Value
wkbZ.Close SaveChanges:=True
MsgBox "Die Daten wurden erfolgreich in der Datenbank gespeichert. " & vbLf & _
"Zusätzlich wurde das heutige Datum: " & Format(Date, " DD.MM.YYYY ") & " mit eingefügt. " _
End Sub
Alternative Suche nach vorhanenem Datensatz:
'Prüfung ob Datensatz vorhanden
With wksZ.Range("B3:B" & lngLZZ - 1)
Set rngZelle = .Find(what:=wksQ.Range("B2"), LookIn:=xlValues, lookat:=xlWhole)
If Not rngZelle Is Nothing Then
strAdresse1 = rngZelle.Address
Do
If wksZ.Range("C" & rngZelle.Row) = wksQ.Range("B4") And _
wksZ.Range("G" & rngZelle.Row) = wksQ.Range("B5") Then
If MsgBox("Datensatz existiert bereits!" & vbLf & vbLf & _
"Soll dieser Datensatz überschrieben werden?" & vbLf _
, vbOKCancel + vbExclamation + vbDefaultButton2, _
"Hinweis: Datenbank") = vbOK Then
lngLZZ = rngZelle.Row
Exit Do
Else
Exit Sub
End If
End If
Set rngZelle = .FindNext(after:=rngZelle)
Loop Until strAdresse1 = rngZelle.Address
End If
End With


Anzeige
AW: Code schlecht
26.03.2009 12:31:24
Andrew
also danke schonmal soweit, du hast recht mit einer For next schleife ist es nicht perfekt, ich habe das Problem nun so gelöst (mit einer do while schleife):
Do While wksZ.Range("B" & lngLZQ) 0
If wksZ.Range("B" & lngLZQ) = wksQ.Range("B2") And _
wksZ.Range("C" & lngLZQ) = wksQ.Range("B4") And _
wksZ.Range("G" & lngLZQ) = wksQ.Range("B5") Then
If MsgBox("Folgender Datensatz existiert bereits in Datenbank bereits!" & vbLf & _
"Soll dieser Datensatz überschrieben werden?" & vbLf _
, vbOKCancel + vbExclamation + vbDefaultButton2, _
"Hinweis: Datenbank") = vbOK Then
lngLZZ = lngI - 1
Exit Do
Else
Exit Sub
End If
End If
lngLZQ = lngLZQ + 2
Loop
Danke euch vielmals!
Anzeige
AW: Code schlecht
26.03.2009 12:46:39
fcs
Hallo Andrew,
deine do-loop-Schleife ist nicht schneller als die For-Next-Schleife, da immer noch jede Zeile abgeklappert werden muss bis ggf. ein Treffer gefunden wird.
Ich verstehe allerdings nicht, warum die Datenbank so aufgebaut wurde, dass für jeden Datensatz 2 Zeilen mit Daten belegt sind. Das ist sehr sehr unschön!.
Die folgende Zeile in deinem Code dürfte jetzt noch nicht stimme:
lngLZZ = lngI - 1
Diese müsste wohl sein:
lngLZZ = lngLZQ - 1
Gruß
Franz

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige