Domino 9 und frühere Versionen > ND6: Entwicklung

Array beschneiden

<< < (3/4) > >>

Bille:
Sorry, wenn ich diesen alten Fred nochmal bemühe, aber ich wollte ein ähnliches Problem lösen und bekomme leider einen Fehler.

Meine Aufgabe ist es, die letzten 5 Einträge eines Arrays in ein Feld zu schreiben.


--- Code: ---dim vValue as variant, x as integer, y as integer
vValue = doc.Liste
y = Ubound(vValue)
x = y - 4
Redim Preserve vValue( x to y )
doc.Liste = vValue

--- Ende Code ---

Beim Aufruf der Funktion kommt ein "Out of range". Lt. Debugger ist y = 10 und x = 6

Die andere Variante mit 

--- Code: ---vListe = doc.Liste
vValue= Evaluate({@Subset(vListe;-5)},doc)
doc.Liste = vValue

--- Ende Code ---

bringt nur einen leeren String und nicht den Feldinhalt, den ich eigentlich möchte (eben die letzten 5 Werte der Liste).

Kann mir jemand sagen, wo mein Fehler ist?

Bille

PS: Ich kann das Ganze erst wieder im Büro testen und dann abends antworten, ich bitte daher um Geduld, falls ich nicht gleich zurückschreiben kann.





TRO:
probier mal
vListe = doc.Liste
vValue= Evaluate({@Subset(Liste;-5)},doc)
doc.Liste = vValue


hth

Thomas

Peter Klett:
Dein Evaluate-Konstrukt ist falsch, weil Du mit der Formel versuchst, die Script-Variable zu manipulieren, obwohl Du nur auf die Felder des Dokuments zugreifen kannst.

doc.Liste = Evaluate({@Subset(Liste;-5)},doc)

sollte funktionieren.

Ob ein Redim Preserve vValue (6 to 10) funktionert, weiß ich nicht, auf solch eine Idee bin ich noch nie gekommen (obwohl es logisch klingt, glauben mag ich es nicht).

Da würde ich eine Schleife bauen

Dim vValue As Variant, i As Integer, x As Integer, y As Integer
x = Ubound (doc.Liste)
y = x - 4
If y > 0 Then
   Redim vValue (4)
   For i = 0 To 4
      vValue (i) = doc.Liste (y + i)
   Next i
   doc.Liste = vValue
End If




Bille:
Danke für die schnelle Rückmeldung.
Das mit dem Evaluate klingt einleuchtend, werde ich heute gleich probieren.

ata:
@Peter,

die Lösung mit dem Redim Preserve funktioniert nur, wenn du die Base hälst - also in dem genannten Beispiel von 0 neu dimensionierst:

--- Code: ---Sub Initialize()
On error GoTo ErrHandle
   Dim v() As String
   Dim i As Integer
   Redim v( 0 to 9 )
   For i = 0 to UBound( v )
      v(i) = Cstr( i + 1 )
'      Print i
   Next
   Redim Preserve v( 0 to 4 ) ' gibt in diesem Fall die Elemente 0 - 4 zurück
   ' Redim Preserve v( 1 to 4 ) ' gibt in diesem Fall einen Fehler zurück => Array bound out of index
   MsgBox Implode( v )
   Exit Sub
ErrHandle:
   MsgBox Error & " in Zeile " & Erl
   Resume WayOut
WayOut:
End Sub

--- Ende Code ---

Toni :)

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln