Anzeige
Archiv - Navigation
1108to1112
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
Syntax ChBx und Blätter hochzählen
Jörg-HH
Guten Morgen, liebe Frühaufsteher
diverse ChBoxen sollen in diversen Blättern was bewirken. Ich dachte mir das so einfach: Die Nummern der Blätter sind historisch gewachsen und nicht linear. Die ChBxen habe ich korrespondierend benannt, also:
ChBx 5 für Blatt 5
ChBx 6 für Blatt 6
ChBx 9 für Blatt 9 usw.
Weil viele Nummern dazwischen nicht existieren, habe ich Resume Next vorangestellt, und dann _ sieht das Ganze so aus:

Dim Tabelle As Worksheet, Checkbox As Object
On Error Resume Next
For i = 5 To 99
With ("Tabelle" & i)
If ("Checkbox" & i).Value = True Then
.Range("Druckbereich").Cells.Interior.ColorIndex = xlNone
.Range("Druckbereich").PrintOut   'Papierpreis
.Range("Druckbereich").Cells.Interior.ColorIndex = 15
End If
End With
Next i
...
Das Programm aber meckert, daß die With-Variable einen benutzerdef. Typ oder Typ Object od Variant haben muß. Was mache ich falsch?
Schönen Sonntag! - Jörg
Objektbezeichner (Sheets, Cells etc.) fehlt
25.10.2009 02:54:34
NoNet
Moin Jörg (nööö, bin heute noch nicht aufgestanden, aber auch noch nicht ins Bett gegangen, daher NOCH wach ;-),
In Deinem Code fehlt der Objektbezeichner, dessen Aufzählung Du in der Schleife abarbeiten möchtest.
Woher soll Excel denn "wissen", dass es sich bei "Tabelle1" um ein Blatt (Sheet) handelt und nicht z.B. um einen definierten Bereichsnamen ? - Das musst Du Deinem Programm schon "verraten" ;-) :
With Sheets("Tabelle" & i)
Das Gleiche dann bei Deinen Checkboxen (für Checkboxen aus der Formular-Symbolleiste) :
If .Checkboxes("Checkbox" & i).Value = True Then
Falls es sich um Checkboxen aus der Steuerelement-Toolbox handelt, dann bitte diese Variante :
If .OLEObjects("Checkbox" & i).Object.Value = True Then
Noch ein Tipp : Verwende als Variablennamen NIE die Bezeichnung eines bestehenden Objektes !
"CheckBox" ist in VBA ein bestehendes Objekt und sollte daher nicht als Variablennamen verwendet werden ! - Besser ist z.B. chkCheckBox.
Gruß, NoNet
Anzeige
aha- wieder was gelernt. Gibt aber noch Probleme..
25.10.2009 20:51:21
Jörg-HH
Hi NoNet,
erstmal ganz herzlichen Dank für die deutliche Unterweisung wg Objektbezeichner. Jetzt hab ich eigentlich erstmals begriffen, was das ist, und dabei gleich den nebulösen Unterschied zwischen Formular- und ActiveX-Elementen gesehen...
Das mit dem Variablennamen ist mir noch unklar: Die Namen Checkbox1 usw werden ja von VBA vergeben. Normalerweise benenne ich die Objekte in sprechender Weise um, aber hier bot sich das mit dem Zähl-Index an, da hab ich die Namen so belassen. Checkbox ist ein VBA-Objekt, aber der taucht doch als Namen nicht auf - nur Checkbox1, Checkbox2 usw... - das sind doch andere Namen.... dachte ich jedenfalls...
So- nun das Wesentliche :-(( ... der Code läuft leider nicht. Es gibt in der Zeile With _ Sheets("Tabelle" & i) (woher kommt eigtl immer dieser blöde Unterstrich?) die Meldung außerhalb Kontext. So sieht das momentan aus:

Private Sub cmd_ToDo_ReBlDruck_Click()
Dim Tabelle As Worksheet, Checkbox As Object
If DruckerWaehlen = True Then     'die Function liegt in modGlobal
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
If ChBx_Deckblatt.Value = True Then Tabelle116.PrintOut                   'Deckblatt
On Error Resume Next
For i = 5 To 99
With Sheets("Tabelle" & i)
If .OLEObjects("Checkbox" & i).Object.Value = True Then
.Range("Druckbereich").Cells.Interior.ColorIndex = xlNone
.Range("Druckbereich").PrintOut
.Range("Druckbereich").Cells.Interior.ColorIndex = 15
End If
End With
Next i ....usw
Woran mag das liegen? Vielleicht nützt es was, wenn ich noch anmerke, daß der Code nicht in einem Blatt liegt, sondern in einer Userform?
Grüße - Jörg
Anzeige
PS
25.10.2009 22:38:18
Jörg-HH
noch als Ergänzung, NoNet:
Dies läuft auch ohne Objektbezeichner:

With Tabelle5
If CheckBox5.Value = True Then
.Range("Druckbereich").Cells.Interior.ColorIndex = xlNone
.Range("Druckbereich").PrintOut
.Range("Druckbereich").Cells.Interior.ColorIndex = 15
End If
End With
Wenn ich bloß die 5 durch i ersetze, läuft nix mehr:

For i = 5 To 99
With Sheets("Tabelle" & i)
If .OLEObjects("Checkbox" & i).Object.Value = True Then
.Range("Druckbereich").Cells.Interior.ColorIndex = xlNone
.Range("Druckbereich").PrintOut
.Range("Druckbereich").Cells.Interior.ColorIndex = 15
End If
End With
Next i

Anzeige
"Tabelle5" ist der Codename des Blattes
26.10.2009 00:12:41
NoNet
Hallo Jörg,
da liegt evtl. ein Mißverständnis vor :
Im Beispielcode "With Tabelle5" ist Tabelle5 weder ein Objektbezeichner (das Objekt wäre Sheets) und auch kein Element der Auflistung aller Sheets (es muss also kein Tabellenblatt "Tabelle5" heißen), sondern der Codename eines Tabellenblattes wie er im VBA-Editor im Eigenschaftenfenster angezeigt wird.
Um die Codenamen aller Tabellenblätter in einer Schleife zu referenzieren, müsste man prinzipiell diese Methode verwenden :
With Activeworkbook.VBProject.VBComponents("Tabelle" & i)
Allerdings funktioniert das nicht wirklich und ich würde davon auch eher abraten.
Ab Excel 2003 muss dazu zudem der Zugriff auf da VB-Projekt gestattet sein ("Extras - Makro - Sicherheit - Vertrauenswürdige Herausgeber")
Befinden sich die Checkboxen auch im userForm pder im Tabellenblatt ? - Wie heißen die Tabellenblätter den (in Excel, nicht im VBA-Editor !) ?
Gruß, NoNet
Anzeige
AW: "Tabelle5" ist der Codename des Blattes
26.10.2009 09:55:24
Jörg-HH
Moin NoNet,
die Checkboxen und der Drucken-cmdButton liegen alle im Userform.
Die Blätter heißen unterschiedlich (Preise, Kalkulation usw...) und liegen auch nicht hintereinander (kann man also nicht von-bis abzählen).
Übrigens gehe ich gerade dazu über, im Code die Blattnamen durch den Codenamen der Blätter zu ersetzen, da dann die Blätter auch mal umbenannt werden können. Das erschien mir einfacher, als in einem Extrablatt die Blattnamen zu sammeln und VBA dort nachgucken zu lassen. Ist das evtl. der falsche Weg?
Ich habe mal versuchsweise die neu gelernte :-) Referenzierung eingesetzt:
With ActiveWorkbook.VBProject.VBcomponents("Tabelle" & i)
Nun liegt der Fehler eine Zeile tiefer bei
If .OLEObjects("Checkbox" & i).Object.Value = True Then
und meldet Objekt unterstützt diese Eigenschaft nicht.
Da der Zu-Fuß-Weg ja funktioniert, könnte ich ihn ja auch so stehen lassen - für meine 15 ChBx ist das ja nicht so schlimm. Aber was wäre, wenn ich 300 davon hätte? Dachte mir, es müsse doch einen Weg geben, das abzukürzen.
Grüße - Jörg
Anzeige
ich würde mir eine Function dafür schreiben.
26.10.2009 17:03:59
Tino
Hallo,
hier mal ein Beispiel.
Function objTab(strName$) As Object
Dim i As Integer
With ThisWorkbook
For i = 1 To .Sheets.Count
If .Sheets(1).CodeName = strName Then
Set objTab = .Sheets(i)
Exit Function
End If
Next i
End With
End Function
Sub Beispiel()
Dim i As Integer
Dim oTabelle As Object
i = 1
Set oTabelle = objTab("Tabelle" & i)
With oTabelle
MsgBox .Name
End With
End Sub
Gruß Tino
Korrektur...
26.10.2009 17:11:50
Tino
Hallo,
in der Function muss in .Sheets(1).CodeName ein i rein, also .Sheets(i).CodeName.
Function objTab(strName$) As Object
Dim i As Integer
With ThisWorkbook
For i = 1 To .Sheets.Count
If .Sheets(i).CodeName = strName Then
Set objTab = .Sheets(i)
Exit Function
End If
Next i
End With
End Function
Sub Beispiel()
Dim i As Integer
Dim oTabelle As Object
i = 1
Set oTabelle = objTab("Tabelle" & i)
If Not oTabelle Is Nothing Then
With oTabelle
MsgBox .Name
End With
Else
MsgBox "Tabelle nicht gefunden"
End If
End Sub
Gruß Tino
Anzeige
versteh ich nicht...
26.10.2009 17:56:15
Jörg-HH
Hi Tino,
ich hab keine Idee, wo ich das in meinem Code einfügen soll. Ich frag doch nicht danach, ob eine Tabelle zu finden ist oder nicht, sondern es soll bei bestimmten Tabellen was gedruckt werden. Weil beim Durchlauf durch die Indizes diverse Tabellen nicht gemeint sind (was planmäßig zu einem Fehler führen muß), steht weiter ja oben On Error Resume Next (zZt auskommentiert, um den Fehler zu finden).
Nachdem nun die Zeile With ActiveWorkbook.VBProject.VBcomponents("Tabelle" & i) keinen Fehler mehr ergibt, müßte noch ein "Ersatz" für If .OLEObjects("Checkbox" & i).Object.Value = True Then gefunden werden.
Grüße - JÖrg
Anzeige
sollte nur ein Beispiel sein
26.10.2009 18:19:32
Tino
Hallo,
an Dein Code im ersten Beitrag angepasst.
Function objTab(strName$) As Object
Dim i As Integer
With ThisWorkbook
For i = 1 To .Sheets.Count
If .Sheets(i).CodeName = strName Then
Set objTab = .Sheets(i)
Exit Function
End If
Next i
End With
End Function
Sub Beispiel()
Dim i As Integer
Dim oTabelle As Object
For i = 5 To 99
'Objektnamen der Tabelle finden und zuweisen
Set oTabelle = objTab("Tabelle" & i)
If Not oTabelle Is Nothing Then 'Tabelle gefunden?
With oTabelle
If .OLEObjects("CheckBox" & i).Object.Value Then 'CheckBox prüfen
.Range("Druckbereich").Cells.Interior.ColorIndex = xlNone
.Range("Druckbereich").PrintOut   'Papierpreis
.Range("Druckbereich").Cells.Interior.ColorIndex = 15
End If
End With
End If
Next i
End Sub
Gruß Tino
Anzeige
ah- schon klarer. Aber noch Fehler...
26.10.2009 18:31:23
Jörg-HH
...hab das jetzt mal so eingebaut. Oben drüber steht dies - hoffe, das war so gemeint:

Private Sub cmd_ToDo_ReBlDruck_Click()
Dim Tabelle As Worksheet, Checkbox As Object
If DruckerWaehlen = True Then     'die Function liegt in modGlobal
Call Beispiel
End If
End Sub
hier folgt dann dein Code. Jetzt wird bei If .OLEObjects("CheckBox" & i)....usw gesagt: Kann das OLE-Objekt nicht zuweisen
:-(( Jörg
ich kann nur raten...
26.10.2009 18:53:13
Tino
Hallo,
und vermute mal es gibt
z. Bsp. auf der Tabelle5 nicht die CheckBox5 oder auf Tabelle10 nicht die CheckBox10.
Welchen Namen haben den die Checkboxen auf den einzelnen Tabellen?
Gruß Tino
Anzeige
...stehen in einer UF...
26.10.2009 19:09:17
Jörg-HH
Tino, du bist später in diesen Thread eingestiegen und hast was vom Anfang nicht mitbekommen:
Es soll bei 15 von ca. 100 Blättern ein Druckbereich gedruckt werden. Welche aus dieser Teilmenge von 15 jeweils gemeint sind, bestimmt eine Batterie von 15 Checkboxen, die in einer UF (!) stehen - und nicht in den Blättern. Dort auf der UF sitzt auch der cmd-Button, der alles auf einmal anschiebt.
Zunächst hatten die ChBx durchlaufende Indizes, die Tabellen aber nicht. Dann kam ich auf die Idee, den ChBx-Namen Indizes zu geben, die mit den gewünschten Tabellen korrespondieren: Für Tabelle5 ist dann CheckBox5 zuständig. Dann könnte ich eine Schleife laufen lassen. Weil beim Durchlauf durch die Indizes diverse Tabellen nicht gemeint sind (was planmäßig zu einem Fehler führen muß), steht weiter oben On Error Resume Next.
Weil sich das zunächst ganz gut schriftlich bearbeiten ließ, hatte ich keine Beispieldatei gebastelt. Und jetzt sind wir schon so weit, daß vermutlich keine mehr nötig ist. Irgnedwie gehts ja nur noch um eine Zeile...
Grüße - Jörg
AW: ...stehen in einer UF...
26.10.2009 19:34:45
Tino
Hallo,
wenn die CheckBoxen sich auf einer Userform befinden und
der Code auch dort läuft kann es so gehen.
If Me("CheckBox" & i) then
Wenn der Code in einer Sub oder einer anderen UF läuft,
müsstest Du den Namen der Userform davorstellen.
If UserForm1("CheckBox" & i) then
Gruß Tino
..findet er nicht...
26.10.2009 19:47:17
Jörg-HH
...da sagt er mir bei If Me("CheckBox" & i) then immer "konnte nicht gefunden werden"
:-((
PS
26.10.2009 19:50:36
Jörg-HH
..ich muß natürlich den UF-Namen voranstellen - aber dann kommt auch die Meldung...
AW: PS
26.10.2009 20:02:26
F1
Controls("Checkbox" & i) = True
Gilt für Userform!
F1
:-((
26.10.2009 20:09:27
Jörg-HH
Hallo F1
If uf_ToDo_ReBlDruck.Controls("CheckBox" & i) = True Then
bringt "konnte nicht gefunden werden" (mit und ohne den Namen der UF)
schwere Geburt...
Grüße - Jörg
hier ein Beispiel.
26.10.2009 20:09:48
Tino
Hallo,
Me("..") funktioniert genau so wie UserForm1("..") oder Controls("..").
Me ist ja die aktuelle Userform nichts anderes.
Hier ein Beispiel mehr kann ich nicht für dich machen.
https://www.herber.de/bbs/user/65348.xls
Gruß Tino
hmm - letzter Versuch mit neuer Erkenntnis...
26.10.2009 21:44:28
Jörg-HH
Hi Tino
erstmal ganz herzlichen Dank für deine Geduld...!!
Ich habe jetzt diverse vermeintliche Ursachen geprüft - zB drei weitere auf der UF vorhandene ChBx auf Namensprob geprüft - kein Unterschied. Dann... die 15 ChBx sind in einem Frame - macht auch nix, hab die chBx in deinem Beispiel in einen Frame gelegt - kein Problem.
Auch wenn ich deinen Code 1:1 bei mir reinstelle - es stoppt immer bei If Me("CheckBox" & i) Then
Aber nun eine Entdeckung:
Die erste ChBx wird anstandslos abgearbeitet - der Fehler tritt erst ab der zweiten auf. Daraufhin hab ich mal mitgezählt:
Die Tabelle5 für die erste ChBx (Checkbox5) ist im ProjExplorer die 61.
Die Tabelle14 für die zweite ChBx (Checkbox14) ist im ProjExplorer die 23.
In der Excel-Reihenfolge liegt Tabelle5 an 26.Stelle, Tabelle 14 an 27.Stelle
Für die Tabelle5 wird die Function objTab(strName$) 26x durchlaufen, für Tabelle14 79x
Diese Zahlen sind bis auf die Zahl 26 für mich so unerwartet zusammenhanglos, daß ich nichts damit anfangen kann. Sagen sie dir vielleicht was?
Grüße - Jörg
AW: hmm - letzter Versuch mit neuer Erkenntnis...
26.10.2009 22:14:18
Tino
Hallo,
dann prüfe doch mal ob es die CheckBox i überhaupt gibt.
Mach mal davor ein Msgbox "CheckBox" & i, gibt es diese?
Tabelle14 79x kann ich nur so erklären, dass es dazwischen ausgeblendete Tabellen gibt.
Kannst Du kein Beispiel hochladen, wäre wohl einfacher?
(Inhalt der Tabellen und Codeteile die nicht zur Aufgabe gehören kannst Du raus löschen)
Gruß Tino
werd ich morgen mal versuchen...
26.10.2009 22:50:29
Jörg-HH
Die erste Checkbox wird in der Msgbox angezeigt, die zweite nicht mehr
ausgeblendete Blätter gibt es keine, es sind insgesamt 116.
Tab5 und 14 liegen hintereinander (im ProjExpl natürlich nicht)
will mal versuchen, ob ich die Datei so abspecken kann, daß sie hochladbar ist. Das kann ich aber erst morgen... den Rest des Abends muß ich noch was Anderes für morgen vorbereiten...
bis dann, Tino - Gute Nacht
Jörg
Datei abgespeckt und hochgeladen...
27.10.2009 15:39:55
Jörg-HH
Hi Tino
hab jetzt die Datei abgespeckt auf ein paar leere Blätter (Außerdem erscheinen im ProjExpl zwei Blätter, die es gar nicht gibt)
Ich konnte den Fehler inzwischen soweit eingrenzen, daß ich mit den eingeschobenen MsgBoxen erkennen kann: Es liegt offenbar an Tabelle93. Die macht aber ansonsten nie Probleme. - Naja, vielleicht siehst du mit geübtem Auge mehr...

Die Datei https://www.herber.de/bbs/user/65373.zip wurde aus Datenschutzgründen gelöscht


Schönen Nachmittag!
Jörg
Ordnung ist das halbe Leben
27.10.2009 17:02:31
Tino
Hallo,
auch im VBA ist dies wichtig und macht einiges einfacher.
Habe jetzt den Tabellen den Objektnamen Tab1 bis Tab19 gegeben und
den CkeckBoxen den dazugehörigen Namen Check1 bis Check19.
https://www.herber.de/bbs/user/65374.zip
Gruß Tino
AW: Ordnung ist das halbe Leben
27.10.2009 19:19:05
Jörg-HH
Hi Tino,
nun versteh ich erstmal nur Bahnhof... natürlich bin ich platt, daß das nun plötzlich geht...
Erste Frage natürlich: Warum hakte es denn nun an Tabelle 93? Die unterschied sich doch nicht (für mich erkennbar) von anderen... In dein früheres Beispiel hatte ich auch versuchsweise eine zusätzliche Tabelle eingeschoben - ohne Probleme für den Ablauf.
Und die zweite Frage: Bedeutet das, daß ich sämtliche 116 Tabellen in der Datei umbenennen soll, damit die Tabellen namenstechnisch hintereinander liegen? Es wird da immer wieder mal wieder die Aufgabe auftreten, daß was ausgewertet werden soll, das nicht nebeneinander liegt.
Grüße - Jörg
AW: Ordnung ist das halbe Leben
27.10.2009 19:46:46
Tino
Hallo,
es hat einfach daran gehakt, dass es zu der Tabelle93 keine CheckBox93 gegeben hat.
Zu der zweiten Frage, die Tabellen müssen nicht hintereinander liegen.
Die Tabellen sollte nur den lückenlosen CodeNamen Tab1 bis Tab... haben und
eine CheckBox die den passenden Namen zur Tabelle besitzt, die Zuordnung macht dann der Code.
Du kannst den Tabellen auch den Namen Tabelle1 bis Tabelle18 geben,
aber dies wird Dir später auch wieder nur Verirrung bereiten wenn Du neue Tabellen einfügst und
diese auch Tabelle… sich nennen.
Ist zwar am Anfang etwas Arbeit, aber später wirst Du es dafür umso einfacher haben.
Zum durch benennen kannst Du zwar auch ein Makro Dir bauen,
aber davon würde ich jetzt erst mal Abstand halten sonst wird die Verwirrung noch größer.
Gruß Tino
puuhhh...
27.10.2009 21:01:45
Jörg-HH
hmm... die Tabellen haben natürlich andere Namen. Das Projekt ist nur etwas heikel, und mein Chef würde platzen, wenn ich da Klartext auf die Reise schicken würde...
Wenn es an der fehlenden Checkbox93 gelegen hat, bin ich noch verwirrter: In meiner Datei gibt es ja demnach 101 fehlende Checkboxen - oder wenn ich den Zählraum 5-99 betrachte: 79 fehlende ChBx. Das beginnt schon bei Tabelle6, zu der es keine Box gibt. Warum bloß trifft es Nr 93?
Wenn ich also mal ein Blatt lösche - sollte ich dann aus den folgenden Codenamen einen ausgucken und mit dem gelöschten Namen neu benennen, damit die Reihe lückenlos ist? Dann müßte man ja wieder den VBA-Code umschreiben, falls er auf dieses Blatt zugreift...
Ich werde versuchen, das Gelernte auf meine Datei umzusetzen. Wird nicht leicht, zumal ich deinen Code bislang nur in groben Zügen versteh. Aber ich hab jetzt endlich mal den grundlegenden Unterschied zwischen Name und Codename verstanden :-)
Herzlichen Dank für deine Erläuterungen
Grüße - Jörg

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige