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 m-o Profi (22.8k Punkte)

Hallo SnowWhite,

da hatte ich heute morgen nur eine Private Sub Schlüssel_Daten_löschen gesehen (war wohl noch nicht ganz wach blush).

der Code hier muss natürlich auch auf die Testtabelle angepasst werden:

With Worksheets("Test")
       arrTabellen = .Range(.Cells(1, 1), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, 1))
End With

Mit der Schleife mit LBound (Lower Bound = untere Grenze = 1. Element in Array) und UBound (Upper Bound = obere Grenze = letztes Element in Array) wird das Array vom 1. bis zum letzten Element durchlaufen, hier also die Liste der eingelesenen angelegten Tabellenblätter.

Gruß

M.O.

0 Punkte
Beantwortet von snowwhite Mitglied (121 Punkte)

Guten Morgen M.O.

Brauchst du noch eine Kaffee wink *einmal rüber reichen*
Ich hab es eh so Laufzeitfehler '13' Typen unverträglich

Aber ich hab gerade gesehen das im "Lokal" Fenster die arrTabellen mit den Werten "Leer" sind. und mir gerade der Knopf aufgegangen ist das ja in der TB "Test" nichts drinnen steht, weil ich quasi nur die Datei geöffnet und habe, Und bei mir steht noch in der TB "urliste" Liste 1,..... und ich ja keine neuen Tabellen generiert habe die er ja in die TB "Test" rein schreibt. Schreit er desswegen mit dem Meldung "Laufzeitfehler '13' Typen unverträglich ?

GLG SnowWhite

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

wenn in der Testtabelle nichts drin steht, dann kommt es zu diesem Fehler.

Da könnte man beim "Feintuning" der Tabelle noch eine Prüfroutine einbauen.

Gruß

M.O.
0 Punkte
Beantwortet von snowwhite Mitglied (121 Punkte)
Bearbeitet von snowwhite

Hallo M.O.

Hmm zu früh gefreut sad
Ich hab gerade eine TB "Neu generiert" aber er hängt auch weiterhin an der selben Stelle sad
Laufzeitfehler '13' Typen unverträglich

In der TB "Test" steht jetzt nur "Liste 4" und sonst keine anderen Werte. Das heißt wenn ich Dich richtig verstanden habe, brauchen wir in der TB "Test" ein ganzes Array ? Wenn "JA" dann ist der Knopf aufgegangen. 
 

Ich hab ja in der Datei die TB Liste 1, Liste 2, Liste 3 wo auch werte eingetragen sind (ich weiß nicht ob die Listen bei dir auch noch vorhanden sind) Habe jetzt Tabelle 4, Tabelle 5, Tabelle 6 in die TB "urliste" eingetragen, dann den "TB generieren" Button gedrückt. Er hat die Tabelle 4, Tabelle 5, Tabelle 6 in die TB "Test" eingetragen und erstellt. und die Datei gespeichert und geschlossen. Dann die Datei wieder geöffnet und den "JA" Button von der Form gedrückt aber es passiert nicht sad keine Reaktion. Tabelle 4, Tabelle 5, Tabelle 6 hab ich aber keine Werte eingetragen. aber in 1, Liste 2, Liste 3 wo die Werte drinnen stehen da schickt er keine Mails weg, bzw löscht er auch nicht die ZellenInhalte sad (Punkt 1)

Dann habe ich die Tabelle 4, Tabelle 5, Tabelle 6 die ich ja neu generiert habe befüllt mit werte, habe dann die Datei safe & close: Dann new open, und den "JA" Button von der Form gedrückt dann hat er allerdings nur die Mails aus den Tabelle 4, Tabelle 5, Tabelle 6 also quasi die Neu erstellten die in der TB "Test" durchlaufen aber die 1, Liste 2, Liste 3 die nicht in der TB "Test" drinnen stehen weil die ja schon vorhanden waren die ist er nicht durchlaufen (Punkt 2) 

Kannst du mir noch folgen ?wink

GLG SnowWhite 

P.S. Hilfeee ich SCHREI GLEICH angry wenn die auf die Idee kommen Sie brauchen die Tabelle 6 nicht mehr und Sie löschen die Tabelle 6 und safe & closed. und die Datei wieder neu öffnen und den "JA" Button drücken dann steht der wieder in der Sub_Schlüssel_löschen in der Zeile "With This Workbook.Worksheets (arrTabellen (t,1)) Mit dem Laufzeitfehler '9' Index außerhalb des gültigen Bereichs !!!

Da tipp ich auf die TB "Test" ? Weil dort noch der Eintrag "Liste 6" drinnen steht ? Kann das sein ?

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

der Fehler kommt, wenn nur ein Tabellenblatt angelegt wird. Falls es vorkommen kann, dass nur ein Tabellenblatt angelegt wird, müsste ich das noch mal überarbeiten.

Blende mal das Tabellenblatt "Test" ein und schreibe in die Zellen A1 bis A3 Liste 1 bis Liste 3 und lasse dann noch mal das Check-Makro laufen.

Das Makro durchläuft ja nur die Tabellenblätter, die in dem Tabellenblatt "Test" stehen. Falls auch später noch Tabellenblätter angelegt werden können, dann müsste ich auch da nochmal das Anlegen-Makro überarbeiten, damit die Liste kontinuierlich fortgeschrieben wird. Momentan wird ja immer ab A1 der Name der anzulegenden Tabelle in das versteckte Tabellenblatt geschrieben.

Gruß

M.O.
0 Punkte
Beantwortet von snowwhite Mitglied (121 Punkte)

Hallo M.O..

der Fehler kommt, wenn nur ein Tabellenblatt angelegt wird. Falls es vorkommen kann, dass nur ein Tabellenblatt angelegt wird, müsste ich das noch mal überarbeiten.

Das war mir dann auch klar nachdem du mir die LBound und UBound erklärt hast, das er da desshalb meckert. Da der Projektleiter heute nicht da ist muß ich schauen ob ich das Morgen mit Ihm klären "Ob geplant ist zwischen durch nur eine "neue" Tabelle zu erstellen sad

Blende mal das Tabellenblatt "Test" ein und schreibe in die Zellen A1 bis A3 Liste 1 bis Liste 3 und lasse dann noch mal das Check-Makro laufen.

Ich habe die  Liste 1 bis Liste 3 in das TB "Test" eintragen und das hat ohne Probleme dann funktioniert winkWas mir ja jetzt auch klar ist weil wir arbeiten ja jetzt mit der "Test" TB die er durchläuft.

Falls auch später noch Tabellenblätter angelegt werden können, dann müsste ich auch da nochmal das Anlegen-Makro überarbeiten, damit die Liste kontinuierlich fortgeschrieben wird. Momentan wird ja immer ab A1 der Name der anzulegenden Tabelle in das versteckte Tabellenblatt geschrieben.

Das muss ich mit dem Projektleiter auch noch mal abklären ob Nachträglich bzw zwischen Durch TB angelegt werden.

wenn die auf die Idee kommen Sie brauchen die Tabelle 6 nicht mehr und Sie löschen die Tabelle 6 

Bzw diesen Punkt muss auch noch geklärt werden. Ob TB aus der Arbeitsmappe auch gelöscht werden (weil die stehen ja auch in der dann weiterhin in der TB "Test" drinnen.

Momanten kämpfe ich gerade mit der Sub Schlüssel_Daten_löschen weil er da irgendwie Spalteninhalte löscht die er gar nicht löschen soll bzw nicht definiert sind angry

GLG SnwoWhite

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

Hallo SnowWhite,

wenn Tabellenblätter gelöscht werden, müsste man noch eine Routine einbauen, die prüft, ob das Tabellenblatt vorhanden ist.

In der Sub Schlüssel_löschen werden ja die Spalten gelöscht:

 If .Cells(i, 3).Value = "x" Then
                .Cells(i, 4).ClearContents            'Spalte D
                .Cells(i, 6).ClearContents            'Spalte F
                .Cells(i, 9).ClearContents            'Spalte I
                .Cells(i, 12).ClearContents           'Spalte L
                .Cells(i, 13).ClearContents           'Spalte M
                .Cells(i, 14).ClearContents           'Spalte N
            End If

Wurden aus dem Vordruck Spalten gelöscht. Du hattest ja geschrieben, dass einige Spalten nicht mehr gebraucht werden. Dann müsste man natürlich auch hier im Code die Spalten anpassen.

Gruß

M.O.

0 Punkte
Beantwortet von snowwhite Mitglied (121 Punkte)

Guten Morgen M.O.

Wurden aus dem Vordruck Spalten gelöscht. Du hattest ja geschrieben, dass einige Spalten nicht mehr gebraucht werden. Dann müsste man natürlich auch hier im Code die Spalten anpassen.

Genau es wurde Spalte D, E & J, gelöscht. Und schaut jetzt so! Aber ich hab das Problem gestern schon gefunden! Bin mit den Spaltenzahl durch einander gekommen frownTabelle

.Ahm bzgl dem Punkt

wenn Tabellenblätter gelöscht werden, müsste man noch eine Routine einbauen, die prüft, ob das Tabellenblatt vorhanden ist.

Also  es kann vorkommen das nach einen Jahr oder so auch TB aus der Mappe gelöscht werden können, wenn sie nicht mehr gebraucht werden. Also das heißt ich brauch eine Schleifen Abfrage ? in einer eigener Sub ? 

Und bzgl dem Punkt

Falls auch später noch Tabellenblätter angelegt werden können, dann müsste ich auch da nochmal das Anlegen-Makro überarbeiten, damit die Liste kontinuierlich fortgeschrieben wird. Momentan wird ja immer ab A1 der Name der anzulegenden Tabelle in das versteckte Tabellenblatt geschrieben.

Auch da ist die Info gekommen, das es durch aus sein kann das nach einem Jahr oder so einzelne oder mehrere TB gebraucht werden und die neu erstellt werden sollen. Aber der Ursprung ist: Das wenn die Datei fertig ist das die MA in die TB "urliste" mit den Daten z.B. 30 Datensätze für die neuen TB eintragen und die erstellt werden und die MA die neuen TB befüllen. Also muss man in der "Sub_Anlegen" wieder umschreiben ?

GLG SnowWhite

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

Hallo SnowWhite,

hier das geänderte Anlegen-Makro:

Sub Anlegen()
Dim Wiederholungen As Long
Dim wksL As Worksheet
Dim lngEinfZeile As Long

Set wksL = Worksheets("urliste")
Application.ScreenUpdating = False

For Wiederholungen = 1 To wksL.Cells(Rows.Count, 1).End(xlUp).Row

If wksL.Cells(Wiederholungen, 1) <> vbNullString Then
    'Name des neu angelegten Tabellenblatts wird in versteckte Tabelle geschrieben
    With Worksheets("Test")
       'letzte beschriebene Zeile in Spalte A ermitteln und um 1 erhöhen für neue Einfügezeile
       lngEinfZeile = .Cells(Rows.Count, 1).End(xlUp).Row + 1
       'falls letzte Zeile 1 ist, dann prüfen, ob in A1 etwas steht
       'falls Zelle A1 leer ist, dann 1. Einfügezeile auf 1 setzen
       If lngEinfZeile = 2 And .Range("A1") = "" Then lngEinfZeile = 1
       'Name des Tabellenblatts in verstecktes Blatt schreiben
       .Cells(lngEinfZeile, 1) = wksL.Cells(Wiederholungen, 1).Value
    End With
         
    Worksheets("Leer").Copy After:=Sheets(Sheets.Count) 'Tabellenblatt "Leer" wird kopiert
    With ActiveSheet
      'Neues Blatt umbenennen
      .Name = wksL.Cells(Wiederholungen, 1).Text 'Als TB Name des neu erstellten TB wird der Name aus der aktiven Zelle genommen von TB urliste.
      .Range("O2:O50") = wksL.Cells(Wiederholungen, 2).Value
    End With
  'Einträge in Tabelle urliste löschen
   With wksL
    .Range(.Cells(Wiederholungen, 1), .Cells(Wiederholungen, 2)).ClearContents
   End With
    
Else
Exit Sub
End If

Next

Set wksL = Nothing

Application.ScreenUpdating = True
End Sub

Das Makro Check-Mail habe ich jetzt so umgeschrieben, dass es auch ohne Fehler funktionieren sollte, wenn nur eine Tabelle angelegt ist. Gleichzeitig habe ich eine Prüfung eingebaut, die prüft, ob das Arbeitsblatt existiert:

Private Sub Check(ByVal Zeile As Long)
Dim Urgenz1 As String
Dim Urgenz2 As String
Urgenz1 = "x"
Urgenz2 = "x"
Dim i As Long
Dim t As Long
Dim b As Long
Dim lngLetzte As Long
Dim strTabelle As String
Dim wksTabellen As Worksheet

Set wksTabellen = ThisWorkbook.Worksheets("Test")
            
'Namen der neu angelegten Tabellenblätter aus versteckter Tabelle einlesen
'letzte beschriebene Zeile in Spalte A des versteckten Tabellenblatts ermitteln
lngLetzte = wksTabellen.Cells(Rows.Count, 1).End(xlUp).Row
'nun alle Zeilen dieses Blattes durchlaufen und die Namen der versteckten Tabellenblätter einlesen
For t = 1 To lngLetzte
  'Namen in Variable einlesen
  strTabelle = wksTabellen.Cells(t, 1).Value
  'prüfen, ob Tabelle in Arbeitsmappe existiert
  For b = 1 To ThisWorkbook.Worksheets.Count
    If Worksheets(b).Name = strTabelle Then
   
      With ThisWorkbook.Worksheets(strTabelle)
    
        For i = Zeile + 1 To .Cells(Rows.Count, 1).End(xlUp).Row
           If .Cells(i, 7).Value <> "" Then
            If (CDate(.Cells(i, 7).Value) < DateTime.Date) And (.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 .Cells(i, 7).Value <> "" And (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, strTabelle) 'Aufruf Prozedur "Send_Email()"
            End If
           End If
           If .Cells(i, 8).Value <> "" Then
             If .Cells(i, 8).Value <> "" And (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, strTabelle)  'Aufruf Prozedur "Send_Erinnerung"
             End If
           End If
        Next i
        
      End With
     End If
   Next b
Next t
        
'    Call MsgBox("Fertig!", vbOKOnly)
    
End Sub

Getestet habe ich es jetzt nicht. Schau mal, ob alles funktioniert.

Gruß

M.O.

0 Punkte
Beantwortet von snowwhite Mitglied (121 Punkte)

Hallo M.O.

Sorry nicht das du glaubst das ich dich so einfach so stehen lasse;-) Aber ich bin vor 3 Wochen gestürzt und daher im Krankenstand gewesen, Ich muss mich jetzt noch mal kurz dein Code testen und auch noch mal kurz nachlesen wo ich hängen geblieben bin vor dem Sturz :-) 

Ich sag dir dann bescheid ob die Änderungen funktionieren :-)

Bis dahin LG SnowWhite

...