RechercheV plusieurs critères plusieurs feuilles

Re,

Donc le problème est plus loin dans la macro ...

Es-tu certain que tes deux variables dl et x sont correctement calculées ...?

Tu peux temporairement rajouter des MsgBox ... pour être sûr de bien visualiser leurs valeurs ...

J'ai tenté de simplifier le code pour voir si ça fonctionne pour une plage réduite mais sans succès :

Cells(i, 2) = Evaluate( _
            "=INDEX(" & sk & "!K6:K11,SOMMEPROD((" & sk & "!B6:B11=E" & i & ")*(" & sk & "!C6:C11=A" & i & ")*(" & sk & "!G6:G11=C" & i & ")*LIGNE(1:6)))")

Concernant la variable x et dl, c'est correct pourtant

Est-ce que ça pourrait venir de

Evaluate

?

Re,

Excellente Idée de Test de supprimer x ... et de tester la validité sur une plage réduite ...

Une première suggestion :

Quel est ton séparateur habituel : est-ce le point-virgule ou la virgule ?

Une seconde suggestion :

Conserver l'anglais pour VBA ...

Cells(i, 2) = Evaluate( _

"=INDEX(" & sk & "!K6:K" & x & ",SUMPRODUCT((" & sk & "!B6:B" & x & "=E" & i & ")*(" & sk & "!C6:C" & x & "=A" & i & ")*(" & sk & "!G6:G" & x & "=C" & i & ")*ROW(1:6)))")

Merci

J'ai en effet remis les expressions en anglais et il me semble que mes séparateurs sont des points virgules

Je vais tester

Ça ne change rien

Je sèche là

Je dois t'avouer de debugger à distance ... sans rien voir ... c'est pas très simple ...

Il me semble que nous avons balayé tous les points principaux ...

Je viens de re-tester le tout de mon côté ... en conservant les expressions anglaises et la virgule ...

et cela fonctionne correctement ...

J'espère que de ton côté ... tu vas réussir à finaliser ta macro ...

Tiens-moi au courant ...

Oui à distance je suis admiratif!!

Il me semble aussi que tout roule niveau macro enfin presque

Je vais tester des trucs et je remettrai sur le fil la solution si j'en trouve une

En tout cas merci beaucoup pour ton aide précieuse!!

Bonne journée!

Re,

J'espère que tu vas pouvoir trouver la solution ...

Merci de poster ... la fin de l'histoire ...

Bonjour,

D'abord, pourquoi un tableau doit comporter 13823 lignes dont 99% sont vierges ?

Et pourquoi dans cette formule on ne prend que les 6 premières lignes ???!!!

=INDEX([SupportTestV1.xlsx]Feuil1!$K$6:$K$11;SOMMEPROD(([SupportTestV1.xlsx]Feuil1!$B$6:$B$11=E2)*([SupportTestV1.xlsx]Feuil1!$C$6:$C$11=A2)*([SupportTestV1.xlsx]Feuil1!$G$6:$G$11=C2)*LIGNE($1:$6)))

Ensuite, je n'ai pas bien compris le but de cette formule, si tu peux expliquer cela m'aiderait à y mettre mon grain de sel.

Bonjour James

Serait-il possible de le faire sous forme de macro?

Quel est l'intérêt de faire sous forme de macro ?

Attention, dans ta formule, si ton SOMMEPROD est égal à 0 alors INDEX ne donnera pas une erreur mais enverra vers la même ligne que la formule elle-même !!!!

Bonjour Steelson,

Merci de te pencher sur mon problème!!

Le fichier que j'ai joins est à titre d'exemple parce qu'à terme il devra prendre en compte beaucoup de lignes et les 13823 lignes c'est que j'ai dû mal enregistrer le fichier

Pour ce qui est de la formule, c'est en raison de mon fichier SupportTest1 qui se présente comme ça.

Ce programme va être utilisé par diverses personnes qui ne sont pas à l'aise avec excel. Je veux donc leur simplifier un maximum la vie pour qu'ils n'aient qu'un seul bouton sur lequel cliquer et pour que tout se mette en place. D'où la macro.

Je voudrais rechercher dans un fichier source (fichier SupportTestV1) les données présentes sur une ligne (OP, poste, appareil) de mon fichier destination (fichier TestV1). Si il y a concordance des données alors copier le statut (colonne K du fichier SupportTestV1) et le mettre en colonne B du fichier TestV1.

J'espère que mes explication sont claires

Il faut donc une condition dans la macro pour la sommeprod?

La formule de base fonctionne bien mais c'est en la passant en macro (ou du moins en essayant) que ça ne fonctionne plus.

Et pourquoi dans cette formule on ne prend que les 6 premières lignes ???!!!

ok j'ai compris mais c'est une erreur piégeante , je pense qu'il faut faire référence aux lignes du fichier annexe car en cas de déplacement ou d'allongement du tableau source on risque de ne plus s'y retrouver !!

Je vais attaquer la version macro

7testv1.xlsm (18.06 Ko)

Merci beaucoup Steelson pour ton aide!

Je prend note de ta remarque

Quand tu souhaites activer ta macro, est-ce que le fichier source est ouvert ?

nota : c'est indispensable pour calculer la fin du tableau source ... si je reprends la proposition de James alors ceci

    x = k.Range("K" & Rows.Count).End(xlUp).Row

nécessite que le fichier soit ouvert, ou alors

  • soit la macro l'ouvre
  • soit le nombre de lignes est indiqué quelque part dans ton fichier source

deuxièmement, je pense que l'erreur vient en effet de la formule initiale qui incluait cette instruction *ROW(1:6) sans tenir compte du x calculé !! Ta formule te semblait certes bonne ... sauf si tu allongeais ton fichier source.

avec le fichier source ouvert

j'ai donc corrigé au niveau du row(1:6)

Sub ImportData2()
Dim i As Long, dl As Long
Dim ws As Worksheet, k As Worksheet
Dim sk As String
Dim x As Long

'Application.ScreenUpdating = False

    'Fichier destination
    Set ws = ThisWorkbook.Sheets(1)

    'Fichier source
    Set k = Workbooks("SupportTestV1.xlsx").Sheets(1)
    sk = "[SupportTestV1.xlsx]Feuil1"

    dl = ws.Range("A" & Rows.Count).End(xlUp).Row
    x = k.Range("K" & Rows.Count).End(xlUp).Row

'NOTA = le tableau source comme en ligne 5 obligatoirement
'=========================================================

    For i = 2 To dl
        If Cells(i, 1) <> "" Then
            Cells(i, 2).FormulaR1C1 = _
                "=SUMPRODUCT((" & sk & "!R6C2:R" & x & "C2=RC[3])*(" & sk & "!R6C3:R" & x & "C3=RC[-1])*(" & sk & "!R6C7:R" & x & "C7=RC[1])*(ROW(" & sk & "!R6C1:R" & x & "C1)-ROW(" & sk & "!R5C1)))"
            If Cells(i, 2) = 0 Then
                Cells(i, 2) = "?"
            Else
                Cells(i, 2).FormulaR1C1 = _
                "=INDEX(" & sk & "!R6C" & x & ":R" & x & "C" & x & ",SUMPRODUCT((" & sk & "!R6C2:R" & x & "C2=RC[3])*(" & sk & "!R6C3:R" & x & "C3=RC[-1])*(" & sk & "!R6C7:R" & x & "C7=RC[1])*(ROW(" & sk & "!R6C1:R" & x & "C1)-ROW(" & sk & "!R5C1))))"
            End If
            Cells(i, 2).Formula = Cells(i, 2).Value
        End If
    Next i

'Application.ScreenUpdating = True

End Sub

Un petit raffinement pour tenir compte de la position du tableau des données source

Sub ImportData2()
Dim i As Long, dl As Long
Dim ws As Worksheet, k As Worksheet
Dim sk As String
Dim x As Long, y As Long

'Application.ScreenUpdating = False

    'Fichier destination
    Set ws = ThisWorkbook.Sheets(1)
    dl = ws.Range("A" & Rows.Count).End(xlUp).Row

    'Fichier source ... DOIT ETRE OUVERT POUR CALCULER LES LIMITES DES DONNEES
    '                   ******************************************************
    Set k = Workbooks("SupportTestV1.xlsx").Sheets(1)
    sk = "[SupportTestV1.xlsx]Feuil1"
    y = k.Range("K:K").Find("*").Row
    x = k.Range("K" & Rows.Count).End(xlUp).Row

    For i = 2 To dl
        If Cells(i, 1) <> "" Then
            Cells(i, 2).FormulaR1C1 = _
                "=SUMPRODUCT((" & sk & "!R" & y + 1 & "C2:R" & x & "C2=RC[3])*(" & sk & "!R" & y + 1 & "C3:R" & x & "C3=RC[-1])*(" & sk & "!R" & y + 1 & "C7:R" & x & "C7=RC[1])*(ROW(" & sk & "!R" & y + 1 & "C1:R" & x & "C1)-ROW(" & sk & "!R" & y & "C1)))"
            If Cells(i, 2) = 0 Then
                Cells(i, 2) = "?"
            Else
                Cells(i, 2).FormulaR1C1 = _
                "=INDEX(" & sk & "!R" & y + 1 & "C" & x & ":R" & x & "C" & x & ",SUMPRODUCT((" & sk & "!R" & y + 1 & "C2:R" & x & "C2=RC[3])*(" & sk & "!R" & y + 1 & "C3:R" & x & "C3=RC[-1])*(" & sk & "!R" & y + 1 & "C7:R" & x & "C7=RC[1])*(ROW(" & sk & "!R" & y + 1 & "C1:R" & x & "C1)-ROW(" & sk & "!R" & y & "C1))))"
            End If
            Cells(i, 2).Formula = Cells(i, 2).Value
        End If
    Next i

'Application.ScreenUpdating = True

End Sub
Rechercher des sujets similaires à "recherchev criteres feuilles"