Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Excel > VBA Excel

Réponse
 
Outils de la discussion
Vieux 26/08/2008, 14h06   #1 (permalink)
Invité régulier
 
Date d'inscription: juin 2006
Messages: 11
Par défaut comparaison 1 fichier avec 1 feuille à 1 fichier avec 2 feuilles

Bonjour à tous,

je developpe une petite macro pour m'aider dans la comparaison de fichiers.

-j'ai un premier fichier avec une feuille de tous les articles de mon client:
-Fichier : "CHU.xls" dans la macro c'est la variable nom_classeur1
-feuille : "AO0634026 accepté" dans la macro c'est la variable Feuille

-j'ai un second fichier avec 2 feuilles :
-Fichier : "Tous les articles supprimés.xls"
-feuille 1 : "Art Supprimés"
-feuille 2 : "Art Bloqués"



Ma macro va comparer :

-la feuille "AO0634026 accepté" du fichier "CHU.xls" à la feuille 1 : "Art Supprimés" du fichier "Tous les articles supprimés.xls"
-la feuille "AO0634026 accepté" du fichier "CHU.xls" à la feuille 2 : "Art Bloqués" du fichier "Tous les articles supprimés.xls"

si la macro trouve qu'un article du fichier "CHU.xls" est présent dans une des feuilles "Art Supprimés" ou "Art Bloqués", elle copie la ligne dans un fichier "produit CHU accepté-supprimé.xls"

ma macro est défaillante, donc si quelqu'un peut me situer où se trouve le problème, je suis preneur, car je perds du temps, sur un truc con en plus j'en suis sûr!

voilà mon Code :

Merci de jeter un coup d'oeil si vous avez le temps

Sofiane
Code :
 
Sub comparer_2_fichiers()
 
Dim nom_classeur1 As String
Dim Feuille As String
Dim a, l, m, k, i, j, z As Integer
 
nom_classeur1 = InputBox("tapez le nom du classeur ou se trouvent les appels d'offres")
 
Feuille = InputBox("tapez le nom de la feuille a traiter")
 
Workbooks.Add
ActiveWorkbook.SaveAs "C:\Documents and Settings\JMDUPOUX\Bureau\produit CHU accepté-supprimé.xls"
 
Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Activate 'compte le nombre de ligne jusqu'a cellule vide
l = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row    'pour le 1er fichier
 
 
Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Supprimés").Activate 'compte le nombre de ligne jusqu'a cellule vide
m = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row    'pour le 2nd fichier et la 1ere feuille
 
 
k = 1 ' variable ligne  pour le fichier produit CHU accepté-supprimé.xls
 
For i = 2 To l Step 1 'boucle du 1er fichier "CHU.xls", pour comparer les articles de mon client
 
 
    For j = 2 To m Step 1 'boucle du 2er fichier "TOUS LES ARTICLES SUPPRIMES dernier.xls", pour trouver les articles si des articles de mon client sont supprimés ou bloqués
 
        If Workbooks(nom_classeur1 & ".xls").Worksheets("Feuille").Cells(i, 3) = Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Supprimés").Cells(j, 1) Then
 
            Workbooks(nom_classeur1 & ".xls").Worksheets("Feuille").Row(i).Copy ' si article trouvé, la macro copie la ligne
            Workbooks("produit CHU accepté-supprimé.xls").Worksheets("Feuil1").Row(k).PasteSpecial ' et colle  la ligne dans la feuille 1 du fichier "produit CHU accepté-supprimé.xls"
            
            k = k + 1
            
        End If
        
        
        If j = m Then ' une fois que la macro est venue à bout du la feuille "Art Supprimés" du fichier "TOUS LES ARTICLES SUPPRIMES dernier.xls"
        ' elle s'attaque à la feuille "Art Bloqués" du fichier "TOUS LES ARTICLES SUPPRIMES dernier.xls"
            
            Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Bloqués").Activate 'compte le nombre de ligne jusqu'a cellule vide
            z = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row    'pour le 2nd fichier et la 2nd feuille
                
                For a = 2 To z Step 1
                   If Workbooks(nom_classeur1 & ".xls").Worksheets("Feuille").Cells(i, 3) = Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Bloqués").Cells(a, 1) Then
 
                        Workbooks(nom_classeur1 & ".xls").Worksheets("Feuille").Row(i).Copy ' si article trouvé, la macro copie la ligne
                        Workbooks("produit CHU accepté-supprimé.xls").Worksheets("Feuille").Row(k).PasteSpecial ' et colle  la ligne dans la feuille 1 du fichier "produit CHU accepté-supprimé.xls"
                        
                        k = k + 1
            
                    End If
                Next a
                
        
        End If
        
    Next j
 
Next i
  
 
End Sub
Fichiers attachés
Type de fichier : zip CHU.zip (63,3 Ko, 5 affichages)
sofiane06 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/08/2008, 14h59   #2 (permalink)
Membre chevronné
 
Date d'inscription: janvier 2007
Localisation: nantua
Messages: 604
Par défaut

la macro est défaillante il serait interressant de savoir ou elle défaille
est-ce à l'ouverture ou à la lecture des fichiers ? si c'est ceci évite tous les caractères exotiques dans les noms é è ë ê et remplace les espaces par des underscore VBA est Tâtillons de plus d'un PC à l'autre certain paramètres influent sur les noms un PC prendra "mon_fichier.xls" l'autre à la lecture de diras qu'il ne trouve pas "mon_fichier.xls.xls"
ceci est une route à suivre je travaille en aveugle (pas d'excel sous la main)
à proscrire aussi les espaces dans les noms de feuilles
__________________
Cordialement
Daranc

Dernière modification par Daranc ; 26/08/2008 à 15h02 Motif: correction orthographe
Daranc est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/08/2008, 16h11   #3 (permalink)
Invité régulier
 
Date d'inscription: juin 2006
Messages: 11
Par défaut

oui Daranc, c'est vrai j'ai completement zapper de laisser les accents et caractères speciaux! je vais changer ça! mais la macro se plante dès la première conditon au niveau du if de la seconde boucle for!
merci de ton com
sofiane06 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/08/2008, 17h10   #4 (permalink)
Nouveau membre du Club
 
Date d'inscription: août 2007
Localisation: Lyon
Âge: 27
Messages: 74
Par défaut

bonjour,
tu as laisser les guillemets dans :

Code :
 
 
If Workbooks(nom_classeur1 & ".xls").Worksheets("Feuille").Cells(i, 3) = Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Supprimés").Cells(j, 1) Then
 
 
ici Feuille est une variable donc pas guillemet sinon il cherche la feuille qui s'appelle "Feuille" !!!
youn1096 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/08/2008, 09h11   #5 (permalink)
Invité régulier
 
Date d'inscription: juin 2006
Messages: 11
Par défaut

merci pour ta reponse!! je savais que c'etait un truc bête !
par contre j'ai fait mes tests!

et à ce niveau là ça bloque!
la macro à trouver un article supprimé, elle doit copier la ligne du fichier puis la coller dans la feuille d'un autre fichier!

Code :
 
Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Row(i).Copy ' si article trouvé, la macro copie la ligne
Workbooks("produit CHU accepté-supprimé.xls").Worksheets("Feuil1").Row(k).PasteSpecial ' et colle  la ligne dans la feuille 1 du fichier "produit CHU accepté-supprimé.xls"
je regarde de mon côté une autre fonction copier coller, et si vous avez des remarques sur cette fonction, je suis toujours preneur!

Merci
Sofiane
sofiane06 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/08/2008, 14h03   #6 (permalink)
Nouveau membre du Club
 
Date d'inscription: août 2007
Localisation: Lyon
Âge: 27
Messages: 74
Par défaut

met juste paste au lieu de pastespecial (vue que ta aucun paramètre donc rien de spécial la dedans)
dis nous si cela marche
youn1096 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 07h49   #7 (permalink)
Rédacteur/Modérateur
 
Avatar de fring
 
Date d'inscription: février 2008
Localisation: Bxl
Âge: 45
Messages: 2 667
Par défaut

Bonjour,

Petite remarque concernant la déclaration des variables.

Pour chaque variable, le type doit être défini sinon la variable prend par défaut le type Variant et bouffe de la mémoire inutilement.

Code :
Dim a, l, m, k, i, j, z As Integer
Dans cette déclaration, seule la variable z est du type Integer, toutes les autres prennent le type Variant.

Code :
Dim a As Integer, l As Integer, m As Integer, k As Integer, i As Integer, j As Integer, z As Integer
Là elles sont toutes de type Integer
.
__________________
LES FAQ OFFICE - LES COURS OFFICE - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

Prenez quelques secondes pour lire ceci : Aide sur l'utilisation des boutons du forum

Hormis pour me demander mon numéro de compte afin d'y effectuer un versement, évitez de m'envoyer vos questions par MP, merci d'avance
En posant une question on risque d'avoir l'air idiot cinq minutes. En n'en posant pas, on risque de le rester toute sa vie (proverbe chinois)
fring est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 10h39   #8 (permalink)
Invité régulier
 
Date d'inscription: juin 2006
Messages: 11
Par défaut

ok,
le paste n'a pas marché mais en mettant la ligne comme ça :
Code :
                        
Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Rows(i).Copy ' si article trouvé, la macro copie la ligne
Workbooks("produit CHU accepté-supprimé.xls").Worksheets("Feuille").Activate
Rows(k).PasteSpecial ' et colle  la ligne dans la feuille 1 du fichier "produit CHU accepté-supprimé.xls"
 
celà fonctionne!

après j'ai modifié les variables comme ceci :

Code :
 
 
Dim a As Integer, l As Integer, m As Integer, k As Integer, i As Integer, j As Integer, z As Integer
 
 
merci fring
tout marche correctement, j'ai rajouté aussi des exit for pour que ma boucle sorte si elle à trouvée ce qu'elle voulais une première fois

mon code final:

Code :
 
Option Explicit
 
Sub comparer_2_fichiers()
 
Dim nom_classeur1 As String
Dim Feuille As String
Dim a As Integer, l As Integer, m As Integer, k As Integer, i As Integer, j As Integer, z As Integer
 
nom_classeur1 = InputBox("tapez le nom du classeur ou se trouvent les appels d'offres")
If nom_classeur1 = "" Then
Exit Sub
End If
Feuille = InputBox("tapez le nom de la feuille a traiter")
If Feuille = "" Then
Exit Sub
End If
Workbooks.Add
ActiveWorkbook.SaveAs "C:\Documents and Settings\JMDUPOUX\Bureau\produit CHU accepté-supprimé.xls"
 
Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Activate 'compte le nombre de ligne jusqu'a cellule vide
l = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row    'pour le 1er fichier
 
 
Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Supprimés").Activate 'compte le nombre de ligne jusqu'a cellule vide
m = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row    'pour le 2nd fichier et la 1ere feuille
 
 
k = 1 ' variable ligne  pour le fichier produit CHU accepté-supprimé.xls
 
For i = 2 To l Step 1 'boucle du 1er fichier "CHU.xls", pour comparer les articles de mon client
 
 
    For j = 2 To m Step 1 'boucle du 2er fichier "TOUS LES ARTICLES SUPPRIMES dernier.xls", pour trouver les articles si des articles de mon client sont supprimés ou bloqués
 
        If Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Cells(i, 3) = Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Supprimés").Cells(j, 1) Then
 
            Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Rows(i).Copy ' si article trouvé, la macro copie la ligne
            Workbooks("produit CHU accepté-supprimé.xls").Worksheets("Feuil1").Activate
            Rows(k).PasteSpecial ' et colle  la ligne dans la feuille 1 du fichier "produit CHU accepté-supprimé.xls"
            
            k = k + 1
            
            Exit For 'on sort de la boucle des qu'on a trouvé
            
        End If
        
        
        If j = m Then ' une fois que la macro est venue à bout du la feuille "Art Supprimés" du fichier "TOUS LES ARTICLES SUPPRIMES dernier.xls"
        ' elle s'attaque à la feuille "Art Bloqués" du fichier "TOUS LES ARTICLES SUPPRIMES dernier.xls"
            
            Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Bloqués").Activate 'compte le nombre de ligne jusqu'a cellule vide
            z = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row    'pour le 2nd fichier et la 2nd feuille
                
                For a = 2 To z Step 1
                   If Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Cells(i, 3) = Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Bloqués").Cells(a, 1) Then
 
                        Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Rows(i).Copy ' si article trouvé, la macro copie la ligne
                        Workbooks("produit CHU accepté-supprimé.xls").Worksheets("Feuil1").Activate
                        Rows(k).PasteSpecial ' et colle  la ligne dans la feuille 1 du fichier "produit CHU accepté-supprimé.xls"
                        
                        k = k + 1
                    Exit For 'on sort de la boucle des qu'on a trouvé
                    End If
                    
                Next a
                
        
        End If
        
    Next j
 
Next i
  
 
End Sub
 
 
mais je voudrais rajouté une partie dans la macro, à la fin :

dès que la première feuille de mon premier fichier est traitée

-Fichier : "CHU.xls" dans la macro c'est la variable nom_classeur1
-feuille : "AO0634026 accepté" dans la macro c'est la variable Feuille

les données trouvées sont bien copiés sur mon nouveau fichier.
je voudrais que ma macro s'attaque aux autres feuilles du fichier
-CHU.xls

en gardant ma variable k, pour pouvoir copier à la suite de mon nouveau fichier (produit CHU accepté-supprimé.xls) les autres données trouvées sur les autres feuilles de mon 1er fichier (CHU.xls).

je test de mon côté toujours,
Merci à tous
sofiane06 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 13h21   #9 (permalink)
Invité régulier
 
Date d'inscription: juin 2006
Messages: 11
Par défaut

c'est bon j'ai reussi à faire ce que je voulais faire!!
voici le code pour ceux qui ont suivi :
Code :
 
Option Explicit
 
Sub comparer_2_fichiers()
 
Dim nom_classeur1 As String
Dim Feuille As String, reponse As String
Dim a As Integer, l As Integer, m As Integer, k As Integer, i As Integer, j As Integer, z As Integer, termine_macro As Integer
 
nom_classeur1 = InputBox("tapez le nom du classeur ou se trouvent les appels d'offres")
If nom_classeur1 = "" Then
Exit Sub
End If
 
Workbooks.Add
ActiveWorkbook.SaveAs "C:\Documents and Settings\JMDUPOUX\Bureau\produit CHU accepté-supprimé.xls"
 
Workbooks("produit CHU accepté-supprimé.xls").Worksheets("Feuil1").Activate 'compte le nombre de ligne jusqu'a cellule vide
k = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row   'pour le 2nd fichier et la 1ere feuille
 
Do 'boucle pour comparer toutes les feuilles
 
    Feuille = InputBox("tapez le nom de la feuille a traiter")
    If Feuille = "" Then
    Exit Sub
    End If
    
    Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Activate 'compte le nombre de ligne jusqu'a cellule vide
    l = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row    'pour le 1er fichier
    
    
    Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Supprimés").Activate 'compte le nombre de ligne jusqu'a cellule vide
    m = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row    'pour le 2nd fichier et la 1ere feuille
 
    
    'k = 1 ' variable ligne  pour le fichier produit CHU accepté-supprimé.xls
    
    For i = 2 To l Step 1 'boucle du 1er fichier "CHU.xls", pour comparer les articles de mon client
    
    
        For j = 2 To m Step 1 'boucle du 2er fichier "TOUS LES ARTICLES SUPPRIMES dernier.xls", pour trouver les articles si des articles de mon client sont supprimés ou bloqués
    
            If Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Cells(i, 3) = Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Supprimés").Cells(j, 1) Then
    
                Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Rows(i).Copy ' si article trouvé, la macro copie la ligne
                Workbooks("produit CHU accepté-supprimé.xls").Worksheets("Feuil1").Activate
                Rows(k).PasteSpecial ' et colle  la ligne dans la feuille 1 du fichier "produit CHU accepté-supprimé.xls"
                
                k = k + 1
                
                Exit For 'on sort de la boucle des qu'on a trouvé
                
            End If
            
            
            If j = m Then ' une fois que la macro est venue à bout du la feuille "Art Supprimés" du fichier "TOUS LES ARTICLES SUPPRIMES dernier.xls"
            ' elle s'attaque à la feuille "Art Bloqués" du fichier "TOUS LES ARTICLES SUPPRIMES dernier.xls"
                
                Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Bloqués").Activate 'compte le nombre de ligne jusqu'a cellule vide
                z = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row    'pour le 2nd fichier et la 2nd feuille
                    
                    For a = 2 To z Step 1
                       If Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Cells(i, 3) = Workbooks("TOUS LES ARTICLES SUPPRIMES dernier.xls").Worksheets("Art Bloqués").Cells(a, 1) Then
    
                            Workbooks(nom_classeur1 & ".xls").Worksheets(Feuille).Rows(i).Copy ' si article trouvé, la macro copie la ligne
                            Workbooks("produit CHU accepté-supprimé.xls").Worksheets("Feuil1").Activate
                            Rows(k).PasteSpecial ' et colle  la ligne dans la feuille 1 du fichier "produit CHU accepté-supprimé.xls"
                            
                            k = k + 1
                        Exit For 'on sort de la boucle des qu'on a trouvé
                        End If
                        
                    Next a
                    
            
            End If
            
        Next j
    
    Next i
    
        termine_macro = MsgBox("Avez vous une autre feuille à traiter", vbYesNo + vbCritical + vbDefaultButton2, "Titre de la boîte")
             
        If termine_macro = vbYes Then
            reponse = "OUI"
        Else
            reponse = "NON"
        End If
     
Loop Until reponse = "NON"
 
End Sub
 
 
 
Merci à tous

Sofiane
sofiane06 est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Excel > VBA Excel

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide