Neue Datei erstellen in unterordner des Aktuellen

  • Excel

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    Neue Datei erstellen in unterordner des Aktuellen

    Hey Leute,

    folgendes habe ich vor:
    • über UserForm Mitarbeitersheet erstellen und es nach dem Mitarbeiter in Sheet 1 benennen (funktioniert prima)
    • Gleichzeitig zur erstellung des Mitarbeitersheet soll ein neues Workbook erstellt werden
      • Workbook.Add an sich funktioniert, aber ich kann es nicht wie ich möchte benennen (Mitarbeitername & " " & Year(Date))
      • Es soll nur ein Sheet eingefügt werden (klappt über Application.SheetsInNewWorkbook=1)
        • Dieses Sheet soll über die Copy Methode den Gleichen Sheetinhalt wie Mitarbeitersheet haben, das einzige was übernommen wird ist jedoch ein leeres Blatt und der Mitarbeitername als Sheetname.
        • Der Sheetname soll der Monatsname sein was ich über die MonthName(Month(Date)) Methode errreichen möchte.
      • Ich würde das Workbook gerne ansprechen können im Code, also eine Variable als Namen vergeben. Mein Ansatz wäre über dim und set und gleichzeitig eben Workbooks.Add

    Mein Größtes Problem ist jedoch folgendes:
    • Da ich nicht weiß wo der Ordner später landet und ich den Code somit vom CurDir ausgehen lassen möchte denke ich muss ich mit der FileSystem Klasse arbeiten.
    • Die Sub erhält von mir den Mitarbeiternamen, der gleichzeitig der Ordnername werden soll
    Dafür hätte ich folgenden ansatz:

    Visual Basic-Quellcode

    1. Sub neueArbeitsmappeAnlegen(ByVal Mitarbeitername As String)
    2. Dim NeueMappe As Object
    3. Set NeueMappe = Workbooks.Add
    4. FileSystem.MkDir (FileSystem.CurDir() & "\" & Mitarbeitername)
    5. FileSystem.ChDir (FileSystem.CurDir() & "\" & Mitarbeitername)
    6. NeueMappe.SaveAs Filename:=FileSystem.CurDir() & "\" & Mitarbeiter & Year(Date)
    7. End Sub



    Hier nochmal der Code um einen neuen Benutzer anzulegen, der auf meine Sub verweist:

    Visual Basic-Quellcode

    1. Private Sub cmdNeuenNutzeranlegen_Click()
    2. Dim i
    3. Dim Kennziffer As Byte
    4. Dim Passwort As Long
    5. Dim Mitarbeitername As String
    6. Kennziffer = lblNummer.Caption
    7. Passwort = 0
    8. Mitarbeitername = ""
    9. 'Benenne den Mitarbeiter
    10. If txtBoxMitarbeitername.Text = "Name" Then 'Wenn der Benutzer nichts eingegeben hat
    11. MsgBox "Geben sie den Namen des Mitarbeiters an", vbCritical 'Weise ihn darauf hin
    12. txtBoxMitarbeitername.SetFocus 'Setze automatisch die Auswahl auf das Textfeld
    13. ElseIf txtBoxMitarbeitername.Text = "" Then 'Wenn der Benutzer den Text aus dem Textfeld herausgelöscht hat
    14. txtBoxMitarbeitername.SetFocus 'Setze automatisch die Auswahl auf das Textfeld
    15. Else
    16. i = 2
    17. For i = 2 To 256
    18. If txtBoxMitarbeitername.Text = Sheets("Passwörter").Cells(i, 3) Then 'wenn der Text im Textfeld bereits in der Tabelle Existiert
    19. Select Case MsgBox("Dieser Mitarbeitername existiert bereits, möchten Sie ihn dennoch verwenden?", _
    20. vbYesNo, "Mitarbeitername existiert bereits!") 'Frage den Benutzer ob er dennoch diesen Namen eintragen möchte
    21. Case vbYes 'Wenn ihm das Bewusst ist
    22. Mitarbeitername = txtBoxMitarbeitername.Text 'Trage dem Namen in die Variable ein
    23. GoTo WeiterMitPasswort
    24. Case vbNo 'Wenn das nicht seine Absicht war
    25. txtBoxMitarbeitername.SetFocus 'Schicke ihn zurück zur Eingabe
    26. Exit Sub 'und beende diese Prozedur
    27. End Select
    28. ElseIf i = 256 And Not txtBoxMitarbeitername.Text = Sheets("Passwörter").Cells(i, 3) Then 'Wenn der Zähler am Ende angekommen ist und der Name auch hier nicht enthalten ist
    29. Mitarbeitername = txtBoxMitarbeitername.Text 'Gib der Variablen den Wert des Textfeldes
    30. End If
    31. Next
    32. End If
    33. 'Vergib ein Passwort
    34. WeiterMitPasswort:
    35. If Passwort1 = "0" Then 'Wenn das Passwort1 "0" heißt
    36. txtboxPasswort1.SetFocus 'Gib den Focus zurück zum Feld des ersten Passwortes
    37. MsgBox "Geben Sie bitte ein Passwort ein"
    38. Exit Sub 'Und beende diesen Prozess
    39. ElseIf Passwort2 = "0" Then 'Wenn das Passwortwiederholen "0" heißt
    40. txtboxPasswortwiederholen.SetFocus 'Gib den Focus zurück zum Feld des zweiten Passwortes
    41. MsgBox "Wiederholen die das Passwort bitte"
    42. Exit Sub 'Und beende diesen Prozess
    43. ElseIf txtboxPasswort1.Text = txtboxPasswortwiederholen Then 'Wenn die beiden Passwörter übereinstimmen
    44. For i = 2 To 256 'Gehe alle Zeilen von 2 bis 256 durch
    45. If txtboxPasswort1.Text = Sheets("Passwörter").Cells(i, 2) Then 'Wenn diese Zelle mit dem Passwort übereinstimmt
    46. MsgBox "Dieses Passwort ist leider schon vergeben", vbCritical 'Weise den Benutzer darauf hin, dass dieses Passwort bereits vergeben ist
    47. txtboxPasswort1.Text = 0 'Setze den Wert des Textfeldes zurück
    48. txtboxPasswortwiederholen.Text = 0 'Setze den Wert des Textfeldes zurück
    49. txtboxPasswort1.SetFocus 'Gib den Fokus zurück auf das Feld des ersten Passwortes
    50. Exit Sub 'Beende den Prozess
    51. End If
    52. Next i 'Wiederhole die Schleife, wenn die Bedingung nicht erfüllt wurde
    53. Passwort = txtboxPasswort1.Text 'Gib der Variablen diesen Wert
    54. End If
    55. Call Mitarbeiteranlegen(Mitarbeitername, Passwort, Kennziffer)
    56. End Sub


    Ich hoffe irgendwer blickt da noch nurch und kann mir helfen...

    Liebe Grüße
    Kathleen
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    Hallo,

    wie wäre es, wenn Du die Mappe hier mit anhängst? Der Pfad der aktuellen Mappe ist

    Visual Basic-Quellcode

    1. ThisWorkbook.Path
    Wenn da nix ausgegeben wird, dann wurde die noch nicht gespeichert.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    ich habe das bisher mit curDir (also dem aktuellen pfad der Arbeitsmappe) ausgeführt und der gab auch brav im Debugg Modus den Korrekten Pfad an, wo die abliegt. daran kann es also nicht liegen. Aber du hast schon in sofern recht, dass der die nicht speichert. Ich habe das zwar mit saveAs versucht auszuführen, aber der lässt die Mappe auch schon garnicht ansprechen. Meine Intention wäre nämlich gewesen ihm zu sagen
    "Erstelle den Pfad" laut internet geht das über FileSystem.MkDir (er hat allerdings noch nie einen pfad erstellt)
    "Erstelle die Mappe" also Workbooks.Add
    "Speichere diese Mappe unter dem Namen, den du aus dem Namen des Mitarbeiters und dem Aktuellen Jahr entnimmst" also Workbook.SaveAs Filename:=CurDir & "\" & Mitarbeiter & Year(Date)

    Also ich sehe derzeit das Problem, dass er das neu erstellte wkb nicht einer Variablen zuordnen möchte mit der ich sie aufrufen kann und dass er keinen Ordner erstellen mag.

    LG Kathleen
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    Hallo,

    die angehängte Excel Mappe erstellt eine neue Datei, welche das Blatt Vorlage enthält in einem Unterornder, dessen Name aus dem Sheet "Namen" geholt wird.

    Hier der Code darin:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Sub cmdStart_Click()
    3. Dim WB As Workbook
    4. Dim Pfad As String
    5. Set WB = Workbooks.Add
    6. ThisWorkbook.Sheets("Vorlage").Copy before:=WB.Sheets(1)
    7. On Error GoTo Fehler
    8. Application.DisplayAlerts = False
    9. While WB.Sheets.Count > 1
    10. WB.Sheets(2).Delete
    11. Wend
    12. Pfad = ThisWorkbook.Path
    13. If Right$(Pfad, 1) <> "\" Then
    14. Pfad = Pfad & "\"
    15. End If
    16. Pfad = Pfad & ThisWorkbook.Sheets("Namen").Cells(2, 1).Text & "\"
    17. OrdnerAnlegen Pfad
    18. Pfad = Pfad & ThisWorkbook.Sheets("Namen").Cells(2, 1).Text & "-" & Format(Now, "HHMMNN") & ".xlsx"
    19. WB.SaveAs Pfad
    20. Fehler:
    21. Application.DisplayAlerts = True
    22. Set WB = Nothing
    23. Unload Me
    24. End Sub
    25. Public Sub OrdnerAnlegen(ByVal sPfad As String)
    26. Dim arr
    27. Dim b As Byte
    28. Dim bb As Byte
    29. Dim fSO As Object
    30. Dim Pfad As String
    31. arr = Split(sPfad, "\", , vbTextCompare)
    32. If IsArray(arr) Then
    33. 'Set fSO = CreateObject("Scripting.FileSystemObject")
    34. For b = 0 To UBound(arr)
    35. Pfad = ""
    36. For bb = 0 To b
    37. Pfad = Pfad & arr(bb) & "\"
    38. Next
    39. If FileSystem.Dir(Pfad, vbDirectory) = "" Then
    40. FileSystem.MkDir Pfad
    41. End If
    42. Next b
    43. Set fSO = Nothing
    44. End If
    45. End Sub


    Edit:
    fSO kannst Du ignorieren, ich nutze sonst immer das FileSystemObjekt, habe es aber auf das Filesystem von Excel geändert.
    Dateien
    • Test.zip

      (14,39 kB, 235 mal heruntergeladen, zuletzt: )
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „peterfido“ ()

    Hey,
    könntest du mir bitte erklären wie der Code nach der Zeile mit dem arr=Split... zu verstehen ist? ich blicke da nicht durch... du Prüfst ob der Pfad wirklich ein Pfad ist, soviel verstehe ich. Aber ab da ist mir schleierhaft was der code anstellt.

    Edit: Hab es grade mal im Einzelschritt nachverfolgt :D funktioniert. Versuche es jetzt mal in meine Mappe zu übertragen.
    LG Kathleen
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kathleen“ ()

    Hey,

    also das Erstellen der Mappe funktioniert nun Super, aber nun ist ein für mich etwas rätselhaftes Index Problem aufgetaucht.
    Soweit ich weiß kann ich mit dem Satz "Dim iRow" danach iRow jeden erdenklichen Zahlenwert geben, den ich möchte (er soll nur bis 256 maximal zählen)
    Allerdings spuckt er mir nun einen hübschen "Index außerhalb des gültigen Bereiches" aus, wenn ich folgenden Code ausführe um eine langweilige ComboBox mit Items zu füllen.

    Visual Basic-Quellcode

    1. Private Sub UserForm_Activate()
    2. Dim iRow
    3. iRow = 2
    4. If cboBestehendenBenutzerAuswählen.ListCount > 0 Then
    5. cboBestehendenBenutzerAuswählen.Clear
    6. Else
    7. Do Until IsEmpty(Sheets("Passwörter").Cells(iRow, 2)) Or iRow = 256
    8. cboBestehendenBenutzerAuswählen.AddItem (Sheets("Passwörter").Cells(iRow, 1) & " " & Sheets("Passwörter").Cells(iRow, 3))
    9. iRow = iRow + 1
    10. Loop
    11. End If
    12. End Sub


    Ich sehe da keinen Grund für ihn so auszurasten...

    Lg Kathleen

    Edit: habe es schon behoben indem ich ThisWorkbook.Sheets.... genommen habe und den Zähler als Byte genommen habe und halt einen Benutzer weniger in meine Liste aufnehme.
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kathleen“ ()

    datsspeed schrieb:

    VB.NET-Quellcode

    1. IO.Directory.CreateDirectory(IO.Directory.GetCurrentDirectory() & "\" & Mitarbeitername)



    datsspeed schrieb:

    VB.NET-Quellcode

    IO.Directory.CreateDirectory(IO.Directory.GetCurrentDirectory() & "\" & Mitarbeitername)


    Dieses Element nimmt VBA nicht an. Das Objekt heißt da FileSystem.Dir beispielsweise. Peterfido lag da schon ganz richtig mit seinem Code, aber danke dir auch Datsspeed
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True

    Kathleen schrieb:

    Hey,
    könntest du mir bitte erklären wie der Code nach der Zeile mit dem arr=Split... zu verstehen ist?


    Oft scheitert es daran, eine ganze Ordnerstruktur auf einmal anzulegen. Daher gehe ich da alle Unterordner Stück für Stück durch und erstelle die dann einzeln.

    Also statt d:\Odner1\Ordner2\Ordner3

    erst D:\
    dann d:\Odner1\
    dann d:\Odner1\Ordner2\
    dann d:\Odner1\Ordner2\Ordner3\

    und da jedesmal vorher prüfen, ob er schon existiert.

    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Hm ok... du hast so einen schönen Codeteil da drin, also dass er das 2. Blatt löschen soll. Ich gehe mal davon aus dass eine Copy anweisung einen Fehler ausgibt, wenn ein Tabellenblatt mit gleichem Namen erstellt wird. Kann ich exakt diesen Fehler beim auftreten abfangen und ihm anweisungen für den Fall geben? Ich habe mal was von Err.Number gelesen, aber habe es bisher nicht geschafft, einen Code zu formulieren, der meinen Fehler abfängt... Also er soll bei dem Fall bereits existierendes Blatt das Existierende durch die neue Kopie ersetzen...
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    Hallo,

    ich erstelle "da oben" eine neue Mappe. Da ich nicht weiß, wieviel Tabellen die beinhaltet, lösche solange die zweite Tabelle, bis es nur noch eine gibt. Die erste ist ja die Vorlage, welche ich ganz vorn eingefügt habe.

    Wenn Du ein Sheet kopierst, dessen Name schon vorhanden ist, packt Excel da normal eine fortlaufende Nummer an den Namen. Wenn der Name zu lang ist, passt das nicht mehr. Da muss man auch aufpassen, dass die Klammern wieder geschlossen sind, sonst fallen einige Tabellenblattfunktionen auf die Nase.

    Willst Du ein Tabellenblatt so benennen, wie schon eins heißt, gibt es den "multifunktionalen" Fehler 1004. Du könntest vorher durchgehen, ob es ein Blatt mit dem Namen schon gibt.

    Z.B. mit einer Funktion:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public Function NeueTabelle(ByVal WorkbookName As String, ByVal TabellenName As String) As String
    3. Dim WB As Workbook
    4. Dim WS As Worksheet
    5. Dim SH As Worksheet
    6. Dim OK As Boolean
    7. Set WB = Workbooks(WorkbookName)
    8. Set WS = WB.Sheets.Add
    9. While OK = False
    10. OK = True
    11. For Each SH In WB.Sheets
    12. If SH.Name = TabellenName Then
    13. TabellenName = TabellenName & "1"
    14. OK = False
    15. End If
    16. Next
    17. Wend
    18. WS.Name = TabellenName
    19. NeueTabelle = TabellenName
    20. Set WS = Nothing
    21. Set WB = Nothing
    22. End Function


    Diese dann aufrufen:

    Visual Basic-Quellcode

    1. Private Sub test()
    2. Dim sName As String
    3. sName = NeueTabelle(ThisWorkbook.Name, "Tabelle1")
    4. Debug.Print sName
    5. End Sub

    Das gibt dann im Direktfenster den neuen Namen aus, mit dem Du weiterarbeiten kannst. Der steht dann auch gleich in sName.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    kann ich auch irgendwie wirklich mit der Fehlernummer Fehler abfangen? Das wäre hilfreich... dann kann ich bekannte fehler abfangen und Fehler die ich darin nicht behandel treten anders als bei "on error resume next" immernoch auf. Habt ihr da eine lösung?
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    Hallo,

    in diesem Fall wirft er den Fehler 1004. Dieser hat mehrere Bedeutungen. Da müsstest Du dann auch noch den Fehlertext mit auswerten. Dieser ist abhängig von der Sprachversion.

    Z.B. so:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Public Type tFehler
    3. Nummer As Integer
    4. Text As String
    5. End Type
    6. Public Function NeueTabelle(ByVal WorkbookName As String, ByVal TabellenName As String) As tFehler
    7. Dim WB As Workbook
    8. Dim WS As Worksheet
    9. Set WB = Workbooks(WorkbookName)
    10. Set WS = WB.Sheets.Add
    11. Err.Clear
    12. On Error Resume Next
    13. WS.Name = TabellenName
    14. NeueTabelle.Nummer = Err.Number
    15. NeueTabelle.Text = Err.Description
    16. Err.Clear
    17. On Error GoTo 0
    18. Set WS = Nothing
    19. Set WB = Nothing
    20. End Function
    21. Private Sub test()
    22. Dim erg As tFehler
    23. erg = NeueTabelle(ThisWorkbook.Name, "Tabelle1")
    24. Debug.Print "Fehler " & erg.Nummer & ":" & erg.Text
    25. End Sub


    Fehler 1004:Dieser Name wird bereits verwendet. Verwenden Sie einen anderen.

    Gruß
    Peterfido

    Keine Unterstützung per PN!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „peterfido“ ()

    was machst du bei "OnError GoTo 0" ich finde deine Sprungmarke nicht...
    Und ich würde bei dem Auftreten des fehlers, der bei mir vermutlich oft auftreten wird, eine ElseIf auslösen die das bestehende wb ersetzt. Das ersetzen an sich sollte klappen, nur die abfrage beim fehler steht noch nicht.
    Sowas wie

    Visual Basic-Quellcode

    1. ElseIf Fehler.Num="1004:Dieser Name wird bereits verwendet. Verwenden Sie einen anderen." Then
    2. 'Meine Anweisungen für Ersetzen'
    3. End If

    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kathleen“ ()

    Visual Basic-Quellcode

    1. Sub neueArbeitsmappeAnlegen(ByVal Mitarbeitername As String)
    2. Dim WB As Workbook
    3. Dim Pfad As String
    4. Set WB = Workbooks.Add
    5. ThisWorkbook.Sheets(Mitarbeitername).Copy before:=WB.Sheets(1)
    6. On Error GoTo Fehler
    7. Application.DisplayAlerts = False
    8. While WB.Sheets.Count > 1
    9. WB.Sheets(2).Delete
    10. Wend
    11. Pfad = ThisWorkbook.path
    12. If Right$(Pfad, 1) <> "\" Then
    13. Pfad = Pfad & "\"
    14. End If
    15. Pfad = Pfad & Mitarbeitername & "\"
    16. Call OrdnerAnlegen(Pfad)
    17. Pfad = Pfad & Mitarbeitername & "-" & Format(Now, "YYYY") & ".xlsx"
    18. WB.Sheets(Mitarbeitername).Name = MonthName(Month(Date))
    19. WB.SaveAs Pfad
    20. Fehler:
    21. Application.DisplayAlerts = True
    22. Set WB = Nothing
    23. Exit Sub


    kannst du mir sagen was dein On Error abgreift? Welcher Fehler kann da auftreten? Ich habe das Unload me nur mit Exit Sub ersetzt. Ein Beenden der Userform möchte ich nich :D
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    Hallo,

    ich schalte die Rückfragen ab, bevor ich überflüssige Sheets lösche. Sonst würde Excel jedesmal fragen, ob das Tabellenblatt gelöscht werden soll. Fällt da was auf die Nase, soll er in jedem Fall die Meldungen wieder einschalten. Sonst fragt Excel auch nicht mehr, ob geänderte Dateien gespeichert werden sollen, was fatal sein kann.
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    peterfido schrieb:

    Willst Du ein Tabellenblatt so benennen, wie schon eins heißt, gibt es den "multifunktionalen" Fehler 1004. Du könntest vorher durchgehen, ob es ein Blatt mit dem Namen schon gibt.
    Man könnte zum Abprüfen auch eine kleine Funktion schreiben.

    Visual Basic-Quellcode

    1. Function SheetExists(ByVal Sheetname as String, Optional ByVal wb as Workbook) As Boolean
    2. If wb is Nothing Then Set wb=ThisWorkbook
    3. On Error Goto Done
    4. SheetExists = wb.Sheets(Sheetname).Name = Sheetname
    5. Done:
    6. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,

    ja, das ist Plan B. Nur müsste man dann den Namen ändern und wieder prüfen. Das mache ich alles in der einen Funktion. Was ich da nicht abgedeckt habe ist, ob evtl. schon die maximale Anzahl an Sheets vorhanden sind.
    Gruß
    Peterfido

    Keine Unterstützung per PN!

    peterfido schrieb:

    Hallo,

    ob evtl. schon die maximale Anzahl an Sheets vorhanden sind.


    *erstaunt gucke* es gibt bei excel eine maximale anzahl an sheets? das gerücht habe ich schonmal gehört... könnt ihr mir dazu eine zahl nennen?

    Function SheetExists(ByVal Sheetname as String, Optional ByVal wb as Workbook) As Boolean
    If wb is Nothing Then Set wb=ThisWorkbook
    On Error Goto Done
    SheetExists = wb.Sheets(Sheetname).Name = Sheetname
    Done:
    End Function


    ich habe da bedenken dass vba das mag... du sagst ihm im set satz, er soll das neue Workbook gleich dem ThisWorkbook machen, was ja falsch ist... nur das Tabellenblatt soll kopiert und eingefügt werden...
    wenn das aber schon da ist (was excel ja als bekannten fehler ausgibt) soll das alte blatt ersetzt werden.
    mein ansatz wäre da folgender:

    Visual Basic-Quellcode

    1. If err.Number =1004 AND err.Discription = "Dieser Name wird bereits verwendet. Verwenden Sie einen anderen." Then
    2. BestehendesWorksheet.Name = "Ich will gelöscht werden"
    3. ThisWorkbook.Sheets(Mitarbeiter).Copy After:=Workbooks(Pfad & Pfaderweiterung).Sheets(MonthName(Month(Date)-1)
    4. Workbooks(Pfad & Pfaderweiterung).Sheets(Mitarbeiter) = MonthName(Month(Date))

    letzteres soll das blatt umbennen, aber ich weiß nicht genau welche eigenschaft von Sheet ich da ansprechen soll, weil es Name nicht gibt...
    "Der Visual Basic ist nur so schlau wie der, der davor sitzt" - Na schön! Dann steh ich eben auf!

    "Wenn du denkst es geht nicht mehr kommt irgendwo ein Lichtlein her"
    If Tunnel.Licht = JemandImTunnelDerVerzweifeltIst Then Licht.Aus = True
    Hallo,

    ich würde den Fehler 1004 mit dem Fehlertext nur als letzte Möglichkeit nutzen. Wer weiß, welche Sprachversion istalliert ist, bzw. ob der genaue Wortlaut die nächsten Excelversionen / -updates übersteht.

    Die Eigenschaft "Name" gibt es. Diese spreche ich in meinen Beispielen oben an. Z.B. Post11. Da könntest Du in Zeile 17 der vorhandenen Tabelle einen neuen Namen geben, damit dessen Name für die neue Tabelle frei wird.

    Edit:
    Die maximale Anzahl Arbeitsblätter pro Mappe ist Speicherabhängig. Die Fehlermeldung, dass zuviele verschiedene Formate genutzt werden kommt öfter als die, dass "Blätter knapp" werden.
    Gruß
    Peterfido

    Keine Unterstützung per PN!