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:
x = PosZahl(UBound(GewichteterArray))
Private Function PosZahl(ByRef ObereGrenze As Integer) As Integer
Randomize -Timer ' Sicherstellen, daß bei jedem Start wirklich eine neue Zufallszahl generiert wird
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: http://www.vbarchiv.net/archiv/tipp_955.html
ArrayDelete GewichteterArray, x
Private Declare Sub CopyMemoryPtr Lib "kernel32" _
Alias "RtlMoveMemory" ( _
ByVal Destination As Long, _
ByVal Source As Long, _
ByVal Length As Long)
Public Sub ArrayDelete(ByRef sArray() As Integer, _
ByVal nDelPos As Long, _
Optional ByVal nSize As Variant, _
Optional ByVal bRedimSize As Variant)
Dim nPtr As Long
' Größe des Arrays bestimmen, falls nicht angegeben
If IsMissing(nSize) Then nSize = UBound(sArray)
If nDelPos < nSize Then
' Element aus Array löschen und alle
' nachfolgende Elemente nach vorne schieben
nPtr = StrPtr(sArray(nDelPos))
CopyMemoryPtr VarPtr(sArray(nDelPos)), VarPtr(sArray(nDelPos + 1)), _
VarPtr(sArray(nSize)) - VarPtr(sArray(nDelPos))
CopyMemoryPtr VarPtr(sArray(nSize)), VarPtr(nPtr), Len(nPtr)
End If
' Array ggf. autom. um 1 Element verkleinern
If IsMissing(bRedimSize) Then bRedimSize = True
If bRedimSize Then
nSize = nSize - 1
If nSize < 0 Then nSize = 0
ReDim Preserve sArray(nSize)
Else
sArray(nSize) = 0
End If
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???