Trouver valeurs ds une colonne

  • Initiateur de la discussion Flavie
  • Date de début
F

Flavie

Guest
bjr le forum
j'ai une valeur contenue dans la cellule D20 de la feuille "FIN"
Je souhaiterais retrouver cette valeur dans la colonne A de la feuille "DEBUT"
mais sachant qu'il peut y en avoir plusieurs , j'aurais besoin de :
- dans une variable "le nbre de fois" que cette valeur est présente dans la colonne.
- dans une autre variable, "la position de cette valeur" (celle la plus "en bas" dans la colonne A s'il y en a plusieurs).

merci à tous
Flav
 
J

Jean-Marie

Guest
Bonjour Flavie

Pour le nombre de Nb de fois =NB.SI(Debut!A:A;Fin!D20)

Pour le numéro de la dernière contenant la valeur Fin!D20, utilise cette formule matricielle, à valider par les touches Ctrl+Shift+Entrer
=Max(si(Debut!A1:A65536=Fin!D20;ligne(A1:A65536);0)

Les plages de cellules doivent être de même longueur, ne peuvent pas être des colonnes entières.

@+Jean-Marie
 
F

Flavie

Guest
Merci Jean-Marie

Oups j'ai oublié de préciser que je travaillais avec du VBA.
la feuille "debut" n'existe pas avant le lancement de la macro
je ne peux donc pas utiliser son nom, j'ai eu erreur "#ref"

merci encore
 
J

Jean-Marie

Guest
Re, Flavie

Tu as deux possibilités :

- Rester dans les fonctions de feuille de calcul;
=si(ou(esterr(Indirect("Debut!A1"));esterr(Indirect("Fin!A1")) );"";NB.SI(indirect("Debut!A:A");indirect("Fin!D20")))

et
=si(ou(esterr(Indirect("Debut!A1"));esterr(Indirect("Fin!A1")) );"";Max(si((indirect("Debut!A1:A65536")=indirect("Fin!D20");ligne(A1:A65536);0))

- Ou intégrer ces deux fonctions dans le VBA
'a mettre en début de sub
Dim vFois, vCombien As long 'Va contenir le résultat
Dim TabValeurs () 'Déclaration d'un tableau dynamique
Dim NbLignes as Long
Dim I As Long
Dim vRecherche as Variant

'a mettre après la création et récupération des données
NbLignes =worksheets("Debut").Range("A65536").end(xlUp).row)
TabValeurs = worksheets("Debut").Range("A1:A" & NbLignes)

vRecherche = worksheets("Fin").Range("D20")

For I = 0 to Nblignes -1
If TabValeurs(I) = vRecherche then
vFois = vFois+1
vCombien = I
end if
Next I

Tu trouveras toute les explications sur l'utilisation des tableaux dans cette page
http://www.excel-downloads.com/html...l]. Zon, très utile cette page. @+Jean-Marie
 
F

Flavie

Guest
Ca à l'air d'être ce dont j'ai besoin mais il y un petit pb

il me met une erreur 13 "type incompatibles" à cette ligne

TabValeurs = Worksheets("ARCHIVE").Range("A1:A" & NbLignes)

j'ai bien mis avant :

Dim TabValeurs()

ça fait un bon moment que je cherche mais pas trouvé
 
J

Jean-Marie

Guest
Bonsoir Flavie

Je te redonne le code
Dim vFois, vCombien As long 'Va contenir le résultat
Dim TabValeurs 'Déclaration d'un tableau dynamique
Dim NbLignes as Long
Dim I As Long
Dim vRecherche as Variant

'a mettre après la création et récupération des données
NbLignes =worksheets("Debut").Range("A65536").end(xlUp).row)

TabValeurs = worksheets("Debut").Range("A1:A" & NbLignes).value

vRecherche = worksheets("Fin").Range("D20")

For I = 0 to Nblignes -1
If TabValeurs(I) = vRecherche then
vFois = vFois+1
vCombien = I
end if
Next I


@+Jean-Marie

PS désolé pour le erreurs, mais j'apprends le VBA
 
J

Jean-Marie

Guest
Re...

Oups encore deux petites erreurs.

Je te redonne le code
Dim vFois as Long, vCombien As long 'Va contenir le résultat
Dim TabValeurs 'Déclaration d'un tableau dynamique
Dim NbLignes as Long
Dim I As Long
Dim vRecherche as Variant

'a mettre après la création et récupération des données
NbLignes =worksheets("Debut").Range("A65536").end(xlUp).row

TabValeurs = worksheets("Debut").Range("A1:A" & NbLignes).value

vRecherche = worksheets("Fin").Range("D20")

For I = 1 to Nblignes
If TabValeurs(I) = vRecherche then
vFois = vFois+1
vCombien = I
end if
Next I

@+Jean-Marie
 
F

Flavie

Guest
bjr le forum
Merci Jean Marie

je vois que tu travailles très tard pour m'aider, c'est vraiment très cool de ta part.
Moi aussi , j'apprend le VBA , mais tu es bien plus doué que moi. (ca ne fait que quelques jours, mais c'est passionnant !!!!)

Je t'ai remis mon code, "ARCHIVE" a remplacé "DEBUT" ; "DEBUT" a remplacé "FIN" et j'ai mis S à la place de I car j'utilisais déjà I au début de ma procédure.
J'ai encore une erreur sur la ligne : If TabValeurs(S) = vRecherche Then
erreur 9 : l'indice n'appartient pas à la selection.
j'ai tout retourné dans tous les sens, je ne comprends pas....

le code:

Dim vFois As Long, vCombien As Long 'Va contenir le résultat
Dim TabValeurs 'Déclaration d'un tableau dynamique
Dim NbLignes As Long
Dim S As Long
Dim vRecherche As Variant

'a mettre après la création et récupération des données
NbLignes = Worksheets("ARCHIVE").Range("A65536").End(xlUp).Row

TabValeurs = Worksheets("ARCHIVE").Range("A1:A" & NbLignes).Value

vRecherche = Worksheets("DEBUT").Range("I9")

For S = 1 To NbLignes
If TabValeurs(S) = vRecherche Then
vFois = vFois + 1
vCombien = S
End If
Next S

Merci
Flav
 
F

Flavie

Guest
Bjr le forum

Je suis désolée Jean Marie, ça me fait tjrs la même erreur au même endroit.
En débogage, il trouve bien la valeur de la taille du tableau avec UBound, mais il le trouvait déjà avec NbLignes.

Flav
 
@

@+Thierry

Guest
Bonjour Flavie, Jean-Marie

Très interressant votre fil, si je peux me permettre, voici une version corrigée :

Option Explicit
Sub Flavie_JeanMarie()
'Dim vCombien As Long '<<< Superflu
'Dim NbLignes As Long '<<< SuperFlu

Dim S As Long
Dim vFois As Byte '<<< As Long est SurDimensionné, si plus de 255 retours alors As Integer
Dim TabValeurs As Variant 'Déclaration d'un tableau dynamique <<< NON PAS DYNAMIQUE !!
Dim vRecherche As String '<<< NON PAS VARIANT

'NbLignes = Worksheets("ARCHIVE").Range("A65536").End(xlUp).Row '<<< SuperFlu

With Worksheets("ARCHIVE")
TabValeurs = .Range("A1:A" & .Range("A65536").End(xlUp).Row) '<<< Tout en une étape
End With

vRecherche = Worksheets("DEBUT").Range("I9")

For S = 1 To UBound(TabValeurs)
If TabValeurs(S, 1) = vRecherche Then
vFois = vFois + 1
' vCombien = S '<<< SuperFlu
End If
Next S

MsgBox "La String " & vRecherche & " a été trouvée " & vFois & " fois, dans un tableau de " & S - 1 & " enregistrements"

End Sub

En fait on peut aller bien plus directement comme ceci...

Quelques Explications :
¤ Un Tableau Variant de Plage (comme ici "TabValeurs") n'est pas une Dynamic Array (Pour une Dynamique Array il est précisé les ()... comme dans le Post de Jean-Marie du 09-08-04 12:33
¤ Dans ce Cas on n'a pas besoin de trouver la dernière ligne "NbLignes" puisque qu'on peut dimensionner la Plage directement.
¤ La Variable "vCombien" est superflue, vu qu'on a la même chose dans "S", la seukle différence c'est qu'ayant un "Next" de plus en sortie, il faut penser à la synchroniser avec moins 1...
¤La variable "vRecherche" n'est pas Variant mais juste String, en fait même Variant peut créer des surprises selon ce que l'on cherche...

Voilà en espérant vous avoir éclairci un peu.

Bonne Journée
@+Thierry
 
@

@+Thierry

Guest
Ah re Bonjour Flavie, Jean-Marie

De rien Jean-Marie.... Et en complément d'info, comme vous pourrez constater c'est cette ligne là chez vous qui devait retourner une erreur :
If TabValeurs(S) = vRecherche Then

Alors que dans ma version j'écris ceci :
If TabValeurs(S, 1) = vRecherche Then

En effet à partir du moment où l'on défini un Tableau Variant de Range même en "Mono-Colonne", il est nécessaire et indispensable lors du scan item par item (ici "S") de définir aussi la colonne (même si il n'y en a qu'une)

Par contre c'est libre pour le UBound(TabValeurs) ou UBound(TabValeurs, 1) ce qui, je le l'admets peut-être très perturbant pour les débutant(e)s...

A l'opposé si on contruit une "Vraie" Dynamic Array en "Mono-Colonne" par exemple voir ce Fil (Lien supprimé) c'est l'inverse, il ne faut pas ... (arf !! lol)

Voici un exemple strictement loufoque et inutile pour comprendre :

Sub MyDynamicArray()
Dim MyArray() As String
Dim MyString As String
Dim MyValue As Byte
Dim i As Byte, x As Byte, z As Byte

Randomize
MyValue = Int((30 * Rnd) + 1)

For i = 1 To MyValue
ReDim Preserve MyArray(x)
MyArray(x) = "Toto " & i
x = x + 1
Next i

For z = 0 To UBound(MyArray)
MyString = MyString & MyArray(z) & vbCrLf
Next z

MsgBox "Il y a eu " & MyValue & " toto" & vbCrLf & MyString & vbCrLf & "sur " & z

End Sub

Enfin si ça vous éclaircit un peu... Sinon on appelle G'Claire !! lol

Bonne Journée
@+Thierry
 

Discussions similaires

Statistiques des forums

Discussions
312 495
Messages
2 088 964
Membres
103 992
dernier inscrit
Christine 974