Autor
|
Thema: Worksheets Objekt (3289 mal gelesen)
|
Christian B. Mitglied
Beiträge: 86 Registriert: 09.03.2006 Windows 7 AutoCAD 2009 AutoCAD Architecture 2012
|
erstellt am: 05. Sep. 2010 12:09 <-- editieren / zitieren --> Unities abgeben:
Hi, anbei hab ich folgenden Code ausprobiert zum Erzeugen eines neuen Blattes von einer Vorlage Index 3: Worksheets(3).Copy After:=Worksheets(3) Sheets(4).Select Worksheets(4).Name = "test" Worksheets(4).Activate Worksheets("Test").Cells(1, 7).Value = Testzeile Klappt soweit, da das ganze jetzt aber in eine Schleife eingebaut werden soll, soll bei jedem Aufruf ein Sheet (n+1) ab 4 als Kopie von 3 erzeugt werden. Dann wird in das gerade aktuelle Worksheet werde reingeschrieben. Kann mir jemand helfen, wie ich den Index in eine Variable bekomme? Allerdings würde ich nun gerne auch den (Name) = Tabelle X des Worksheets ändern. Durch den Code wird nur in der Tabelle der Name geändert und das Attribut Name und nicht (Name). Kennt da jemand den Unterschied? Vielen Dank, Christian B. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 05. Sep. 2010 14:03 <-- editieren / zitieren --> Unities abgeben: Nur für Christian B.
Hallo Christian B., hier ein Ansatz: Code: Private Sub Registerkopie()Dim i As Integer 'für die Schleife Dim i_maxWS As Integer 'max. Anzahl an Kopien der WorkSheets i_maxWS = 5 '--- Bisheriger Code mit Anmerkungen --- 'Worksheets(3).Copy After:=Worksheets(3) 'Sheets(4).Select 'UNNÖTIG - siehe hier: http://www.online-excel.de/excel/singsel_vba.php?f=61 'Worksheets(4).Name = "test" 'Klappt nur 1x, da ab dem zweiten Durchlauf das Register "test" ' bereits vorhanden ist --> Fehlermeldung 'Worksheets(4).Activate 'Soll er das WIRKLICH jedes mal machen - oder erst am Ende der Schleife? ' kann gespart werden, da neu erzeugte Register ohnehin aktiviert werden. 'Bildschirmflackern aus Application.ScreenUpdating = False 'Schleife setzen - aus VBA z. B. mit F8 im Einzelschritt: For i = 1 To i_maxWS Worksheets(3).Copy After:=Worksheets(i_maxWS - 3 + i) Worksheets(3 + i).Name = "Test_" & i Next i 'Bildschirmflackern an Application.ScreenUpdating = True End Sub
Zu Deiner zweiten Frage: WARUM möchtest Du die Bezeichnung ändern? Möglich ist das schön - in der VBA-IDE. Auf diese Eigenschaft - siehe Screenshot - lässt sich (glaube ich) auch per Code zugreifen; wenn's denn sein muss. Der Benutzer kriegt davon allerdings rein gar nichts mit?!
------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 06. Sep. 2010 10:23 <-- editieren / zitieren --> Unities abgeben: Nur für Christian B.
Zitat: Original erstellt von Christian B.: Allerdings würde ich nun gerne auch den (Name) = Tabelle X des Worksheets ändern. Durch den Code wird nur in der Tabelle der Name geändert und das Attribut Name und nicht (Name). Kennt da jemand den Unterschied?
Der Unterschied zwischen dem Ausdruck ohne Klammer und dem in Klammern besteht in folgendem: der Ausdruck in Klammern ist der Tabellenname bzw. die für den Benutzer sichtbare Aufschrift auf dem Tabellenreiters, der ohne Klammer dagegen ist der interne oder Codename des Tabellenblattes. Der Codename wird beim Erstellen des Tabellenblattes von Excel automatisch vergeben und erhält eine fortlaufende Nummerierung. Wird ein Tabellenblatt gelöscht, erhält das nächste erstellte die Nummer des gelöschten. Unter normalen Bedingungen reicht der im VBA-Editor in Klammern stehende Ausdruck für die Ansprache eines Tabellenblattes aus, wenn man sich im Code ganz konkret auf ein bestimmtes Tabellenblatt beziehen will: Worksheets("Test1").Range("A1") = "Hallo". In solchen Fällen, wenn man sich auf ein Tabellenblatt beziehen muss, dessen Reiter vom Benutzer geändert werden kann, hilft diese Methode nicht weiter, denn der Debugger zeigt dann den Fehler "Index außerhalb des gültigen Bereichs", weil dieses Tabellenblatt ja nicht mehr existiert. Man kann sich natürlich auch auf die Reihenfolgen-Nummer eines Tabellenblattes beziehen: Worksheets(3).Range("A1") = "Hallo" - das ist dann das 3. von links gezählt. Das führt jedoch zu Problemen, wenn die Reihenfolge der Tabellenblätter durch den Benutzer geändert werden darf, denn in diesem Fall würde sich der Code dann auf ein falsches Blatt beziehen. Hier nun kommt die dritte Möglichkeit ins Spiel: der Codename des Tabellenblattes, also derjenige der von Excel automatisch vergeben wird. Man verwendet ihn z.B. auf diese Weise: Tabelle3.Range("A1") = "Hallo". Den Codenamen kann man natürlich auch ändern, man muss sich dabei jedoch auf das VBA-Projekt beziehen, was jedoch voraussetzt, dass das VBA-Projekt nicht mit Passwort geschützt ist. Hier dein Code, wenn du sowohl Tabellenname als auch Codename des Tabellenblattes ändern willst: Code: Dim intTabelle As Integer For intTabelle = 1 To 5 Worksheets(3).Copy After:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Cells(1, 7) = Testzeile ' Ändern des Tabellenblatt-Namen bzw. der Aufschrift des Tabellenreiters Worksheets(Worksheets.Count).Name = "Test" & intTabelle ' Ändern des Codenamen des Tabellenblattes ThisWorkbook.VBProject.vbcomponents(Worksheets(Worksheets.Count).CodeName).Name = "Test" & intTabelle Next intTabelle
Anstelle von
Code: ThisWorkbook.VBProject.vbcomponents(Worksheets(Worksheets.Count).CodeName).Name = "Test" & intTabelle
kannst du natürlich auch dieses schreiben:
Code: ThisWorkbook.VBProject.vbcomponents(Worksheets("Test" & intTabelle).CodeName).Name = "Test" & intTabelle
denn das Tabellenblatt hat ja bereits einen Namen bekommen und kann zielgerichtet angesprochen werden.------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian B. Mitglied
Beiträge: 86 Registriert: 09.03.2006 Windows 7 AutoCAD 2009 AutoCAD Architecture 2012
|
erstellt am: 06. Sep. 2010 22:12 <-- editieren / zitieren --> Unities abgeben:
Hi, Danke für die Antowrt, ich dachte nur das (Name) einen Einfluss auf den Index des Worksheets hat. war aber nicht so. hab mich nur gefragt, warum das Worksheet eigentlich zwei namen hat: name / (name) ist ja eigentlich unötig und dazu noch einen Index; danke an Beverly, jetzt hab ich den Unterschied verstanden! Grüße Christian B. [Diese Nachricht wurde von Christian B. am 06. Sep. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|