Anzeige
Archiv - Navigation
536to540
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
536to540
536to540
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Hilfe bei VBA Prozedur

Hilfe bei VBA Prozedur
22.12.2004 11:01:25
Martin
Hallo zusammen,
hab da ein riesiges Problem mit einer Prozedur und hoffe Ihr könnt mir da evtl. weiterhelfen.
Folgende Situation:
Ich habe im Excel eine Datei, in der ca. 5000 Zeilen gefüllt sind. Der Inahlt dieser Zeilen ist bis auf einen Teil nicht verwertbar, da er meist nur technische Daten etc. enthält(Export aus einem anderen System). Den Teil den ich benötige, beschränkt sich auf 4 sich wiederholenden angaben (Anrede, Vorname, Nachname, EMail) in Spalte A bzw. B, die in eine neue Tabelle übertragen werden sollen.
Von der Ausganstabelle werden nur die Inhalte der o.g. 4 Angaben benötigt, also das was in der Spalte neben Anrede usw. steht.
Übertrag in neue Tabelle sollte wie folgt aussehen:
1 A /B /C /D
2 Anrede /Vorname /Nachname /E-Mail
3 Beginn mit erster Werteübergabe
4 ...
Meine Versuche sehen wie folgt aus:
_____________________________________________________________________________

Sub Anschriften_Herausfiltern()
Dim WS As Worksheet
Dim strBlatt As String
Dim strAnrede As String
Dim strVorname As String
Dim strNachname As String
Dim strEMail As String
'Dim lngCount As Long
Dim rngBegin As Range
' alte Blätter löschen
On Error Resume Next
Application.DisplayAlerts = False
For Each WS In ThisWorkbook.Worksheets
If Left(WS.Name, 7) = "Weitere" Then WS.Delete
Next WS
Application.DisplayAlerts = True
On Error GoTo 0
' neues Blatt anlegen
strBlatt = "Weitere Infotmationen"
On Error Resume Next
Set WSneu = ThisWorkbook.Worksheets(strBlatt)
If Err.Number <> 0 Then
Set WSneu = ThisWorkbook.Worksheets.Add
WSneu.Name = strBlatt
WSneu.Range("A1") = "Anrede"
WSneu.Range("B1") = "Vorname"
WSneu.Range("C1") = "Nachname"
WSneu.Range("D1") = "E-Mail"
End If
Set WS = Application.ActiveWorkbook.Worksheets("Gewinnspiel101")
Set rngBegin = WS.Range("A1")
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
' Wertezuweisung
Do Until IsEmpty(rngBegin)
If Cells = "Anrede:" Then
strAnrede = ActiveCell.Offset(0, 1).Value
ElseIf Cells.Right(strVorname, 8) = "Vorname:" Then
strVorname = ActiveCell.Offset(0, 1).Value
ElseIf Cells.Right(strNachname, 9) = "Nachname:" Then
strNachname = ActiveCell.Offset(0, 1).Value
ElseIf Cells.Right(strEMail, 7) = "E-Mail:" Then
strEMail = ActiveCell.Offset(0, 1).Value
End If
' Datenübergabe an Unterprozedur
Daten strAnrede, strVorname, strNachname, strEMail
Set rngBegin = rngBegin.Offset(1, -1)
Loop
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
End Sub

______________________________________________________________________________
'Unterprozedur

Sub Daten(Anrede As String, Vorname As String, Nachname As String, EMail As String)
Dim lngZeile As Long
lngZeile = WSneu.UsedRange.Rows.Count + 1
WSneu.Cells(lngZeile, 1) = Anrede
WSneu.Cells(lngZeile, 2) = Vorname
WSneu.Cells(lngZeile, 3) = Nachname
WSneu.Cells(lngZeile, 4) = EMail
End Sub

______________________________________________________________________________
Sobald ich nun das ganze ausführen will stürzt mit die Anwendung ab(Liegt warscheinlich an der Schleife für die Wertezuweisung)
Frage nun:
Irgendeine Idee oder eine Hilfestellung, wie ich das anders formulieren muss damit es klappt?
Für eure Hilfe wäre ich sehr dankbar.
MfG
Martin
AW: Hilfe bei VBA Prozedur
Coach
Hallo Martin,
wenn Du eine Beispieldatei uploaden würdest, könnte man Dir leichter helfen.
Gruß Coach
AW: Hilfe bei VBA Prozedur
Martin
Hallo Coach,
ich bin noch nicht so lange hier, wie mach ich das denn am besten?
Mfg
Martin
AW: Hilfe bei VBA Prozedur
Coach
Hallo Martin,
über dem Eingabeformular sind 2 Button, "Durchsuchen" und "Datei zum Server". Mit 1 wählst Du die Datei aus, mit letzterem wird sie übertragen.
Gruß Coach
AW: Hilfe bei VBA Prozedur
Martin
Hallo Coach,
Kann die Datei leider nicht uploaden, beim Versuch wird diese immer von den Sichheitsmaßnamen in meiner Arbeit geblockt!
Sorry,
Martin
P.S.:
Reichen evtl. weiter Erläuterungen?
Anzeige
AW: Hilfe bei VBA Prozedur
Coach
Hallo Martin,
leider ist Dein Programm nicht wirklich geeignet, die Ausgangsstruktur korrekt zu erahnen.
Stehen die Daten dort immer in einer bestimmten Reihenfolgen untereinander? Dann wäre der Offset 4? Oder sind es 4er-Blöcke, in denen die Daten unterschiedliche Reihenfolgen haben.
Bitte poste mal ca. 32 repräsentative Beispielzeilen, dann kann man das besser sehen.
Viele Grüße
Coach
AW: Hilfe bei VBA Prozedur
Coach
Hallo Martin,
leider ist Dein Programm nicht wirklich geeignet, die Ausgangsstruktur korrekt zu erahnen.
Stehen die Daten dort immer in einer bestimmten Reihenfolgen untereinander? Dann wäre der Offset 4? Oder sind es 4er-Blöcke, in denen die Daten unterschiedliche Reihenfolgen haben.
Bitte poste mal ca. 32 repräsentative Beispielzeilen, dann kann man das besser sehen.
Viele Grüße
Coach
Anzeige
AW: Hilfe bei VBA Prozedur
Martin
Hallo Coach,
So sehen die Einträge in Spalte A aus:
Received:
Received:
Received:
Received:
Received:
Received:
$MessageID:
PostedDate:
Subject:
SendTo:
From:
MIME_Version:
$MIMETrack:
SMTPOriginator:
$TKAttaConversion:
$Orig:
$TkFlag10:
RouteServers:
RouteTimes:
$UpdatedBy:
$TkFlag50:
Categories:
$Revisions:
$MsgTrackFlags:
DeliveredDate:
Formularversand
https://www.sskm.de/aktionen/altersvorsorge2004/k1/gewinnen.htm
Versandzeitpunkt:
gewinnantwort:
Anrede:
*Vorname:
*Name:
*Strasse:
*Hausnummer:
*PLZ:
*Ort:
*E-Mail:
*Geburtstag:
Teilnahmebedingungen:
WeitereInfos:

Dies ist die genaue sich wiederholende Reihenfolge! In Spalte B stehen die gewünschten Ergebnisse für Anrede usw., welche dann in eine neue Tabelle übertragen werden sollen.
MfG
Martin
Anzeige
AW: Hilfe bei VBA Prozedur
Coach
Hallo Martin,
hier eine Beispielmappe:
https://www.herber.de/bbs/user/15172.xls
Sollte das mit Deinen Sicherheitseinstellungen nicht funktionieren hier der Code:
Option Explicit
Dim WSNeu As Worksheet
Dim lngZeile As Long

Sub Anschriften_Herausfiltern()
Dim WS As Worksheet
Dim strBlatt As String
Dim strAnrede As String
Dim strVorname As String
Dim strNachname As String
Dim strEMail As String
'Dim lngCount As Long
Dim rngBegin As Range
' alte Blätter löschen
On Error Resume Next
Application.DisplayAlerts = False
For Each WS In ThisWorkbook.Worksheets
If Left(WS.Name, 7) = "Weitere" Then WS.Delete
Next WS
Application.DisplayAlerts = True
On Error GoTo 0
' neues Blatt anlegen
strBlatt = "Weitere Infotmationen"
On Error Resume Next
Set WSNeu = ThisWorkbook.Worksheets(strBlatt)
If Err.Number <> 0 Then
Set WSNeu = ThisWorkbook.Worksheets.Add
WSNeu.Name = strBlatt
WSNeu.Range("A1") = "Anrede"
WSNeu.Range("B1") = "Vorname"
WSNeu.Range("C1") = "Nachname"
WSNeu.Range("D1") = "E-Mail"
End If
Set WS = Application.ActiveWorkbook.Worksheets("Gewinnspiel101")
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
End With
' Wertezuweisung
lngZeile = 1
Set rngBegin = WS.Range("A30")
Do Until IsEmpty(rngBegin)
strAnrede = rngBegin.Offset(0, 1).Value
strVorname = rngBegin.Offset(1, 1).Value
strNachname = rngBegin.Offset(2, 1).Value
strEMail = rngBegin.Offset(7, 1).Value
Daten strAnrede, strVorname, strNachname, strEMail
Set rngBegin = rngBegin.Offset(40, 0)
Loop
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
End With
End Sub


Sub Daten(Anrede As String, Vorname As String, Nachname As String, EMail As String)
lngZeile = lngZeile + 1
WSNeu.Cells(lngZeile, 1) = Anrede
WSNeu.Cells(lngZeile, 2) = Vorname
WSNeu.Cells(lngZeile, 3) = Nachname
WSNeu.Cells(lngZeile, 4) = EMail
End Sub

Gruß Coach
Anzeige
AW: Hilfe bei VBA Prozedur
Martin
Hallo Coach,
sorry ich hab einen Fehler gemacht, die Reihenfolge wiederholt sich leider nicht genau! Dieser Export ist der größte mist mit dem ich je gearbeitet habe! Hin und wieder wird entweder ein feld der aufgeführten weggelassen oder es kommt eins dazu.
Ich brauche leider eine dynamischere Lösung. Hierfür evtl. noch eine Idee?
Gruß
Martin
AW: Hilfe bei VBA Prozedur
Coach
Hallo Martin,
dann tausch mal den entsprechenden Teil aus:
' Wertezuweisung
lngZeile = 1
strAnrede = vbNullString: strVorname = vbNullString: strNachname = vbNullString: strEMail = vbNullString
Set rngBegin = WS.Range("A30")
Do Until IsEmpty(rngBegin)
Select Case rngBegin.Value
Case "Anrede:"
strAnrede = rngBegin.Offset(0, 1).Value
Case "*Vorname:"
strVorname = rngBegin.Offset(0, 1).Value
Case "*Name:"
strNachname = rngBegin.Offset(0, 1).Value
Case "*E-Mail:"
strEMail = rngBegin.Offset(0, 1).Value
End Select
If strAnrede vbNullString And strVorname vbNullString And strNachname vbNullString And strEMail vbNullString Then
Daten strAnrede, strVorname, strNachname, strEMail
strAnrede = vbNullString: strVorname = vbNullString: strNachname = vbNullString: strEMail = vbNullString
End If
Set rngBegin = rngBegin.Offset(1, 0)
Loop
Gruß Coach
Anzeige
AW: Hilfe bei VBA Prozedur
Coach
Hallo Martin,
dann tausch mal den entsprechenden Teil aus:
' Wertezuweisung
lngZeile = 1
strAnrede = vbNullString: strVorname = vbNullString: strNachname = vbNullString: strEMail = vbNullString
Set rngBegin = WS.Range("A30")
Do Until IsEmpty(rngBegin)
Select Case rngBegin.Value
Case "Anrede:"
strAnrede = rngBegin.Offset(0, 1).Value
Case "*Vorname:"
strVorname = rngBegin.Offset(0, 1).Value
Case "*Name:"
strNachname = rngBegin.Offset(0, 1).Value
Case "*E-Mail:"
strEMail = rngBegin.Offset(0, 1).Value
End Select
If strAnrede vbNullString And strVorname vbNullString And strNachname vbNullString And strEMail vbNullString Then
Daten strAnrede, strVorname, strNachname, strEMail
strAnrede = vbNullString: strVorname = vbNullString: strNachname = vbNullString: strEMail = vbNullString
End If
Set rngBegin = rngBegin.Offset(1, 0)
Loop
Gruß Coach
Anzeige
AW: Hilfe bei VBA Prozedur
Martin
Hallo Coach,
Vielen vielen Dank für die super Unterstützung!
Funktioniert einwandfrei!
Selbst wäre ich nie auf die Variante mit dem vbNullstring gekommen!
Ich wünsche schon mal Frohe Weihnachten und einen guten Rutsch ins neue Jahr.
MfG
Martin
AW: Hilfe bei VBA Prozedur
Martin
Hallo zusammen,
ich bräuchte immer noch eure Hilfe, stell auf weiter offen.
MfG
Martin
Hilfe bei VBA Prozedur (noch offen)
Martin
Hallo zusammen,
ich bräuchte immer noch eure Hilfe, stell auf weiter offen.
MfG
Martin
AW: Hilfe bei VBA Prozedur (noch offen)
bst
Mahlzeit Martin,
hab's zwar nicht wirklich probiert, aber:
- WSneu ist nicht definiert
- If Cells = "Anrede:" Then
ist nun keine besonders gute Idee, nimm vielleicht sowas wie if rngBegin.Value = ...
- dito bei den elseif, versuch eher sowas: ElseIf Right( rngBegin.Value, 8) = ...
- am Ende vielleicht sowas: Set rngBegin = rngBegin.Offset(1, 0)
HTH, Bernd
Anzeige
AW: Hilfe bei VBA Prozedur (noch offen)
Martin
Hallo Bernd,
hab deine Vorschläge umgesetzt.
Jetzt stürtzt das ganze schon mal nicht mehr ab, allerdings werden die Werte nicht übernommen bzw. übergen.
Hierzu irgendeinen Ansatz?
Gruß
Martin
AW: Hilfe bei VBA Prozedur (noch offen)
bst
Hi Martin,
ja. Hatte ich beim 1. Versuch überlesen :-(
Deine "strAnrede = ActiveCell.Offset(0, 1).Value" und Freunde sollten vermutlich
so oder so ähnlich aussehen:
strAnrede = rngBegin.Value
bzw. so:
strAnrede = rngBegin.Offset(0, 1).Value
HTH, Bernd
AW: Hilfe bei VBA Prozedur (noch offen)
Martin
Hallo Bernd,
nun werden die Daten auch übertragen! Jetzt hab ich wie mir scheint nur noch ein Problem mit meiner Unterprozedur, da diese mir die Daten solange bis alle ElseIfs beendet werden, jeweils doppelt einträgt!
Wenn du hier noch eine Lösung parat hättest, wäre das einfach spitze!
MfG
Martin
Anzeige
AW: Hilfe bei VBA Prozedur (noch offen)
bst
Hallo Martin,
das ist wohl weniger eine Frage der Unterproz., sondern eher wann bzw. wie oft diese aufgerufen wird. Hast Du schon mal coach's Lösung probiert ?
Wenn die Reihenfolge immer die Gleiche ist, kannst Du nach dem Finden von Anrede die
anderen halt direkt auslesen.
HTH, Bernd
AW: Hilfe bei VBA Prozedur (noch offen)
Martin
Hallo Bernd,
geht leider nicht. Hatte es gehofft, aber bei so vielen Einträgen ist das schwer zu sehen.
Wie kann ich das ganze so stricken, dass nur die relevanten Daten an die Unterproz. übergeben werden, bzw. dass der Aufruf nur einmal für alle Angaben erfolg?
Jeweils eine eigene Unterprozedur?
Gruß
Martin
Anzeige
AW: Hilfe bei VBA Prozedur (noch offen)
Martin
Hallo Bernd,
ebenfalls vielen vielen Dank für die super Unterstützung!
Hab jetzt ne Variante die Funktioniert!
Ich wünsche schon mal Frohe Weihnachten und einen guten Rutsch ins neue Jahr.
MfG
Martin
AW: Hilfe bei VBA Prozedur (noch offen)
bst
Morgen Martin,
Bitteschön. Und ebenfalls Frohe Weihnachten und einen guten Rutsch.
cu, Bernd
AW: Hilfe bei VBA Prozedur
Alex
Martin,
las das On Error Resume Next mal weg, vielleicht kommt dann eine brauchbare fehlermeldung.
Gruß
Alex Z
AW: Hilfe bei VBA Prozedur
Martin
Hallo Alex,
danke für den Hinweis. Ich hab das Error Handling nun wieder mit der Anweisung On Error Goto 0 an Excel zurückgegeben, aber da tut sich auch nix.
Sobald er beginnt die Schleife zu starten, wird er langsam und lädt anscheinend irgendwelche Daten die Auslagerungsdatei, sodass mir dann eine Fehlermeldung angezeigt wird, dass nicht genügend virtueller Speicher zur Verfügung steht!
Dann hilft nur noch strg+alt+entf.
Gruß
Martin

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige