Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Typen unverträglich

Forumthread: Typen unverträglich

Typen unverträglich
Franz
Hallo Fachleute,
ein Beispiel für mein Problem:
MsgBox Month(Cells(iTag, iMon)) ergibt 1
MsgBox Month(Date) ergibt 11
ABER: die Abfrage
If Month(Cells(iTag, iMon)) = Month(Date) Then
ergibt die Fehlermeldung "Typen unverträglich"
Ich bitte Euch um Hilfe, was ich da tun muss.
Danke schonmal und Grüße
Franz
Anzeige
Nicht nachvollziehbar
07.11.2011 10:50:07
Harald
Hallo Franz,
in Zelle A1 steht die Formel: =heute()
Der folgende Code funktioniert:
Option Explicit
Sub test()
MsgBox Month(Cells(1, 1))
MsgBox Month(Date)
If Month(Cells(1, 1)) = Month(Date) Then
MsgBox "hurra"
End If
End Sub
liegt die Unverträglichkeit vielleicht darin, dass iTag oder iMon an der Stelle der if-Anweisung in Deinem Code nicht als Integer oder Long definiert sind?
Gruß
Harald
Anzeige
AW: Nicht nachvollziehbar
07.11.2011 11:05:27
Franz
Hallo Harald,
richtig, ich versteh es eben auch nicht. Und die Variablen sind beide als INTEGER definiert?
Hab jetzt noch bissl war probiert:
Diese Abfrage kommt am Ende eines längeren Codes, in dem die beiden Variablen bereits mehrfach benutzt werden. Setze ich diesen Schnipsel an den Anfang des Codes, dann klappts plötzlich. Kann es sein, dass da von vorherigem Gebrauch irgendwas hängenbleibt? Und kann man die Variablen vor erneutem Gebrauch so etwas wie "zurücksetzen"?
Grüße
Franz
Anzeige
AW: Nicht nachvollziehbar
07.11.2011 11:18:19
Harald
Hallo Franz,
"vom Gebrauch etwas hängenbleiben" kann eigentlich nur in der Form, dass der Wert einer Variablen geändert wird. Aber den Typ zur Laufzeit ändern - ich wüsste nicht, wie das in VBA funktioniert.
Hast Du "option explicit" am Anfang des Codes, um auszuschließen, dass der VBA Interpreter bei einem evtl. Tippfehler einfach eine Variable eines neuen Typs erstellt? (das sieht an in meiner Antwort leider nicht, weil es oberhalb der gelben Box mit dem Code angezeigt wird. Das macht das Forums Tool eben so.
Wenn ich z.B. folgendes mache:
Sub test()
imon = 1
itag = 1
MsgBox Month(Cells(imon, itag))
MsgBox Month(Date)
imon = "test"
If Month(Cells(imon, itag)) = Month(Date) Then
MsgBox "hurra"
End If
End Sub
dann sind imon und itag anfangs integer und beide MSGboxen funktionieren. Durch die Zuweisung imon="test" wird imon aber implizit zu einem String. dann schlägt auch der Vergleich fehl, weill Cells() eben keinen String erwartet.
Gruß
Harald
Anzeige
AW: Nicht nachvollziehbar
07.11.2011 11:38:29
Franz
Hallo Harald,
okay, das versteh ich, da müsste ich mal meinen Code durchfieseln, ob ich da irgendwo einen Wechsel drin hab. Kann man denn irgendwo in einem Code irgendwie die Definition einer Variablen auslesen, gibt's da ne Möglichkeit?
"option explicit" hab ich drin
Grüße
Franz
Anzeige
AW: Nicht nachvollziehbar
07.11.2011 12:19:48
Harald
Hallo Franz,
hast Du imon und iTag auch explizit als Integer deklariert?
Gerne wird folgendes gemacht:
Dim imon, itag As Integer
und der Programmierer meint, beide Variablen als Integer deklariert zu haben. Das ist aber nicht so. VBA geht hier eigene Wege. Bei einer solchen Deklaration ist imon als Variant deklariert, nur iTag ist Integer. Seltsam aber wahr, wie folgendes Codeschnipsel zeigt::
imon = "hallo"
itag = 1
Das funktioniert nämlich anstandslos.
Wie man den Typ einer variablen an einer beliebigen Stelle im Code anzeigen kann, weiß ich nicht. Du kannst aber überall im Code mit rechter Maustaste auf die Variable klicken und imkontextmenü "Definition" auswählen. Dann springt der Cursor zu der DIM-Anweisung.
Gruß Harald
Anzeige
AW: Nicht nachvollziehbar
07.11.2011 12:34:05
Franz
Hallo Harald,
"Dim iHlbJhr As Byte, iMon As Integer, iTag As Integer" - so hab ich's geschrieben, daran kann's also eigentlich auch nicht liegen.
Und auch der Klick auf Definition im Kontextmenü führt zur richtigen Dim-Anweisung.
Na, ich werd mich mal dran machen, den Code durchzugehen und schaun, ob ich was rausfind.
Ich danke Dir auf jeden Fall, hab ein paar neue Ideen gekriegt.
Grüße
Franz
Anzeige
Noch 'ne Idee
07.11.2011 12:43:09
Harald
Hallo Franz,
Du kannst im VBA Editor auf iMon klicken, dann im Menü unter Debuggen - Überwachung hinzufügen bei Art der Überwachung "Unterbrechen, wenn Wert geändert wurde" anklicken. Das Gleiche für iTag. Dann kannst Du das Programm laufen lassen und es hälz jedes Mal an, wenn einer der werte geändert wird. Dann findest DU schnell die Stelle, wo ggfls. ein unpassender Wert zugewiesen wird. Wobei VBA eigentlich dann an dieser Stelle meckern sollte, nicht erst später.
Gruß Harald
Anzeige
AW: Typen unverträglich
07.11.2011 12:52:38
Heiko
Moin Franz,
ich denke ja da deine iTag und iMon "zwischendurch" verändert werden.
Was zeigt den eine MsgBox wenn du die mal vor dem Vergleich einbaust, steht da wirklich ein Datum oder vielleicht ein Text.
Also in etwa so:
MsgBox Cells(iTag, iMon) ' Was kriegts du hier angeziegt ?!
MsgBox TypeName(Cells(iTag, iMon).Value) ' Das kann man sich auch noch mal anzeigen lassen.
If Month(Cells(iTag, iMon)) = Month(Date) Then
Gruß Heiko
Anzeige
@ Harald und Heiko
07.11.2011 12:57:03
Franz
Hallo Harald und Heiko,
danke für Eure Ideen, werde beides ausprobieren, allerdings erst später. Ich muss jetzt leider raus und komm erst später wieder dazu. Ich geb aber Rückmeldung, wenn ich weiter bin.
Danke erstmal und beste Grüße
Franz
AW: Typen unverträglich - Teilerfolg
07.11.2011 14:07:32
Franz
Hallo Heiko,
mit Deinen beiden MsgBoxen hat ich den fehler rausgefunden:
Die erste MsgBox gibt tatsächlich ein Datum aus, die zweite MsbBox zeigt "Date"
BIS......... zum 29. Februar, da - natürlich - zeigt die erste MsgBox nichts mehr an, die zweite sagt jetzt "String" - daran liegt's also. Die letzten 3 (2) Tage im Februar und die nicht existenten 31.-ten einiger Monate muss ich jetzt noch ausschließen, mal schauen wie....
Danke und Grüße
Franz
Anzeige
AW: Typen unverträglich - Teilerfolg
07.11.2011 14:46:28
Harald
Hallo Franz,
tja, wenn in den Zellen auch nicht-Datumswerte stehen...
Du kannst das vorab testen:
If isdate(Cells(iTag, iMon)) then
If Month(Cells(iTag, iMon)) = Month(Date) Then
'tue was
End if
End if
Gruß
Harald
AW: Typen unverträglich - ERFOLG
07.11.2011 15:09:21
Franz
Hallo Harald,
wunderbar, das ist gut. Hab's mit
If........ ""
versucht, das hat nicht geklappt. Aber "If IsDate" klappt. Vielen Dank! Hast mir sehr geholfen.
Grüße
Franz
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Typen unverträglich in Excel VBA beheben


Schritt-für-Schritt-Anleitung

Um den Fehler "Typen unverträglich" in Excel VBA zu beheben, folge diesen Schritten:

  1. Variablen deklarieren: Stelle sicher, dass alle Variablen wie iTag und iMon korrekt als Integer oder Long deklariert sind. Verwende Option Explicit am Anfang des Codes.

    Option Explicit
    Dim iMon As Integer
    Dim iTag As Integer
  2. Zellenwerte überprüfen: Vor dem Vergleich solltest Du die Zellenwerte überprüfen. Füge MsgBoxen hinzu, um den Typ und den Inhalt der Zellen zu prüfen.

    MsgBox Cells(iTag, iMon)  ' Was wird hier angezeigt?
    MsgBox TypeName(Cells(iTag, iMon).Value)  ' Typ des Wertes anzeigen
  3. Datentypen abgleichen: Verwende IsDate, um sicherzustellen, dass der Wert in der Zelle ein Datum ist, bevor Du die Month-Funktion anwendest.

    If IsDate(Cells(iTag, iMon)) Then
       If Month(Cells(iTag, iMon)) = Month(Date) Then
           ' tue was
       End If
    End If

Häufige Fehler und Lösungen

  1. Nicht-Datumswerte in Zellen: Wenn die Zellen, auf die Cells(iTag, iMon) verweist, kein Datum enthalten, führt das zu einem "Typen unverträglich" Fehler. Verwende IsDate, um dies zu überprüfen.

  2. Fehlende Option Explicit: Wenn Du Option Explicit nicht verwendest, kann es sein, dass eine Variable unbeabsichtigt als Variant deklariert wird, was den Fehler verursachen kann.

  3. Falsche Variablenzuweisung: Wenn Du einer Integer-Variable einen String zuweist, wird der Typ konvertiert und kann zu Problemen führen. Überprüfe Deine Zuweisungen sorgfältig.


Alternative Methoden

  • Debugging-Tools: Nutze die Debugging-Funktionen im VBA-Editor, um Überwachungen für Variablen hinzuzufügen. Dies hilft, den Punkt zu finden, an dem eine Variable einen unerwarteten Wert annimmt.

  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung, um den Code robuster zu gestalten und unvorhergesehene Fehler besser zu managen.

    On Error Resume Next
    ' Dein Code hier
    If Err.Number <> 0 Then
       MsgBox "Ein Fehler ist aufgetreten: " & Err.Description
    End If
    On Error GoTo 0

Praktische Beispiele

Hier ein einfaches Beispiel, das den Umgang mit "Typen unverträglich" demonstriert:

Sub Beispiel()
    Dim iMon As Integer
    Dim iTag As Integer
    iMon = 2
    iTag = 1

    If IsDate(Cells(iTag, iMon)) Then
        If Month(Cells(iTag, iMon)) = Month(Date) Then
            MsgBox "Der Monat stimmt überein!"
        Else
            MsgBox "Der Monat stimmt nicht überein."
        End If
    Else
        MsgBox "Der Wert in der Zelle ist kein Datum."
    End If
End Sub

Tipps für Profis

  • Verwende Typkonversion: Wenn Du sicher bist, dass ein Wert konvertierbar ist, kannst Du Funktionen wie CInt() oder CStr() verwenden, um explizit den Typ zu konvertieren.

  • Schreibe testbaren Code: Halte Deinen Code modular, sodass Du Teile des Codes einfach testen und debuggen kannst.

  • Dokumentiere Deinen Code: Füge Kommentare hinzu, um die Funktionsweise Deines Codes zu erklären. Dies hilft nicht nur Dir, sondern auch anderen, die Deinen Code lesen.


FAQ: Häufige Fragen

1. Was bedeutet "Typen unverträglich"? Der Fehler tritt auf, wenn der VBA-Interpreter versucht, Werte zu vergleichen oder zuzuweisen, die unterschiedliche Datentypen haben.

2. Wie kann ich sicherstellen, dass meine Variablen die richtigen Datentypen haben? Nutze Option Explicit und deklariere Deine Variablen explizit, um sicherzustellen, dass sie den gewünschten Datentyp haben.

3. Was kann ich tun, wenn ich immer noch den Fehler erhalte? Überprüfe Deinen Code Schritt für Schritt, nutze Debugging-Tools und füge MsgBoxen hinzu, um die Werte und deren Typen zu überprüfen. Achte darauf, dass in den Zellen, auf die Du zugreifst, auch tatsächlich Datumswerte stehen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige