XL 2013 Sum IFs en VBA, sans sommer

clarouche33

XLDnaute Nouveau
Bonjour !

J'ai un fichier ws_1 dans lequel j'ai une liste d'identifiants, et pour chacun d'entre eux j'ai la possibilité de renseigner 3 acomptes différents (dans trois colonnes). Ces montants d'acompte sont situés dans un fichier ws_2, où j'ai, sur chaque ligne, l'identifiant, puis le numéro de l'acompte (acompte 1, acompte 2, solde),, puis le montant de l'acompte en question.
J'ai donc utilisé un sumIfs, en prenant pour "résultat" la colonne contenant le montant de l'acompte dans ws_2, comme premier critère, le fait que les identifiants de ws_1 et ws_2 correspondent, et comme second critère le fait que le numéro de l'acompte (1, 2, solde) de ws_2 en face de l'identifiant corresponde au nom de la colonne de ws_1
Toutes mes variables sont à priori bien déclarées.
Les cellules que je veux voir compléter se remplissent d'un 0. J'ai l'impression qu'il y a un problème avec ma plage de "résultat" dans lequel il fait la "somme" (qui n'en est donc pas vraiment une car je ne veux qu'une seule valeur), alors qu'il repère correctement quelle cellule remplir.
Savez vous ce que je pourrai changer pour arranger cela ?

VB:
'je veux compléter mon fichier ws_1 d'après le montant contenu dans ws_2. Je balaie mes lignes dans ws_1, je repère l'identifiant et le nom de l'acompte. Je vais chercher l'identifiant dans ws_2. Si un montant pour ce type d'acompte est inscrit dans ws_2 dans la ligne de l'identifiant, copier ce montant dans la cellule appropriée de ws_1

With ws_1.Activate
    derniereLigne_1 = .Cells(Rows.Count, 1).End(xlUp).Row
    derniereLigne_2 = ws_2.Cells(Rows.Count, 1).End(xlUp).Row
    colPlage = ws_2.Rows(1).Find(What:="Montant").Column
    colCritere1 = ws_2.Rows(1).Find(What:="Acompte").Column
    colligne_1 = .Rows(1).Find(What:="Identifiant", LookAt:=xlPart).Column
    colligne_2 = ws_2.Rows(1).Find(What:="Identifiant", LookAt:=xlPart).Column
    Set plage = ws_2.Range(ws_2.Cells(2, colPlage), ws_2.Cells(derniereLigne_2, colPlage)) 'colonne des montants à copier depuis ws_2
    Set critere1 = ws_2.Range(ws_2.Cells(2, colCritere1), ws_2.Cells(derniereLigne_2, colCritere1)) 'colonne du premier critère dans ws_2 : il faut que les deux noms d'acomptes dans ws_1 et ws_2 correspondent
    Set critere2 = ws_2.Range(ws_2.Cells(2, colligne_2), ws_2.Cells(derniereLigne_2, colligne_2)) ''colonne du deuxieme critère dans ws_2 : il faut que les deux noms des identifiants dans ws_1 et ws_2 correspondent
    For lsub = 2 To derniereLigne_1 'pour chacune des lignes de ws_1
        Ident_1 = .Cells(lsub, colligne_1).Value  'numéro identifiant dans ws_1
        Ligne_2 = ws_2.Columns(colligne_2).Find(Ident_1).Row 'ligne correponsdante dans ws_2 à l'identifiant précédent
        nomAc = ws_2.Cells(Ligne_2, colCritere1).Value
        Acompte_1 = .Rows(1).Find(What:=nomAc, LookAt:=xlPart).Column 'colonne contenant le nom d'acompte, dans ws_1
        .Cells(lsub, Acompte_1) = Application.WorksheetFunction.SumIfs(plage, critere1, nomAc, critere2, .Cells(lsub, Ident_1))
    Next lsub
End With


Merci beaucoup !

Edit : les fichiers ws_1 et ws_2. Le résultat souhaité est en feuil2 de ws_1 : le tableau est complété avec les bons montants d'acomptes pour chacun des identifiants
 

Pièces jointes

  • ws_2.xlsx
    8.8 KB · Affichages: 2
  • ws_1.xlsx
    8.8 KB · Affichages: 3
Dernière édition:

Phil69970

XLDnaute Barbatruc
Re

Par définition pour corrigé un code il faut tout avoir le fichier ET le code en totalité
Pour info donner les infos au compte goutte en règle général énervent les bonnes volontés....


Donc met le fichier en totalité en respectant le RGPD si besoin (avec le code en totalité) )et explique nous ce que tu veux faire.
Exemple je veux copier ceci à tel endroit seulement si j'ai cela mais uniquement si j'ai X ou Y etc..et effacer ou pas les donner copier etc....
Tu mets dans une feuille Résultat ce que tu attends comme ... résultat pas besoin d'avoir un 2eme fichier surtout quand ton fichier fait - de 10 ko;)

@Phil69970
 

clarouche33

XLDnaute Nouveau
Re

Par définition pour corrigé un code il faut tout avoir le fichier ET le code en totalité
Pour info donner les infos au compte goutte en règle général énervent les bonnes volontés....


Donc met le fichier en totalité en respectant le RGPD si besoin (avec le code en totalité) )et explique nous ce que tu veux faire.
Exemple je veux copier ceci à tel endroit seulement si j'ai cela mais uniquement si j'ai X ou Y etc..et effacer ou pas les donner copier etc....
Tu mets dans une feuille Résultat ce que tu attends comme ... résultat pas besoin d'avoir un 2eme fichier surtout quand ton fichier fait - de 10 ko;)

@Phil69970
Merci pour votre reponse

Ma macro fait ~200lignes et fait d’autres choses également, les informations manquantes dans le code transmis et qui pourraient être utiles sont les déclarations des variables et fichiers uniquement (je les compléterai tout de même pour rendre le tout plus lisible)
J’ai « anonymisé » mes fichiers en ne présentant que les colonnes utiles et des exemples de lignes. Le fichier original contient davantage d’informations mais qui ne sont pas utilisées dans cette partie du code, d’où mon retrait.

Le résultat attendu est dans le même fichier ws_1. Je l’ai mis en Feuil2 pour la lisibilité.
Effectivement, la taille du fichier ne justifierai pas une macro ici, mais elle s’insère dans une procédure plus globale.

Mon but est de compléter mon fichier ws_1. Les identifiants (dans la colonne Identifiant) correspondent à des opérations, qui sont financées par plusieurs acomptes (acompte 1, acompte 2, solde).
Je souhaite avoir dans mon fichier ws_1, dans la ligne de l’identifiant concerné, les montants des différents acomptes. Si un montant n’est pas trouvé, la case reste vide.

Les montants des acomptes sont situés dans ws_2. Sur chaque ligne, il y a un identifiant, le type d’acompte (1,2, solde), et le montant de l’acompte en question. Plusieurs lignes peuvent donc contenir le même identifiant, avec des types d’acompte (donc des montants) différents.

Est ce plus clair comme cela ?
Merci beaucoup pour votre aide.
 

Phil69970

XLDnaute Barbatruc
Bonjour @clarouche33

Est ce plus clair comme cela ?
Non

Vu le peu d'info que tu as donné malgré mes demandes je te propose en fonction de ce que j'ai compris ce fichier

*J'ai pas compris à quoi sert la feuille 1 vu qu'il n'y a pas de valeur ?
1650470551386.png


*Merci de ton retour

@Phil69970
 

Pièces jointes

  • Copie sur autre feuille V1.xlsm
    18 KB · Affichages: 9

clarouche33

XLDnaute Nouveau
Bonjour @clarouche33


Non

Vu le peu d'info que tu as donné malgré mes demandes je te propose en fonction de ce que j'ai compris ce fichier

*J'ai pas compris à quoi sert la feuille 1 vu qu'il n'y a pas de valeur ?
Regarde la pièce jointe 1137393

*Merci de ton retour

@Phil69970
Bonjour,

Merci pour votre retour.
La feuille 1 est justement la feuille que je veux compléter, grâce aux données contenues dans le second classeur - feuil1 nommée ws_2.
Votre fichier ne semble pas contenir de macro VBA, je ne peux donc pas voir la solution proposée. Votre résultat en feuille 3 est à priori une version sensiblement similaire à mon fichier source ws_2 dont je veux au contraire extraire les données. Je cherche à faire le chemin inverse ( compléter ws_1 à partir de ws_2).

Ayant finalement modifié mon code et comme cela semble marcher, je cloture la discussion. Le problème provenait du fait que j'avais fait un seul SumIfs pour l'ensemble des cellules à compléter. J'ai maintenant 3 sumIfs, qui s'occupent chacun de compléter les informations pour chaque type d'acompte. (Le premier SumIfs complète la colonne de l'acompte 1, le deuxieme celui pour l'acompte 2 et le troisième pour le Solde)

Le code modifié ci-dessous si jamais cela interessent des futurs lecteurs :
VB:
Dim ws_1, ws_2 as worksheets
Dim derniereLigne_1, derniereLigne_2, colPlage, colCritere1, colligne_1, colligne_2, colAcompte1_1, colAcompte2_1, colSolde_1 as Integer
Dim plage, critere1, critere2 as Range 
Dim Ident_1 As String
Dim lsub As Integer

Set ws_1 = « » ‘chemin de la feuille 1 du fichier où l’on veut récupérer les données ( ici, fichier nommé ws_1)
Set ws_2 = « » ‘ chemin de la feuille 1 du fichier contenant les données (ici ws_2)

With ws_1.Activate
    derniereLigne_1 = .Cells(Rows.Count, 1).End(xlUp).Row 'derniere ligne de mon fichier ws_1 à compléter
    derniereLigne_2 = ws_2.Cells(Rows.Count, 1).End(xlUp).Row 'derniere ligne de mon fichier ws_2 contenant les données
    colPlage = ws_2.Rows(1).Find(What:="Montant").Column 'colonne de ws_2 contenant les montants des acomptes
    colCritere1 = ws_2.Rows(1).Find(What:="Acompte").Column 'colonne de ws_2 contenant le type d'acompte
    colligne_1 = .Rows(1).Find(What:="Identifiant", LookAt:=xlPart).Column 'colonne contenant l'identifiant des opérations dans ws_1
    colligne_2 = ws_2.Rows(1).Find(What:="Identifiant", LookAt:=xlPart).Column 'colonne contenant l'identifiant des opérations dans ws_2
    colAcompte1_1 = .Rows(1).Find(What:="Montant acompte 1", LookAt:=xlWhole).Column 'colonne contenant le montant de l'acompte 1 des opérations dans ws_1
    colAcompte2_1 = .Rows(1).Find(What:="Montant acompte 2", LookAt:=xlWhole).Column 'colonne contenant le montant de l'acompte 2 des opérations dans ws_1
    colSolde_1 = .Rows(1).Find(What:="Montant Solde", LookAt:=xlWhole).Column 'colonne contenant le montant du solde des opérations dans ws_1
    Set plage = ws_2.Range(ws_2.Cells(2, colPlage), ws_2.Cells(derniereLigne_2, colPlage)) 'colonne des montants à copier depuis ws_2
    Set critere1 = ws_2.Range(ws_2.Cells(2, colCritere1), ws_2.Cells(derniereLigne_2, colCritere1)) 'colonne du premier critère dans ws_2 : il faut que les deux noms d'acomptes dans ws_1 et ws_2 correspondent
    Set critere2 = ws_2.Range(ws_2.Cells(2, colligne_2), ws_2.Cells(derniereLigne_2, colligne_2)) ''colonne du deuxieme critère dans ws_2 : il faut que les deux noms des identifiants dans ws_1 et ws_2 correspondent
    For lsub = 2 To derniereLigne_1 'pour chacune des lignes de ws_1
        Ident_1 = .Cells(lsub, colligne_1).Value  'numéro identifiant dans ws_1
        .Cells(lsub, colAcompte1_1) = Application.WorksheetFunction.SumIfs(plage, critere1, "1", critere2, Ident_1) 'la cellule correspondant à l'acompte 1 pour l'opération étudiée est remplie par le montant de l'acompte 1 de cette même opération, trouvée dans ws_2. Concretement : on copie le montant que si (critère 1) le type d'acompte dans ws_2 correspond à "1" (soit acompte 1) et si (critère2) le numéro de l'identifiant de ws_2 correspond à celui de la ligne sur lequel on est dans ws_1
        .Cells(lsub, colAcompte2_1) = Application.WorksheetFunction.SumIfs(plage, critere1, "2", critere2, Ident_1) ' de même qu'au dessus pour l'acompte 2
        .Cells(lsub, colSolde_1) = Application.WorksheetFunction.SumIfs(plage, critere1, "Solde", critere2, Ident_1) ' de même qu'au dessus pour le solde
    Next lsub
End With
 
Dernière édition:

Phil69970

XLDnaute Barbatruc
Bonjour @clarouche33

Votre fichier ne semble pas contenir de macro VBA, je ne peux donc pas voir la solution proposée.
Tu es sur ??? 🤔
Mais as tu ouvert le fichier ? :rolleyes:

1650533665307.png


Tu aurais vu ceci

1650533721956.png


De plus proposer un code qui ne fonctionne tel quel dans aucun des fichiers mis à disposition c'est pas top... même pour les futurs lecteurs. ;)

@Phil69970
 
Dernière édition:

clarouche33

XLDnaute Nouveau
Oui, j'ai bien ouvert le fichier et vu votre résultat obtenu en feuille 3. Etant donné que le résultat que je voulais était représenté en feuille 2, vous comprendrez que cela ne répond pas à mon besoin. Entre autre, votre derniere ligne fait apparaitre un solde qui n'est relié à aucune opération, ce qui est embetant.

Mon probleme etant résolu par ailleurs, je vous souhaite une bonne journée.
 

Statistiques des forums

Discussions
311 733
Messages
2 082 015
Membres
101 870
dernier inscrit
Dethomas