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 :

Problème d'affectation de macro entre deux classeurs


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 26
    Par défaut Problème d'affectation de macro entre deux classeurs
    Bonjour le Forum ,

    Je suis en train de copier des valeurs d'un classeur à un autre. Ma macro de base fonctionne lorsque j'ai une feuille qui existe d'ors et déjà dans mon classeur de destination. Ici la feuille de destination est identifié dans la variable Nom
    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
    Sub CopieEntreClasseur()
     
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Dim Chemin As String
    Dim Chemintest As String
    Dim Source As Workbook
    Dim i As Byte
     
    Chemin = ThisWorkbook.Path
    Chemintest = Chemin & "\donnee.xlsm"
    Set Source = Application.Workbooks.Open(Chemintest)
    With Workbooks("donnee.xlsm")
     
        For i = 1 To .Sheets.Count
                If .Sheets(i).Name Like "*2016" Then
                    With .Sheets(i)
                        Nom = .Name
                        Source1.Sheets(Nom).Range(.Cells(LigOpe, ColOpe), .Cells(EndRow, ColOpe)).Copy ThisWorkbook.Sheets(Nom).Cells(1, 1)
                    End With
                End If
        Next i
    .Close
    End With
     
    End Sub
    J'aimerai pouvoir tester la présence de cette feuille Nom dans mon classeur de destination. Si elle est présente : la feuille est vidée de ses valeur. Si elle est abscente, je la crée. J'applique cette macro :
    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
    Sub CreeOuReinitialiseFeuille(ByVal MaFeuille As String)
     
    Dim g As ChartObject
     
        For Each feuille In Worksheets
            If feuille.Name = MaFeuille Then
                For Each g In Worksheets(MaFeuille).ChartObjects
                    g.Delete
                Next
                Worksheets(MaFeuille).Cells.ClearContents
                Exit Sub
            End If
        Next feuille
        Sheets.Add.Name = MaFeuille
     
    End Sub
    Je n'arrive pas à intégrer cette macro CreeOuReinitialiseFeuille dans ma procédure CopieEntreClasseur et faire le test dans la boucle For pour ne l'appliquer que lorsqu'il y a une aucurence de nom qui est trouvée. J'ai essayé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Workbooks(resutlat.xlsm)
        .CreeOuReinitialiseFeuille (Nom)
    End With
    Et d'autres manières qui ne sont pas cohérentes car la syntaxe n'est pas bonne. C'est comme dans mon exemple précédent : comment Excel peut savoir que c'est dans ce classeur qu'il faut travailler (le point n'est pas approprié ici).

    Avez-vous une idée vers une piste vers laquelle se tourner?
    Merci de votre aide

    BlackMountain

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    Bonjour,

    En passant rapidement, tu as écrit Source1 dans ton premier code plutôt que Source.
    Ça devrait te retourner une erreur en principe.

    Dans ta procédure CreeOuReinitialiseFeuille, tu devrais spécifier ThisWorkbook dans ta collection Worksheets pour ne pas faire les actions dans le classeur "Source"

  3. #3
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour Blackmountain, bonjour le forum,

    Je verrais les choses comme ça :

    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
    Sub CopieEntreClasseur()
    Dim Chemin As String
    Dim Chemintest As String
    Dim CS As Workbook
    Dim O As Sheet
    Dim OS As Sheet
    Dim TEST As Boolean
     
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Chemin = ThisWorkbook.Path
    Chemintest = Chemin & "\donnee.xlsm"
    Set CS = Application.Workbooks.Open(Chemintest)
    For Each O In CS.Sheets
        If O.Name Like "*2016" Then
            Set OS = O
            TEST = True
            Exit For
        End If
    Next O
    If TEST = True Then
        OS.Cells.Clear
    Else
        'si elle n'existe pas je ne vois pas comment définir le nom !
        CS.Sheets.Add Before:=CS.Sheets(Sheets.Count)
        ActiveSheet.Name = "Je sais pas quoi_2016"
        Set OS = ActiveSheet
        CreeOuReinitialiseFeuille (OS.Name)
    End If
    CS.Close False
    TEST = False
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    End Sub
    Mais comment définir le nom de l'onglet s'il n'existe pas ?... Je te laisse le soin de trouver la solution.
    Et j'espère qu tu ne feras pas comme dans ce post
    ici où tu n'as même pas daigné répondre...

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 26
    Par défaut
    Citation Envoyé par Thautheme Voir le message
    Bonjour Blackmountain, bonjour le forum,

    Je verrais les choses comme ça :


    [...]

    Mais comment définir le nom de l'onglet s'il n'existe pas ?... Je te laisse le soin de trouver la solution.
    Et j'espère qu tu ne feras pas comme dans ce post
    ici où tu n'as même pas daigné répondre...
    Bonjour Tautheme et le forum,

    Tout d'abord je te présente mes plus plates excuses concernant le post resté sans réponse que tu a publié dans un précédent sujet sur la suppression de feuilles multiples que j'ai publié. Je l'ai lu, compris et j'ai trouvé l'approche avec l'utilisation de tableaux intéressante. D'ailleurs, j'utilise de plus en plus de tableaux dans mes raisonnements ce qui m'a apporté rapidité dans l'execution de calculs. C'était après t'avoir lu. J'avais pu résoudre mon problème avec le message de unparia un jour plus tôt.
    Bref, même si j'étais pris par le temps, un message n'est pas impossible. Je te représente mes excuses. Je te prierai de les accepter.

    Concernant ce sujet, ton code reflète en partie mon besoin, je m'explique.
    Je cherche des onglets présents dans un fichier donnees.xlsm. Je cherche tous ceux qui se terminent par 2016. Il peut y avoir de 1 à 4 feuilles différentes sur les 20 présentes dans le classeurs, d'où le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 1 To .Sheets.Count
       If .Sheets(i).Name Like "*2016" Then
          With .Sheets(i)
             Nom = .Name
    Si un nom est trouvé, je voudrai créer une feuille dans l'autre classeur : resultat.xlsm s'il n'est pas présente dans ce dernier, ou tout y effacer si elle est présente. J'avais déjà repris ce bout de code qui le fait trus bien :
    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
    Sub CreeOuReinitialiseFeuille(ByVal MaFeuille As String)
    Dim g As ChartObject
     
        For Each feuille In ThisWorkbook.Worksheets
            If feuille.Name = MaFeuille Then
                For Each g In Worksheets(MaFeuille).ChartObjects
                    g.Delete
                Next
                Worksheets(MaFeuille).Cells.ClearContents
                Exit Sub
            End If
        Next feuille
        Sheets.Add.Name = MaFeuille
     
    End Sub
    Dans ton code je ne comprends pas cette ligne : Tu définierai l'objet OS comme étant la feuille qui a été testé et qui répond aux critères de "*2016"?

    Et cette partie-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CS.Sheets.Add Before:=CS.Sheets(Sheets.Count)
    ActiveSheet.Name = "Je sais pas quoi_2016"
    Set OS = ActiveSheet
    CreeOuReinitialiseFeuille (OS.Name)
    Tu ajoutes une nouvelle feuille dans le classeur CS, dans celui appelé donnee.xlsm, pourquoi mettre Before : ce serait pour l'ajouter à l'extrême gauche de la liste de tous les onglets?

    Merci pour ta réponse précédente.

    BlackMountain

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2016
    Messages : 26
    Par défaut
    Citation Envoyé par parmi Voir le message
    Bonjour,

    En passant rapidement, tu as écrit Source1 dans ton premier code plutôt que Source.
    Ça devrait te retourner une erreur en principe.

    Dans ta procédure CreeOuReinitialiseFeuille, tu devrais spécifier ThisWorkbook dans ta collection Worksheets pour ne pas faire les actions dans le classeur "Source"
    Salut,

    Source1 était une erreur d'adaptation lors de la retranscription dans ce forum. Après modification, il y a toujours le problème.
    J'ai aussi modifié cette ligne dans la macro CreeOuReinitialiseFeuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each feuille In ThisWorkbook.Worksheets
    Ca ne fonctionne toujours pas, le code sort prématurément. C'est ce que tu voulais dire?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    3 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2013
    Messages : 3 609
    Par défaut
    En fait, tu dois rajouter Thisworkbook à chaque worksheets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        For Each feuille In ThisWorkbook.Worksheets
            If feuille.Name = MaFeuille Then
                For Each g In ThisWorkbook.Worksheets(MaFeuille).ChartObjects
                    g.Delete
                Next
                ThisWorkbook.Worksheets(MaFeuille).Cells.ClearContents
                Exit Sub
            End If
        Next feuille

Discussions similaires

  1. Réponses: 11
    Dernier message: 21/02/2011, 11h08
  2. Problème d'affichage Crystal Report entre deux machines.
    Par gwadakillah dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 20/09/2007, 14h01
  3. problème de alcul de cosinus entre deux vecteurs !?
    Par mega_info dans le forum Langage
    Réponses: 3
    Dernier message: 10/09/2007, 22h32
  4. [Requête]Problèmes de nombre d'enregistrements entre deux requêtes
    Par Paul Gasser dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 23/03/2007, 12h20

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