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 :

Faire fonctionner une macro VBA dans un seul et unique classeur quand d'autres sont ouverts


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juin 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 2
    Par défaut Faire fonctionner une macro VBA dans un seul et unique classeur quand d'autres sont ouverts
    Bjr,

    J'ai créé une macro VBA dans un classeur (classeur 1) qui récupère une donnée toutes les 5 minutes ou (x minutes) à l'aide d'un lien DDE d'un flux de données en temps réel. Cette donnée est stockée au fur et à mesure dans une feuille Excel par la création d'un ligne nouvelle. A partir de ces données ainsi stockées, est créé un graphique en temps réel. Tout fonctionne parfaitement bien tant que...je n'ouvre pas d'autres classeurs contenant d'autres macros totalement différentes. A partir de là tout se dérègle...La macro dans le classeur 1 s'arrête quand je travaille dans un autre classeur etc...J'aimerais connaître la manière qui pourrait m'éviter ce désagrément si elle existe...Par avance, merci.

    Alain

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Pour avoir une chance de comprendre la cause, il faudrait au moins connaitre le code de cette macro.
    Il faudrait aussi savoir de quel type sont les autres macro (évènementielles ?) pour savoir comment elles peuvent perturber la première.

  3. #3
    Candidat au Club
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juin 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 2
    Par défaut
    Bjr Menhir,

    Ci-joint le code du classeur 1 que j'ai bidouillé (je ne suis pas programmeur). Pour les autres classeurs, ce ne sont que des fonctions de calculs.
    Par avance, merci.

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Option Explicit
    'Macro a utilisé entre une heure de démarrage et une heure de fin
    'Toutes les x minute entre les 2 horaires
    Private RunWhen As Double
    Private Const cRunIntervalMinutes As Long = 1
    Private Const cRunWhat As String = "MajEgedis"
    Private Const BeginTime As Date = #9:30:00 AM#
    Private Const FinishTime As Date = #5:30:00 PM#
    Sub Auto_Open()
    If Time < BeginTime Then
    'Attend jusqu'àl'heure de démarrage
    Application.OnTime earliesttime:=BeginTime, _
    procedure:=cRunWhat
    Else
    'Démarrer la procédure
    Application.Run cRunWhat
    End If
    End Sub
    Sub StartTimer()
    'Mise à jour toutes les minutes
    RunWhen = Now + TimeSerial(0, cRunIntervalMinutes, 0)
    Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat, _
    Schedule:=True
    End Sub
    Sub MajEgedis()
     
    'Ajoute une ligne toutes les x minutes et copie/colle en freezant les données du flux temps réel
     
    Dim i As Integer
    Dim NombreDeLignes As Integer
     
    NombreDeLignes = 500
     
    For i = 2 To NombreDeLignes
     
       If IsEmpty(Range("A" & i)) = False And IsEmpty(Range("A" & i + 1)) = True Then
            Range(Cells(i, 1), Cells(i, 5)).Select
            Selection.Copy
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            Application.CutCopyMode = True
            Exit For
        End If
    Next i
    'Démarrage et arrêt de la procédure à partir d'une certaine heure
    If Time < FinishTime Then
        StartTimer
    Else
        StopTimer
    End If
     
    End Sub
    Sub StopTimer()
    'Arrêt de la mise à jour
    On Error Resume Next
    Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat, _
    Schedule:=False
    End Sub
    Sub Auto_Close()
    'si fichier fermer le timer s'arrête
    'le dossier ne se réouvre pas
    'et la macro ne redémarre pas
    Call StopTimer
    End Sub

  4. #4
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 113
    Par défaut
    Salut

    Tout simplement parce que la feuille (et à fortiori le classeur) sur lequel tu effectues ces actions n'est pas précisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A1").value = "12"
    revient à mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Range("A1").value = "12"
    Et donc à travailler sur le classeur et la feuille active

    Pour spécifier le classeur est la feuille, tu as plusieurs solutions

    1. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ThisWorkBook.sheet("Feuil1").Range("A1").value = 12
      Ici on dit à Excel que l'on veut travailler sur la feuille nommée "Feuil1" (nom qui apparait sur l'onglet dans Excel). Et on lui dit que cette feuille se trouve dans la classeur où se trouve le code qui est en train de s'exécuter (ThisWorkBook)
    2. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Feuil1.range("A1").value = 12
      Ici on utilise le CodeName de la feuille, ce Nom n'apparait pas sous Excel (il peut être nommé différemment du nom inscrit sur l'onglet du classeur).
      Il se modifie si besoin dans VBE.
      Nom : 2015-01-18_134906.png
Affichages : 317
Taille : 14,2 Ko


    Voila à quoi peut ressembler ton code après modification
    • Suppression des Select, il n'est pas besoin de selectionner une cellule pour modifier son contenu ou son apparence
    • Indentation du code, super important pour la lecture du code et son debuguage/modifiaction. Et donc bien plus sympa lorsque des inconnu doivent le lire et le comprendre, sinon ils sont obliger de l'indenter avant de pouvoir faire quoi que ce soit... et ça prend du temps...
    • Utilisation des With pour alléger un peu les écriture de 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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    Option Explicit
    'Macro a utilisé entre une heure de démarrage et une heure de fin
    'Toutes les x minute entre les 2 horaires
    Private RunWhen As Double
    Private Const cRunIntervalMinutes As Long = 1
    Private Const cRunWhat As String = "MajEgedis"
    Private Const BeginTime As Date = #9:30:00 AM#
    Private Const FinishTime As Date = #5:30:00 PM#
     
     
    Sub Auto_Open()
        If Time < BeginTime Then
            'Attend jusqu'àl'heure de démarrage
            Application.OnTime earliesttime:=BeginTime, _
            procedure:=cRunWhat
        Else
            'Démarrer la procédure
            Application.Run cRunWhat
        End If
    End Sub
    Sub StartTimer()
        'Mise à jour toutes les minutes
        RunWhen = Now + TimeSerial(0, cRunIntervalMinutes, 0)
        Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat, Schedule:=True
    End Sub
    Sub MajEgedis()
    Dim aCell As Range
    'Ajoute une ligne toutes les x minutes et copie/colle en freezant les données du flux temps réel
     
    Dim i As Integer
    Const NombreDeLignes As Integer = 500
     
    'On pointe la feuille sur laquelle on va travailler
    'Ici on utilise par exemple le CodeName de la feuille qui n'est modifiable que par VBA
    '### Il faudra adapter ###
    With Feuil1
        'On Boucle sur les cellules de la colonne A
        For Each aCell In .Range("A2", .Cells(.Rows.Count, "A").End(xlUp))
            'On vérifie que cette cellule contient une valeur et que la suivante est vide
            If Not IsEmpty(aCell) And IsEmpty(aCell.Offset(1)) Then
                'On pointe la ligne du tableau de A à E
                With aCell.Resize(, 5)
                    .Copy
                    .Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
                    .PasteSpecial xlPasteValues 'Les autres paramètres sont ceux par défaut
                    Application.CutCopyMode = True
                End With
            End If
        Next
    End With
     
    'Démarrage et arrêt de la procédure à partir d'une certaine heure
    If Time < FinishTime Then
        StartTimer
    Else
        StopTimer
    End If
     
    End Sub
    Sub StopTimer()
        'Arrêt de la mise à jour
        On Error Resume Next
        Application.OnTime RunWhen, cRunWhat, Schedule:=False
    End Sub
    Sub Auto_Close()
        'si fichier fermer le timer s'arrête
        'le dossier ne se réouvre pas
        'et la macro ne redémarre pas
        Call StopTimer
    End Sub
    ++
    Qwaz

    PS: Pense à utiliser les balise code, c'est le bouton # dans l'éditeur de message (tu sélectionnes ton code et tu cliques sur le bouton. Ou alors tu clique sur le bouton et ensuite tu colle ton code entre les deux balise )
    Pour plus d'information regarde dans ma signature de message il y a un lien vers un tuto sur l'éditeur de messages

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    vu que vba ne fait qu'une seule chose à la fois, tu as peut-être intérêt à faire tourner ce classeur dans une session indépendante d'excel qui lui sera réservée (à lui et aux classeurs qui travaillent avec ses données s'il y en a).
    Et dans une autre tu pourras faire tout ce que tu veux sans risque.
    Ceci n'enlève rien à ce qui a été dit au-dessus : toujours spécifier l'objet avec lequel on travaille.
    eric

Discussions similaires

  1. [XL-2016] Problème pour faire fonctionner une Macro VBA
    Par Pachicou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/03/2017, 14h32
  2. Améliorer et faire fonctionner une macro !
    Par laurent481826 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/01/2015, 16h08
  3. Gérer une macro VBA dans un projet C#
    Par kaijin dans le forum C#
    Réponses: 9
    Dernier message: 08/08/2014, 09h28
  4. Réponses: 3
    Dernier message: 14/04/2014, 15h04
  5. Comment faire fonctionner une macro à une heure precise
    Par dreloman dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 29/06/2008, 00h46

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