Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
28.04.2024 14:18:05
Anzeige
Archiv - Navigation
1932to1936
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

DIm und SET

DIm und SET
11.06.2023 16:31:19
G.

Guten Tag.
Ich verstehe nicht warum folgender Code nicht funktioniert:
Dim wbkDaten As Workbook
Dim wksMeßdatenJ As Worksheet
Dim wksMeßdatenVJ As Worksheet

Set wbkDaten = Workbooks("EW.Daten.xlsM")
Set wksMeßdatenJ = Workbooks("EW.Daten.xlsM").Worksheets(Worksheets.Count)
Set wksMeßdatenVJ = Workbooks("EW.Daten.xlsM").Worksheets(Worksheets.Count - 1)

Variante 1
' Daten werden in die richtige Tabelle eingefügt
Workbooks("EW.Daten.xlsM").Worksheets(Worksheets.Count).Cells(Zeile, "A") = _
Workbooks("EW.Daten.xlsM").Worksheets(Worksheets.Count - 1).Cells(Zeile, "B")

Variante 2
' Daten werden nicht in die letzte Tabelle eingefügt, sondern an drittletzter Stelle
with wksMeßdatenJ
.Cells(Zeile, "A") = wksMeßdatenVJ.Cells(Zeile, "B")
End with

Wo liegt der Fehler?

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: DIm und SET
11.06.2023 16:53:07
Daniel
Hi
Du verwendest zum Zählen der Blätter das falsche Workbook.
Worksheets.Count zählt die Tabellenblätter in der aktiven Datei.
In deinem Fall musst du angeben, in welcher Datei du die Tabellenblätter Zählen willst:
Workbooks("EW.Daten.xlsM").Worksheets.Count

Weiterhin, wenn du das Workbook einer Variablen zugewiesen hast, solltest du in Folge die Variable verwenden und nicht den ausgeschriebenen Workbooknamen.
Wenn sich der Name mal ändert, musst du so nur bei der Variablenzuweisung den Code anpassen und nicht mehrfach.

Gruß Daniel


Anzeige
Wo liegt der Fehler?
11.06.2023 16:59:11
RPP63
Moin!
Der Fehler liegt wie so häufig an unzureichender Referenzierung!
Bei Set wksMeßdatenJ = Workbooks("EW.Daten.xlsM").Worksheets(Worksheets.Count)
bezieht sich der fette Teil auf die aktive Mappe, die nicht Workbooks("EW.Daten.xlsM") sein muss!
Wenn Du unbedingt eine Objekt-Kaskade mittels Set = bilden willst, dann solltest Du auch die bereits vorhandenen Objekte nutzen:
Dim wbkDaten As Workbook
Dim wksMeßdatenJ As Worksheet
Dim wksMeßdatenVJ As Worksheet

Set wbkDaten = Workbooks("EW.Daten.xlsM")
With wbkDaten 
   Set wksMeßdatenJ = .Worksheets(.Worksheets.Count)
   Set wksMeßdatenVJ = .Worksheets(.Worksheets.Count - 1)
End With
Beachte die Punkte!

Gruß Ralf


Anzeige
AW: DIm und SET
11.06.2023 20:35:55
GerdL
Moin
Set wbkDaten = Workbooks("EW.Daten.xlsm")
Set wksMeßdatenJ = wbkDaten.Worksheets(wbkDaten.Worksheets.Count)
Set wksMeßdatenVJ = wksMeßdatenJ.Previous
Gruß Gerd


AW: DIm und SET
12.06.2023 13:09:22
snb
With Workbooks("EW.Daten.xlsm")
  with .sheets(.sheets.Count)
    ----
  end with
  with .sheets(.sheets.Count-1)
      - - - - - 
  end with
End with


AW: DIm und SET
14.06.2023 14:37:58
G.
Danke für Euere Antworten.
Das hat mir geholfen.
Jetzt habe ich jedoch ein Problem festgestellt:
Wenn ich die Prozedur im Entwicklermodus starte funktioniert alles wie es soll.
Rufe ich die Prozedur aus einer anderen Prozedur auf tritt wieder der leidige Fehler der Variante 2 auf.
Das verstehe ich nicht.


Anzeige
AW: DIm und SET
14.06.2023 14:55:14
Daniel
dann hast du irgendwo nicht vollständig referenziert, dh. irgenwo fehlt noch eine Workbook- oder Worksheet-Angabe und Excel setzt dann das falsche ein.
da in der Regel Excel das aktive Tabellenblatt oder aktive Workbook einsetzt, fällt einem der Fehler beim Testen oft nicht auf, weil man hierzu meistens das "richtige" Tabellenblatt aktiviert, so das der Code läuft. Das passiert häufig beim testen im Einzelstepmodus, wo man beobachten will, was das Makro macht.
Führt man das Makro dann normal aus, ist dann häufig ein anderes Tabellenblatt das aktive und dann kommt der Fehler.


Anzeige
AW: DIm und SET
14.06.2023 16:20:00
G.
Um sicher zu gehen hier nochmal der vollständige Code:

Option Explicit
Option Base 1

Dim wbkDaten As Workbook 'wbk = Workbook, Mappe EW.Daten.xlsM
Dim wksMeßdatenVJ As Worksheet 'Blatt Meßdaten Vorjahr
Dim wksMeßdatenJ As Worksheet 'Blatt Meßdaten aktuelles Jahr

Dim letzteZeile, Zeile As Byte 'Start Ende der ProgressBar
Public ZählerwechselJN, eZählerwechselJN, wZählerwechselJN As Boolean

Sub TEST1()         'Rechnung_Parzelle_erstellen()

Set wbkDaten = Workbooks("EW.Daten.xlsM")
With wbkDaten
   Set wksMeßdatenVJ = .Worksheets(Worksheets.Count - 1)
   Set wksMeßdatenJ = .Worksheets(Worksheets.Count)
End With

wbkDaten.Activate


For Zeile = 3 To 3  'letzteZeile  'von: 3 to letzteZeile; = Parzelle 1 - 22
   With wbkDaten
      With wksMeßdatenJ
               MsgBox wksMeßdatenJ.Name & " ; " & wksMeßdatenVJ.Name
         ZählerwechselJN = IIf(wksMeßdatenJ.Cells(Zeile, "R") > 0 Or wksMeßdatenJ.Cells(Zeile, "T") > 0, True, False)
               MsgBox Zeile & " ; " & CDbl(wksMeßdatenJ.Cells(Zeile, "R")) & " ; " & _
                                      CDbl(wksMeßdatenJ.Cells(Zeile, "T")) & " ; " & ZählerwechselJN
      End With
   End With

Next Zeile

End Sub
Aufgerufen wird die
Sub durch einen RibbonButton 



Anzeige
AW: DIm und SET
14.06.2023 16:35:30
GerdL
Sub TEST1() 'Rechnung_Parzelle_erstellen()

Set wbkDaten = Workbooks("EW.Daten.xlsM")
With wbkDaten
Set wksMeßdatenVJ = .Worksheets(.Worksheets.Count - 1)
Set wksMeßdatenJ = .Worksheets(.Worksheets.Count)
End With

Gruß Gerd


AW: DIm und SET
14.06.2023 16:38:40
Daniel
so wie ich schrieb.
du hast immer noch unvollständige Referenzierung drin, dh es fehlt die Angabe des Workbooks und damit referenziert Excel dann automatisch das aktive Workbook und das ist das falsche.

With wbkDaten
   Set wksMeßdatenVJ = .Worksheets(Worksheets.Count - 1)
   Set wksMeßdatenJ = .Worksheets(Worksheets.Count)
End With
damit hier die Anzahl der Workbooks immer in der richtigen Mappe ermittelt wird, musst du auch vor Worksheets.Count das Workbook angeben (das hatte ich dir schon in meiner ersten Antwort an dich geschrieben.
du hast zwar jetzt die WITH-Klammer aufgemacht, aber damit auch das Workbook aus der WITH-Klammer eingesetzt wird, musst du auch den Punkt setzen, also
With wbkDaten
   Set wksMeßdatenVJ = .Worksheets(.Worksheets.Count - 1)
   Set wksMeßdatenJ = .Worksheets(.Worksheets.Count)
End With
es ist zwar nur ein kleiner Punkt, aber er macht viel aus.

noch ein paar weiter Punkte:
du hast jetzt zwar die WITH-Klammer angewendet, aber noch nicht richtig verstanden, das sieht man im folgecode.
Wenn du schon die WITH-Klammer verwendest, dann benutze sie auch.
aus
      With wksMeßdatenJ
               MsgBox wksMeßdatenJ.Name & " ; " & wksMeßdatenVJ.Name
         ZählerwechselJN = IIf(wksMeßdatenJ.Cells(Zeile, "R") > 0 Or wksMeßdatenJ.Cells(Zeile, "T") > 0, True, False)
               MsgBox Zeile & " ; " & CDbl(wksMeßdatenJ.Cells(Zeile, "R")) & " ; " & _
                                      CDbl(wksMeßdatenJ.Cells(Zeile, "T")) & " ; " & ZählerwechselJN
      End With
wird:
      With wksMeßdatenJ
               MsgBox .Name & " ; " & wksMeßdatenVJ.Name
         ZählerwechselJN = IIf(.Cells(Zeile, "R") > 0 Or .Cells(Zeile, "T") > 0, True, False)
               MsgBox Zeile & " ; " & CDbl(.Cells(Zeile, "R")) & " ; " & _
                                      CDbl(.Cells(Zeile, "T")) & " ; " & ZählerwechselJN
      End With
also überall, wo normalerweise das Objekt steht, dass du beim letzten WITH definiert hast, bleibt nur der Punkt am Anfang.

und nochwas:
Public ZählerwechselJN, eZählerwechselJN, wZählerwechselJN As Boolean
hier wird nur die wZählerwechselJN boolean, die anderen werden Variant.
in VBA gibt es keine gruppendeklaration, man muss für jede Variable einzeln den Typ angeben, auch wenn man in einer Zeile deklariert
Public ZählerwechselJN as boolean, eZählerwechselJN as boolean, wZählerwechselJN As Boolean
meistens merkt man das nicht, weil in Variant der Typ ja passend zum zugewiesenen Wert aktiviert wird, aber man sollte es wissen.
Gruß Daniel


Anzeige
AW: DIm und SET
14.06.2023 17:13:13
G.
Danke Daniel, das war der Durchbruch!
Die Punkte vor Worksheet.count war die Ursache.
Die inkonsequente Nutzung der with-Klammer in Lösung 2, war die Folge von Verzweiflungstaten.
Und zum Schluß. Das es bei VBA keine Gruppendeklaration gibt war mir bisher nicht bekannt.

Danke für Alles und an allen Helfern.
MfG. Günter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige