Discussion:
Fehlermeldung zu UBound
(zu alt für eine Antwort)
Götz Alles
2004-11-04 16:05:02 UTC
Permalink
Hallo zusammen,

zwei auf einem Sheet befindliche Taxtboxen sollen mit Textten aus einem
anderen Sheet befüllt werden. Bei der einen Textbox funktioniert es
einwandfrei, bei der anderen erhalte ich beim Debuggen immer die
Fehlermeldung "Erwartet Datenfeld".

Hier zunächste einmal der Code, der funktioniert .....
*****
Private Sub tbAnmerkungen_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim aList As Variant
Dim intI As Integer

With Tabelle9 ' oder Worksheets(Tabelle2.Name)
aList = .Range("T3:T" & .Range("T65536").End(xlUp).Row)
tbAnmerkungen.Text = ""
For intI = 1 To UBound(aList)
tbAnmerkungen.Text = tbAnmerkungen.Text & aList(intI, 1) & Chr(10)
Next intI
tbAnmerkungen.Text = Left(tbAnmerkungen.Text, Len(tbAnmerkungen.Text) - 2)
End With

End Sub
*****
.... er stammt von Melanie Breden (weshalb es mich nicht wundert, dass er
funktioniert ;-) ).

Diesen Code wollte ich einfach in angepaßtere Form wie folgt verwenden...
***
Private Sub tbStrukBes_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim aList As Integer
Dim intI As Integer


With Tabelle9
aList = .Range("AO3:AO" & .Range("AO65536").End(xlUp).Row)
tbStrukBes.Text = ""
If IsNumeric(UBound(aList)) Then
For intI = 1 To UBound(aList)
tbStrukBes.Text = tbStrukBes.Text & aList(intI, 1) & Chr(10)
Next intI
tbStrukBes.Text = Left(tbStrukBes.Text, Len(tbStrukBes.Text) - 2)
Else
tbStrukBes.Text = .Range("AO3").Text
End If
End With

End Sub
***
... und genau das funktioniert nicht. Auf dem "Quellsheet" (hier Tabelle9)
steht in Zellen AO3 und AO4 Text während in den Zellen T3:Tx Formeln stehen.

Könnte es damit zusammen hängen?

ich hoffe, dass mir jemand mit einem Tipp weiter helfen kann.

Vielen Dank schon einmal im Voraus.

cu
Götz
Michael Zimmermann
2004-11-04 16:52:02 UTC
Permalink
Hallo!
Post by Götz Alles
zwei auf einem Sheet befindliche Taxtboxen sollen mit
Textten aus einem anderen Sheet befüllt werden. Bei der
einen Textbox funktioniert es einwandfrei, bei der
anderen erhalte ich beim Debuggen immer die Fehlermeldung
"Erwartet Datenfeld".
Hier zunächste einmal der Code, der funktioniert .....
*****
Private Sub tbAnmerkungen_DblClick(ByVal Cancel As
MSForms.ReturnBoolean)
Dim aList As Variant
Dim intI As Integer
With Tabelle9 ' oder Worksheets(Tabelle2.Name)
aList = .Range("T3:T" & .Range("T65536").End(xlUp).Row)
tbAnmerkungen.Text = ""
For intI = 1 To UBound(aList)
tbAnmerkungen.Text = tbAnmerkungen.Text &
aList(intI, 1) & Chr(10) Next intI
tbAnmerkungen.Text = Left(tbAnmerkungen.Text,
Len(tbAnmerkungen.Text) - 2) End With
End Sub
*****
.... er stammt von Melanie Breden (weshalb es mich nicht
wundert, dass er funktioniert ;-) ).
Diesen Code wollte ich einfach in angepaßtere Form wie
folgt verwenden... ***
Private Sub tbStrukBes_DblClick(ByVal Cancel As
MSForms.ReturnBoolean)
Dim aList As Integer
^^^^^^^
Variant'!!
Post by Götz Alles
Dim intI As Integer
With Tabelle9
aList = .Range("AO3:AO" &
.Range("AO65536").End(xlUp).Row) tbStrukBes.Text = ""
If IsNumeric(UBound(aList)) Then
^^^^^^^^^^
Das kannst Du Dir schenken. UBound ist immer numerisch.
Post by Götz Alles
For intI = 1 To UBound(aList)
tbStrukBes.Text = tbStrukBes.Text & aList(intI, 1)
& Chr(10) Next intI
tbStrukBes.Text = Left(tbStrukBes.Text,
Len(tbStrukBes.Text) - 2) Else
tbStrukBes.Text = .Range("AO3").Text
End If
End With
End Sub
***
Gruß aus Mainz
Michael
Götz Alles
2004-11-05 07:43:04 UTC
Permalink
Hallo Michael,
Post by Michael Zimmermann
Post by Götz Alles
If IsNumeric(UBound(aList)) Then
^^^^^^^^^^
Das kannst Du Dir schenken. UBound ist immer numerisch.
So sollte das zumindest sein. ;) Leider ist das (zumindest bei mir gerade)
nicht der Fall. Selbst wenn ich die IF-Abfrage raus nehme erhalte ich die
Fehlermeldung.

Irgendwie scheint die "Befüllung" von aList fehlerhaft zu sein. Aber genau
das verstehe ich nicht, da ich (bis auf die zugrundeliegende Range) am
funktionierenden Code nichts geändert habe.

Vielleicht hat noch jemand eine Idee woran es liegen könnte.

cu
Götz
Götz Alles
2004-11-05 08:07:02 UTC
Permalink
Einen Teil habe ich gefunden ...

Es lag an der Dimensionierung von aList. Im "fehlerhaften" Code habe ich
aList als Integer dimensioniert. Wenn ich es auf Variant ändere klappt es -
zumindest, wenn mind. 2 Einträge in der Liste stehen. Im Einzelschrittmodus
ist zu erkennen, dass UBound dann auch richtig gesetzt wird >>UBound(aList) =
2<<. Wenn die abzubildende Liste allerdings nur einen Eintrag hat, dann
erhalte ich die Fehlermeldung "Typen unverträglich". UBound ist dann
fogendermaßen belegt:"UBound(aList) = <Typen unverträglich>"

Wie kann erreicht werden, dass auch nur ein Eintrag (oder sogar keiner) in
der Textbox abgebildet, ohne eine Fehlermeldung zu liefern.

Vielen Dank schon einmal im Voraus.

cu
Götz
Melanie Breden
2004-11-05 08:26:51 UTC
Permalink
Hallo Götz,
Post by Götz Alles
Es lag an der Dimensionierung von aList. Im "fehlerhaften" Code habe ich
aList als Integer dimensioniert. Wenn ich es auf Variant ändere klappt es -
zumindest, wenn mind. 2 Einträge in der Liste stehen. Im Einzelschrittmodus
ist zu erkennen, dass UBound dann auch richtig gesetzt wird >>UBound(aList) =
2<<. Wenn die abzubildende Liste allerdings nur einen Eintrag hat, dann
erhalte ich die Fehlermeldung "Typen unverträglich". UBound ist dann
fogendermaßen belegt:"UBound(aList) = <Typen unverträglich>"
Wie kann erreicht werden, dass auch nur ein Eintrag (oder sogar keiner) in
der Textbox abgebildet, ohne eine Fehlermeldung zu liefern.
um einen Eintrag zu übernehmen, musst du prüfen, ob das Datenfeld genutzt wird (IsArray),
oder nur einen Wert als String enthält.

Wenn kein Wert vorhanden ist, liefert die Suche nach der letzten Zeile einen Wert <3,
den du wiederum abfragen kannst:

Private Sub tbStrukBes_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim aList As Variant
Dim intI As Integer
Dim lngLastRow As Long

With Tabelle9
lngLastRow = .Range("AO65536").End(xlUp).Row
tbStrukBes.Text = ""
If lngLastRow < 3 Then Exit Sub

aList = .Range("AO3:AO" & lngLastRow)
If IsArray(aList) Then ' Variant/Variant
For intI = 1 To UBound(aList)
tbStrukBes.Text = tbStrukBes.Text & aList(intI, 1) & Chr(10)
Next intI
tbStrukBes.Text = Left(tbStrukBes.Text, Len(tbStrukBes.Text) - 2)
Else
tbStrukBes.Text = aList ' Variant/String
End If
End With
End Sub

Um die Thematik besser zu verstehen, lasse den Code im Einzelschritt-Modus
durchlaufen und schau dir im Lokalfenster die Werte und Typen der verwendeten Variablen an.
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Michael Zimmermann
2004-11-05 13:22:02 UTC
Permalink
Hallo!
Post by Götz Alles
Post by Michael Zimmermann
Das kannst Du Dir schenken. UBound ist immer numerisch.
So sollte das zumindest sein.
Das *ist* so.
Post by Götz Alles
Einen Teil habe ich gefunden ...
Es lag an der Dimensionierung von aList. Im
"fehlerhaften" Code habe ich aList als Integer
dimensioniert.
Was hatte ich Dir denn hier geschrieben?
Post by Götz Alles
Post by Michael Zimmermann
Dim aList As Integer
^^^^^^^
Variant'!!
Dachtest Du, das sei ein Programmiererscherz? ;-)

Gruß aus Mainz
Michael
Götz Alles
2004-11-08 11:13:03 UTC
Permalink
Hallo Michael,
Post by Michael Zimmermann
Was hatte ich Dir denn hier geschrieben?
Post by Michael Zimmermann
Post by Götz Alles
Dim aList As Integer
^^^^^^^
Variant'!!
Dachtest Du, das sei ein Programmiererscherz? ;-)
Sorry, das hatte ich übersehen. Da ich leider keinen Newsreader benutzen
kann, ist die Anzeige nicht gerade übersichtlich. :-(

Danke nochmal für Deine Hinweise.

cu
Götz

Melanie Breden
2004-11-05 08:15:21 UTC
Permalink
Hallo Götz,
Post by Götz Alles
zwei auf einem Sheet befindliche Taxtboxen sollen mit Textten aus einem
anderen Sheet befüllt werden. Bei der einen Textbox funktioniert es
einwandfrei, bei der anderen erhalte ich beim Debuggen immer die
Fehlermeldung "Erwartet Datenfeld".
Hier zunächste einmal der Code, der funktioniert .....
[Snipp Code]
Post by Götz Alles
.... er stammt von Melanie Breden (weshalb es mich nicht wundert, dass er
funktioniert ;-) ).
:-) Danke für die Blumen :-)
Post by Götz Alles
Diesen Code wollte ich einfach in angepaßtere Form wie folgt verwenden...
***
Private Sub tbStrukBes_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim aList As Integer
Dim intI As Integer
aList ist ein Datenfeld vom Typ Variant

Dein Code funktioniert bei mir einwandfrei, wenn ich aList als Variant deklariere
Post by Götz Alles
... und genau das funktioniert nicht. Auf dem "Quellsheet" (hier Tabelle9)
steht in Zellen AO3 und AO4 Text während in den Zellen T3:Tx Formeln stehen.
Könnte es damit zusammen hängen?
Nein, das denke ich nicht.

Kannst du mir das Tabellenblatt mal zuschicken, dann schaue ich mal danach.
--
Mit freundlichen Grüssen

Melanie Breden
- Microsoft MVP für Excel -

http://excel.codebooks.de (Das Excel-VBA Codebook)
#Excel-Auftragsprogrammierung#
Götz Alles
2004-11-05 09:25:09 UTC
Permalink
Hallo Melanie,
Post by Melanie Breden
Dein Code funktioniert bei mir einwandfrei, wenn ich
aList als Variant deklariere und die If-Anweisung
Ja genau, daran lag es.
Post by Melanie Breden
Kannst du mir das Tabellenblatt mal zuschicken, dann
schaue ich mal danach.
Vielen Dank für das Angebot. Ich würde gerne erst einmal ausprobieren, ob
ich mit dem Code aus Deinem anderen Beitrag weiterkomme. Denn das oben
angesprochene Problem hat sich ja erst einmal erledigt. Jetzt muß ich "nur"
noch den Fall "ein Eintrag" abfangen.

Herzlichen Dank schon einmal für Deine Hilfe! War wieder einmal prima!

cu
Götz
Götz Alles
2004-11-05 09:35:01 UTC
Permalink
Hallo Melanie,

war ja mal wieder völliger Blödsinn, was ich da geschrieben habe. "noch den
Fall "ein Eintrag" abfangen." ....

Das hast Du ja auch schon längst mit Deinem Code abgefangen!
:-))

Es klappt ganz hervorragend! Nochmals herzlichen Dank für Deine schnelle und
tolle Hilfe!

cu
Götz
Loading...