Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
892to896
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
892to896
892to896
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Prüfung ob Tabellenblattname schon vorhanden...

Prüfung ob Tabellenblattname schon vorhanden...
07.08.2007 13:03:00
moppi
hi an alle profis,
habe ein problem...
habe eine sog. masterdatei (A) in der ich daten eingebe und über einen button das aktuelle tabellenblatt in eine externe datei (B) exportiere. dabei wird B geöffnet, das tabellenblatt herüberkopiert und der wert aus zelle A8 als tabellenblattname verwendet.
nun zum problem: wie kann ich beim kopieren und umbenennen eine prüfung einbauen, dass wenn der name schon vorhanden ist eine eingabeaufforderung erscheint, welche vom nutzer die manuelle namensvergabe des blattes fordert?
vielen dank schonmal vorab für eure AW's
gruß
moppi

31
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 13:24:00
Ramses
Hallo
Hier mal ein Ansatz
Option Explicit

Sub Test()
    Dim myWks As Worksheet
    Dim myName As String
    For Each myWks In Workbooks("DeineMappe.xls")
        If myWks.Name = "Dein Tabellenname" Then
            myName = InputBox("Bitte neuen Namen eingeben", "Name für: " & myWks.Name & " existiert bereits.")
            myWks.Name = myName
        End If
    Next
End Sub

Die Prüfung auf unzulässige Dateinamen (Zeichenlänge,Sonderzeichen usw) musst du noch einbauen, ebenso musst du abfangen, wenn der eingegebenen Name der gleiche ist und/oder wenn "Abbrechen" geklickt wird.
Gruss Rainer

Anzeige
AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 13:37:08
moppi
hi ramses,
besten dank für deinen ansatz...aber bei dem "noch einbauen" und "noch abfangen" hapert es gewaltig. das werde ich nicht hinbekommen, daher auch meine frage nach einer lösung für das gesamte prozedere...
gruß
moppi

AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 13:49:00
Ramses
Hallo
"...daher auch meine frage nach einer lösung für das gesamte prozedere...."
Danach hast du nicht gefragt, sondern wie man den Benutzer auffordert einen anderen Namen einzugeben.
Das habe ich dir gezeigt.
Das ganze in deine Prozedur einzubauen und abzustimmen, dazu habe ich nicht die Zeit.
Gruss Rainer

Anzeige
AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 14:26:00
Chaos
Servus moppi,
hier mal ein Ansatz für das ganze Prozedere:

Sub namen()
Dim nam As String, nam1 As String
Dim ws As Worksheet
nam1 = ThisWorkbook.Name
nam = Workbooks(nam1).ActiveSheet.Range("A8").Value
Workbooks.Open Filename:="C:\Dokumente und Einstellungen\Christian\Desktop\neu.xls"
For Each ws In Workbooks("neu.xls").Worksheets
If ws.Name = nam Then
On Error Resume Next
MsgBox ("Blattname existiert in der Zieldatei schon! Geben Sie einen anderen Namen ein!") _
n = InputBox("neuer Name!")
With Workbooks(nam1)
.Sheets(nam).Name = n
.Sheets(n).Copy After:=Workbooks("neu.xls").Sheets(1)
.Sheets(n).Name = nam
Workbooks("neu.xls").Save
Workbooks("neu.xls").Close
Exit Sub
End With
End If
Next ws
With Workbooks(nam1)
.Sheets(nam).Copy After:=Workbooks("neu.xls").Sheets(1)
End With
End Sub


neu.xls ist die Zieldatei
Gruß
Chaos

Anzeige
AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 14:41:23
Ramses
Hallo
On Error Resume Next
Das kanns aber dann ja wohl nicht sein,... oder ? :-)
Gruss Rainer

AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 15:57:42
Chaos
Servus Ramses,
naja, es gibt mit Sicherheit elegantere Lösungen, aber es funktioniert. :-))
Gruß
Chaos

AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 16:55:15
Ramses
Hallo
"... aber es funktioniert. ..."
Aber auch nur wenn Weihnachten und Ostern auf einen Tag fallen :-)

Sub demoName()
Dim shName As String, nameArr As Variant
shName = "Muster?"
On Error Resume Next
ActiveSheet.Name = shName
MsgBox "Ist der Name der aktiven Tabelle: """ & shName & """ ?", vbOKOnly, "Test"
End Sub


In dem von Dir genannten Beispiel ist das Ergebnis Zufall, weil Limitierungen wie:
1. Abbrechen in der Inputbox gedrückt
2. Dateinamen länger als 31 Zeichen
3. Sonderzeichen in Tabellennamen
4. Nur die Worksheets im Namenvergleich überprüft werden,... es gibt auch noch andere Sheets !! :-)
ganz einfach nicht berücksichtigt werden.
Das auffangen aller Möglichkeiten war die Anforderung :-)
Nimmst du an ?
Dann helfe ich Dir.
Gruss Rainer

Anzeige
AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 18:52:26
Chaos
Servus Rainer,
da hast du natürlich recht.
Aber für alle Fehler auffangen, fehlt es mir auch etwas an Erfahrung und Zeit . Ist ja schließlich auch nur ein Ansatz, der für das Gröbste einigermaßen hinhaut.
Du kannst dem guten moppi ja helfen, die Fehler aufzufangen. Mir fehlt leider die Zeit. Fahr heute Nacht nämlich in Urlaub und hab noch so ein bißchen was zu erledigen.
Aber beim nächsten Mal gerne, bin immer bereit etwas dazuzulernen.
Gruß
Chris

Viel Spass im Urlaub :-) o.w.T.
07.08.2007 22:37:00
Ramses
...

AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 16:14:52
Chaos
Servus moppi,
weil ich grad dabei war:

Sub namen()
Dim nam As String, nam1 As String
Dim ws As Worksheet, ws1 As Worksheet
nam1 = ThisWorkbook.Name
nam = Workbooks(nam1).ActiveSheet.Range("A8").Value
Workbooks.Open Filename:="C:\Dokumente und Einstellungen\Christian\Desktop\neu.xls"
For Each ws In Workbooks("neu.xls").Worksheets
If ws.Name = nam Then
On Error Resume Next
MsgBox ("Blattname existiert in der Zieldatei schon! Geben Sie einen anderen Namen ein!") _
nochmal:
n = InputBox("neuer Name!")
With Workbooks(nam1)
For Each ws1 In Workbooks("neu.xls").Worksheets
If ws1.Name = n Then
MsgBox ("Name bereits vergeben! Bitte anderen Namen wählen!")
GoTo nochmal
End If
Next ws1
.Sheets(nam).Name = n
.Sheets(n).Copy After:=Workbooks("neu.xls").Sheets(1)
.Sheets(n).Name = nam
Workbooks("neu.xls").Save
Workbooks("neu.xls").Close
Exit Sub
End With
End If
Next ws
With Workbooks(nam1)
.Sheets(nam).Copy After:=Workbooks("neu.xls").Sheets(1)
End With
End Sub


jetzt prüft das Makro noch, ob der eingegebene Name schon vorhanden ist, wenn ja dann nochmal, wenn nein wie gehabt.
Gruß
Chaos

Anzeige
AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 17:50:13
moppi
hey chaos,
erstmal ein riesen dankeschon für deine mühe. habe es eingefügt, doch leider bleibt es bei mir noch hängen. und zwar hängt er sich immer wieder folgender zeile auf:

.Sheets(nam).Copy before:=Workbooks("neu.xls").Sheets(1)


habe schon versucht heraus zu bekommen warum der unerwartete abbruch zu stande kommt, kann es mir aber nicht erklären...für eine kurze hilfestellung wäre ich dir natürlich sehr dankbar!!?
gruß
moppi

AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 18:35:00
Chaos
Servus,
vermute mal du musst "neu.xls" durch den Dateinamen deiner Zielarbeitsmappe ersetzen.
Also, wenn das Workbook "irgendwsas.xls" heißt, dann ersetze alles, was "neu.xls" ist durch "irgendwas.xls"
Gruß
Chaos

Anzeige
AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 19:46:00
Chaos
Servus moppi,
hatt doch noch ein wenig Zeit und hab noch einige Fehler, wie von Ramses angeführt, abgefangen:

Sub namen()
Dim nam As String, nam1 As String
Dim ws As Worksheet, ws1 As Worksheet
nam1 = ThisWorkbook.Name
nam = Workbooks(nam1).ActiveSheet.Range("A8").Value
Dim x As Variant
Dim BoOffen As Boolean
BoOffen = False
For Each x In Workbooks
If x.Name = "neu.xls" Then
BoOffen = True
Exit For
End If
Next
If BoOffen = False Then
Workbooks.Open Filename:="C:\Dokumente und Einstellungen\Christian\Desktop\neu.xls"
Else
GoTo weiter
End If
weiter:
For Each ws In Workbooks("neu.xls").Worksheets
If ws.Name = nam Then
On Error Resume Next
MsgBox ("Blattname existiert in der Zieldatei schon! Geben Sie einen anderen Namen ein!") _
nochmal:
n = InputBox("neuer Name!")
If StrPtr(n) = 0 Then
Exit Sub
End If
If Len(n) > 31 Then
MsgBox "Name zu lang!"
GoTo nochmal
End If
With Workbooks(nam1)
For Each ws1 In Workbooks("neu.xls").Worksheets
If ws1.Name = n Then
MsgBox ("Name bereits vergeben! Bitte anderen Namen wählen!")
GoTo nochmal
End If
Next ws1
.Sheets(nam).Name = n
.Sheets(n).Copy Before:=Workbooks("neu.xls").Sheets(1)
.Sheets(n).Name = nam
Workbooks("neu.xls").Save
Workbooks("neu.xls").Close
Exit Sub
End With
End If
Next ws
With Workbooks(nam1)
.Sheets(nam).Copy Before:=Workbooks("neu.xls").Sheets(1)
Workbooks("neu.xls").Save
Workbooks("neu.xls").Close
End With
End Sub


Warum sich das bei dir an dieser Zeile aufhängt, kann ich nicht nachvollziehen. In meiner Testdatei funktioniert das. Wie gesagt, evtl. die Zieldatei umbenennen (nicht: "neu.xls, sondern den Namen deiner Zieldatei)
.Sheets(nam).Copy before:=Workbooks("NameZieldatei.xls").Sheets(1)
Gruß Chaos

Anzeige
AW: Prüfung ob Tabellenblattname schon vorhanden..
07.08.2007 19:54:00
Chaos
Servus,
noch ein Fehler weniger:

Sub namen()
Dim nam As String, nam1 As String
Dim ws As Worksheet, ws1 As Worksheet
nam1 = ThisWorkbook.Name
nam = Workbooks(nam1).ActiveSheet.Range("A8").Value
Dim x As Variant
Dim BoOffen As Boolean
BoOffen = False
For Each x In Workbooks
If x.Name = "neu.xls" Then
BoOffen = True
Exit For
End If
Next
If BoOffen = False Then
Workbooks.Open Filename:="C:\Dokumente und Einstellungen\Christian\Desktop\neu.xls"
Else
GoTo weiter
End If
weiter:
For Each ws In Workbooks("neu.xls").Worksheets
If ws.Name = nam Then
On Error Resume Next
MsgBox ("Blattname existiert in der Zieldatei schon! Geben Sie einen anderen Namen ein!") _
nochmal:
n = InputBox("neuer Name!")
If StrPtr(n) = 0 Then
Exit Sub
End If
If Len(n) > 31 Then
MsgBox "Name zu lang!"
GoTo nochmal
End If
If n = "" Then
MsgBox "Bitte mindestens 1 Zeichen eingeben"
GoTo nochmal
End If
With Workbooks(nam1)
For Each ws1 In Workbooks("neu.xls").Worksheets
If ws1.Name = n Then
MsgBox ("Name bereits vergeben! Bitte anderen Namen wählen!")
GoTo nochmal
End If
Next ws1
.Sheets(nam).Name = n
.Sheets(n).Copy Before:=Workbooks("neu.xls").Sheets(1)
.Sheets(n).Name = nam
Workbooks("neu.xls").Save
Workbooks("neu.xls").Close
Exit Sub
End With
End If
Next ws
With Workbooks(nam1)
.Sheets(nam).Copy Before:=Workbooks("neu.xls").Sheets(1)
Workbooks("neu.xls").Save
Workbooks("neu.xls").Close
End With
End Sub


Gruß
Chaos

Anzeige
Darf ich es wagen...
07.08.2007 22:06:20
Ramses
Hallo
... den schon sehr guten Code etwas zu modifizieren und zu kommentieren :-)
Option Explicit

Sub namen()
    'Aussagekräftige Variablennamen sind wichtig
    'um sich später in einem Code zurechtzufinden
    'Gross und Kleinschreibung verwenden
    'Im Code die Variablen nur kleinschreiben
    'Wenn Sie richtig geschrieben sind
    'wechselt EXCEL die Buchstaben korrekt in Grossbuchstaben um
    'Das ist eine einfache Kontrolle auf Schreibfehler :-)
    Dim sourceWkb As Workbook, targetWkb As Workbook
    Dim targetWkbName
    Dim sourceWks As Worksheet, targetWks As Worksheet
    Dim wks As Worksheet, wkb As Workbook
    Dim TarShName As String, newTarShName As String
    Dim BoOffen As Boolean
    '****************
    'Anpassen Zielmappe
    targetWkbName = "Neu.xls"
    'Ab hier muss eigentlich nichts mehr geändert werden
    '****************
    Set sourceWkb = ThisWorkbook
    Set sourceWks = sourceWkb.ActiveSheet
    TarShName = sourceWks.Range("A8")
    BoOffen = False
    For Each wkb In Workbooks
        If wkb.Name = targetWkbName Then
            BoOffen = True
            Exit For
        End If
    Next
    If BoOffen = False Then
        Set targetWkb = Workbooks.Open(Filename:="C:\neu.xls")
        'Alternativ um flexibel zu sein
        'targetWkbName = Application.GetOpenFilename("XLS Dateien (*.xls),", True, "Neue Zieldatei auswählen", "Übernehmen", False)
        'Set targetWkb = Workbooks.Open(Filename:=targetWkbName)
    End If
    'Die Else-Anweisung ist nicht nötig
    ' GoTo weiter
    ' End If
    'weiter:
    ''Worksheets bezieht sich NUR auf Worksheets, andere Blätter
    'wie Diagramme usw. belegen aber auch einen Namen
    'Daher ist die Prüfung ALLER Blätter nötig
    'Mit Verweis auf die oben erstellten Objecte fällt es leichter
    'den Code zu kontrollieren und ausserdem listet dir EXCEL
    'in der Autovervollständigung die möglichen Methoden auf
    GoTo StartLoop
    '----------------------------
    'Dieser Einsprungpunkt brauchen wir wenn
    'ein neuer Name angefordert wird
    Restart:
    newTarShName = InputBox("Neuen Namen eingeben!", "Tabellenname existiert bereits")
    'Sehr gut abgefangen :-)
    If StrPtr(newTarShName) = 0 Then
        Exit Sub
    End If
    If Len(newTarShName) > 31 Then
        'Benutzerhinweis :-)
        MsgBox "Name zu lang!", vbInformation + vbOKOnly, "Zeichenlänge max 31 Zeichen"
        GoTo Restart
    End If
    'Gut nachgedacht :-)
    If newTarShName = "" Then
        MsgBox "Bitte mindestens 1 Zeichen eingeben", vbInformation + vbOKOnly, "Kein Namen angegeben"
        GoTo Restart
    End If
    '... die Prüfung auf unerlaubte Zeichen :-)
    If CheckName(newTarShName) = True Then
        GoTo Restart
    End If
    'Alte Variable neu füllen
    TarShName = newTarShName
    '-----------------------------
    'Und hier beginnt die normale Routine
    StartLoop:
    'Bei einem neuen Namen muss die Mappe
    'ebenfalls nochmals komplett neu geprüft werden
    For Each wks In targetWkb.Sheets 'Worksheets
        If wks.Name = TarShName Then
            'DAS GIBT ES DEFINITIV nicht :-)
            'On Error Resume Next
            MsgBox "Blattname existiert in der Zieldatei schon! Geben Sie einen anderen Namen ein!", vbInformation + vbOKOnly, "Namen Fehler"
            GoTo Restart
        End If
    Next wks
    'Hier greifen wir bereits auf das oben
    'erstellte Tabellenobject zu
    'So geht es einfacher :-)
    With sourceWks
        'Warum nochmals prüfen
        'das hast du doch oben schon gemacht
        '----
        'For Each ws1 In Workbooks("neu.xls").Worksheets
        'If ws1.Name = n Then
        'MsgBox ("Name bereits vergeben! Bitte anderen Namen wählen!")
        'GoTo nochmal
        'End If
        'Next ws1
        '----
        'umbenennen
        .Name = TarShName
        '...und gleich in die Zielmappe kopieren
        .Copy Before:=targetWkb.Sheets(1)
    End With
    'Zielmappe schliessen
    With targetWkb
        .Save
        .Close
    End With
End Sub


Function CheckName(chkString As String) As Boolean
    '(C) Ramses
    'Gibt "True" zurück, wenn ein unerlaubtes
    'Zeichen im Namen vorhanden ist
    'False wenn alles korrekt ist
    Dim i As Integer
    For i = 1 To Len(chkString)
        Select Case Mid(chkString, i, 1)
            Case "\", "/", ">", "<", ":", "*", "?", "[", "]", "¦"
                MsgBox ("Unerlaubtes Zeichen """ & Mid(chkString, i, 1) & """ an Position " & i & " in " _
                & """" & chkString & """" & vbCrLf _
                & vbCrLf & "Kopiervorgang wegen Fehler in Dateinamen abgebrochen")
                CheckName = True
                Exit Function
        End Select
    Next i
    CheckName = False
End Function

Gruss Rainer

Anzeige
AW: Darf ich es wagen...
08.08.2007 10:46:00
moppi
hi rainer, hi chaos,
bin euch für die erstellung und kommentierung des codes sehr sehr dankbar! weiß gar nicht wie ich das wieder gut machen soll....
habe es eingefügt und an meine dateien angepasst...funktioniert soweit schon ganz gut!!! *hurra
habe nur noch ein kleines problemchen bzw. änderungswunsch: und zwar wird der blattname der quelldatei auch geändert, welches ich nicht so gern hätte, da ich noch drei weitere tabellenblätter in der quellmappe habe mit denen ich den gleichen kopieren-umbenennen-speichern-vorgang vornehmen will und dabei dann doppelte blattnamen in der quelldatei auftreten könnten. weiterhin sind die blätter in der quellmappe mit einer bestimmten bezeichnung versehen, welche dem nutzer einen sofortigen zugriff auf das gewünschte themengebiet ermöglichen soll. deshalb hätte ich gern, dass sich die blattnamen nur in der zieldatei ändern! geht das?
und wenn die zieldatei, aus welchen gründen auch immer, geöffnet sein sollte, erscheint wieder eine fehlermeldung! ist das bei euch auch der fall?
gruß
moppi

AW: Darf ich es wagen...
08.08.2007 10:56:10
Ramses
Hallo
probier mal
Option Explicit

Sub namen()
    'Aussagekräftige Variablennamen sind wichtig
    'um sich später in einem Code zurechtzufinden
    'Gross und Kleinschreibung verwenden
    'Im Code die Variablen nur kleinschreiben
    'Wenn Sie richtig geschrieben sind
    'wechselt EXCEL die Buchstaben korrekt in Grossbuchstaben um
    'Das ist eine einfache Kontrolle auf Schreibfehler :-)
    Dim sourceWkb As Workbook, targetWkb As Workbook
    Dim targetWkbName
    Dim sourceWks As Worksheet, targetWks As Worksheet
    Dim wks As Worksheet, wkb As Workbook
    Dim TarShName As String, newTarShName As String
    Dim BoOffen As Boolean
    '****************
    'Anpassen Zielmappe
    targetWkbName = "Neu.xls"
    'Ab hier muss eigentlich nichts mehr geändert werden
    '****************
    Set sourceWkb = ThisWorkbook
    Set sourceWks = sourceWkb.ActiveSheet
    TarShName = sourceWks.Range("A8")
    BoOffen = False
    For Each wkb In Workbooks
        If wkb.Name = targetWkbName Then
            BoOffen = True
            Set targetWkb = Workbooks(targetWkbName)
            Exit For
        End If
    Next
    If BoOffen = False Then
        Set targetWkb = Workbooks.Open(Filename:="C:\neu.xls")
        'Alternativ um flexibel zu sein
        'targetWkbName = Application.GetOpenFilename("XLS Dateien (*.xls),", True, "Neue Zieldatei auswählen", "Übernehmen", False)
        'Set targetWkb = Workbooks.Open(Filename:=targetWkbName)
    End If
    'Worksheets bezieht sich NUR auf Worksheets, andere Blätter
    'wie Diagramme usw. belegen aber auch einen Namen
    'Daher ist die Prüfung ALLER Blätter nötig
    'Mit Verweis auf die oben erstellten Objecte fällt es leichter
    'den Code zu kontrollieren und ausserdem listet dir EXCEL
    'in der Autovervollständigung die möglichen Methoden auf
    GoTo StartLoop
    '----------------------------
    'Dieser Einsprungpunkt brauchen wir wenn
    'ein neuer Name angefordert wird
    Restart:
    newTarShName = InputBox("Neuen Namen eingeben!", "Tabellenname existiert bereits")
    'Sehr gut abgefangen :-)
    If StrPtr(newTarShName) = 0 Then
        Exit Sub
    End If
    If Len(newTarShName) > 31 Then
        'Benutzerhinweis :-)
        MsgBox "Name zu lang!", vbInformation + vbOKOnly, "Zeichenlänge max 31 Zeichen"
        GoTo Restart
    End If
    'Gut nachgedacht :-)
    If newTarShName = "" Then
        MsgBox "Bitte mindestens 1 Zeichen eingeben", vbInformation + vbOKOnly, "Kein Namen angegeben"
        GoTo Restart
    End If
    '... die Prüfung auf unerlaubte Zeichen :-)
    If CheckName(newTarShName) = True Then
        GoTo Restart
    End If
    'Alte Variable neu füllen
    TarShName = newTarShName
    '-----------------------------
    'Und hier beginnt die normale Routine
    StartLoop:
    'Bei einem neuen Namen muss die Mappe
    'ebenfalls nochmals komplett neu geprüft werden
    For Each wks In targetWkb.Sheets 'Worksheets
        If wks.Name = TarShName Then
            MsgBox "Blattname existiert in der Zieldatei schon! Geben Sie einen anderen Namen ein!", vbInformation + vbOKOnly, "Namen Fehler"
            GoTo Restart
        End If
    Next wks
    'Hier greifen wir bereits auf das oben
    'erstellte Tabellenobject zu
    'So geht es einfacher :-)
    With sourceWks
        '...und gleich in die Zielmappe kopieren
        .Copy Before:=targetWkb.Sheets(1)
    End With
    'Zielmappe schliessen
    With targetWkb
        .Sheets(1) = TarShName
        .Save
        .Close
    End With
End Sub


Function CheckName(chkString As String) As Boolean
    '(C) Ramses
    'Gibt "True" zurück, wenn ein unerlaubtes
    'Zeichen im Namen vorhanden ist
    'False wenn alles korrekt ist
    Dim i As Integer
    For i = 1 To Len(chkString)
        Select Case Mid(chkString, i, 1)
            Case "\", "/", ">", "<", ":", "*", "?", "[", "]", "¦"
                MsgBox ("Unerlaubtes Zeichen """ & Mid(chkString, i, 1) & """ an Position " & i & " in " _
                & """" & chkString & """" & vbCrLf _
                & vbCrLf & "Kopiervorgang wegen Fehler in Dateinamen abgebrochen")
                CheckName = True
                Exit Function
        End Select
    Next i
    CheckName = False
End Function

Gruss Rainer

Korrektur
08.08.2007 10:59:00
Ramses
Hallo
Hier noch die Variante wo der Pfad ebenfalls als Variable angegeben werden muss.
Dann musst du nur noch die beiden Punkte anpassen und im Code selber nichts mehr ändern
Option Explicit

Sub namen()
    'Aussagekräftige Variablennamen sind wichtig
    'um sich später in einem Code zurechtzufinden
    'Gross und Kleinschreibung verwenden
    'Im Code die Variablen nur kleinschreiben
    'Wenn Sie richtig geschrieben sind
    'wechselt EXCEL die Buchstaben korrekt in Grossbuchstaben um
    'Das ist eine einfache Kontrolle auf Schreibfehler :-)
    Dim sourceWkb As Workbook, targetWkb As Workbook
    Dim targetWkbName As String, targetPfad As String
    Dim sourceWks As Worksheet, targetWks As Worksheet
    Dim wks As Worksheet, wkb As Workbook
    Dim TarShName As String, newTarShName As String
    Dim BoOffen As Boolean
    '****************
    'Anpassen Zielmappe
    'Pfad mit Backslash am Ende
    targetPfad = "C:\"
    targetWkbName = "Neu.xls"
    'Ab hier muss eigentlich nichts mehr geändert werden
    '****************
    Set sourceWkb = ThisWorkbook
    Set sourceWks = sourceWkb.ActiveSheet
    TarShName = sourceWks.Range("A8")
    BoOffen = False
    For Each wkb In Workbooks
        If wkb.Name = targetWkbName Then
            BoOffen = True
            Set targetWkb = Workbooks(targetWkbName)
            Exit For
        End If
    Next
    If BoOffen = False Then
        Set targetWkb = Workbooks.Open(Filename:=targetPfad & targetWkbName)
        'Alternativ um flexibel zu sein
        'targetWkbName = Application.GetOpenFilename("XLS Dateien (*.xls),", True, "Neue Zieldatei auswählen", "Übernehmen", False)
        'Set targetWkb = Workbooks.Open(Filename:=targetWkbName)
    End If
    'Worksheets bezieht sich NUR auf Worksheets, andere Blätter
    'wie Diagramme usw. belegen aber auch einen Namen
    'Daher ist die Prüfung ALLER Blätter nötig
    'Mit Verweis auf die oben erstellten Objecte fällt es leichter
    'den Code zu kontrollieren und ausserdem listet dir EXCEL
    'in der Autovervollständigung die möglichen Methoden auf
    GoTo StartLoop
    '----------------------------
    'Dieser Einsprungpunkt brauchen wir wenn
    'ein neuer Name angefordert wird
    Restart:
    newTarShName = InputBox("Neuen Namen eingeben!", "Tabellenname existiert bereits")
    'Sehr gut abgefangen :-)
    If StrPtr(newTarShName) = 0 Then
        Exit Sub
    End If
    If Len(newTarShName) > 31 Then
        'Benutzerhinweis :-)
        MsgBox "Name zu lang!", vbInformation + vbOKOnly, "Zeichenlänge max 31 Zeichen"
        GoTo Restart
    End If
    'Gut nachgedacht :-)
    If newTarShName = "" Then
        MsgBox "Bitte mindestens 1 Zeichen eingeben", vbInformation + vbOKOnly, "Kein Namen angegeben"
        GoTo Restart
    End If
    '... die Prüfung auf unerlaubte Zeichen :-)
    If CheckName(newTarShName) = True Then
        GoTo Restart
    End If
    'Alte Variable neu füllen
    TarShName = newTarShName
    '-----------------------------
    'Und hier beginnt die normale Routine
    StartLoop:
    'Bei einem neuen Namen muss die Mappe
    'ebenfalls nochmals komplett neu geprüft werden
    For Each wks In targetWkb.Sheets 'Worksheets
        If wks.Name = TarShName Then
            MsgBox "Blattname existiert in der Zieldatei schon! Geben Sie einen anderen Namen ein!", vbInformation + vbOKOnly, "Namen Fehler"
            GoTo Restart
        End If
    Next wks
    'Hier greifen wir bereits auf das oben
    'erstellte Tabellenobject zu
    'So geht es einfacher :-)
    With sourceWks
        '...und gleich in die Zielmappe kopieren
        .Copy Before:=targetWkb.Sheets(1)
    End With
    'Zielmappe schliessen
    With targetWkb
        .Sheets(1) = TarShName
        .Save
        .Close
    End With
End Sub


Function CheckName(chkString As String) As Boolean
    '(C) Ramses
    'Gibt "True" zurück, wenn ein unerlaubtes
    'Zeichen im Namen vorhanden ist
    'False wenn alles korrekt ist
    Dim i As Integer
    For i = 1 To Len(chkString)
        Select Case Mid(chkString, i, 1)
            Case "\", "/", ">", "<", ":", "*", "?", "[", "]", "¦"
                MsgBox ("Unerlaubtes Zeichen """ & Mid(chkString, i, 1) & """ an Position " & i & " in " _
                & """" & chkString & """" & vbCrLf _
                & vbCrLf & "Kopiervorgang wegen Fehler in Dateinamen abgebrochen")
                CheckName = True
                Exit Function
        End Select
    Next i
    CheckName = False
End Function


Gruss Rainer

AW: Korrektur
08.08.2007 11:29:25
moppi
hi rainer,
du bist ja echt fixer als die feuerwehr...
beim abschnitt zielmappe speichern unter

.Sheets(1) = TarShName


erhalte ich immer wieder folgende Meldung:


"Laufzeitfehler 438
Objekt unterstützt diese Eigenschaft oder Methode nicht"


Es muss heissen
08.08.2007 11:37:00
Ramses
Hallo
.Sheets(1).Name = TarShName
Gruss Rainer

AW: Ein Letztes noch
08.08.2007 11:49:05
moppi
super super super...
aber eine frage, welche ich vorhin vergessen hatte muss noch sein: wie kann ich vor dem speichern und schließen der zielmappe noch zwei weitere makros, welche schon vorhanden sind aufrufen? habe es mit "call" probiert, doch leider funktioniert dies nicht...

AW: Ein Letztes noch
08.08.2007 12:08:33
Ramses
Hallo
das funtkioniert schon mit call.

Sub testStart()
Call test2
Call test3
MsgBox "nun ist schluss"
End Sub



Sub test2()
MsgBox "Ich bin aus Test2"
End Sub



Sub test3()
MsgBox "Ich bin aus Test3"
End Sub


Gruss Rainer

AW: Ein Allerletztes
08.08.2007 12:11:00
moppi
ach rainer,
nach kopieren des blattes soll noch einmal das zielblatt vollständig markiert und kopiert werden und mit inhalte einfügen "Werte" nur die werte übernommen werden...bekommst du das noch hin?
den aufruf der makros habe ich doch hinbekommen...habe nicht richtig hingeschaut ;o)
danke
moppi

Nein...
08.08.2007 12:21:00
Ramses
Hallo
Ändere
With sourceWks
'...und gleich in die Zielmappe kopieren
.Copy Before:=targetWkb.Sheets(1)
End With
in
With sourceWks
'...und gleich in die Zielmappe kopieren
.Copy Before:=targetWkb.Sheets(1)
.Cells.Copy
.PasteSpecial Paste:=xlValues
End With
Gruss Rainer

AW: Nein...
09.08.2007 09:20:11
moppi
moin rainer,
sorry, dass ich dich nochmal "quälen" muss, aber das ist noch nicht das gewünschte ergebnis! die quelldatei soll unverändert bleiben, da diese mein eingabeformular darstellt und die daten des druckbereiches ERST in der zieldatei kopiert und durch werte ersetzt werden sollen...mit deinem letzten code habe ich mir mein eingabeformular zerschossen...zum glück hatte ich noch 'ne sicherheitskopie, somit konnte ich mir die quelldatei wieder in den ausgangszustand zurücksetzen *puuh
habe es schon wie folgt probiert indem ich den copy und paste abschnitt unter die targetwks gesetzt habe:

With targetWkb
.Sheets(1).Name = TarShName
.Application.Goto Reference:="Print_Area"
.Cells.Copy
.Selection.PasteSpecial Paste:=xlValues
End With


hier bleibt er immer wieder stehen beim copy-befehl...
gruß
moppi

AW: Nein...
09.08.2007 10:49:00
Ramses
Hallo
"...sorry, dass ich dich nochmal "quälen" muss, ..."
Sonst hättest du dich wohl gar nicht mehr gemeldet.
With targetWkb .Sheets(1)
.Name = TarShName
.Cells.Copy
.Selection.PasteSpecial Paste:=xlValues
End With
Gruss Rainer

AW: Nein...
09.08.2007 11:12:38
moppi
hi rainer,
"Sonst hättest du dich wohl gar nicht mehr gemeldet."
ich hätte mich auf jeden fall nochmal gemeldet, nur leider hatte ich gestern noch einen termin, sodass ich nicht mehr zum testen gekommen bin...
jedenfalls bleibt er immer wieder stehen bei

.Selection.PasteSpecial Paste:=xlValues


und ich kann das nicht nachvollziehen
ich habe auch noch eine ausgeblendete zeile, einen button und ein kombinationsfeld in dem tabellenblatt, könnte es vielleicht daran liegen?
gruß
moppi

AW: Nein...
09.08.2007 11:35:21
Ramses
Hallo
Schreibfehler :-)
With targetWkb .Sheets(1)
.Name = TarShName
.Cells.Copy
.cells(1,1).PasteSpecial Paste:=xlPasteValues
End With
Habs gerade ausprobiert. Tut soweit
Gruss Rainer

AW: Nein...
09.08.2007 11:51:00
moppi
hi,
nun bekomme ich folgende meldung
Userbild
an dieser stelle

.Cells(1, 1).PasteSpecial Paste:=xlPasteValues


:o(((
gruß
moppi

AW: Nein...
09.08.2007 12:02:51
Ramses
Hallo
Stimmt deine EXCEL-Version ?
Ersetz mal die Zeile mit dieser Zeile
.Cells.PasteSpecial Paste:=xlPasteValues
Gruss Rainer

AW: Nein...
09.08.2007 12:24:26
moppi
juhuuuu rainer,
du bist mein held des tages!!!
jetzt funzt es super! alles wird kopiert, die quelldatei bleibt unverändert, die möglichen problemchen werden auch abgefangen...
bin total begeistert!
VIELEN VIELEN DANK FÜR DIE SUPER SCHNELLE UND PROFESSIONELLE HILFE
gruß
moppi
ps: excel version 2003

6 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige