Jag har försökt modifiera nedanstående funktion som jag lärt mig från 4guysfromrolla för att den ska klara multidimensionella arrayer, men jag lyckas inte komma på hur jag ska göra och hoppas att någon kan hjälpa mig på traven. Jag försökte först helt sonika byta värden i alla dimensioner, men eftersom vissa dimensioner har olika antal index blir det problem med hur många gånger loopen ska loopa. Om första dimensionen har 4 index och en annan 50 så byts ju bara värden på fyra index.
Function ReArrange(ByVal arrArray)
intUpper = UBound(arrArray)
intLower = LBound(arrArray)
Randomize Timer
For i = intLower to intUpper
'Slumpar fram ett arrayindex att byta med originalet.
intSwapPos = Int(Rnd * (intUpper + 1))
'Byter värden mellan slumpat index och originalindex.
varTmp = arrArray(i)
arrArray(i) = arrArray(intSwapPos)
arrArray(intSwapPos) = varTmp
Next
ReArrange = arrArray
End Function
Räcker det om den klarar tvådimensionella arrayer?
Function ReArrange(ByVal arrArray)
intUpper = UBound(arrArray)
intLower = LBound(arrArray)
Randomize Timer
For i = intLower to intUpper
'Slumpar fram ett arrayindex att byta med originalet.
intSwapPos = Int(Rnd * (intUpper + 1))
'Byter värden mellan slumpat index och originalindex.
for j = Lbound(arrArray,2) to Ubound(arrArray,2)
varTmp = arrArray(i,j)
arrArray(i,j) = arrArray(intSwapPos,j)
arrArray(intSwapPos,j) = varTmp
Next
Next
ReArrange = arrArray
End Function
Jag var nog inte tillräckligt klar i huvudet när jag ställde frågan.
Jag tänkte använda funktionen för att röra om ordningen i en array som skapats med getrows() och då ska ju den första dimensionen inte arrangeras om. Det jag vill åstadkomma är att alla värden i den andra dimensionen arrangeras om men att de ändå behåller integriteten (heter det så?) sinsemellan. Förklaringen är inte helt lysande men förhoppningsvis förstår ni vad jag menar.
Function ReArrange(ByVal arrArray)
intUpper1 = UBound(arrArray,1)
intLower1 = LBound(arrArray,1)
intUpper2 = UBound(arrArray,2)
intLower2 = LBound(arrArray,2)
Randomize Timer
For x = intLower1 to intUpper1
For i = intLower2 to intUpper2
'Slumpar fram ett arrayindex att byta med originalet.
intSwapPos = Int(Rnd * (intUpper2 + 1))
'Byter värden mellan slumpat index och originalindex.
varTmp = arrArray(x,i)
arrArray(x,i) = arrArray(x,intSwapPos)
arrArray(x,intSwapPos) = varTmp
Next
Next
ReArrange = arrArray
End Function
Det problem jag inte lyckats lösa är ju då att de slumpade talen blir olika för varje index i den första dimensionen (kolumnerna i databasen). Tänker jag rätt här, eller är jag helt ute och cyklar?
Nu har jag trippelkollat databasen och det verkar som om funktionen trots allt fungerar, men jag förstår fortfarande inte hur det går till.
Den första loopen går igenom den första dimensionen (kolumnerna i databasen) och för varje sådan kolumn läggs värdena i indexen i dimensionen under i slumpad ordning. Sedan går den vidare till nästa index i den första dimensionen (nästa kolumn i databasen) och gör samma sak, men det sker en ny slumnpningen för varje index i den första dimensionen så borde ordningen bli annorlunda för varje gång. Som sagt, vad är det jag missar?
Det var nog bara bra att ni ignorerade mig för jag lyckades lösa det själv och det känns ju alltid bäst. Och det var inte särskillt komplicerat trots allt.
Så, här är den nu. Skarres schyssta funktion för att slumpa om ordningen i en getrows-array:
Function ReArrange(ByVal arrArray)
intUpper1 = UBound(arrArray,1)
intUpper2 = UBound(arrArray,2)
Randomize Timer
For j = 0 To intUpper2
'Slumpar fram ett arrayindex att byta med originalet.
intSwapPos = Int(Rnd * (intUpper2 + 1))
For x = 0 To intUpper1
'Byter värden mellan slumpat index och originalindex.
varTmp = arrArray(x,j)
arrArray(x,j) = arrArray(x,intSwapPos)
arrArray(x,intSwapPos) = varTmp
Next
Next
ReArrange = arrArray
End Function
257 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91