Option Base 1
Option Explicit
'Cieľ : Odstrániť jeden prvok poľa
'Vstupy : Pole Pole, z kt. sa má odstrániť jeden prvok
' [ind] Index prvku, kt. sa má odstrániť
' [ihod] Hodnota prvku, kt. sa má odstrániť
' [poradie] Ak zadáte TRUE, poradie prvkov poľa sa zachová(trochu pomalšie)
'Výstupy : Vráti TRUE ak bol prvok odstránený z poľa
'Poznámka : Špecifikuj buď ind alebo ihod
' Ak je špecifikovaná hodnota (ihod) a pole obsahuje viac
' ako 1 prvok tej istej hodnoty, bude odstránený prvý prvok
' kt. je zhodný so zadanou hodnotou. Polia musia byť deklarované
' ako dynamické, napr. Dim Pole() as Integer
Function PolePrvok(ByRef Pole As Variant, Optional _
ind As Long, Optional ihod As Variant, Optional _
poradie As Boolean = False) As Boolean
Dim hIndex As Long, DocasHod As Variant, dIndex As Long, NajdiPrvok As Boolean
Dim kk As Long
On Error GoTo Chyba
hIndex = UBound(Pole) ' maximálny index poľa
dIndex = LBound(Pole) ' najnižší index poľa
If IsMissing(ihod) Then
If hIndex >= ind Then
'Najdi prvok podľa indexu
NajdiPrvok = True
End If
Else
'Najdi prvok v poli a odstráň prvok zistený podľa hodnoty
For ind = dIndex To hIndex
If Pole(ind) = ihod Then
'najdený prvok
NajdiPrvok = True
Exit For
End If
Next
End If
If NajdiPrvok Then ' keď našiel prvok
If poradie Then
'Zachovaj poradie prvkov poľa kopírovaním hodnôt
For kk = ind To hIndex - 1
Pole(kk) = Pole(kk + 1)
Next
Else
'kopíruj posledný prvok do dočasnej premennej
DocasHod = Pole(hIndex)
'prepíš prvok, kt. sa má odstrániť
Pole(ind) = DocasHod
End If
'zmeň rozpätie poľa
ReDim Preserve Pole(dIndex To hIndex - 1)
PolePrvok = True
End If
Exit Function
Chyba:
Debug.Print Err.Description
PolePrvok = False
On Error GoTo 0
End Function
'Príklad použitia funkcie PolePrvok
Sub Test()
Dim vse() As Long, ii As Long, hind As Long, dind As Long, n As Long
n = 5
ReDim vse(n)
vse(1) = 5
vse(2) = 10
vse(3) = 15
vse(4) = 20
vse(5) = 25
'Odstráň prvok s hodnotou 10 a zachovaj poradie prvkov
PolePrvok vse, , 10, True 'voláme funkciu PolePrvok
hind = UBound(vse)
For ii = 1 To hind
Debug.Print vse(ii)
Next
End Sub