1.8k Aufrufe
Gefragt in Tabellenkalkulation von

Hallo alle miteinanderwink

Ich bin hier im Forum eh auch schon alle Beiträge die irgendwie mit meinen Problem zusammen hängen durch gegangen und getestet aber ich finde den Fehler einfach nicht angry

Kurzerklärung. Die Datei wird geöffnet -> mit UserForm1.Show -> mit "Ja" bestätigt und mit Sub Mail() soll er den ganzen Code auf jedes TB ausführen. Nur irgendwie macht er das nicht er macht es immer nur für das akutelle TB angry wenn ich die Sub Mail() in jedem TB manuell aufrufe dann macht er es frown


Private Sub Workbook_Open()
UserForm1.Show
End Sub


Private Sub CommandButton1_Click()
Application.Run "Mail"
End Sub


Private Sub Mail()

Dim Zeile As Long
Zeile = 1
Check (Zeile)  'Sprung in den Aufruf Check()

End Sub

Private Sub Check(ByVal Zeile As Long)
    Dim WS As Worksheet
    Dim Urgenz1 As String
    Dim Urgenz2 As String
    Urgenz1 = "x"
    Urgenz2 = "x"
    Dim i As Long
    
    For Each WS In ThisWorkbook.Worksheets 'alle Tabellenblätter durchlaufen
    
    Const xlUp As Long = &HFFFFEFBE
    Debug.Print CStr(Cells(Rows.Count, 1).End(xlUp).Row) 
      
    For i = Zeile + 1 To Cells(Rows.Count, 1).End(xlUp).Row
        If (CDate(Cells(i, 7).Value) < DateTime.Date) And (CStr(Cells(i, 13).Value) = "x") Then ' Wenn Spalte "G" Datum = heutiges Datum & Spalte "M" auf "Leer" Dann
        'MsgBox "Email schon geschickt", vbInformation, "Fertig" 'Message Box als Hilfe stellung

        ElseIf (CDate(Cells(i, 7).Value) < DateTime.Date) And (CStr(Cells(i, 13).Value) = vbNullString) Then 'Wenn Spalte "G" Datum = heutiges Datum & Spalte "M" auf "Leer" Dann
            Cells(i, 13).Value = Urgenz1 'Füge Urgenz1 in Spalte M
            Call Send_Email(i)  'Aufruf Prozedur "Send_Email()"
        End If
        
        If (CDate(Cells(i, 8).Value) < DateTime.Date) And (CStr(Cells(i, 14).Value) = vbNullString) Then 'Wenn Spalte "H" Datum = heutiges Datum & Spalte "N" auf "Leer" Dann
            Cells(i, 14).Value = Urgenz2 'Füge Urgenz2 in Spalte N
            Call Send_Erinnerung(i)  'Aufruf Prozedur "Send_Erinnerung" 
        End If
    Next i
'    Call MsgBox("Fertig!", vbOKOnly)
    Next WS
End Sub


Kann mir bitte wer sagen was ich falsch mache und wo der verdammte Fehler ist cheeky. Bin echt schon am verzweifeln devil

Über dringende Hilfe wäre ich sehr dankbar.

LG SnowWhite

75 Antworten

0 Punkte
Beantwortet von snowwhite Mitglied (121 Punkte)
Bearbeitet von snowwhite

Guten Morgen M.O.

Also es hat alles bis jetzt gut funktioniert ^^  (tausend rote Rosen als Danke schön blush)
Am das Problem ist doch anders ^^ Wenn ich in der "uliste" in der Spalte A statt "Text" -> Zahl "1932" z. ein die dann generiere, was er auch macht ;-) dann speicher und schließe und dann nochmal die Datei öffne und dann auf "JA" oder "NEIN" button klicke dann kommt er mit der Meldung. Laufzeitfehler `9`und dann auf "Index auserhalb des gültigen Berreichs " und hupft in die "Sub Schlüssel löschen" 

Meldung

LCase da meintest du das es ja das in kleinbuchstaben umwandelt ^^ wenn ich das noch richtig in Erinnerung habe.

GLG SnowWhite

0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo SnowWhite,

freut mich, dass es dir wieder besser geht. Auch ich muss mich erst mal wieder in das Projekt hereinfinden smiley.

LCase wandelt einen Text in Kleinbuchstaben um, das ist richtig.

Wenn auch Zahlen als Dateinamen in Frage kommen können, dann ändere die oben markierte Zeile wie folgt ab:
With ThisWorkbook.Worksheets(CStr(arrTabellen(t, 1)))
Gruß
M.O.
0 Punkte
Beantwortet von snowwhite Mitglied (121 Punkte)

Hallo M.O.

Naja besser leider noch nicht :-( dauert noch 6 Wochen :-( aber da haben sie einen Anfall bekommen daher muss ich wieder ran angry

Ma du bist echt ein Schatz smiley Nach dem verdammten Umwandeln hab ich gesucht sad bzw hab ich das an der falschen Stelle gemacht angry

Ich hatte es versucht bei 

For t = LBound(arrTabellen) To UBound(arrTabellen)

Aber das hat leider nicht funktioniert :-( Warum weiß ich allerdings nicht ?
Aber deine Variation hat funktioniert  ;-)  (tausend rote Rosen als Danke schön blush

GLG SnowWhite

0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo SnowWhite,

ja ja, die lieben Arbeitgeber...

Mit der Codezeile

For t = LBound(arrTabellen) To UBound(arrTabellen)

wird ja nur der Zähler für das Durchlaufen des Arrays hochgezählt. Der Dateiname für das Arbeitsblatt wird aber in der oben geposteten Codezeile ausgelesen.

Dann wünsche ich dir gute Besserung und ein schönes Wochenende yes.

Gruß

M.O.

0 Punkte
Beantwortet von snowwhite Mitglied (121 Punkte)

Mahlzeit M.O:

Wollte dich an deinem wohlverdienten WE nicht noch stören :-)
Ach ja Stimmt hatte ich,hinterher nochmal die Comms nachgelesen und da hattest du es mir ja eh erklärt ^^

Also ich hab es jetzt bei mir komplett jetzt durch getestet ^^ hat alle funktioniert. Und hab es dem Projekt Leiter zum testen frei gegeben hoffe ich bekomme heute noch Rückmeldung, und es kommt nicht wieder Änderungen ;-)

Sag dir dann Bescheid :-)

GLG SnowWhite

0 Punkte
Beantwortet von snowwhite Mitglied (121 Punkte)

Hallo M.O.

Ich habs mir doch gedacht :-(

Ahm folgendes beim "Ja" button macht er im prinzip das ganze Modul durch ^^ Also "Check", "Löschen" & "Mail"
Er will jetzt das wenn er den "Nein" button klickt das er nur die Zeilen in den TB durch läuft und wo das "x" ist die Zeilen löscht und dann die "Form" geschlossen wird, Das schließen funktioniert ja und das "Löschen" auch nur das Problem er schickt ja auch gleichzeitig die Mails weg :-( weil in der " Sub Schlüssel_Daten_löschen()" ja unten die Mail() drinnen steht ;-)

Gibts da eine Option das er die " Sub Schlüssel_Daten_löschen()" durch führt wenn man auf den "nein" Button klickt ohne das er anschließend in die Mail() hupft ? 

Ich hätte sonst eine neue "Sub" gemacht und der einen anderen Namen genommen und hätte nur den Code von der " Sub Schlüssel_Daten_löschen()" genommen ohne der Mail()

GLG SnowWhite

0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)
Hallo SnowWhite,

ich muss mir das mal anschauen und melde mich dann noch einmal.

Gruß

M.O.
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo SnowWhite,

Ergänze im allgemeinen Modul vor Option Explicit die folgende Zeile:

Public strMail As String

Ändere Im VBA-Projekt der Userform den Code wie folgt:

Private Sub CommandButton1_Click()
strMail = "ja"
Application.Run "Mail"
Unload Me

End Sub

Private Sub CommandButton2_Click()
strMail = "nein"
Application.Run "Mail"
Unload Me

End Sub

Und schließlich noch die Änderungen (fett) im Check-Makro:

Private Sub Check(ByVal Zeile As Long)
    Dim WS As Worksheet
    Dim Urgenz1 As String
    Dim Urgenz2 As String
    Urgenz1 = "x"
    Urgenz2 = "x"
    Dim i As Long
    
    For Each WS In ThisWorkbook.Worksheets 'alle Tabellenblätter durchlaufen
    
    '-------< Die letzte benutzte Datenzeile kann man so herausfinden >--------
    Const xlUp As Long = &HFFFFEFBE
    Debug.Print CStr(WS.Cells(WS.Rows.Count, 1).End(xlUp).Row) ' ermittelt die erste Zelle ohne Wert (formatierte Zellen bleiben unberücksichtigt)
    '-------</ Die letzte benutzte Datenzeile kann man so herausfinden >--------
    
    For i = Zeile + 1 To WS.Cells(Rows.Count, 1).End(xlUp).Row
        If (CDate(WS.Cells(i, 7).Value) < DateTime.Date) And (CStr(WS.Cells(i, 13).Value) = "x") Then ' Wenn Spalte "G" Datum = heutiges Datum & Spalte "M" auf "Leer" Dann
        'MsgBox "Email schon geschickt", vbInformation, "Fertig" 'Message Box als Hilfe stellung

        ElseIf (CDate(WS.Cells(i, 7).Value) < DateTime.Date) And (CStr(WS.Cells(i, 13).Value) = vbNullString) Then 'Wenn Spalte "G" Datum = heutiges Datum & Spalte "M" auf "Leer" Dann
            WS.Cells(i, 13).Value = Urgenz1 'Füge Urgenz1 in Spalte M
            If strMail = "ja" Then Call Send_Email(i)  'Aufruf Prozedur "Send_Email()"
        End If
        
        If (CDate(WS.Cells(i, 8).Value) < DateTime.Date) And (CStr(WS.Cells(i, 14).Value) = vbNullString) Then 'Wenn Spalte "H" Datum = heutiges Datum & Spalte "N" auf "Leer" Dann
            WS.Cells(i, 14).Value = Urgenz2 'Füge Urgenz2 in Spalte N
            If strMail = "ja" Then Call Send_Erinnerung(i)  'Aufruf Prozedur "Send_Erinnerung"
        End If
    Next i
'    Call MsgBox("Fertig!", vbOKOnly)
    Next WS
End Sub

Schau mal, ob das dann so funktioniert wie gewünscht.

Gruß

M.O.

0 Punkte
Beantwortet von snowwhite Mitglied (121 Punkte)

Hallo M.O.

vielen Dank für deine Rückmeldung.
Ich habe deine  Änderungen umgesetzt, Ahm der "Ja" Button da schickt er zwar die Mail weg^^ aber löscht die Zellinhalte nicht weil er ja da nicht in die "Schlüssel_Daten_löschen" rein springt :-( in der ja die "Mail()" drinnen ist als Sprung ^^ 

Und der "Nein" Button setzt die "x" plötzlich in die "1.Urgenz" bzw "2.Urgenz"  was er nicht machen soll :-) sondern eigentlich nur die "Zelleninhalte" raus löschen ^^ was er leider mit deiner Änderung nicht macht :-(

Der eigentlich Sprung beginn ist ja von Private Sub Schlüssel_Daten_löschen() und dann in die Mail() müsste dann in der "Form" bei den Button bei:

"Application.Run "Mail" da statt "Mail" nicht "Schlüssel_Daten_löschen" stehen?
GLG SnowWhite
0 Punkte
Beantwortet von m-o Profi (22.7k Punkte)

Hallo SnowWhite,

ich habe wohl wegen der ganzen Änderungen etwas den Überblick verloren sad. Kannst du vielleicht noch einmal eine aktuelle Beispieldatei (ohne die Änderungen oben) hochladen, damit ich mir das noch einmal ansehen kann.

Gruß

M.O.

...