VBA: Tableau de Long

  • Initiateur de la discussion Initiateur de la discussion Toug
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

T

Toug

Guest
Bonjour,
Je souhaite compter le nombre de nombre différent dans une colonne excel en vba. J'utilise un tableau de long pour sauvegarder les différent nombre.
J'arrive à le faire, mais une fois sortie de mes boucles, j'ai l'impression que le tableau de long n'existe plus... Car en faisant MsgBox tableau(valeur) seul des zéros apparaissent.
Voici un extrait de mon fichier:
 

Pièces jointes

Re : VBA: Tableau de Long

Bonjour Toug,

Ton problème vient du fait que tu redimensionne ton tableau sans PRESERVE

Sinon il y'a une optimisation possible
Code:
Sub Comptage()
  Dim DLig As Long, Lig As Long, Point() As Long
  Dim I As Long, J As Long, MaCol As New Collection
  ' Récupérer la dernière ligne du tableau
  DLig = Range("A" & Rows.Count).End(xlUp).Row
  ' Initialiser
  J = 0
  ' Pour chaque ligne du tableau
  For Lig = 2 To DLig
    On Error Resume Next
    ' Ajouter la valeur à la collection
    MaCol.Add ActiveSheet.Range("A" & Lig), ActiveSheet.Range("A" & Lig)
    ' Si aucune erreur, la valeur n'existe pas dans la collection
    If Err.Number = 0 Then
      ' On incrémente l'index du tableau
      J = J + 1
      ' On redimensionne le tableau en préservant les valeurs existantes
      ReDim Preserve Point(J)
      ' On l'ajoute au tableau
      Point(J) = MaCol(MaCol.Count)
    End If
  Next Lig
  ' Message
  Msgbox "Nombre de valeurs différentes : " & J
  ' Afficher les valeurs différentes
  For I = 1 To J
    MsgBox "Point(" & I & ")=" & Point(I)
  Next I
End Sub

A+
 
Dernière modification par un modérateur:
Re : VBA: Tableau de Long

Bonjour,
Je souhaite compter le nombre de nombre différent dans une colonne excel en vba. J'utilise un tableau de long pour sauvegarder les différent nombre.
J'arrive à le faire, mais une fois sortie de mes boucles, j'ai l'impression que le tableau de long n'existe plus... Car en faisant MsgBox tableau(valeur) seul des zéros apparaissent.
Voici un extrait de mon fichier:

En fait, je pense que c'est à cause de la fonction ReDim, cela efface les valeurs.
Du coup je suis peut-êtree obligé de faire un tableau de taille fixe et trés grand plutôt qu'avoir un tableau de la taille exacte du nombre de valeurs différentes.
 
Re : VBA: Tableau de Long

Bonjour Toug, Bruno, bonjour le forum,

Peut-être comme ça :
Code:
Sub Comptage()
Dim sd As Object 'déclare la variable sd (Sans Doublons)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim tbl As Variant 'déclare la variable tbl (TaBLeau)
Dim i As Integer 'déclare la variable i (incrément)
Dim mes As String 'déclare la variable mes (MESsage)
 
Set sd = CreateObject("Scripting.Dictionary") 'définit la variable sd
With Sheets("recherche ") 'prend en compte l'onglet "recherche"
    Set pl = .Range("A2:A" & .Cells(Application.Rows.Count, 1).End(xlUp).Row) 'définit la plage pl
End With 'fin de la prise en compte de l'onglet "recherche"
For Each cel In pl 'boucle sur toutes les cellule cel de la plage pl
  sd(cel.Value) = "" 'alimente le dictionnaire
Next cel 'prochaine cellule de la boucle
tbl = sd.keys 'récupère les valeurs sans doublons dans le tableau tbl
mes = "Nombre de valeurs différente : " & UBound(tbl, 1) + 1 & Chr(13) 'définit le message mes
For i = 0 To UBound(tbl) 'boucle sur toutes les valeurs du tableau tbl
    mes = mes & Chr(13) & tbl(i) 'redéfinit le message mes
Next i 'prochaine valeur de la boucle
MsgBox mes 'affiche le message mes
End Sub
 
Re : VBA: Tableau de Long

Bonjour

Si l'objectif est juste de compter le nombre de valeurs différentes, tu peux utiliser un dictionnaire, c'est quasi instantané

nommes de façon dynamique la plage contenant tes nombres
dans formules/définir un nom
=DECALER('recherche '!$A$1;1;0;NBVAL('recherche '!$A:$A)-1)

puis dans le code :

Code:
Sub dictionnaire()
Set mesnumeros = CreateObject("Scripting.Dictionary")
For Each i In Range("numbers") 'la plage est nommée de façon dynamique
    If Not mesnumeros.exists(i.Value) Then mesnumeros.Add i.Value, i.Value
Next i
MsgBox mesnumeros.Count
End Sub
 
Re : VBA: Tableau de Long

En fait, je pense que c'est à cause de la fonction ReDim, cela efface les valeurs.
Du coup je suis peut-êtree obligé de faire un tableau de taille fixe et trés grand plutôt qu'avoir un tableau de la taille exacte du nombre de valeurs différentes.

Non redim n'efface pas les valeurs. Ce qui efface les valeurs c'est de ne pas utiliser le mot preserve qui comme l'indique son nom préserve les données existantes dans l'array.
Il est beaucoup plus économique quand on travaille avec les tableaux de les redimensionner au fur et à mesure et de ne pas travailler avec des trucs surdimensionnés "au cas où".
J'ai "commis" quelques pages de tutos sur le sujet des array, cell-ci qui traite plus particulièrement du dimensionnement t'intéressera probablement
Ce lien n'existe plus
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
16
Affichages
507
Réponses
4
Affichages
240
Réponses
3
Affichages
463
Retour