Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1956to1960
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

Makro geht nicht. (Objekt erforderlich)

Makro geht nicht. (Objekt erforderlich)
04.12.2023 14:11:52
Florian
hi

makro geht nicht. kann mir wer sagen, warum? Und wie man das beheben kann? Hab schon alle Möglichkeiten durchprpobiert. Kann das jemand ausprobieren bitte? Bin noch im Übungsmodus.



Sub BlattAuswahlVersuch()
Dim dicListe As New Dictionary
Dim shBlatt As Worksheet

For Each shBlatt In ActiveWorkbook.Worksheets
dicListe.Add shBlatt.Name, shBlatt
Next shBlatt

For Each shBlatt In dicListe.Items 'Diese Zeile geht nicht
Call Ausrechnen(shBlatt)
Next shBlatt
End Sub

Sub Ausrechnen(Rotblatt As Worksheet)
Debug.Print Rotblatt.Name
End Sub


lg, Flo

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Makro geht nicht. (Objekt erforderlich)
04.12.2023 14:56:15
Yal
Hallo Florian,

Ich gehe davon aus, Du hast diesen Code von irgendwo übernommen.

Diese Zeile
Dim dicListe As New Dictionary

deutet auf die Verwendung von einem "Dictionary"-Objekt, der nicht im Standardumfang von VBA liegt, sondern in einer Blibliothek, die man vorher anbinden (early binding) muss: im VBA-Editor im Menü "Extras", "Verweise..." nach "Microsoft Scripting Runtime" suchen und anhaken.

Die Alternativ wäre "late binding". Der Code lässt sich zwar besser übertragen, aber dann verzichtet man auf Intellisense (Autovervollständigung), Objekt-Katalog (Ansicht, Objekt-Katalog, siehe Unterkatalog "Scripting") und Debuging. Für jemand der lernen möchte empfehle ich early binding.
Diese Autovervollständigung zeigt dir u.a. welche Parameter ein "dicListe.Add" erwartet. Ich hätte angenommen, dass wie bei Collection zuerst das Objekt, dann der Schlüssel erwartet wird, aber es ist doch umgekehrt (so wie Du es übergibt ist richtig).

Der Code in late binding würde so aussehen:
Sub BlattAuswahlVersuch()

Dim dicListe As Object
Dim shBlatt As Worksheet

Set dicListe = CreateObject("Scripting.Dictionary")
For Each shBlatt In ActiveWorkbook.Worksheets
dicListe.Add shBlatt.Name, shBlatt
Next shBlatt

For Each shBlatt In dicListe.Keys 'Diese Zeile geht nicht
Ausrechnen dicListe(shBlatt)
Next shBlatt
End Sub

Sub Ausrechnen(objBlatt As Worksheet)
Debug.Print objBlatt.Name
End Sub


Und dabei entdecke ich den "Diese Zeile geht nicht": bei Dictionary ist es üblich über "Keys" zu gehen.
https://excelmacromastery.com/vba-dictionary/

VG
Yal

Anzeige
AW: Makro geht nicht. (Objekt erforderlich)
04.12.2023 19:11:34
Ulf
Hi Flo,
Sollte so funzen


Option Explicit

Sub BlattAuswahlVersuch()
Dim dicListe As Scripting.Dictionary
Dim strBlatt As Variant
Dim sh As Worksheet
Set dicListe = New Scripting.Dictionary
For Each sh In ActiveWorkbook.Worksheets
strBlatt = sh.Name
dicListe.Add strBlatt, sh
Next sh
For Each strBlatt In dicListe.Keys
Ausrechnen ActiveWorkbook.Worksheets(strBlatt)
Next strBlatt
End Sub

Sub Ausrechnen(objBlatt As Worksheet)
Debug.Print objBlatt.Name
End Sub

hth
Ulf
Anzeige
AW: Makro geht nicht. (Objekt erforderlich)
05.12.2023 15:49:01
Florian
Danke Ulf, das ist eine gute Lösung. Offensichtlich kann man ein Objekt byref übergeben, wenn der Code nur dieses eine Objekt, eben ein Worksheet, erzeugen kann. Ansonsten muss man byval wählen. Auch wenn dann Änderungen am Worksheet nach Beendigung des Aufrufs hinaus erhalten bleiben, genauso wie bei einer byRef-Übergabe. ok, wieder was gelernt.

Danke, und LG, Flo
AW: Makro geht nicht. (Objekt erforderlich)
04.12.2023 15:31:35
Florian
Hallo yal, danke für deinen Beitrag.

Ich dachte schon, dass ich beim Code was nicht verstanden habe, wegen der Fehlermeldung. Aber da auch Dein Code bei mir nicht funktioniert, muss es wohl an meinem Computer oder Einstellungen oder an was anderem bei mir liegen und nicht an der for-each-Schleife. Kannst Du das noch erklären, falls Du eine Idee dazu hast?

Am Verweis liegt es jedenfalls nicht. Den habe ich direkt angebunden, so wie du es unter mit early binding beschrieben hast. Ohne das scripting einzubinden wäre ich auch sicher nicht so weit gekommen, wie beschrieben.

Die Frage ist also noch offen. LG, Flo
Anzeige
AW: Makro geht nicht. (Objekt erforderlich)
04.12.2023 15:56:24
daniel
HI
in deinem Fall ist das Problem, dass ein .Item eines Dictionarys im Prinzip alles sein kann, also vom einfachen Text bis zum hochkomplexen Objekt, und das innerhalb des selben Dictionarys.
deswegen muss man hier den "Schleifenzähler" der For-Each-Schleife als Variant deklarieren, damit er auch alles aufnehmen kann.

wenn aber shBlatt vom Typ variant ist, muss auch der Übergabeparameter der aufgerufenen Sub variant sein (gleicher Typ wie die übergebene Variable) oder du musst byVal übergeben.

Also so: das erste Makro so (ich hab die erstellung des Dictionarys auch auf late binding umgestellt, aber wenn early binding bei dir funktionert, kanns du es auch so lassen)



Sub BlattAuswahlVersuch()
Dim dicListe As Object
Dim shBlatt
Set dicListe = CreateObject("scripting.dictionary")

For Each shBlatt In ActiveWorkbook.Worksheets
dicListe.Add shBlatt.Name, shBlatt
Next shBlatt

For Each shBlatt In dicListe.Items 'Diese Zeile geht nicht
Call Ausrechnen(shBlatt)
Next shBlatt
End Sub

das zweite Makro umuss dann so geschrieben werden, wenn du die Variable Rotblatt als Worksheet haben willst:
Sub Ausrechnen(ByVal Rotblatt As Worksheet)

Debug.Print Rotblatt.Name
End Sub


oder so, wenn sie auch variant sein darf, bzw wenn du die ByRef-Übergabe benötigst.
Sub Ausrechnen(Rotblatt)

Debug.Print Rotblatt.Name
End Sub



bei der Variant-Variante fehlt dir halt die Unterstützung durch die Intellisense beim programmieren.

Gruß Daniel
Anzeige
AW: Makro geht nicht. (Objekt erforderlich)
04.12.2023 17:19:56
Florian
Hallo Daniel,

habe fast alles verstanden. Danke.
Danke jedenfalls für Deine Antwort.

Ich gebe nur ungern die Objektdeklaration für ein Variant auf und komme auf folgenden Umweg:
    Dim a As Variant

For Each a In dicListe.Items
Set shBlatt = a
Ausrechnen shBlatt
Next a


Bei "oder du musst byVal übergeben" ist mir was unklar, Daniel:
Was bedeuetet byVal? Führt das zu irgendwelchen Einschränkungen? Kann ich mit byVal etwas nicht, was ich ohne byVal könnte?
Es wird ja das konkrete Tabellenblatt und nicht eine Kopie des Objekts übergeben, denn ich kann ja im Aufruf ja davon ein Range bilden und was tatsächlich in eine Zelle schreiben.

LG, Flo.

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige