Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1632to1636
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
Inhaltsverzeichnis

Tabellenblatt mithilfe For-Schleife benennen

Tabellenblatt mithilfe For-Schleife benennen
12.07.2018 20:33:57
Fabian
Hey ihr,
habe folgendes Makro:
Sub Test()
Dim sht1 As Worksheet
Set sht1 = Sheets("Muster")
Sheets(3).Activate
sht1.Copy before:=ActiveSheet
ActiveSheet.Name = Cells(1, 7)
End Sub
Wenn ich das Makro ausführe, erstellt es mir eine Kopie meines Muster-Tabellenblattes und setzt an die für mich gewünschte Position. Es wird nach dem Zelleninhalt von Cells(1,7), also G1 benannt. Nun möchte ich aber, dass nach jeder Erstellung eines Blattes die Zelle unterhalb angesprochen wird, also Cells(2,7), Cells(3,7) usw. und dementsprechend benannt wird.
Meine Idee ist dies mit einer For-Schleife zu lösen, also im Prinzip so ähnlich
 Dim n as Integer
Dim name as Text
For n=1 to 99
cells(n,7).value=name
Next n
Und unten bei ActiveSheet.Name = Cells(name,7) zu schreiben. Aber durch längeres Rumprobieren komme ich auf keinen grünen Zweig, ich wäre über jegliche Hilfe erfreut.
Beste Grüße!

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabellenblatt mithilfe For-Schleife benennen
12.07.2018 20:40:44
SF
Hola,
verlinkst du bitte deine Beiträge in den verschiedenen Foren gegenseitig?
Danke.
Gruß,
steve1da
AW: Tabellenblatt mithilfe For-Schleife benennen
12.07.2018 21:04:35
Fabian
Hallo Steve,
ich verstehe nicht was du mit

verlinkst du bitte deine Beiträge in den verschiedenen Foren gegenseitig?
Danke.
meinst.
Was soll ich wie verlinken?
Grüße
AW: Tabellenblatt mithilfe For-Schleife benennen
12.07.2018 21:34:15
Sepp
Hallo Fabian,
so?
Modul Modul1
Option Explicit 
 
Sub test() 
  Dim lngIndex As Long 
 
  On Error GoTo ErrorHandler 
  Application.ScreenUpdating = False 
   
  With Sheets(3) 
    For lngIndex = 1 To 99 
      If IsValidSheetName(.Cells(lngIndex, 7).Text) Then 
        If Not SheetExist(.Cells(lngIndex, 7).Text) Then 
          Sheets("Muster").Copy Before:=Sheets(3) 
          ActiveSheet.Name = .Cells(lngIndex, 7).Text 
        End If 
      End If 
    Next 
  End With 
   
ErrorHandler: 
  Application.ScreenUpdating = False 
End Sub 
 
Private Function IsValidSheetName(ByVal strName As String) As Boolean 
  'Validates a gifen string 
  Dim objRegExp As Object 
 
  Set objRegExp = CreateObject("vbscript.regexp") 
 
  With objRegExp 
    .Global = True 
    .Pattern = "^[^\/\\:\*\?\[\]]{1,31}$" 
    .IgnoreCase = True 
    IsValidSheetName = .test(strName) 
  End With 
 
  Set objRegExp = Nothing 
 
End Function 
 
Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook, Optional ByVal byCodeName As Boolean = False) As Boolean 
  Dim wks As Object 
  On Error GoTo ErrorHandler 
  If Wb Is Nothing Then Set Wb = ThisWorkbook 
  For Each wks In Wb.Sheets 
    If byCodeName Then 
      If LCase(wks.CodeName) = LCase(sheetName) Then SheetExist = True: Exit Function 
    Else 
      If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function 
    End If 
  Next 
ErrorHandler: 
  SheetExist = False 
End Function 

VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0


 ABCDEF
1Gruß Sepp
2
3

Anzeige
Sorry, kleiner Fehler im Code
12.07.2018 21:36:16
Sepp
Hallo nochmal,
so passt es.
Modul Modul1
Option Explicit 
 
Sub test() 
  Dim lngIndex As Long 
 
  On Error GoTo ErrorHandler 
  Application.ScreenUpdating = False 
   
  With Sheets(3) 
    For lngIndex = 1 To 99 
      If IsValidSheetName(.Cells(lngIndex, 7).Text) Then 
        If Not SheetExist(.Cells(lngIndex, 7).Text) Then 
          Sheets("Muster").Copy Before:=Sheets(3) 
          ActiveSheet.Name = .Cells(lngIndex, 7).Text 
        End If 
      End If 
    Next 
  End With 
   
ErrorHandler: 
  Application.ScreenUpdating = True 
End Sub 
 
Private Function IsValidSheetName(ByVal strName As String) As Boolean 
  'Validates a gifen string 
  Dim objRegExp As Object 
 
  Set objRegExp = CreateObject("vbscript.regexp") 
 
  With objRegExp 
    .Global = True 
    .Pattern = "^[^\/\\:\*\?\[\]]{1,31}$" 
    .IgnoreCase = True 
    IsValidSheetName = .test(strName) 
  End With 
 
  Set objRegExp = Nothing 
 
End Function 
 
Private Function SheetExist(ByVal sheetName As String, Optional Wb As Workbook, Optional ByVal byCodeName As Boolean = False) As Boolean 
  Dim wks As Object 
  On Error GoTo ErrorHandler 
  If Wb Is Nothing Then Set Wb = ThisWorkbook 
  For Each wks In Wb.Sheets 
    If byCodeName Then 
      If LCase(wks.CodeName) = LCase(sheetName) Then SheetExist = True: Exit Function 
    Else 
      If LCase(wks.Name) = LCase(sheetName) Then SheetExist = True: Exit Function 
    End If 
  Next 
ErrorHandler: 
  SheetExist = False 
End Function 

VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0


 ABCDEF
1Gruß Sepp
2
3

Anzeige
AW: Sorry, kleiner Fehler im Code
13.07.2018 11:36:08
Fabian
Hallo Sepp,
danke schon mal für die ausführliche Lösung inklusive Fehlerbehandlung, dein Code funktioniert zwar, aber ich würde gerne mit dem Ausführen des Makros nur ein Tabellenblatt hinzufügen aus der G1-zelle und nicht alle gleichzeitig.
Also: Mit dem ersten Ausführen des Makros ein Tabellenblatt mit dem Namen aus G1, mit dem zweiten Ausführen ein Tabellenblatt aus G2 usw.
Könntest du mir da bitte noch helfen?
Beste Grüße
AW: Sorry, kleiner Fehler im Code
13.07.2018 19:10:00
Fabian
Ich habe selber etwas rumprobiert und habe folgende Idee (habe die Fehlerbehandlung der Übersicht halber weggelassen):
Sub Test()
Dim i As Integer
Dim ws As Worksheet
i = 1
Sheets("Muster").Copy before:=Sheets(3)
ActiveSheet.Name = Cells(i, 7).Text
For Each ws In ActiveWorkbook.Sheets
If ws.Name = Cells(i, 7) Then
i = i + 1
End If
Next ws
Mein Gedanke war, bei Zelle G1 (i ist am Anfang gleich 1) anzufangen, das erste Tabellenblatt zu dublizieren und umzubenennen, was auch funktioniert hat. Dann soll meine Arbeitsmappe überprüft werden, ob das eben erstellte Tabellenblatt vorhanden ist (die Voraussetzung ist natürlich immer erfüllt) und als Folge soll i um 1 vergrößert werden, damit der Name des zweiten, zu dublizierende Tabellenblattes sich nicht mehr auf die Zelle G1, sondern G2 bezieht. Es erscheint mir jedoch eine Fehlermeldung, wo ist mein Denkfehler?
Beste Grüße
Anzeige
AW: Sorry, kleiner Fehler im Code
13.07.2018 19:13:46
Fabian
Achso, der Code ist natürlich mit
end sub

beendet.
AW: Sorry, kleiner Fehler im Code
13.07.2018 19:45:48
Sepp
Hallo Fabian,
da genügt ein kleiner Zusatz.
Sub test()
  Dim lngIndex As Long
 
  On Error GoTo ErrorHandler
  Application.ScreenUpdating = False
   
  With Sheets(3)
    For lngIndex = 1 To 99
      If IsValidSheetName(.Cells(lngIndex, 7).Text) Then
        If Not SheetExist(.Cells(lngIndex, 7).Text) Then
          Sheets("Muster").Copy Before:=Sheets(3)
          ActiveSheet.Name = .Cells(lngIndex, 7).Text
          Exit For
        End If
      End If
    Next
  End With
   
ErrorHandler:
  Application.ScreenUpdating = False
End Sub

VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 16 - mit VBAHTML 12.6.0

Der Rest vom Code bleibt gleich!
 ABCDEF
1Gruß Sepp
2
3

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige