Element im Int-Array löschen und re-dimensionieren

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von kerim80.

    Element im Int-Array löschen und re-dimensionieren

    Hallo,

    ich will mich kurz/knapp halten. Habe Excel 2007.
    Folgendes Szenario und Problem habe ich:

    1. habe ein "Gewichtetes Array" vom Typ=Integer, z.B. (0,0,0,0,0,0,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,etc.) / Einträge von 0 bis 24
    2. wähle mir mit folgendem Code aus diesem Array per Zufall einen Eintrag aus:

    Visual Basic-Quellcode

    1. x = PosZahl(UBound(GewichteterArray))
    2. Private Function PosZahl(ByRef ObereGrenze As Integer) As Integer
    3. Randomize -Timer ' Sicherstellen, daß bei jedem Start wirklich eine neue Zufallszahl generiert wird
    4. PosZahl = Int(Rnd * ObereGrenze) ' gibt Zahlen im Bereich von [0 - Oberegrenze] End Function

    3. lösche diese Eintrag (Zufallszahl) aus dem Array, mit folgendem Code:
    den Code habe ich von der Seite: vbarchiv.net/archiv/tipp_955.html

    Visual Basic-Quellcode

    1. ArrayDelete GewichteterArray, x
    2. Private Declare Sub CopyMemoryPtr Lib "kernel32" _
    3. Alias "RtlMoveMemory" ( _
    4. ByVal Destination As Long, _
    5. ByVal Source As Long, _
    6. ByVal Length As Long)
    7. Public Sub ArrayDelete(ByRef sArray() As Integer, _
    8. ByVal nDelPos As Long, _
    9. Optional ByVal nSize As Variant, _
    10. Optional ByVal bRedimSize As Variant)
    11. Dim nPtr As Long
    12. ' Größe des Arrays bestimmen, falls nicht angegeben
    13. If IsMissing(nSize) Then nSize = UBound(sArray)
    14. If nDelPos < nSize Then
    15. ' Element aus Array löschen und alle
    16. ' nachfolgende Elemente nach vorne schieben
    17. nPtr = StrPtr(sArray(nDelPos))
    18. CopyMemoryPtr VarPtr(sArray(nDelPos)), VarPtr(sArray(nDelPos + 1)), _
    19. VarPtr(sArray(nSize)) - VarPtr(sArray(nDelPos))
    20. CopyMemoryPtr VarPtr(sArray(nSize)), VarPtr(nPtr), Len(nPtr)
    21. End If
    22. ' Array ggf. autom. um 1 Element verkleinern
    23. If IsMissing(bRedimSize) Then bRedimSize = True
    24. If bRedimSize Then
    25. nSize = nSize - 1
    26. If nSize < 0 Then nSize = 0
    27. ReDim Preserve sArray(nSize)
    28. Else
    29. sArray(nSize) = 0
    30. End If
    31. End Sub


    4. gibt er mir im MS-VB-Editor die Fehlermeldung "Nicht genügend Speicher" oder schließt automatisch das EXCEL-Programm

    -> Habt ihr einen Lösungsvorschlag oder einen anderen, wie ich ein ausgewähltes Element von einem Integer-Array lösche und danach redimensioniere???

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kerim80“ ()

    Array.Length gibts in VBA nicht.
    Das entspricht Ubound(Array) + 1
    "Inline" deklarationen von Variablen und Wertezuweisungen gabs damals auch noch nicht.

    Folgendes wäre dann der "übersetzte" Code:

    Visual Basic-Quellcode

    1. Randomize()
    2. Dim loesch As Integer
    3. loesch = Rnd() * 5'(Anzahl der Items)
    4. Dim i as Integer
    5. For i = loesch To ubound(j) - 1
    6. j(i) = j(i + 1)
    7. Next i
    8. ReDim Preserve j(ubound(j) - 1)