Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Schleife & If.. Then Next

VBA Schleife & If.. Then Next
24.11.2020 10:24:16
viktor0000000000
Hallo Community,
ich versuche mein Glück erneut und diesmal mit der Datei :-)
Vielleicht findet sich jemand der mein Problem lösen kann.
https://www.herber.de/bbs/user/141805.xlsm
PW: verteiler
Es geht um das Modul

Sub AnAlleVersenden
_________________________

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

Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Schleife & If.. Then Next
24.11.2020 11:25:17
Edmund
Hallo Viktor
Ich habe mal das Script bis zu deiner Fehlermeldung etwas gekürzt und deine Schleife angepasst.
Guck mal, ob das so funktioniert. Ich kann das leider nicht testen, da ich ja nicht deine Ordnerstruktur besitze.
Eine Änderung, die ich gemacht habe:
Ich gehe davon aus, dass alle Zeilen mit Namen überprüft werden sollen.
Deshalb ermittelt die For Next Schleife erstmal , bis zu welcher Zeile Einträge stehen, und arbeitet diese dann ab.
Wie gesagt, testen kann ich es nicht und bin deshalb gespannt auf deine Antwort.
https://www.herber.de/bbs/user/141814.xlsm
Gruß
Edmund
Anzeige
AW: VBA Schleife & If.. Then Next
24.11.2020 11:39:23
viktor0000000000
Hi,
vielen Dank!
Der erste Durchlauf mit F8 läuft sauber durch.
Beim zweiten Durchlauf sagt er mit einen Laufzeitfehler Typ 13 an; Typen unverträglich.
Debuggen bei Loop Until i = j Or j = ""
Gruß
Viktor
AW: VBA Schleife & If.. Then Next
24.11.2020 11:45:01
Edmund
Hallo Viktor,
sorry, da habe ich ja voll gepennt.
Ersetze mal die ganze Loop Zeile mit:
Loop Until i = j Or Cells(j, 1) = ""
Anzeige
AW: VBA Schleife & If.. Then Next
24.11.2020 11:26:03
UweD
Hallo
erstmal. Auf select kann in 99% verzichtet werden.
zum Fehler: ungetestet!!!
versuch das mal.

Option Explicit
Sub AnAlleVersenden()
'Wähle Spalte AD aus und erstelle eine Überschrift für die Spalte
With Sheets("Liste").Range("AD1")
.FormulaR1C1 = "Controller"
With .Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 8813846
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With .Font
.ThemeColor = xlThemeColorDark1
.TintAndShade = 0
.Bold = True
End With
End With
'Füge XVerweis hinzu
Sheets("Liste").Range("AD2:AD15236").FormulaR1C1 = _
"=XLOOKUP(RC[-29],Zuordnung!R7C3:R168C3,Zuordnung!R7C1:R168C1)"
Dim j As Integer
For j = 7 To 10
Dim i As Integer
For i = 7 To 10
ThisWorkbook.Worksheets("Zuordnung").Activate
'error.
If Sheets("Zuordnung").Cells(i, 1).Value = _
Sheets("Zuordnung").Cells(i - 1, 1).Value Then
Else: GoTo Start
End If
Next i
Start:
'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

LG UweD
Anzeige
AW: VBA Schleife & If.. Then Next
24.11.2020 11:29:46
peterk
Hallo
Nur die Schleife als Code.
Die zweite Schleife (i) war der Fehler, Du arbeitest bereits am 2. Namen (j=8) und prüfst dann ob der 1. Name (i=7) im Bereich "A6" vorhanden ist. Für den Zähler i ist dies nie der Fall! und somit schickt Du Deine Emails Doppelt und Dreifach.

Dim j As Integer
For j = 7 To 10
With ThisWorkbook.Worksheets("Zuordnung")
If WorksheetFunction.CountIf(.Range(.Cells(6, 1), .Cells(j - 1, 1)), .Cells(j, 1)) > _
0 Then
GoTo EmailGeschickt
End If
End With
'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
EmailGeschickt:
Next j

Anzeige
AW: VBA Schleife & If.. Then Next
24.11.2020 11:45:05
viktor0000000000
Hi Peter,
das wars! Es klappt! Wahnsinn..
Vielen Dank an alle die sich die Mühe gemacht haben.
Gruß
Viktor
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA Schleife & If.. Then Next in Excel


Schritt-für-Schritt-Anleitung

  1. Modul erstellen: Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen. Erstelle ein neues Modul, indem du mit der rechten Maustaste auf "VBAProject" klickst und "Einfügen" > "Modul" wählst.

  2. Code eingeben: Füge deinen VBA-Code in das Modul ein. Hier ist ein Beispiel, wie du eine einfache For Next Schleife mit If Then einbinden kannst:

    Sub AnAlleVersenden()
       Dim j As Integer
       For j = 7 To 10
           If Sheets("Zuordnung").Cells(j, 1).Value <> "" Then
               ' Hier kannst du deinen Code einfügen.
           End If
       Next j
    End Sub
  3. XLOOKUP verwenden: Wenn du eine Datenabgleichung benötigst, füge eine XLOOKUP-Formel hinzu:

    Sheets("Liste").Range("AD2").FormulaR1C1 = "=XLOOKUP(RC[-29],Zuordnung!R7C3:R168C3,Zuordnung!R7C1:R168C1)"
  4. Fehlerbehebung: Achte darauf, dass du die richtigen Zellen referenzierst, um Laufzeitfehler zu vermeiden.


Häufige Fehler und Lösungen

  • Typen unverträglich (Laufzeitfehler 13): Dieser Fehler tritt häufig auf, wenn du versuchst, unterschiedliche Datentypen zu vergleichen. Stelle sicher, dass du nur Werte des gleichen Typs vergleichst, z.B. Strings oder Zahlen.

  • Doppelte Emails versenden: Dies passiert, wenn du in der inneren Schleife (For i) auf denselben Namen zugreifst, während du in der äußeren Schleife (For j) bist. Achte darauf, die Schleifenbedingungen ordentlich zu definieren.

  • Verwendung von Select: Vermeide die Verwendung von Select oder Activate, um die Leistung zu verbessern. Du kannst direkt auf Zellen zugreifen, z.B. Sheets("Liste").Range("AD1").


Alternative Methoden

  • Verwendung von For Each Schleifen: Statt einer For Next Schleife, kannst du auch For Each verwenden, um durch alle Zellen in einem Bereich zu iterieren.

    Dim cell As Range
    For Each cell In Sheets("Zuordnung").Range("A7:A10")
       If cell.Value <> "" Then
           ' Dein Code hier
       End If
    Next cell
  • Benutze If And für komplexe Bedingungen: Wenn du mehrere Bedingungen kombinieren möchtest, kannst du If And verwenden:

    If Sheets("Zuordnung").Cells(j, 1).Value <> "" And Sheets("Zuordnung").Cells(j, 2).Value <> "" Then
       ' Dein Code hier
    End If

Praktische Beispiele

Hier ist eine praktische Anwendung des Codes, um Emails basierend auf einer Bedingung zu versenden:

Dim j As Integer
For j = 7 To 10
    If WorksheetFunction.CountIf(Sheets("Zuordnung").Range("A6:A" & j - 1), Sheets("Zuordnung").Cells(j, 1)) = 0 Then
        ' Email senden
    End If
Next j

In diesem Beispiel wird überprüft, ob der Name bereits gesendet wurde, bevor die Email verschickt wird.


Tipps für Profis

  • Verwende Option Explicit: Dies zwingt dich dazu, alle Variablen zu deklarieren, was die Fehlersuche erleichtert.

  • Nutze die VBA-Themecolor-Liste: Durch die Verwendung von .ThemeColor kannst du die Formatierung deiner Zellen einfacher anpassen.

  • Fehlerbehandlung einbauen: Implementiere On Error Resume Next um Laufzeitfehler zu ignorieren und die Ausführung fortzusetzen, wenn nötig.


FAQ: Häufige Fragen

1. Was ist eine For Next Schleife in VBA?
Eine For Next Schleife wird verwendet, um eine bestimmte Anzahl von Wiederholungen durchzuführen, basierend auf einem Zähler.

2. Wie kann ich Fehler in meinem VBA-Code finden?
Du kannst den Debugger nutzen, indem du F8 drückst, um den Code Schritt für Schritt auszuführen und zu sehen, wo der Fehler auftritt.

3. Was ist der Unterschied zwischen If und If Then in VBA?
If ist die Bedingung, während If Then die Aktion beschreibt, die ausgeführt wird, wenn die Bedingung wahr ist.

4. Wie sende ich Emails über VBA?
Verwende das Outlook-Objektmodell, um Emails zu erstellen und zu versenden, indem du Objekte wie Outlook.Application und Outlook.MailItem verwendest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige