Sub RandomNumbersUnique()
Dim C As New Collection, N, lowerbound As Integer, upperbound As Long
lowerbound = 1
upperbound = 500000
ReDim N(lowerbound To upperbound, 1 To 1)
On Error Resume Next
For i = lowerbound To upperbound
RandomNumber = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
C.Add RandomNumber, CStr(RandomNumber)
If Err Then
Do While Err
Err.Clear
RandomNumber = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
C.Add RandomNumber, CStr(RandomNumber)
Loop
End If
N(i, 1) = RandomNumber
Next
Application.ScreenUpdating = False
Cells(1).Resize(upperbound).Value = N
Application.ScreenUpdating = True
End Sub
Sub testMatch()
VA = Cells(1).CurrentRegion.Value
Valeur = Cells(499993, 1).Value
T = Timer
C = Application.Match(Valeur, VA, 0)
MsgBox Timer - T & " pour rechercher " & Valeur & " se trouvant sur la ligne " & C
End Sub
Sub Boucle()
Valeur = Cells(499993, 1).Value
VA = Cells(1).CurrentRegion.Value
T = Timer
For i = 1 To UBound(VA)
If VA(i, 1) = Valeur Then
C = i
Exit For
End If
Next
MsgBox Timer - T & " pour rechercher " & Valeur & " se trouvant sur la ligne " & C
End Sub
Sub BoucleArray1D()
Valeur = Cells(499993, 1).Value
VA = Cells(1).CurrentRegion.Value
ReDim V(1 To UBound(VA))
For i = 1 To UBound(VA): V(i) = VA(i, 1): Next
T = Timer
For i = 1 To UBound(VA)
If V(i) = Valeur Then
C = i
Exit For
End If
Next
MsgBox Timer - T & " pour rechercher " & Valeur & " se trouvant sur la ligne " & C
End Sub
Sub UboundSplitJoin()
Valeur = Cells(499993, 1).Value
VA = Cells(1).CurrentRegion.Value
ReDim V(1 To UBound(VA))
For i = 1 To UBound(VA): V(i) = VA(i, 1): Next
T = Timer
C = UBound(Split(Split(Join(V, "|"), Valeur & "|")(0), "|")) + 1
MsgBox Timer - T & " pour rechercher " & Valeur & " se trouvant sur la ligne " & C
End Sub
Comme je l'ai fait Item clé mais c'est du pareil au même pour clé item voilà en peu de phrase ce que cela donne pour Add clé item …d'ailleurs en 5/6 phrases ( ca ne devrait pas demander plus)serais tu capable de m'expliquer le fonctionnement de base( add cle item) sans tout tes à coté
Voilà ce qu'il en est (sans version tableau se construisant dans la foulée tel sur mon 1er module de classe) :il est sur que je reverrai ma copie …
Option Explicit
Option Compare Text
Private Coll As Collection
'Private objTab
'Private Const Sep As Integer = 167 ' <= § avec ChrW - MAC/PC
Private Const SepItm As Integer = 181 ' <= µ avec ChrW - MAC/PC
Public Sub Add(KeyC, ItemC, Optional Before, Optional After, Optional OverWrit As Boolean, Optional AddItemToKey As Boolean)
Dim objCol, GetObjColl, C As Long, i As Long, Indice As Long
If Coll Is Nothing Then Set Coll = New Collection: ' If Coll.Count = 0 Then C = 1 Else C = Coll.Count + 1
ReDim objCol(0 To 1): objCol(0) = CStr(KeyC): objCol(1) = ItemC
On Error Resume Next
Coll.Add objCol, objCol(0), Before, After
If Err Then
Err.Clear: GetObjColl = Coll(objCol(0))
For i = 1 To Coll.Count
If Coll(i)(0) = GetObjColl(0) Then Indice = i: Exit For
Next
If OverWrit Then Coll.Remove GetObjColl(0): Coll.Add objCol, GetObjColl(0), Indice
If AddItemToKey Then Coll.Remove GetObjColl(0): objCol(1) = GetObjColl(1) & ChrW(SepItm) & ItemC: Coll.Add objCol, GetObjColl(0), Indice
End If
End Sub
toto | 45 |
titi | 12 |
U3 | Usine3 |
riri | 27 |
fifi | 85 |
NEW toto | 45 |
Sub TestLaBase_cDic()
Dim DicoC As New cDic, VA
VA = ActiveSheet.Cells(1).CurrentRegion.Value
For i = 1 To UBound(VA)
DicoC.Add VA(i, 2), VA(i, 1), , , True
Next
Stop
End Sub
je me suis inspiré d'un post qui n'était pas sur XLDbon alors on a compris le principe( d'ailleurs déjà vu et cité par Dranreb précédemment )
le découpage se faisait entre l'item et la clé, schématiquement on avait :ce qui explique ton besoins de découpage dans la fonction sort
objCol = Array(CStr(KeyC), ItemC)
On Error Resume Next
Coll.Add objCol, objCol(0), Before, After
Private Coll As Collection
'Private objTab
'Private Const Sep As Integer = 167 ' <= § avec ChrW - MAC/PC
Private Const SepItm As Integer = 181 ' <= µ avec ChrW - MAC/PC
Public Property Get Keys(Optional clé As String = "")
Dim T, I&
If clé = "" Then
ReDim T(1 To Coll.Count): For I = 1 To Coll.Count: T(I) = Coll(I)(1): Next: Keys = T
Else
For I = 1 To Coll.Count
If Coll(I)(1) = clé Then Keys = Coll(I)(0): Exit Property
Next
End If
End Property
Public Property Get Items()
Dim T, I&
ReDim T(1 To Coll.Count): For I = 1 To Coll.Count: T(I) = Coll(I)(0): Next
Items = T
End Property
Public Sub Add(KeyC, ItemC, Optional Before, Optional After, Optional OverWrit As Boolean, Optional AddItemToKey As Boolean)
Dim objCol, GetObjColl, C As Long, I As Long, Indice As Long
If Coll Is Nothing Then Set Coll = New Collection: ' If Coll.Count = 0 Then C = 1 Else C = Coll.Count + 1
objCol = Array(CStr(KeyC), ItemC)
On Error Resume Next
Coll.Add objCol, objCol(0), Before, After
If Err Then
Err.Clear: GetObjColl = Coll(objCol(0))
For I = 1 To Coll.Count
If Coll(I)(0) = GetObjColl(0) Then Indice = I: Exit For
Next
If OverWrit Then Coll.Remove GetObjColl(0): Coll.Add objCol, GetObjColl(0), Indice
If AddItemToKey Then Coll.Remove GetObjColl(0): objCol(1) = GetObjColl(1) & ChrW(SepItm) & ItemC: Coll.Add objCol, GetObjColl(0), Indice
End If
End Sub
Sub TestLaBase_cDic()
Dim DicoC As New cDic, VA
VA = ActiveSheet.Cells(1).CurrentRegion.Value
For I = 1 To UBound(VA)
DicoC.Add VA(I, 2), VA(I, 1), , , True
Next
k = DicoC.Keys
it = DicoC.Items
MsgBox Join(k, ",")
MsgBox Join(it, ",")
MsgBox DicoC.Keys("toto")
End Sub
Re Patrick,ha non c'est bon
en fait c'est dès le départ tu fonctionne comme une collection e non un dico
DicoC.Add VA(I, 2), VA(I, 1), , , True
c'est ta colonne 2 les clés
ça me perturbe
j'aurais du inversé mes colonnes ca aurait été plus logiquere
oui mal ce qui m'a perturbé c'est que les clés c'est val(t(i,2)) et les valeurs val(t(i,1))
Coucou KikiSalut, à titre documentaire : Limites et lacunes de VBA
non Patrick une clé est toujours en texte d'ou le Cstr pour insérer un nombreon pourrait par exemple confondre la clé"18" et la clé 18
oui un vrai dico mais rappelle toi que j'ai voulu allié ce que peux faire un dico et une collection … c'est voulu … et ma base le fait très bienun dico n'a pas de fonction add avec before , after, overwrite, ou encore additemkey
Option Explicit
Option Compare Text
Private Coll As Collection
'Private objTab
'Private Const Sep As Integer = 167 ' <= § avec ChrW - MAC/PC
Private Const SepItm As Integer = 181 ' <= µ avec ChrW - MAC/PC
Public OverWrit As Boolean
Public AddItemToKey As Boolean
Public Property Get Keys(Optional clé As String = "")
Dim T, I&
If clé = "" Then
ReDim T(1 To Coll.Count): For I = 1 To Coll.Count: T(I) = Coll(I)(0): Next: Keys = T
Else
For I = 1 To Coll.Count
If Coll(I)(0) = clé Then Keys = Coll(I)(1): Exit Property
Next
End If
End Property
Public Property Get Items()
Dim T, I&
ReDim T(1 To Coll.Count): For I = 1 To Coll.Count: T(I) = Coll(I)(1): Next
Items = T
End Property
Public Sub Add(KeyC, ItemC)
Dim objCol, GetObjColl, C As Long, I As Long, Indice As Long
If Coll Is Nothing Then Set Coll = New Collection: ' If Coll.Count = 0 Then C = 1 Else C = Coll.Count + 1
objCol = Array(CStr(KeyC), ItemC)
On Error Resume Next
Coll.Add objCol, objCol(0)
If Err Then
Err.Clear: GetObjColl = Coll(objCol(0))
For I = 1 To Coll.Count
If Coll(I)(0) = GetObjColl(0) Then Indice = I: Exit For
Next
If OverWrit Then Coll.Remove GetObjColl(0): Coll.Add objCol, GetObjColl(0), Indice
If AddItemToKey Then Coll.Remove GetObjColl(0): objCol(1) = GetObjColl(1) & ChrW(SepItm) & ItemC: Coll.Add objCol, GetObjColl(0), Indice
End If
End Sub
Sub TestLaBase_cDic()
Dim DicoC As New cDic, VA
DicoC.OverWrit = True
VA = ActiveSheet.Cells(1).CurrentRegion.Value
For I = 1 To UBound(VA)
DicoC.Add VA(I, 1), VA(I, 2)
Next
k = DicoC.Keys
it = DicoC.Items
MsgBox Join(k, ",")
MsgBox Join(it, ",")
MsgBox DicoC("toto")
End Sub
Option Base 1
Sub RandomNumbersUnique()
Dim C As New Collection, N, lowerbound As Integer, upperbound As Long
lowerbsound = 1
upperbound = 65537
ReDim N(lowerbound To upperbound, 1 To 1)
On Error Resume Next
For i = lowerbound To upperbound
RandomNumber = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
C.Add RandomNumber, CStr(RandomNumber)
If Err Then
Do While Err
Err.Clear
RandomNumber = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
C.Add RandomNumber, CStr(RandomNumber)
Loop
End If
N(i, 1) = RandomNumber
Next
Application.ScreenUpdating = False
Cells(1).Resize(upperbound).Value = N
Application.ScreenUpdating = True
End Sub
Sub MatchArray1DLimite_NOK()
Dim V(), C
Valeur = Cells(65537, 1).Value
VA = Cells(1).CurrentRegion.Value
ReDim V(1 To UBound(VA))
For i = 1 To UBound(VA): V(i) = VA(i, 1): Next
T = Timer
C = Application.Match(Valeur, V, 0)
If IsError(C) Then
MsgBox "Nous avons une erreur " & "2042" & vbNewLine & "car on a dépassé la limite d'un tab 1D" & vbNewLine & "qui est de 65 536"
End If
End Sub
Sub MatchArray1DLimite_OK()
Dim V(), C
Valeur = Cells(65536, 1).Value
VA = Cells(1).CurrentRegion.Value
ReDim V(1 To UBound(VA) - 1)
For i = 1 To UBound(VA) - 1: V(i) = VA(i, 1): Next
T = Timer
C = Application.Match(Valeur, V, 0)
MsgBox Timer - T & " s pour rechercher " & Valeur & " se trouvasnt sur la ligne " & C
MsgBox "Donc la limite est bien de 65536 pour un tab de dimension 1D"
End Sub
Sub testMatchTb2D_OK()
VA = Cells(1).CurrentRegion.Value
Valeur = Cells(65537, 1).Value
T = Timer
C = Application.Match(Valeur, VA, 0)
MsgBox Timer - T & " pour rechercher " & Valeur & " se trouvant sur la ligne " & C
MsgBox "Pour un tab de dimension 2D, la limite 65536 est dépassé"
End Sub