Fonction countifpour remplacer formule NB.SI
Bonsoir,
Une petite question.
Pour remplacer NB.SI dans mon document Excel, j'utilise la fonction countIf.
J'arrive à traiter la première ligne, en revanche, dès que je m'essai à étendre le traitement par l'intermédiaire de plages, je me perd un peu... et Excel finit par inscrire le résultat partout, dans toutes les plages désignées.
Vous vous y prendriez comment ?
Voici ce que je cherche à faire :
convertir :
=SI(NB.SI('Database complete'!A$2:A$22126;C8)>1;"Codes jumeaux";[...suite])
en VBA
Donc :
Si la valeur renseignée dans la cellule [C2] de la feuille 'Correspondances' est présente plus d'une fois dans la plage [A:A] de la feuille 'Database complete' alors renseigner "Codes jumeaux" dans la cellule qui suit (D2).
Et répéter la tâche autant de fois qu'il n'y a de ligne en colonne C2.
J'ai mis un document Excel en PJ au cas où mon explication ne serait pas suffisamment détaillée, tout le code est bloqué de manière à éviter qu'il ne change les valeurs à traiter dès l'ouverture du document (car il est pas bien fait... )
J'ai dans l'idée de convertir à terme toute ma formule puis appliquer le même traitement aux autres formules qui subsistent dans le document.
Bonne soirée !
A plus tard
Bonjour !
Si je comprend bien, le code remplace la formule dans sa totalité !
Je n'en espérais pas autant !!! Merci beaucoup !
En revanche, cette partie là du code semble poser problème :
co.Range("D" & i) = dc.Range("G" & i)Le résultat ne correspond pas à au code. En l'occurrence, dès qu'un code est valide, Excel semble lister les correspondances dans l'ordre de leur apparition dans la base de données.
Exemple
- pour le code Dact glom ; le premier résultat est "Aaronsohnia pubescens (Desf.) K.Bremer & Humphries, 1993" ce qui correspond à la première donnée renseignée dans la base de données.
Le résultat devrait être Dactylis glomerata.
Je mets un document en PJ pour illustrer.
Ça ne doit pas être grande chose ! Dès que j'ai du temps je regarde et si je trouve quelque chose je viendrai le poster !
Quoi qu'il en soit, je vais m'en inspirer pour le reste du document.
Bonne journée !
Cette instruction ne figure pas dans mon code.cette partie là du code semble poser problème :
co.Range("D" & i) = dc.Range("G" & i)
En revanche on y trouve :
fc.Range("D" & i) = fdbc.Range("G" & i)Je ne vois pas d'où sort ce résultat...Exemple
- pour le code Dact glom ; le premier résultat est "Aaronsohnia pubescens (Desf.) K.Bremer & Humphries, 1993"
Bye !
En effet, je voulais parler de :
fc.Range("D" & i) = fdbc.Range("G" & i)Je l'avais adapté à mon document.
Dans ce code, il est indiqué (corrige moi si je me trompe) :
i = 2 to "dernière ligne"
Pour chaque cellule dans 'feuille Correspondances' [colonne D] ; renseigner l'information présente dans 'feuille database complete' [colonne G].
Sauf qu'en l'occurrence, i désigne la coordonnée de la cellule ; par conséquent, si on demande à Excel de renseigner une valeur pour : Gi (i =2) il va chercher la valeur présente en [G2].
En réalité, il devrait rechercher la valeur inscrite en [D2] dans la 'Database complete' [colonne A] et renseigner ensuite la correspondance en [colonne G] dans la 'feuille Correspondances' [colonne D].
Comme tu peux voir dans le document que j'ai joins dans mon précédent post, lorsque le code en [Colonne C] est valide, alors il renseigne l'information qui correspond au numéro de ligne.
Ex : en ligne 6
Code : Poa prat (= code valide)
Résultat : Abietinella abietina (Hedw.) M.Fleisch., 1922
Ce résultat est bien présent en 'Feuille Database complete' G6
En réalité il aurait du aller chercher Poa pratensis L., 1753 (ligne 18) qui est la correspondance exacte.
A plus tard
Bonsoir,
Pour résoudre le problème j'ai fait ceci :
For i = 2 To co.Range("A" & Rows.Count).End(xlUp).Row
Cells(1, 14).Value = i
nb = WorksheetFunction.CountIfs(dc.Range("A2:A" & derLn), co.Range("C" & i))
If nb = 0 Then
co.Range("D" & i) = "Code erroné"
ElseIf nb = 2 Then
co.Range("D" & i) = "Codes jumeaux"
Else
Dim ii As Integer, vv As Variant
With Worksheets("Correspondances")
For ii = 2 To lrco
On Error Resume Next
vv = Application.WorksheetFunction.VLookup(.Cells(ii, 3), Sheets("Database complete").Range("A:G"), 7, 0)
.Cells(ii, 4) = IIf(IsError(vv), 0, vv)
Next
End With
'co.Range("D" & i) = dc.Range("G" & i)
End IfSauf que j'ai deux problèmes :
- Il ne tient pas compte de ce qui est calculé avant ; codes erronés / codes jumeaux sont remplacés par des correspondances (alors qu'il est supposer donner une correspondance exacte et donc ne rien trouver).
- le traitement est plutôt long..
A peaufiner du coup..
EDIT :
Voilà, le code s'exécute plus vite et je n'ai plus le problème cité.
Dim ii As Integer, vv As Variant
Set dc = Sheets("Database complete")
'Set fc = Sheets("Correspondances")
derLn = dc.Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To co.Range("A" & Rows.Count).End(xlUp).Row
Cells(1, 14).Value = i
nb = WorksheetFunction.CountIfs(dc.Range("A2:A" & derLn), co.Range("C" & i))
If nb = 0 Then
co.Range("D" & i) = "Code erroné"
ElseIf nb = 2 Then
co.Range("D" & i) = "Codes jumeaux"
ElseIf nb = 1 And nb < 2 And nb <> 0 Then
'For ii = 2 To lrco
On Error Resume Next
vv = Application.WorksheetFunction.VLookup(co.Cells(i, 3), Sheets("Database complete").Range("A:G"), 7, 0)
co.Cells(i, 4) = IIf(IsError(vv), 0, vv)
'End With
'co.Range("D" & i) = dc.Range("G" & i)
End If
Next iSi vous avez des correction à proposer pour rendre le code plus efficient (si ça existe) je suis preneur !
Bonne soirée !