Variable de bouclage dans formule RechercheV

Fermé
Thibault LB - 30 mai 2012 à 11:40
 Thibault LB - 31 mai 2012 à 11:37
Bonjour,

Voici un bout de macro que je suis en train de faire.
J'aimerais qu'elle parcourt toutes les cellules de A7 a A20.

Mais j'ai essayé de nombreuses formes pour le $A[i], en gras ci-dessous, sans succès.

For i = 7 To 20

numLigne = "=EQUIV(RECHERCHEV($A[i];[Test2.xlsm]Feuil1!$A$7:$A$23;1;FAUX);[Test2.xlsm]Feuil1!$A$7:$A$23;0)"
numLigne = numLigne + 7
Range("A" & numLigne).Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Next



Merci d'avance !

A voir également:

8 réponses

linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
30 mai 2012 à 11:42
On ne peut pas écrire de formule Excel dans du code VBA, à moins que je sois à la bourre?! =/
Que cherches-tu à faire?
0
Thibault LB
30 mai 2012 à 11:45
Ah bon :/.

En fait, je poste ici une petite partie de la macro que je cherche à faire lors de ce sujet : http://www.commentcamarche.net/forum/affich-25272529-macro-de-maj-de-liste-avec-source-excel#newanswer

Dans ce bout de macro, je cherche à récupérer le numéro des lignes qui sont différentes entre les deux listes.
Une fois ces numéros de lignes en main, j'insère une ligne à cette endroit.

J'espère être clair.
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
30 mai 2012 à 11:49
Dans un des deux fichiers, tu ouvres l'autre en VBA ensuite, avec un compteur, tu vérifies que tes lignes sont les mêmes. Si les lignes sont différentes alors tu met le numéro de la ligne différente dans un tableau définit.
J'ai la flemme d'écrire le code mais l'algo est là.
0
Thibault LB
30 mai 2012 à 11:50
Ah oui je vois ce que tu veux dire.

Ile me faudrait quelque chose dans ce type la plutôt :
"=MATCH(VLOOKUP(R[-10]C[" & i & "],[Test2.xlsm]Feuil1!R7C1:R23C1,1,FALSE),[Test2.xlsm]Feuil1!R7C1:R20C1,0)" ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
30 mai 2012 à 13:56
Arrete de penser en tant que formule Excel mais pense plutot programmation et VBA avec des if... then ... end if
0
Thibault LB
30 mai 2012 à 13:59
Ah :).

J'avais pas vu ton message précédent, désolé. Je suis donc resté sur ma piste de début.


Je suis au début de VBA, donc j'essaye de m'y interresser et de comprendre le raisonnement.
Je vais essayer de faire quelque chose, et je le metterais ici, mais attention ça risque d'être marrant !
Si d'autres sont tentés de m'aider, ce serait avec plaisir.

En tout cas merci.
Thibault.
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
30 mai 2012 à 14:01
Commence à programmer et si t'es pas sûr ou si sa plante, post le, on y regardera avec plaisir ;)
On a tous commencé tu sais, mes premiers programmes étaient très moches aussi, mais faut un début a tout!
0
Thibault LB
30 mai 2012 à 16:19
Me revoila !

Bon alors voila ce que j'ai reussi à faire pour le moment :




Private Function EstDansCollection(Coln As Object, Item As String) As Boolean
Dim obj As Object
On Error Resume Next
Set obj = Coln(Item)
EstDansCollection = Not obj Is Nothing
End Function

'Cette fonction me permet de vérifier si le fichier est deja ouvert (il me l'ouvrait en lecture seule sinon), mais ça ne marche pas :'(

Public Function MacroExcel()
'Permet d'ouvrir le fichier Test1.xls si ce n'est pas le cas.
If EstDansCollection(Workbooks, "Test1.xls") = True Then
MsgBox "Le classeur est déjà ouvert !"
Else
Workbooks.Open Filename:="D:\Documents and Settings\yr26686\Bureau\Test1.xls"
End If

End Function




Sub Test()

'MacroExcel

Windows("Test1.xls").Activate
Dim numLigne As Long
Dim NomTableau(50) As Integer
Dim i As Integer

For i = 7 To 9

'Remplacer "???" par la comparaison de A[i] avec la liste du fichier Test2, mais je ne trouve pas comment faire...
If ??? Then
NomTableau(i) = numLigne
End If
Next i

'Cela me sert juste à vérifier si les données ont été entrées dans le tableau
For numLigne = 0 To 50
MsgBox NomTableau(numLigne)
Next numLigne



Voila ! Je galère bien bien :P
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
30 mai 2012 à 16:30
Tu veux vérifier quelle(s) cellule(s)?
0
Thibault LB
30 mai 2012 à 16:37
Je veux vérifier si chaque cellule A7 jusqu'a A[X] (avec X dernière cellule non vide de la colonne) du fichier Test2 est dans Test1, et si ce n'est pas le cas, stocker le numéro de la ligne dans le tableau.

Pour plus de comprehension peut être :

Test 1 : http://cjoint.com/?BEEkoyWsrps

Test 2 : http://cjoint.com/?BEEkl6S7xyf
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
30 mai 2012 à 17:13
Je peux pas vérifier ton fichier d'où je suis mais je peux t'aider :

Dim compteur as integer
Dim derniere_ligne as Integer

'Permet de trouver la dernière ligne écrite
For compteur = 7 to 20000

If Test2.Sheets(...).Cells(compteur, 1).value ="" then

derniere_ligne = compteur
Exit For

End If

Next Compteur

'On initialise ton tableau à 0
Dim NomTableau(derniere_ligne) As Integer

For compteur = 1 to derniere_ligne

NomTableau(compteur) = 0

Next compteur

'On vérifie les lignes et si elles sont différentes, on met un 1 à l'indice de la ligne
For compteur = 7 to derniere_ligne

If Test2.Sheets(...).Cells(compteur, 1).Value <> Test1.Sheets(...).Cells(compteur, 1).Value then
NomTableau(compteur) = 1
End If

Next compteur


Ainsi, par exemple, si les lignes 7 sont différentes, alors NomTableau(7) = 1 sinon NomTableau(7) = 0

Attention, j'ai codé comme un barbare par manque de temps, tu peux largement améliorer mon code! (Surtout au niveau des boucles For que je fais!) mais là j'étais pressé.
0
Thibault LB
30 mai 2012 à 17:31
Merci pour avoir chercher de ton côté !!

J'avais aussi reussi a récupérer la dernière ligne non vide, par :
DerniereLigne = Cells(65536, 1).End(xlUp).Row 'Sur la colonne A, ce qu'il me faut.

Je ne comprend pas pourquoi tu fais autant de Next compteur.

Sinon, juste une petite remarque. Je ne veux pas comparer A7 du Test1 à A7 du Test2, A8 du Test1 à A8 du test2, et ainsi de suite. Ce que je veux, c'est comparer A7 du test1 à (A7 jusqu'a A[DerniereLigne]) du Test2, A8 du test1 à (A7 jusqu'a A[DerniereLigne]) du Test2, et ainsi de suite.
J'espère avoir été clair :D.

Et voila ce que j'ai fait pour ce sujet la, mais mon tableau reste vide, alors qu'il ne devrait pas :
Sub Test()

'Permet d'ouvrir le fichier Test1.xls si ce n'est pas le cas.
MacroExcel

Windows("Test1.xls").Activate
Dim numLigne As Long
Dim NomTableau(5) As Integer
Dim i As Integer
Dim DerniereLigne As Integer
Dim Lig

DerniereLigne = Cells(65536, 1).End(xlUp).Row 'On va aller trouver la dernière ligne de la colonne A
MsgBox "" & DerniereLigne

For i = 7 To 9
Valeur_Test = Cells(i, 1).Value 'La valeur qu'on souhaite tester
'On va voir si on trouve la valeur testée.
Windows("Test2.xlsm").Activate
Set Lig = Range(Cells(1, 1), Cells(DerniereLigne, 1)).Find(Valeur_Test, LookIn:=xlValues, LookAt:=xlWhole)
If Lig Is Nothing Then
NomTableau(numLigne) = i

End If
Next i
0
linkcr15 Messages postés 362 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 31 mars 2016 12
30 mai 2012 à 17:49
Un for dans un for? (Tu vas me dire que j'aime bien les for, je sais :p )
For compteur = 7 to derniereligne
      valeur = Cells(compteur, 1).Value
      For compteur2=7 to derniereligne
      if test2.sheets(...).cells(compteur2, 1).value = valeur then
           NomTableau(compteur)=compteur2
      end if
      next compteur2
next compteur

Ainsi, imagine que la cellule 7 de test1 soit trouvé en ligne 14, tu auras dans ton tableau NomTableau(7) = 14

Pour ton code, tu écris NomTableau(numLigne) = i cependant, tu ne définis à aucun moment ton numLigne, voila pourquoi il ne fonctionne pas^^
0