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

VBA Schleife & If.. Then Next

VBA Schleife & If.. Then Next
20.11.2020 10:35:37
viktor0000000000
Siehe: 'Hier startet das Problem! Der Rest des Codes läuft einwandfrei.

Sub AnAlleVersenden()
'W?hle Spalte AD aus und erstelle eine ?berschrift f?r die Spalte
Sheets("Liste").Select
Range("AD1").Select
ActiveCell.FormulaR1C1 = "Controller"
Range("AD1").Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 8813846
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
End With
Selection.Font.Bold = True
'F?ge XVerweis hinzu
Range("AD2").Select
ActiveCell.FormulaR1C1 = _
"=XLOOKUP(RC[-29],Zuordnung!R7C3:R168C3,Zuordnung!R7C1:R168C1)"
Range("AD2").Select
Selection.AutoFill Destination:=Range("AD2:AD15236")
Range("AD2:AD15236").Select
Dim j As Integer
For j = 7 To 8
Dim i As Integer
For i = 7 To 8
ThisWorkbook.Worksheets("Zuordnung").Activate
'Hier startet das Problem
If Sheets("Zuordnung").Cells(i, 1).Value = _
Sheets("Zuordnung").Range(Cells(6, 1), Cells(i - 1, 1)).Value Then
Else: GoTo Start
End If
Next i
Start:
'Hier endet das Problem.
Ich habe in der ersten Spalte Namen stehen (doppelt, dreifach,..) Er erstellt zwei Dateien    _
_
_
_
mit „Name1“ obwohl er erkennen müsste, dass er „Name1“ schon hatte und zum nächsten Name (i)  _
springen sollte.
'Das Tabellenblatt aktivieren
ThisWorkbook.Worksheets("Liste").Activate
'FilterEinstellungen auf null setzen
ActiveSheet.Columns("A:AD").AutoFilter
'Filter w?hlen - Referenz Zuordnung Zelle A2
ActiveSheet.Columns("A:AD").AutoFilter 30, "=" & Worksheets("Zuordnung").Cells(j, 1).Value
'Neues Tabellenblatt hinzuf?gen
'Tabelle leeren
ThisWorkbook.Worksheets("Exportliste").Cells.Clear
'Informationen kopieren
ActiveSheet.Range("A1:AC20000").Copy Destination:=ThisWorkbook.Worksheets(" _
Exportliste").Range("A1")
ThisWorkbook.Worksheets("Exportliste").Activate
'Exportliste versenden per Outlook an Controller
Dim DateiNameA As String
Dim NameDatei As String
DateiNameA = Worksheets("Zuordnung").Range("D3") & Worksheets("Zuordnung").Cells(j, 1) & " " _
_
_
_
& Worksheets("Zuordnung").Range("D5") & ".xlsx"
NameDatei = DateiNameA
Sheets("Exportliste").Copy
With ActiveWorkbook
.SaveAs filename:=DateiNameA
.Close
End With
Dim OutlookApp As Object
Dim OutlookMailItem As Object
Dim myAttachments As Object
Set OutlookApp = CreateObject("Outlook.Application")
Set OutlookMailItem = OutlookApp.CreateItem(0)
Set myAttachments = OutlookMailItem.Attachments
With OutlookMailItem
.To = Worksheets("Zuordnung").Cells(j, 2).Value
.Subject = Worksheets("Zuordnung").Range("D5").Value
.Body = Worksheets("Zuordnung").Range("D1").Value
.Attachments.Add NameDatei
.Display 'Hier Display durch Send ersetzen!!
End With
Set OutlookApp = Nothing
Set OutlookMailItem = Nothing
Next j
MsgBox "Die Email wurde an an alle Mitarbeiter versandt."
End Sub

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Schleife & If.. Then Next
20.11.2020 10:43:43
Daniel
Hallo Viktor
Wir sind hier etwas altmodisch und mögen zumindest rudimentäre Höflichkeit, dh eine freundlich Anrede und ein netter Gruß am Ende erhöhen die Wahrscheinlichkeit, dass sich ein Helfer des Problems annimmt.
Gruß Daniel
AW: VBA Schleife & If.. Then Next
20.11.2020 10:55:20
viktor0000000000
Sorry dafür! :/
Diesmal richtig:
Hallo Community,
ich habe ein kleines Problem, welches ich unten *fett* markiert habe. Kann mir jemand weiterhelfen?
Er erstellt zwei Dateien mit „Name1“ obwohl er erkennen müsste, dass er „Name1“ schon hatte und zum nächsten Name (i) springen sollte.
LG
Viktor
AW: VBA Schleife & If.. Then Next
20.11.2020 11:07:52
Daniel
Hi
ist der Standardfehler, den jeder Anfänger macht:
merke dir:
1. jedes Range, Cells, Columns oder Rows ohne Tabellenblattangabe davor bezieht sich immer auf aktive Tabellenblatt! *
das gilt auch dann, wenn diese innerhalb Funktionen stehen, für die bereits ein Tabellenblatt angegeben wurde, dieses wird NICHT weiterverwendet.
2. du bekommst den Fehler weil das Tabellenblatt, auf dem die Range liegen soll, ein anderes Blatt ist als das der Cells, die die Range definieren, dh du musst bei Range(Cells(), Cells()) für Range UND Cells das gleiche Tabellenblatt angeben.
du darfst sogar vor der Range das Tabellenblatt weglassen, aber vor den beiden Cells muss es stehen (in diesem Fall wird das Blatt von den Cells übernommen, weil die Cells die Range definieren **
Gruß Daniel
* Ausnahme: liegt der Code nicht in einem allgemeinen Modul sondern in einem TAbellenblattmodul, dann beziehen sich Range, Cells, Rows und Columns ohne Tabellenblattangabe davor nicht auf das aktive Blatt, sondern auf das Modul des Tabellenblatts
** liegt der Code in einem Tabellenblattmodul, so muss das Tabellenblatt, sofern es nicht das Blatt des Moduls ist, vor Cells UND vor Range angegeben werden.
Gruß Daneil
Anzeige
AW: VBA Schleife & If.. Then Next
20.11.2020 11:16:50
Yal
Hallo Viktor,
_ vermeide die Sprungmarke, benutze lieber separate Sub oder Function.
_ schneide dementprechend die Aufgaben in kleine Stücke.
_ achte auf das Einrücken (macht leichter zu lesen).
Das Erforschen der Problemstelle ist durch den Umfang verkompliziert. Wenn Du zertückelt, wirst Du wahrscheinlich selber entdecken, wo es klemmt.
Es kann nicht 2 Dateien mit demselben Name geben. Es sei denn in 2 unterschiedlichen Verzeichnisse. Da ist die Erklärung nicht ausreichend.
Viel Erfolg
Yal
AW: VBA Schleife & If.. Then Next
20.11.2020 11:19:20
Edmund
Hallo viktor
Ich bin jetzt absolut kein Profi.
Aber den Code empfinde ich als Alptraum.
Eine Mischung aus Makrorecorder und ich weiß nicht was...
Dein eigentliches Problem:
Du vergleichst eine einzelne Zelle mit einem Bereich aus mehreren Zellen.
Das funktioniert nicht.
In dem Fall muss Zelle für Zelle verglichen werden.
Des Weiteren:
Der Befehl GoTo kommt direkt aus der Hölle und ist auch in deinem Fall unnötig.
Wenn ich den Code richtig verstehe benutzt du das GoTo, um die For Next Schleife zu unterbrechen.
Statt GoTo ein exit For ist da wesentlich besser.
Und nicht zuletzt:
.Activate und .Select haben in einem Code nichts verloren.
Gruß
Edmund
Anzeige
AW: VBA Schleife & If.. Then Next
20.11.2020 11:32:06
Yal
@Edmund: ich gebe Dir zwar Recht, aber dem Anfänger sei es zu verzeihen.
Ich finde es toll, wenn man die Sache in der Hand nimmt und sich nicht entmutigen lässt.
Sogar die Fehlerbeschreibung an sich ist eine harte Schule.
Sprungmarke ("Goto") sind aber bei Fehlerhandling sinvoll:
Sub DiesUndDas()
On Error GoTo Catch
Try:
GoTo Finally 'Alles ohne Fehler gelaufen
Catch:
'Hier Fehlerbehandlung
Finally:
'Fehler-unabhängige Abschluss-Bereinigung, wie z.b.
Application.ScreenUpdating = True
End Sub
setzt aber voraus, dass die Aufgaben klein unterteilt werden.
Viel Erfolg
Yal
Anzeige
AW: VBA Schleife & If.. Then Next
20.11.2020 11:44:20
Edmund
Hallo Yal
Hast natürlich recht. Und wie schon gesagt bin ich ja auch kein Profi und es gibt bestimmt elegantere Lösungen als meine Codes :)
Nur beim GoTo, da musste ich einfach grinsen und an meinen damaligen Lehrer denken, der immer Schaum vor dem Mund bekam, wenn den einer verwendet hat :D
Aber klar, beim On Error hat sogar der den ausnahmsweise erlaubt.
AW: VBA Schleife & If.. Then Next
20.11.2020 12:47:52
viktor0000000000
Hi,
sorry für den Code, das ist mein aller aller erster Code. Ich habe 0 Kenntnisse und habe mich der Herausforderung gestellt. Bis auf das Problem, würde ich die Zeilen rausnehmen, läuft der Code auch einwandfrei. Jeder (Name) erhält seine entsprechende Datei.
Leider hat das mit der Nennen des Sheets vor den Cells nicht funktioniert.
Ich glaube es liegt, wie schon erwähnt, daran, dass ich eine Zelle mit einem bestimmten Bereich an Zellen vergleichen möchte.
Versuche ich nur eine Zelle mit einer anderen Zelle zu vergleichen und sage dann: wenn zellen gleich dann Next.. funktioniert es.
Leider fällt mir nicht ein, wie ich dies in einer Schleife kombinieren soll.
LG
Viktor
Anzeige
AW: VBA Schleife & If.. Then Next
20.11.2020 13:54:51
Daniel
Hi
richtig. du kannst nicht einen Wert (einzelne Zelle) mit vielen Zellen (Zellbereich) vergleichen.
zumindest nicht mit "=".
Ausßerdem stellt sich die Frage: ob alle Zellen des Zellbereichs gleich der einzelnen Zelle sein müssen oder ob es ausreicht, wenn eine Zelle des Bereichs gleich ist.
wenn zweiteres der Fall ist, könntest du mit ZählenWenn / Worksheetfunction.CountIf arbeiten:
IF Worksheetfunction.CountIf(Range(Cells(6, 1), Cells(i-1, 1)), Cells(i, 1)) > 0 Then
Gruß Daniel
AW: VBA Schleife & If.. Then Next
20.11.2020 14:43:13
viktor0000000000
Hi Daniel,
danke für den Hinweis. Den Code habe ich so eingesetzt. Leider spuckt er mir weiterhin mehrere Email-Vorlagen mit dem selben Namen heraus.
If WorksheetFunction.CountIf(Sheets("Zuordnung").Range(Sheets("Zuordnung").Cells(6, 1), Sheets("Zuordnung").Cells(i - 1, 1)), Sheets("Zuordnung").Cells(i, 1)) > 0 Then
Else: GoTo Start
End If
Next i
LG
Viktor
Anzeige
AW: VBA Schleife & If.. Then Next
20.11.2020 14:44:40
Daniel
Mit der generellen Funktionsweise deines Codes habe ich mich noch nicht beschäftigt.
AW: VBA Schleife & If.. Then Next
20.11.2020 14:44:41
Daniel
Mit der generellen Funktionsweise deines Codes habe ich mich noch nicht beschäftigt.
AW: VBA Schleife & If.. Then Next
20.11.2020 17:46:23
Edmund
Hallo Viktor
Eine gangbare Lösung kann ich dir im Moment nicht anbieten, da ich zu wenig über dein Projekt weiß.
Aber immerhin weiß ich jetzt, warum es nicht funzt.
Wie schon gesagt ist der Befehl, eine einzelne Zelle mit einem Range zu vergleichen nicht zulässig.
Eigentlich müsste Excel mit einem Laufzeitfehler antworten. Warum tut es das nicht?
Ich habs jetzt gefunden. Das also passiert:
In deiner For Next Schleife definierst du i zunächstals 7
Dann sagst du Excel: vergleiche Zelle i,1 also 7,1 mit Bereich 6,1 bis i-1,1, also 6,1 bis 6,1.
Also im Klartext: Vergleiche A7 mit dem Bereich A6 bis A6.
Excel ist in solchen Dingen sehr tolerant und sagt A6 bis A6 ist eh nur eine Zelle und akzeptiert das.
Somit wird A7 mit A6 verglichen.
Dein Code sagt weiter: Wenn beide Zellen gleichen Inhalt haben, starte die Schleife von vorn, wenn nicht, verlasse die Schleife über den GoTo Befehl.
In diesem Fall sind die Zellen unterschiedlich. Wären sie gleich, würde die Schleife von vorn beginnen und der Befehl beim 2. Durchlauf heißen: Vergleiche A8 mit Bereich A6 bis A7. Und jetzt würde selbst das toleranteste Excel merken, dass das nicht geht und einen Laufzeitfehler bringen.
Kannst du leicht testen, indem du in beide Zellen das gleiche reinschreibst.
Das ist der Grund, warum deine doppelten Einträge nicht erkannt werden.
Für eine Lösung, wäre die Datei zu sehen nicht schlecht
Gruß
Edmund
Anzeige
AW: VBA Schleife & If.. Then Next
23.11.2020 21:50:49
viktor0000000000
Hallo Edmund,
du findest anbei die Datei. Bitte nicht erschrecken, ich bin absoluter Neuling.
Ich danke vielmals für die Mühe!!!
https://www.herber.de/bbs/user/141805.xlsm
PW: verteiler
Gruß Viktor

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige