Résolu excel vba comparer des listes dans des classeurs et recopier dans un autre.

  • Auteur de la discussion globulle93
  • Date de début

globulle93

Habitué
voila pour le moment je demande si c'est faisable avant de me triturer les méninges.

j'ai 2 fichier commande avec 3 colonne "numéro comande, libéllé, et montant et un autre fichier commande payé avec idem num commande, libellé et montant.

je voudrais comparer commande avec commande payé sur le numéro et le montant et toutes les lignes qui match les extraires et les collées dans un autre classeur, ceux ou le num commande est identique mais montant différent les coupés collées dans un autre classeur et enfin les reste non matché les coupé collée dans un autre.

c'est faisable en excel vba ??

merci des réponses !! je demande pas le code je vais plancher et proposer, mais je veux déjà savoir si c'est faisable avant de perdre du temps.
 

zeb

Modérateur
Salut Globulle,

D'une part c'est faisable, et d'autre part, tu n'es pas le premier à avoir ce problème dans ce forum.
Nous serions ravis de t'aider.
 

globulle93

Habitué
merci alors je vais plancher dessus et faire étape par étape et vous soumettre le code pour avis :D
 

zeb

Modérateur
Et si tu publiais à chaque étape ?
On peut être très critique (*) sur ton code.
Ça pourrait t'être intéressant.

_____________
(*) Ne pas confondre critique objective, et dénigrement ;)
 

globulle93

Habitué
bonjour,

juste une question je veux faire un teste if and

Code:
if cellule du classeur 1 onglet 1= a cellule du classeur 2 onglet1
then couper la celulle classeur 1 et copier dans classeur 3 et couper cellule classeur 2 et copier dans classeur3 a la suite de l'autre

pour le moment j'ai pondu ça en code :??:

Code:
Sub encaissement()
' ouverture de mes 2 classeur sur les 2 onglet 
Dim wb As Workbook
Dim ws As Worksheet

Set wb = Workbooks.Open("C:\........\ogone.xls")
Set ws = wb.Worksheets("Ogone_Fev")

Set wb = Workbooks.Open("C:\................\commande.xls")
Set ws = wb.Worksheets("Encaissement_Ventes")

' définition des variables
Dim NumeroCommandeCompta As Integer
Dim NumeroCommandeOgone As Integer
Dim DateCommandeCompta As String
Dim DateCommandeOgone As String
Dim MontantCommandeCompta As Integer
Dim MontantCommandeOgone As Integer
Dim Ligne As Integer

' initialisation des variables
Ligne = 1
NumeroCommandeCompta = 0
NumeroCommandeOgone = 0
DateCommandeCompta = ""
DateCommandeOgone = ""
MontantCommandeCompta = 0
MontantCommandeOgone = 0

While Not IsEmpty(Cells(Ligne, 1))

merci de votre aide pour que je puisse avancer :D
 

zeb

Modérateur
Salut :)

Ah, enfin quelqu'un qui a compris qu'un peu d'anonymisation ne coûtait pas grand chose mais faisait passer son auteur pour un peu moins bête que la moyenne. Merci.

Code:
Set wb = Workbooks.Open("C:\........\ogone.xls")
Set ws = wb.Worksheets("Ogone_Fev")
 
Set wb = Workbooks.Open("C:\................\commande.xls")
Set ws = wb.Worksheets("Encaissement_Ventes")
:/
Et si je te proposais :
Code:
a = 5
a = 2
MsgBox a

Et que je te demande l'intérêt de la première ligne...

Comme ça, m'enfin !
Code:
Dim wb_ogone As Workbook
Dim ws_ogone As Worksheet
Set wb_ogone = Workbooks.Open("C:\........\ogone.xls")
Set ws_ogone = wb.Worksheets("Ogone_Fev")
 
Dim wb_cmd As Workbook
Dim ws_cmd_encaiss As Worksheet
Set wb_cmd = Workbooks.Open("C:\................\commande.xls")
Set ws_cmd_encaiss = wb.Worksheets("Encaissement_Ventes")

Code:
Dim DateCommandeCompta As String
Dim MontantCommandeCompta As Integer
Dim Ligne As Integer

Bof.
Une date c'est "Date" (euh... ben quoi)
Un montant c'est "Currency" (sinon, quid des centimes !)
Une ligne de classeur, c'est "Long" (Integer s'arrête à 32767. En version 32 bits, Excel dispose de 65536 lignes et en mode 64 bits, c'est 1048576 !)

"While .. Wend" est obsolète. Utilise "Do While .. Loop".


-----------------------------------------------

[fixed]if cellule du classeur 1 onglet 1= a cellule du classeur 2 onglet1
then couper la celulle classeur 1 et copier dans classeur 3 et couper cellule classeur 2 et copier dans classeur3 a la suite de l'autre[/fixed]

Ton test (sans e [:zeb:4]) amène quelques questions.

Il y a bien trois classeurs, 1, 2 et 3. Lequel est le classeur courant (celui qui contient la macro) ?
On ne demande pas à un programme, fut-il une macro, d'utiliser le presse-papier. On ne coupe, ni ne colle quoique ce soit.
Si la cellule 1 et la cellule 2 contiennent la même valeur, qul intérêt de recopier la valeur de chacune dans le classeur 3 ?

Donc il te faut trois variables pour tes trois feuilles. Si l'un d'eux est le classeur qui contien la macro, alors pas besoin de variable pour ce classeur. mais une variable pour la feuille peut être utile.

Admettons que le troisième classeur soit celui qui contient la macro, qu'on veuille enregistrer dans la feuille 1 de ce classeur, et que les données soient issues des feuilles ws_ogone et ws_cmd_encaiss.

L'algo est le suivant :
1°) On détermine la dernière ligne de la feuille 1.
2°) On détermine la dernière ligne de la feuille 2.
3°) On détermine la dernière ligne de la feuille 3.

4°) On parcourt toutes les lignes de la feuille 1, du début (ligne 2 pour laisser un éventuel titre) à la dernière ligne.
4.1°) Pendant ce parcours, on cherche dans la colonne 1 de feuille 2, la valeur de la colonne 1 de la ligne en cours de la feuille 1.
4.2°) Quand on trouve cette valeur, on copie les trois premières colonnes de la feuille 1 et les colonnes 2 à 3 (pas la peine de répéter l'information présente dans la colonne 1) de la feuille 2, dans la première ligne vide de la feuille 3.

Ca donne :
Code:
Dim last_row_ogone      As Range
Dim last_row_cmdencaiss As Range
Dim next_row_target     As Range

Set last_row_ogone      =                  ws_ogone.Cells(Application.Rows.Count, 1).End(vbUp).EntireRow
Set last_row_cmdencaiss =             ws_cmdencaiss.Cells(Application.Rows.Count, 1).End(vbUp).EntireRow
Set next_row_target     = ThisWorbook.Worksheets(1).Cells(Application.Rows.Count, 1).End(vbUp).Offset(1).EntireRow

Dim row_ogone          As Range
Dim row_cmdencaiss     As Range

For Each row_ogone In ws_ogone.Range(ws_ogone.Cells(2, 1), last_row_ogone)
	For Each row_cmdencaiss In ws_cmdencaiss.Range(ws_ogone.Cells(2, 1), last_row_ogone).Rows
		If row_ogone.Cells(1).Value = row_cmdencaiss.Cells(1).Value Then
			Intersect(row_ogone,           ws_ogone.Range("$1:$3")).Copy Destination:=next_row_target.Cells(1)
			Intersect(row_cmdencaiss, ws_cmdencaiss.Range("$2:$3")).Copy Destination:=next_row_target.Cells(4)

			Set next_row_target = next_row_target.Offset(1)
		End If
		
	Next
Next

Ce n'est pas LA solution à ton problème, c'est un canevas à bien comprendre pour résoudre tous les problème dans ton genre ;)
J'attends tes questions :o
 

globulle93

Habitué
bonjour zeb

et oui faut pas sous estimé les boeufs :D

oui
a = 5
a = 2
MsgBox a

me donne le même résultat :/

date j'avais mis string car je suis pas sur que la cellule soit au format date ! est ce que ca pose problème si elle l'est pas et que je lui met "date"

Code:
Dim MontantCommandeCompta As Integer
idiot c'est vrais

Code:
Dim MontantCommandeCompta As double
aurait déja été plus juste

la j'ai mis

Code:
Dim Ligne As Integer
car j'irai jamais au 32767 ligne :D

peut pas avoir tout faut :p


j'ai 3 classeur

classeur 1 commande
classeur 2 ogone
classeur 3 contient la macro

donc je parcour 1er ligne de commande je teste avec ogone
si je match je recopie la ligne de classeur 1 et 2 entièrement dans le 3 onglet commande paye
si je match sur numéro de commande date mais montant différent je copie dans onglet commande payé partielement
si je match avec aucune ligne du classeur 2 je copie dans onglet commande non payé
et faudrait que les commande non pointer du classeur 2 soit copié dans un onglet retour marchandise.

je reprend toute les colonnes car d'autre peuvent lire le fichier et je les vois bien paniquer si il retrouve pas tout les petits :heink:

merci pour l'aide je remet en forme et j'avance et revient vers le forum

merci encore de l'aide:love:


 

zeb

Modérateur
Meilleure réponse
Plop,

Ce n'est pas parce que tu n'as pas prévu ci ou ça qu'il faut se dispenser de bien faire les choses.
Une ligne, c'est entre 1 et 1048576. Picétou.

Je ne sais pas ce qu'il y a dans ta feuille, mais une date, c'est une date. Si la cellule ne contient pas quelque choses qui ressemble à une date, je ne vois pas l'intérêt de colporter une information erronée.
Tips : Regarde l'aide de la fonction CDate(String).

Oki. N classeurs. Qu'importe. Il faut juste mettre ceux que tu ouvres dans autant de variables que nécessaire pour pouvoir les fermer à l'issue de la procédure. Ce qui importe surtout, c'est que tu aies toutes tes feuilles.

Ça devrait ressembler à ça :
Code:
Dim Found As Boolean
For Each row_encaiss In ws_encaiss.Range(...).Rows
    Found = False
    For Each row_ogone In ws_ogone.Range(...).Rows
        If row_ogone.Cells(...).Value = row_encaiss.Cells(...).Value Then    ' reférence
            Found = True
            If row_ogone.Cells(...).Value = row_encaiss.Cells(...).Value Then    
            Then
                ' montant identique = payé
                
            Else
                ' montant différents = partiellement payé

            End If
            Exit For
        End If
    Next
    If Not Found Then
        ' Pas trouvé => refusé

    End If
Next
 

globulle93

Habitué
bonjour,

bon je reprend après une absence.

je récapitule car je me rend compte que j'ai mis la charnue avant les vieux :D

j'ai :
un classeur commande avec un onglet ventes "chiffre positif" et un retour " chiffre négatif - xx"
un classeur ogone avec un onglet paiement ( dedans j'ai aussi bien les encaissement que remboursement mais pas de chiffre + ou - mais j'ai une colonne qui indique paiement ou remboursement)

j'ai en commun dans les 2 fichier une colonne commande, une montant mais en sachant que dans commande j'ai des montant - pour le retour mais dans le fichier ogone j'ai une colonne qui me dit paiement ou remboursement qui correspond au + et -.

donc j'ouvre excel sur un classeur vierge de tout.
je lance ma macro vba excel qui doit m'ouvrir le classeur commande, ogone et qui me crée un nouveau classeur appelé résultat dans lequel je doit avoir un onglet :
cmd payer
cmd pt partiel
cmd non payer
retour payer
retour non payer
donc je doit vérifier que toute les lignes du fichier commande onglet vente match avec le fichier ogone.

le résultat du trie se recopie dans le classeur résultat dans l'onglet concerner.

cmd payer
cmd pt partiel
cmd non payer

après la macro continue et vérifier le classeur commande onglet retour avec le fichier ogone et les ligne qui on dans la colonne paiement marquer remboursement

le résultat du trie se recopie dans le classeur résultat dans l'onglet concerner
retour payer
retour non payer

le plus serait que toutes les lignes qui on été basculé dans le classeur résultat soit coloriser dans les fichiers d'origine " commande et ogone")

pour être sur de rien louper.

bon voila la je crois avoir rien oublier :heink:

donc
1°) j'ouvre un classeur excel

2°) je lance la macro qui ouvre le classeur commande, ogone et créer le classeur résultat avec les onglet cmd payer,cmd pt partiel, cmd non payer, retour payer, retour non payer

3°) On parcourt toutes les lignes du classeur commande de la feuille vente, du début (ligne 2 pour laisser un éventuel titre) à la dernière ligne avec comme critère la colonne n° commande colonne A et montant colonne N.

4°) Pendant ce parcours, on cherche dans le classeur ogone colonne B commande le montant colonne L statue qui me dit si paiement ou remboursement colonne E que l'on compare avec le classeur commande.

5°) Quand on trouve les valeurs on recopie dans le classeur résultat dans l'onglet concerner.

donc je me relance dans l'étude avec l'aide déja fournie pas maitre zeb :D
 

zeb

Modérateur
Je ne vois pas de question dans ton dernier message.
Est-ce donc que tu cherches par toi-même ?
Super ! Pense à nous montrer ta solution.
N'hésite pas si tu as encore des problèmes, gros ou petits ;)
 

globulle93

Habitué
bonjour,

je voulais créer un classeur résultat et renommer les feuilles avant de poursuivre la macro donc j'ai tester ce code mais apparemment il ne me ferme pas la feuille à la fin.

Code:
Sub creation_feuille()

Dim XLApp As New Excel.Application
Dim XLBook As Workbook
Dim XLSheet As Worksheet

Set XLBook = XLApp.Workbooks.Add
Set XLSheet = XLBook.Worksheets.Add

XLBook.Sheets("Feuil1").Name = "barbapapa"
XLBook.SaveAs "C:\......\Desktop\test.xlsx"
XLBook.Close

End Sub


je veut bien un coup de main la:D
 

zeb

Modérateur
Salut,

Euh... Pourquoi crées-tu une nouvelle instance d'Excel ?
J'espère que tu auras pas à exécuter cette macro sur un Excel non-francisé ("Feuil1");

Ton instance d'Excel est différente de celle depuis laquelle tu exécutes ton code.
Et cette instance n'est pas visible.
Pour t'en convaincre, ouvre le gestionnaire de tâches. Compte le nombre de processus Excel.
Exécute cette macro :
Code:
Dim XLApp As New Excel.Application
Dim XLBook As Workbook
Set XLBook = XLApp.Workbooks.Add
Stop
XLBook.Close
Quand la macro s'arrête, retourne dans le gestionnaire de tâches. Compte le nombre de processus Excel.
Laisse la macro se terminer. Combien de processus Excel ?

Voilà.

Maintenant, un tour de magie :
Code:
Dim XLApp As New Excel.Application
XLApp.Visible = True
Stop
XLApp.Quit

:sol:
 

globulle93

Habitué
bonsoir,

pour tout dire j'ai été dans différent poste et j'ai trouvé différent morceau que j'ai assemblé :D

j'ai déjà fait le teste de lancé la macro et gestionnaire de tache j'ai plus de precessus excel qui tourne ce qui fait en plus que si je veux fermer le pc je suis obligé de stoper les processus avant. :heink:

j'ai pas trouvé de forum ou même de bouquin qui détaille tout les processus ta toujours que des morceaux d'explications si ta un bouquin je veut bien le titre :??:

j'ai testé et la rien dans le gestionnaire.

quand je lance la macro elle doit me créer mon classeur resultat et mes onglet. comment je fait pour que cela marche avec tout les n'excel si c'est possible:??:
 

zeb

Modérateur
Salut,

Je n'ai pas de bouquin sur VB à te conseiller. J'ai appris à programmer il y a fort longtemps, avec d'autres langages (BASIC, Asm, C, Pascal, Cobol...) et sur d'autres systèmes (CPC, UNIX, MVS, Linux, DOS). Je me suis mis à la programmation événementielle et aux API Windows avec C++. Du coup, la transition vers le VB a été simple pour moi.

Comment ça, tu lances la macro, elle s'arrête en plein milieu, un EXCEL instancié et tu ne le vois pas dans le gestionnaire des tâches ?
Regarde mieux !
De toute façon, la solution pour ne pas qu'il se cache t'a été donnée.

Aucun besoin de connaître le nom de la feuille n°1, qui varie en fonction des versions d'Excel.
Son numéro suffit, et lui, ne varie pas !

;)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 000
Membres
1 586 387
Dernier membre
ouistititouille
Partager cette page
Haut