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 :

Macro portant sur une cellule [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 476
    Points : 43
    Points
    43
    Par défaut Macro portant sur une cellule
    Bonjour,
    En vue d'un test, j'écris dans une cellule d'une feuille ad hoc les valeurs successives d'une variable string mais elles s'écrivent par défaut à la verticale dans la cellule. Sur la base d'un tutoriel de Silky Road ("Les événements dans la feuille de calcul Excel", merci), j'ai écrit une procédure événementielle qui, quand la cellule est sélectionnée, est censée changer son format pour annuler le retour à la ligne, mais ça ne marche pas. J'ai fait diverses modifcations, sans succès. Voici 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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range, Z)
    Dim d As Integer
    d = Z
        'If Target = ThisWorkbook.Sheets("registre").Range("A" & d) Then
        With Range("A" & d)
        .HorizontalAlignment = xlGeneral
            .VerticalAlignment = xlBottom
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
    'End if
    End Sub
    Et voici les lignes qui devraient déclencher la macro, dans la procédure principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ThisWorkbook.Sheets("registre").Activate
    Cells(Z, 1).Select
    Selection.Value = GED_N1
    Z = Z + 1
    Z est une variable de la proc principale qui joue un autre rôle sur cette même feuille "registre" et je veux éviter que les données s'écrasent les unes les autres.
    Je n'ai jamais bien maîtrisé les proc événementielles et je remercie d'avance celui ou celle qui me dépatouiilera de celle-ci.
    Cordialement
    touche_a_tout
    There is always an easy solution to every human problem - neat, plausible. And wrong.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 587
    Points : 34 258
    Points
    34 258
    Par défaut
    Salut,

    la procédure qui est reconnue et déaclenchée par Excel est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
    End Sub
    Ta variable Z en question, est-elle stockable dans une cellule ou un objet ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour, au risque de me tromper, vu le manque de code je ferais quelque chose ressemblant à cela:

    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
    ThisWorkbook.Sheets("registre").Activate
    Cells(Z, 1).Select
    With activeCell
         .HorizontalAlignment = xlGeneral
            .VerticalAlignment = xlBottom
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
     End With
    Selection.Value = GED_N1
    Z = Z + 1  ' en sachant qu'il doit peut être y avoir une boucle
    Toutefois, je ne peut rien vérifier???
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  4. #4
    Membre du Club Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 476
    Points : 43
    Points
    43
    Par défaut Macro portant sur une cellule
    Merci Jean-Philippe André et Transitoire,
    Si je pige bien, c'est mon Z dans la parenthèse qui fait cafouiller. Le plus simple est de créer une feuille exprès pour ce test, feuille sur laquelle Z n'aura rien à faire.
    Dans le post de Transitoire, je ne comprends pas quel code manque. Mais ça ne m'empêche pas de continuer sans Z !
    (mais non sans aide, votre aide, merci !).
    Cordialement,
    touche_a_tout
    There is always an easy solution to every human problem - neat, plausible. And wrong.

  5. #5
    Membre du Club Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 476
    Points : 43
    Points
    43
    Par défaut Macro portant sur une cellule
    Re,
    Je n'ai pas dû bien comprendre, car ça ne fonctionne toujours pas. Tu me dis:
    la procédure qui est reconnue et déclenchée par Excel est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     
     End Sub
    J'ai compris que je devais mettre mes 10 et quelques lignes de code entre "Private Sub..." et "End Sub" (sauf que j'ai oublié d'incrémenter d dans mon code du post No 1) mais ça ne suffit pas.
    Comme la sub principale sélectionne une cellule dans la feuille concernée, on a l'événement "SelectionChange" qui devrait lancer la procédure événementielle, mais elle ne le fait pas, j'ai toujours mon texte en colonne.
    Est-ce que je dois préciser comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With Thisworkbook.Sheets("test_cell").Range("A" & d)
    Pardon d'être aussi balbutiant, hélas.
    Cordialement
    touche_a_tout
    There is always an easy solution to every human problem - neat, plausible. And wrong.

  6. #6
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    bonsoir, la deuxième procédure, ci dessous est en fait un bout de code avec des choses qui se passent avant et d'autres qui se passent après. Et on ignore ce qui se passe???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ThisWorkbook.Sheets("registre").Activate
    Cells(Z, 1).Select
    Selection.Value = GED_N1
    Z = Z + 1
    Par contre je ne comprend pas, lorsque vous dites que votre texte reste en colonne? Comment souhaiteriez vous qu'il fasse? Il y a des choses qui m'échappent.
    Parceque lors de l'entrée des données, le déplacement de la sélection peut -être modifié par les préférences d'excel par : préférences/Edition ou aussi par procédure.
    Nom : Capture d’écran 2019-05-30 à 19.48.22.png
Affichages : 66
Taille : 77,7 Ko
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  7. #7
    Membre du Club Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 476
    Points : 43
    Points
    43
    Par défaut Macro portant sur une cellule
    Bonsoir Transitoire,
    Merci de votre soutien. Je vous donne quelques détails. Mon appli est un ensemble de procédures (qui n'en formaient qu'une à l'origine, de plus de 400 lignes !) qui fonctionnent toutes de manière similaire: elles vont chercher dans une feuille Excel utilisée comme BD des informations qu'elles combinent sous forme de texte continu, chacune d'elle produisant une variable string qui s'allonge par concaténations successives (au fur et à mesure que la procédure balaie la feuille).
    Par "texte en colonne", je veux dire, comme ma variable String compte 500 ou 600 caractères, qu'elle étire la cellule en hauteur et forme une colonne de texte d'environ 10 signes par ligne. Très malcommode à lire !!
    La première procédure sur laquelle porte mon test fournit l'en-tête du document-texte à produire. La voici (je vous fais grâce de la mécanique qui commande le balayage des diverses feuilles du classeur et des lignes dans ces feuilles, etc.):
    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
     
    Sub en_teteN(teteN As String)
    Dim d As Integer
    d = 3
    ThisWorkbook.Sheets(logoN).Activate
    Set r = ThisWorkbook.Sheets(logoN).Range("A1").CurrentRegion
     
     teteN = teteN & "0 @" & Format(compteur, "000") & "S" & "@" & " " & "SOUR" & Chr(10)
     teteN = teteN & "1 ABBR" & " " & "AN " & ActiveSheet.Cells(ligne, 10).Value & " " & Cells(ligne, 11).Value _
    & " " & Cells(ligne, 12).Value & " " & Cells(ligne, 17).Value & Chr(10)
     teteN = teteN & "1 TITL Acte civil, paroissial ou notarié." & " " & Chr(10)
     teteN = teteN & "1 REPO" & " " & Cells(ligne, 4).Value & Chr(10)
     teteN = teteN & "2 CALN" & " " & Cells(ligne, 6).Value & Chr(10)
     
     teteN = teteN & "3 MEDI" & " " & Cells(ligne, 68).Value & Chr(10)
     teteN = teteN & "1 TEXT" & " " & "Réf. Excel:" & " " & Cells(ligne, 1).Value & _
    " " & Cells(ligne, 2).Value & Chr(10)
    GED_N1 = GED_N1 & teteN
    ThisWorkbook.Sheets("test_cell").Activate
    Cells(d, 1).Select
    Selection.Value = GED_N1
    d = d + 1
    Aujourdhui = Date
     
    End Sub
    Cela dit, depuis mon dernier post j'ai ajouté une feuille réservée à ces contrôles ("test_cell") et modifié la procédure événementielle (pour éviter les ambiguïtés avec la variable Z, qui concerne une autre feuille). Elle se présente maintenant comme ceci:
    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim d As Integer
        'If Target.Count > 1 Then Exit Sub   'superflu ici, je pense, vient de
                                             'l'exemple de Silky Road
        d = 3
        With ThisWorkbook.Sheets("test_cell").Range("A" & d)
            .HorizontalAlignment = xlGeneral
            .VerticalAlignment = xlBottom
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With
        d = d + 1
     
    End Sub
    Notez que de With à End With c'est la copie textuelle d'un enregistrement de macro.
    J'ai aussi remarqué que si je clique droit sur la cellule concernée pour avoir son format, la case retour automatique à la ligne reste cochée.
    Les problèmes, dans mon projet, sont comme un oignon: vous en enlevez une couche, vous en trouvez une en-dessous !
    Si vous voyez par où ça pèche ...?
    Merci d'avance.
    Cordialement
    touche_a_tout
    There is always an easy solution to every human problem - neat, plausible. And wrong.

  8. #8
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour, je ne suis pas sur d'avoir bien compris. En fait vous avez par concaténation une phrase très longue dans une cellule qui agrandit votre cellule vers le bas. Pourquoi ne pas agrandir votre colonne afin de recevoir la phrase complète? J'imagine que cela doit vous poser d'autres problèmes? parce que sinon, il vous suffit de pointer dans la ligne des colonnes par exemple la barre qui sépare A et B et de double cliquer pour que la colonne A entière s'agrandisse afin que la cellule dans lequel le texte est le plus long contienne sur une seule ligne la phrase complète.
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  9. #9
    Membre du Club Avatar de touche_a_tout
    Profil pro
    Inscrit en
    Août 2006
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 476
    Points : 43
    Points
    43
    Par défaut Macro portant sur une cellule
    Bonjour Transitoire,
    Vous avez tout à fait raison, il y a des solutions plus simples. La vôtre par exemple et une autre que j'ai essayée avec succès: une fois toutes mes phrases (ou un certain nombre) stockées dans ces cellules étirées vers le bas, sélection de toutes la colonne A et format-cellule/alignement: pas de retour automatique à la ligne.
    J'ai pollué le forum avec une question oiseuse, désolé. Et merci de votre aide qui m'a ouvert les yeux.
    Belle journée
    touche-a-tout
    There is always an easy solution to every human problem - neat, plausible. And wrong.

  10. #10
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Pas de problème, "qu'importe le flacon pourvu que l'on ait l'ivresse".
    Ainsi que le dit si souvent Pierre Fauconnier: "avant de penser VBA, pensons Excel"
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

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

Discussions similaires

  1. [XL-2007] arrêt de la macro suite à un offset sur une cellule
    Par marco62118 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/12/2015, 00h20
  2. [XL-2007] Lancer une macro lorsque l'on clique sur une cellule
    Par catetesse dans le forum Excel
    Réponses: 3
    Dernier message: 28/09/2012, 12h57
  3. VBA - Macro : Action sur click droit souris sur une cellule
    Par Raphael DIAZ dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 02/02/2011, 11h45
  4. [XL-2003] macro VBA pour imposer signe "-" sur une cellule
    Par cilala dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/09/2010, 01h13
  5. lancer une macro sur une cellule ou sur du texte
    Par xadep dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 02/09/2009, 18h50

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