Variable de bouclage dans formule RechercheV

Thibault LB -  
 Thibault LB -
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 !

8 réponses

  1. linkcr15 Messages postés 423 Statut Membre 12
     
    On ne peut pas écrire de formule Excel dans du code VBA, à moins que je sois à la bourre?! =/
    Que cherches-tu à faire?
    0
  2. Thibault LB
     
    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
  3. linkcr15 Messages postés 423 Statut Membre 12
     
    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
  4. Thibault LB
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. linkcr15 Messages postés 423 Statut Membre 12
     
    Arrete de penser en tant que formule Excel mais pense plutot programmation et VBA avec des if... then ... end if
    0
  7. Thibault LB
     
    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
  8. linkcr15 Messages postés 423 Statut Membre 12
     
    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
  9. Thibault LB
     
    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
    1. linkcr15 Messages postés 423 Statut Membre 12
       
      Tu veux vérifier quelle(s) cellule(s)?
      0
    2. Thibault LB
       
      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
    3. linkcr15 Messages postés 423 Statut Membre 12
       
      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
    4. Thibault LB
       
      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
    5. linkcr15 Messages postés 423 Statut Membre 12
       
      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