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 :

éviter feuille.activate + question array [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut éviter feuille.activate + question array
    Bonjour à toutes et à tous,

    j'ai deux questions relatives à la macro ci-dessous pour laquelle j'aurais besoin de votre assistance

    1) comment éviter le Worksheets("Staff").Activate pour ensuite revenir sur la page principale via Worksheets("Dashboard").Activate.
    En effet il s'agit d'une macro permettant d'envoyer des mails avec pièce jointes mais en arrière plan et donc non visible
    En effet j'arrive à jongler entre deux feuilles distinctes (T_Reports vs Projects) au début mais pas lors de la boucle
    j'ai tenté via un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set Sp = Worksheets("Staff")
     Set plage = Sp.Range("A1:A" & Range("A" & Rows.Count).End(xlUp).row)
     MsgBox Sp.Cells(ici.row, 4) & " " & Sp.Cells(ici.row, 3)
    mais j'ai le droit une erreur d'exécution 1004


    2) comment procéder au lieu d'afficher Cells(ici.row, 4) & " " & Cells(ici.row, 3) mettre cela dans un array ( ce sont des noms et prénoms que je peux facilement transformer en mail
    Mon objectif étant de pouvoir le récupérer en dehors de la boucle et pouvoir le splitter pour un envoi de mail

    merci par avance pour votre aide


    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
    nomtableau = "T_Reports"
    TblBD = Range(nomtableau)
     
      For i = 1 To UBound(TblBD)
     
    If TblBD(i, 7) > Now And TblBD(i, 7) <= Now + 56 And TblBD(i, 10) = "Y" Then
    Project_ID = TblBD(i, 1)
    periodid = TblBD(i, 2)
    Acronym_Range = Application.Match(Project_ID, Worksheets("Projects").Range("A:A"), 0)
    Acronym = Worksheets("Projects").Cells(Acronym_Range, 3)
     
    Worksheets("Staff").Activate
     
    Dim plage As Range, valeur1 As Variant, valeur2 As Variant, decalage As Integer
        Set plage = Range("A1:A" & Range("A" & Rows.Count).End(xlUp).row)
        valeur1 = Project_ID
        valeur2 = periodid
        decalage = 7 '(de A à H)
        With plage
            Set ici = .Find(valeur1, LookIn:=xlValues)
            If Not ici Is Nothing Then
                prem = ici.Address
                Do
     
                If ici.Offset(0, decalage) = valeur2 Then MsgBox (Cells(ici.row, 4) & "." & Cells(ici.row, 3))
     
                                Set ici = .FindNext(ici)
                Loop While Not ici Is Nothing And ici.Address <> prem
            End If
        End With
     
    End If
    Next
    Worksheets("Dashboard").Activate

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La ligne 2 du premier code publié n'est pas correcte et explique sans doute le problème que vous rencontrez si la feuille nommée Staff n'est pas active
    En effet dans cette ligne Set plage = Sp.Range("A1:A" & Range("A" & Rows.Count).End(xlUp).row), seul le premier Range est rattaché à son parent (la variable objet Sp)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    La ligne 2 du premier code publié n'est pas correcte
    Merci à vous pour cette observation, aussi quelle syntaxe serait appropriée pour éviter cela ?

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,
    Citation Envoyé par Darkangel2014 Voir le message
    Merci à vous pour cette observation, aussi quelle syntaxe serait appropriée pour éviter cela ?
    Il faut systématiquement définir la parentalité de chaque objet Excel.
    Donc rattacher chaque objet Range (i.e. Range, Cells, Rows, Columns, ...) à son parent (sa feuille).
    C'est à dire ne jamais écrire & Range("A") mais & ObjetFeuille.Range("A").
    Et lorsqu'on utilise plusieurs classeurs, il faut préciser le parent (le classeur) de chaque feuille.

  5. #5
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    ExemplePlage représentera les cellules remplies de la colonne A de la feuille nommée Staff du classeur où se trouve le code VBA et ce quelle que soit la feuille active
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub T()
     Dim Sp As Worksheet
     Dim Plage As Range
     Set Sp = ThisWorkbook.Worksheets("Staff")
     With Sp
      Set Plage = .Range("A1:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
     End With
     MsgBox Plage.Address(External:=True)
     Set Sp = Nothing: Set Plage = Nothing
    End Sub
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  6. #6
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    Merci à vous pour vos retours respectifs ainsi que vos explications.

    Qui de la 2ème question toutefois?

    Merci par avance

  7. #7
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    ok merci à vous.

    Juste une dernière question qui me pose un cas de conscience

    j'ai donc la macro suivante qui fonctionne (merci à vous) depuis tous mes onglets sauf 1 à savoir mon dashboard
    j'ai donc tenté de changer le nom des variables sait on jamais mais rien n'y fait
    la macro se lance bien et si je teste même de simple Msgbox("ok") cela fonctionne sauf à partir de la ligne
    If Not la Is Nothing Then
    alors que cela fonctionne depuis les autres onglets...
    Une idée de ce qui pourrait expliquer cela svp??


    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
    Dim SpS As Worksheet, SpP As Range, valeur1 As Variant, valeur2 As Variant, decalage As Integer
    Dim TblReport()
     
    TableName = "T_Reports"
    TblReport = Range(TableName)
     
      For i = 1 To UBound(TblReport)
     
    If TblReport(i, 7) > Now And TblReport(i, 7) <= Now + 56 And TblReport(i, 10) = "Y" Then
    Project_ID = TblReport(i, 1)
    periodid = TblReport(i, 2)
    Acronym_Range = Application.Match(Project_ID, Worksheets("Projects").Range("A:A"), 0)
    Acronym = Worksheets("Projects").Cells(Acronym_Range, 3)
     
     
    Set SpS = ThisWorkbook.Worksheets("Staff")
     
        Set SpP = SpS.Range("A1:A" & Range("A" & Rows.Count).End(xlUp).row)
        valeur1 = Project_ID
        valeur2 = periodid
        decalage = 7 '(de A à H)
        With SpP
            Set la = .Find(valeur1, LookIn:=xlValues)
            If Not la Is Nothing Then
                prem = la.Address
                Do
              If la.Offset(0, decalage) = valeur2 Then MsgBox (SpS.Cells(la.row, 4) & "." & SpS.Cells(la.row, 3))
     
                                Set la = .FindNext(la)
                Loop While Not la Is Nothing And la.Address <> prem
            End If
        End With
     
    End If
    Next

  8. #8
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Citation Envoyé par Darkangel2014 Voir le message
    2) comment procéder au lieu d'afficher Cells(ici.row, 4) & " " & Cells(ici.row, 3) mettre cela dans un array ( ce sont des noms et prénoms que je peux facilement transformer en mail
    - déclares un tableau dynamique
    - ajoutes une ligne au tableau en préservant les données précédentes (REDIM & PRESERVE)
    - défini les nouveaux éléments du tableau

    Voir : Utiliser tableaux VBA Excel

  9. #9
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Qu'est-ce qui ne fonctionne pas ?
    Un message d'erreur ?
    En pas à pas que disent les variables ?

  10. #10
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    Aucun message d'erreur justement c'est que depuis dashboard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Set la = .Find(valeur1, LookIn:=xlValues)
    il bypass cette section... ce qui fait que rien n'en résulte

  11. #11
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Citation Envoyé par Darkangel2014 Voir le message
    Set la = .Find(valeur1, LookIn:=xlValues)
    il bypass cette section... ce qui fait que rien n'en résulte
    Il n'y a aucune raison que cette ligne ne soit pas exécutée !!!
    Est-tu certain de ce que tu affirmes ????
    Lorsque tu exécutes le code en pas à pas : quelle est donc la ligne exécutée aussitôt après la précédente ????

  12. #12
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    le find est bien exécuté désolé pour la confusion

    C'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If Not la Is Nothing Then
    ligne 24
    qui passe directement au
    en ligne 31

    alors que cela passe via les autres feuilles

  13. #13
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    C'est tout simplement que la valeur cherchée n'est pas présente dans la zone de recherche !
    Mets un point d'arrêt sur la ligne et vérifie :
    - l'adresse de la plage SpP
    - la valeur de valeur1 (attention aux caractères cachés, aux espaces, ...)

    Tu peux faire la même recherche à la main depuis la Feuille Excel.

  14. #14
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2014
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2014
    Messages : 163
    Par défaut
    il y a bien un résultat car correctement afficher si macro lancée depuis une autre feuille


    j'ai réussi à faire afficher mon résultat depuis le dashboard en modifiant la ligne comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set la = SpS.Cells.Find(what:=valeur1, LookAt:=xlWhole)
    mais ceci génère une erreur 1004.. ce que je peux corriger en modifiant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set la = SpS.Cells.FindNext(la)

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

Discussions similaires

  1. Macro suppression feuille active question
    Par McLister213 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 17/05/2018, 09h06
  2. Keydown sans la feuille active
    Par ShortcutZ dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 26/10/2006, 15h02
  3. [Tableaux] petite question.. array()
    Par weldoo dans le forum Langage
    Réponses: 14
    Dernier message: 23/10/2006, 23h10
  4. Feuille de question
    Par DavidDeTroyes dans le forum ASP
    Réponses: 2
    Dernier message: 20/09/2006, 09h06
  5. Rapidité Macro lié à la feuille active
    Par conconbrr dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/08/2006, 17h40

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