Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
816to820
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
816to820
816to820
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

VBA-Makro

VBA-Makro
14.11.2006 12:08:00
Bernd
Hallo zusammen,
ich bin neu im Forum und benötige auch sofort eure Hilfe.
Wenn ich im VBA-Code ein Tabellenblatt ansprechen will funktioniert dieses nur mit dem automatisch vergeben Namen (z.B. Blatt = "Tabelle1"). Da ich aber eine automatische Mappenerstellung über VBA benutze, kann sich der Tabellenname immer ändern. Deshalb muss ich die entsprechenden Blätter mit dem von mir vergebenen Namen (z.B. Blatt = "Sitzplan MP") ansprechen. Hier ein Ausschnitt aus meinem Makro.
With ThisWorkbook.VBProject.VBComponents(Blatt).CodeModule
gruss Bernd

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA-Makro
14.11.2006 12:37:09
ingUR
Hallo, Bernd,
die direkte Möglickeit wäre, den Namen aus der Objektliste Worksheets: heraus zu benutzen:
ThisWorkbook.Worksheets("Sitzplan MP")
Alternativ, bei in VBA-Code angelegte Mappen:
dim wsSP_MP as worksheet
On error resume Next
set wsSP_PM = Worksheets("SP_MP")
if wsSP_MP ist nothing then
set wsSP_PM=Worksheets.Add ' Weitere Parameter (z.B. Lage der Einfügung) siehe in Onlin-Hilfe
ws_SP_MP.name="Sitzplan MP"
end if
' die Tabelle kann ab hier auf jeden fall in allen Modulen mit dem Tabellennamen aus der Liste angesprochen werden
'    Worksheets("Sitzpaln MP").Range("A10:E100").clear
' oder aber im Geltungsbereich der Variablen wsSP_MP über das so referenzierte
'    Objekt <b>wsSP_MP.Range("A10:E100").clear
set wsSP_MP=nothing

Gruß,
Uwe
Anzeige
AW: VBA-Makro
14.11.2006 12:40:20
Heiko
Hallo Bernd,
der Name der in VBComponents angegeben werden muss ist der VBA Codename, der der im VBA Editor vor dem Tabellennamen (der in Klammern) steht.
Sprich das so an:

Sub test()
Dim Blatt As String
Blatt = "Test  Test"
MsgBox ThisWorkbook.VBProject.VBComponents(ActiveWorkbook.Worksheets(Blatt).CodeName).CodeModule.Parent.Name
End Sub

Gruß Heiko
PS: Rückmeldung wäre nett !
AW: VBA-Makro
14.11.2006 12:52:38
lueckii
Hallo Bernd!
Den Tabellenblattnamen direkt per VBA im Code ändern geht soweit ich weiß nicht.
Du könntest die Tabellenblätter aber indexieren also z.B.
1 Sitzplan MP
2 Sitzplan QR
etc.
Dann einfach nur die Nummer ansprechen. Da wäre der Name dann egal.
z.b. wenn die Blatt 1 Sitzplan die Tabellennummer 3 in deinem Worksheet ist:

Private Sub CommandButton1_Click()
Dim i As Variant
Dim tbl As Variant
For i = 3 To 3
ThisWorkbook.Worksheets(i).Activate
Next
End Sub

Den Code einfach unter den Button legen
Gruß Martin
Anzeige
@ Martin
14.11.2006 13:01:22
Heiko
Hallo Martin,
natürlich kann man per VBA die Blattnamen ändern.

Sub NamenAendern()
' Blattnamen ändern
ActiveWorkbook.Worksheets("NeuerName").Name = "NeuerNameEXCEL"
' VBA Codenamen ändern.
ThisWorkbook.VBProject.VBComponents("Tabelle1").Name = "NeuerNameVBA"
End Sub

Und die Verwendung der Tabellennummer solltest du mit vorsicht genießen, denn wenn du ein Blatt einfügst dann ändert sich auch die Nummerierung, also was bis eben noch Blatt 2 war könnte jetzt Blatt 3 sein und schon sprichst du das falsche an.
Gruß Heiko
PS: Rückmeldung wäre nett !
Anzeige
AW: @ Martin
14.11.2006 14:54:00
lueckii
Hallo Bernd!
Man kann den Namen des Blattes schon per VBA ändern. Wenn das Makro aber mit nem Button verknüpft ist und das Blatt in verschiedenen Dateien anders heißt, geht das leider nicht mit der .Name prozedur, da dem Blatt kein eindeutiger Name zugewiesen ist.d.h.
in einer datei heißt das 3. Blatt "F" und in ner anderen "G". Schon hast du ein Problem. Da die Dateien hier alle gleich aufgebaut sind funktioniert meine Lösung, denk ich mal
Gruß Martin
Nur VBA Name ist einigermassen sicher!
14.11.2006 15:32:08
EtoPHG
Hallo Martin,
Mit Deinem funktioniert meine Lösung, denk ich mal! bin ich gar nicht einverstanden.
Ohne Blattschutz: Blattnamen können vom Benutzer beliebig geändert werden (Umbenennen).
Ohne Arbeitsmappenschutz: Blatt-Index können vom Benuzter beliebig geändert werden (Register verschieben).
Ohne VBE-Schutz: Blatt-Codenamen können vom Benutzer beliebig geändert werden.
Sicher ist also keine Methode, wobei die sicherste IMHO der relative Blatt-Codenamen ist, weil a) VBE-Schutz "relativ" sicher und VBE-Kentnisse der Benutzer "relativ" klein.
So schreibt z.B. der folgende Code IMMER in die VBA Tabelle1 egal wie diese heisst und welchen Index sie hat. Aber auch dieser Code funktioniert nur einwandfrei, a) in einer Arbeitsmappe erstellt mit einer deutschen Excelversion und keine VBA-Codenamen Änderung vorgenommen wurde.

Sub TabNamen()
Dim ix As Integer
Tabelle1.Range("A1") = "Index"
Tabelle1.Range("B1") = "Blatt-Name"
Tabelle1.Range("C1") = "VBA-Name"
For ix = 1 To ActiveWorkbook.Sheets.Count
Tabelle1.Range("A" & ix) = ThisWorkbook.Sheets(ix).Index
Tabelle1.Range("B" & ix) = ThisWorkbook.Sheets(ix).Name
Tabelle1.Range("C" & ix) = ThisWorkbook.Sheets(ix).Name
Next ix
End Sub

Gruss Hansueli
Anzeige
Kleine Korrektur,
14.11.2006 15:45:34
EtoPHG
... auch das übernehmen von falschem Code ist nicht sicher ... ;-)

Sub TabNamen()
Dim ix As Integer
Tabelle1.Cells(1, 1) = "Index"
Tabelle1.Cells(1, 2) = "Blatt-Name"
Tabelle1.Cells(1, 3) = "VBA-Name"
For ix = 1 To ActiveWorkbook.Sheets.Count
Tabelle1.Cells(1 + ix, 1) = ThisWorkbook.Sheets(ix).Index
Tabelle1.Cells(1 + ix, 2) = ThisWorkbook.Sheets(ix).Name
Tabelle1.Cells(1 + ix, 3) = ThisWorkbook.Sheets(ix).CodeName
Next ix
End Sub

Sorry, Hansueli
AW: VBA-Makro
14.11.2006 13:01:56
EtoPHG
Hallo Bernd,
Spiel mal ein bisschen damit rum:

Sub TabNamen()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
MsgBox "BlattIndex:" & ws.Index & vbCrLf & _
"BlattName: " & ws.Name & vbCrLf & _
"VBA-Name: " & ws.CodeName
Next
End Sub

Gruss Hansueli
Anzeige
AW: VBA-Makro
14.11.2006 20:12:22
Bernd
Vielen Dank für eure Mühe,
vielleicht habe ich mich nicht verständlich ausgedrückt. Ich möchte das Blatt über eine Variable ansprechen, aber das scheint mein Problem zu sein.
gruss Bernd
AW: VBA-Makro
15.11.2006 08:04:33
Bernd
Morgen Heiko,
das Problem ist, dass VBComponents anscheinend keine Variable akzeptiert.
Hier das Makro, welches ich Makrogesteuert hinter eine Tabelle legen muss.
With ThisWorkbook.VBProject.VBComponents(Tabelle).CodeModule
.InsertLines 1, _
"

Private Sub Worksheet_Change(ByVal Adresse As Range)" & Chr(13) & _
"Dim Bereich As Range" & Chr(13) & _
"Set Bereich = Range(""I2:BH72"")" & Chr(13) & _
"If Not Intersect(Adresse, Bereich) Is Nothing Then" & Chr(13) & _
"Adresse.Interior.ColorIndex = 4" & Chr(13) & _
"Adresse.Offset(-1, 0).Interior.ColorIndex = 4" & Chr(13) & _
"End If" & Chr(13) & _
"End Sub
"
End With
gruss Bernd
Anzeige
AW: VBA-Makro
15.11.2006 08:11:41
Heiko
Hallo Bernd,
also bei mir geht das, XP und EXCEL 2002.

Sub test()
Dim Tabelle As String
' Tabelle1 heißt bei mir in EXCEL Tabelle1
' Tabelle = "Tabelle1"
' With ThisWorkbook.VBProject.VBComponents(Tabelle1).CodeModule
' Tabelle2 heißt bei mir in EXCEL MalSehen
Tabelle = "MalSehen"
With ThisWorkbook.VBProject.VBComponents(ActiveWorkbook.Worksheets(Tabelle).CodeName).CodeModule
.InsertLines 1, _
" Private Sub Worksheet_Change(ByVal Adresse As Range)" & Chr(13) & _
"Dim Bereich As Range" & Chr(13) & _
"Set Bereich = Range(""I2:BH72"")" & Chr(13) & _
"If Not Intersect(Adresse, Bereich) Is Nothing Then" & Chr(13) & _
"Adresse.Interior.ColorIndex = 4" & Chr(13) & _
"Adresse.Offset(-1, 0).Interior.ColorIndex = 4" & Chr(13) & _
"End If" & Chr(13) & _
"End Sub "
End With
End Sub

Gruß Heiko
PS: Rückmeldung wäre nett !
Anzeige
AW: VBA-Makro
15.11.2006 09:25:40
Bernd
Hallo Heiko,
wenn ich versuche das Blatt über folgenden Code anzusprechen wird Excel ohne Angabe einer Fehlernummer beendet.
With ThisWorkbook.VBProject.VBComponents(ActiveWorkbook.Worksheets(Tabelle).Name).CodeModule
.InsertLines 1, _
"

Private Sub Worksheet_Change(ByVal Adresse As Range)" & Chr(13) & _
"Dim Bereich As Range" & Chr(13) & _
"Set Bereich = Range(""I2:BH72"")" & Chr(13) & _
"If Not Intersect(Adresse, Bereich) Is Nothing Then" & Chr(13) & _
"Adresse.Interior.ColorIndex = 4" & Chr(13) & _
"Adresse.Offset(-1, 0).Interior.ColorIndex = 4" & Chr(13) & _
"End If" & Chr(13) & _
"End Sub
"
End With
gruss Bernd
Anzeige
Ich geb´s auf !
15.11.2006 10:23:43
Heiko
Hallo Bernd,
da du ja schon einen neuen Thread eröffnest hast ohne den alten hier richtig zu verfolgen und nicht in der Lage bist, bei EXCEL und VBA GUT, meine Codevorschläge richtig und fehlerfrei in deine Anwendungen zu übertragen bin ich jetzt raus !!!
Gruß Heiko

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige