IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[E-03] problème pour travailler sur 2 fichiers en même temps


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 31
    Par défaut [E-03] problème pour travailler sur 2 fichiers en même temps
    rebonjour, eh oui je vous embête avec mes questions depuis samedi, voilà donc les 2 questions du jour (qui sont liées) :

    Question 1
    Je travaille sur 2 fichiers Excel en même temps (tous les 2 ouverts) pour copier des cellules de l'un dans l'autre et autres manip de ce genre.
    Le problème est que je ne sais pas comment dire à la macro de passer de l'un à l'autre puisque l'instruction workbooks(2).select ne semble pas exister !
    donc j'ai mis l'instruction open mais du coup ça ouvre et ferme le fichier à chaque boucle et donc c'est beaucoup trop long et compliqué.

    Question 2
    Ci-dessous ma macro (qui fonctionne) mais à laquelle je voudrais ajouter une instruction complémentaire.
    Voilà ce qu'elle fait actuellement : pour chaque cellule de la zone du classeur 1, elle va créer un onglet dans le classeur 2 dont le nom sera égal à la valeur de la cellule.
    Voilà ce que je veux ajouter : il se peut qu'à l'utilisation une des cellules de la zone du classeur 1 corresponde déjà à un onglet existant dans le classeur 2.
    Je voudrais donc anticiper cet éventuel problème en faisant une boucle du type :
    pour chaque cellule de la zone du classeur 1 vérifie si un onglet du classeur 2 porte déjà ce nom.
    si oui : demander à l'utilisateur s'il souhaite remplacer l'onglet existant
    > si l'utilisateur clique oui : alors supprimer au préalable l'onglet existant pour que le nouveau (au même nom) puisse se créer
    > si l'utilisateur clique non : alors ne pas essayer d'ajouter l'onglet
    si non : ajouter l'onglet normalement


    Voilà mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    Public Sub creation_onglet()
     
    Dim zone As Range
    Dim cell As Variant
    Dim numLig As Integer
    Dim contenu As String
    Dim compteur As Integer
     
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
     
    numLig = Worksheets(2).Range("A1").CurrentRegion.Rows.Count      'nombre de lignes du tableau
    Set zone = Worksheets(2).Range("I2:I" & numLig)                  'la zone va de la 2eme ligne a la derniere ligne de la colonne I
     
    Worksheets.Add after:=Worksheets(2)                              'ajoute un onglet a la fin
    Worksheets(Worksheets.Count).Name = "LISTE"
    Worksheets(2).Rows(1).Copy Worksheets("LISTE").Range("A1")    'copie la ligne d'en-tete dans l'onglet LISTE
     
    For Each cell In zone.Cells
        contenu = Worksheets(2).Range("Z" & cell.Row).Value
        If contenu = "Oui" Then
        numLig = Worksheets("LISTE").Range("A1").CurrentRegion.Rows.Count + 1
        Worksheets(2).Rows(cell.Row).Copy Worksheets("LISTE").Range("A" & numLig)  'copie la ligne dans la 1ere ligne vide de l'onglet LISTE
        End If
    Next
     
    Worksheets("LISTE").Activate
    numLig = Worksheets("LISTE").Range("A1").CurrentRegion.Rows.Count      'nombre de lignes du tableau
    Set zone = Worksheets("LISTE").Range("I2:I" & numLig)                  'la zone va de la 2eme ligne a la derniere ligne de la colonne I
     
    compteur = 0
     
    For Each cell In zone.Cells
        Workbooks.Open Filename:="C:\Users\Emily\... \fichier2.xls"
        Worksheets.Add after:=Worksheets(Worksheets.Count)                               'ajoute un onglet a la fin
        Worksheets(Worksheets.Count).Name = cell.Value                                   'l'onglet ajouté prend le nom de la valeur de la cellule
        Worksheets("MODELE").Range("A:A").Copy Worksheets(cell.Value).Range("A:A")       'copie le modele dans le nouvel onglet
        compteur = compteur + 1
        Workbooks(2).Save
    Next
     
        Workbooks(1).Save
     
     
        MsgBox prompt:=compteur & " onglets ont ete créés"
     
     
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
     
    End Sub
    Question 3
    J'aimerai que les onglets se créent non plus si le contenu de la cellule est "Oui" mais si le contenu est la date du jour.
    Dans mon fichier les dates sont affichées sous la forme 23/02/2009

    merci de votre aide et de votre indulgence (eh oui ce sont mes toutes premières macro)

  2. #2
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Bonjour,
    je n'ai pas regardé ton code mais je peux te dire qu'il ne faut utiliser select.

    Bien sûr l'open est a faire une seule fois.

    Pour copie direct d'un workbook vers un autre (disponible via aide en ligne VBA sur .copy par ) après la feuille existante "SheetTo"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Workbooks("source").Worksheets("SheetFrom").Copy After:=Workbooks("destination").Worksheets("SheetTo")

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Je réponds d'abord à la question 1 :
    Le plus facile pour travailler sur plusieurs fichiers simultanément est de créer une instance des fichiers en question. Ex
    Thisworkbook étant le fichier contenant les macros, NomFich étant la variable contenant le nom du second fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim CL1 as Workbook
    Dim CL2 as Workbook
    Dim NomFich as string
        NomFich ="D:\Les xls de mon projet\LeClasseur.xls"
        Set CL1 = Thisworkbook
        Set CL2 = Workbooks.open NomFich
     
    numLig = CL1.Worksheets(2).Range("A1").CurrentRegion.Rows.Count      'nombre de lignes du tableau
    Set zone = CL1.Worksheets(2).Range("I2:I" & numLig)                  'la zone va de la 2eme ligne a la derniere ligne de la colonne I
     
    CL1.Worksheets.Add after:=CL1.Worksheets(2)
    'etc
    Et pour travailler sur le second classeur, tu utilises CL2. Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CL2.Worksheets(2).range("A10:Z15").Copy CL1.Worksheets(1).range("A1")
    Tu peux également instancier tes feuilles de calculs et utiliser ces instances pour simplifier ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim CL1 as Workbook
    Dim CL2 as Workbook
    Dim NomFich as string
        NomFich ="D:\Les xls de mon projet\LeClasseur.xls"
        Set CL1 = Thisworkbook
        Set CL2 = Workbooks.open(NomFich)
    Dim FL1 as Worksheet
    Dim FL2 as Worksheet
        Set FL1 = CL1.Worksheets(2)
        Set FL2 = CL2.Worksheets(1)
        CL2.FL2.range("A10:Z15").Copy CL1.FL1.range("A1")
    Juste pour le principe.
    Tu reviens en deuxième semaine pour les questions 2 et 3

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 31
    Par défaut
    Merci Ouskel'n'or ... je viens d'essayer mais la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set CL2 = Workbooks.open NomFich
    se met en rouge, qu'est-ce qui cloche ?

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    J'ai oublié les parenthèses (seulement ici)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Set CL2 = Workbooks.Open(NomFich)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Février 2009
    Messages : 31
    Par défaut
    j'ai un message d'erreur "l'indice n'appartient pas à la sélection"

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    C'est que tu as une erreur soit dans le nom du fichier soit dans le chemin. Tu vérifies mais ce coup-ci j'ai testé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme pour travailler sur un fichier parsé
    Par kayenne77 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 14/08/2009, 05h54
  2. Réponses: 4
    Dernier message: 27/05/2008, 19h42
  3. Problème de droits sur un fichier
    Par BenoitDenis dans le forum Langage
    Réponses: 8
    Dernier message: 14/02/2006, 16h44
  4. Réponses: 7
    Dernier message: 23/03/2005, 22h23
  5. [Excel] Travailler sur un fichier excel existant
    Par scoder dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 26/10/2004, 12h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo