Microsoft Excel

Herbers Excel/VBA-Archiv

With Anweisung löscht Variant Instanz?! | Herbers Excel-Forum


Betrifft: With Anweisung löscht Variant Instanz?! von: Andreas Hanisch
Geschrieben am: 20.08.2012 12:18:18

Hallo Excel Freunde,

ich bin am Wochenende über ein Phänomen gestolpert, welches ich mit meinem bisherigen Wissen nicht erklären kann.

Ich habe eine Prozedur die von diversen anderen Codes aufgerufen wird. Es gibt einen Variant- Aufrufparameter „varRef“. Dieser kann fast alles sein. Ein Array (ein oder mehrdimensionales), eine Collection oder ein Range. Die Prozedur ermittelt durch einfache Prüfung, um was es sich handelt und schreibt alles in eine einheitliche Form um, mit der dann weitergearbeitet wird. Um die Prozedur noch etwas zu erweitern habe ich am Sonnabend nun an der Position „2: “ im VBA Code ein Prüfung einfügen wollen – derzeit dargestellt durch die Zeile „Debug.Print "2: "; varRef(l)“. Bei Strings innerhalb des „varRef“ gab der Debug.Print nichts aus. An Position „1: “ hingegen wurde erwartungsgemäß der String im „varRef“ ausgegeben. Aber dazwischen gab es nur eine „With“ Anwiesung innerhalb derer geprüft wurde, um welche Form von Inhalt es sich im „varREf“ handelt (Range oder Object). Wenn ich die „With“ Anweisung auskommentieren, dann wird an Position 1 und (!) 2 der Inhalt korrekt ausgegeben.

Warum beeinflußt diese „With“ Anweisung das „varRef“ so negativ? Habe ich etwas übersehen oder unterliege ich einem eklatanten Denkfehler?!

Ich sehe den Wald vor lauter Bäumen nicht mehr und weiß nicht weiter, daß ich in so wenigen Codezeilen den Fehler nicht erkenne…
Ich wäre sehr erfreut, wenn ein erfahrener und hilfsbereiter Forumsteilnehmer sich den Code einmal ansieht.

https://www.herber.de/bbs/user/81484.xlsm

Vielen Dank und Grüße aus Berlin, Andreas Hanisch

  

Betrifft: VarType() verwenden von: Erich G.
Geschrieben am: 20.08.2012 16:52:00

Hi Andreas,
so ganz verstehe ich das auch nicht.

Sicher ist, dass hinter "With" immer ein Objekt (oder ein benutzerdefinierter Typ) stehen muss (VBA-Hilfe zu With).
Das ist bei deinem Beispiel nicht der Fall. Eigentlich müsste die "With"-Zeile schon einen Fehler auslösen.
Stattdessen wird wohl versucht, aus dem Arrayelement irgendwie ein Objekt zu machen.

Du solltest With nur bei Objekten verwenden. Für die Unterscheidung der möglichen Datentypen gibt es VarType().

Schau dir mal den folgenden (noch Pseudo-)Code an:

Sub Variant_prc(ByVal varRef As Variant)
   Dim ii As Long, intTyp As Integer
   
   intTyp = VarType(varRef)            ' Typ des gesamten varRef
   If intTyp >= vbArray Then           ' nur dann ist LBound usw. definiert
      Debug.Print "Typ: Arr"; intTyp

      For ii = LBound(varRef, 1) To UBound(varRef, 1)
         intTyp = VarType(varRef(ii))  ' Typ des Arrayelements
         Debug.Print "Typ: "; ii; intTyp
      
      '   if Typ ist range oder object: (nur dann ist 'With' sinnvoll
              With varRef(ii)
                 ' ...
              End With
      '   else
               ' ...
      '   end if
      Next ii
   End If
End Sub
Die Werte für vbObject usw. findest du in der VBA-Hilfe zu VarType().
Wichtig ist auch die Bemerkung zu vbArray.

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: AW: VarType() verwenden von: Andreas Hanisch
Geschrieben am: 21.08.2012 12:36:31

Hallo Erich,

vielen Dank für Deine Antwort. Ich habe gestern begonnen, Deinen Tip mit der 'varType' Prüfung umzusetzen und bin erfreut nun einen neuen Befehl zu kennen. Es ist ein hoffnungsvoller Ansatz. Ich werde wohl meinen ganzen Code umstrukturieren, um den kruden Fehler zu beseitigen.

Danke Dir für Deine wertvolle und nützliche Anregung!

Grüße aus Berlin, Andreas Hanisch


Beiträge aus den Excel-Beispielen zum Thema "With Anweisung löscht Variant Instanz?!"