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 :

Débutant VBA Premiers pas


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut Débutant VBA Premiers pas
    Bonsoir,

    Donc voici, ce sont vraiment mes premiers pas et je fais des tests.
    Je sais que ce que je vais vous montrer n'est sans doute pas opti ou réfléchi de la bonne façon mais un pas après l'autre :-)

    je sèche un peu pour le moment.

    objectif de ma macro :

    Au stade où j'en suis, il s'agit d'entrer une date dans une box et d'inscrire cette date à la dernière ligne libre de la colone C, de se décaler sur la droite et de copier le contenu de la valeur de B3 de la feuille active.
    Ensuite feuille suivante et on recommence.

    Sauf que ça fonctionne tant que ma boucle n'a qu'un seul indice "for i = 4 to 4" par ex si j'essaye avec 4 to 6 ben il coince ici : (voir flèche à droite de la ligne)
    J'ai essayé de supprimer la boucle mais même résultat donc j'imagine que c'est un problème de réinitialisation de la variable Dlig.
    Mince en vous écrivant, je pense avoir trouvé le problème, en effet une fois que Dlig s'est initialisé sur la feuille 4 j'imagine que ça pose problème d'espérer que ça marche pour la feuille 5 même si c'est la même plage ?
    Bon et si je vois juste comment réinitialiser la variable ?

    les premières lignes de commentaire c'est pour mon usage afin de suivre mon raisonnement. il pourrait vous aider à me suivre aussi

    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
    Sub Répartition()
    'Activation du bouton dans la fenêtre "Acceuil"
    'Fenêtre pour entrer la date valeur
    'Activation de la première sheets à modifier
    'Se placer sur la première cellule occupée en partant du bas -1 de la colonne C
    'insérer la date valeur
    'se déplacer d'une cellule vers la droite et insérer la valeur de la cellule B3
    'Activation de la sheets suivante
     
    Dim DLig As Range
    Dim MaDate As Variant
     
     
     
    Application.ScreenUpdating = False
     
    Set DLig = Range("c" & Rows.Count).End(xlUp)
     
     
    MaDate = "Date"
    While Not IsDate(MaDate)
        MaDate = InputBox("Entrez une date", "Date", MaDate)
    Wend
     
    For i = 4 To 6
     Sheets(4).Activate
        DLig.Offset(1, 0).Select          <----  ça coince là au second passage et ça n'a rien inscrit dans la première non plus.
        ActiveCell.Value = MaDate
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = Range("B3").Value
     
    Next i
     
     
    End Sub

  2. #2
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut
    Bon ben j'ai trouvé on dirait , j'ai placé le set dlig dans la boucle et corrigé une erreur sheet(i) et non 4 et ça fonctionne
    merci de m'avoir écouté, vous décrire le problème m'a aidé

    après si vous avez un conseil pour améliorer ce petit code je suis preneur. Ne riez pas mais il m'a fallu 4h pour l'élaborer hein mais c'est le mien à moi

  3. #3
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    je te conseille d'emblée les bonnes habitudes à prendre, vu que tu n'en est probablement pas encore empêtré au niveau des mauvaises

    Tu raisonnes comme raisonne l'enregistreur de macro, tu reproduits très exactement les opérations manuelles.
    Or, en VBA, on peut s'en affranchir et se concentrer sur le résultat découlant de ces opérations manuelles.

    Ici, le but est de collecter une date, l'insérer sur plusieurs feuilles, en ajoutant une autre information sur une autre cellule.
    En VBA, tu peut effectuer des opérations sur les feuilles sans être dessus, idem pour les cellules, pour le classeur, pour tous les classeurs ouverts etc... pour tout Objet excel.

    Voici une petite optimisation, non pas uniquement fonctionnelle (sauf coquilles à corriger), mais surtout dans l'esprit d'aller à l'essentiel, ce qui allège tes codes et te permet de gagner en efficacité.
    On passe souvent par des structures With/End With pour rassembler des manipulations d'objets sans les répéter.
    Et pour éviter toute ambiguïté, on écrit toujours la filiation complète d'un objet, par exemple : Classeur.Feuille.Cellule

    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
    Sub Répartition()
    Application.ScreenUpdating = False
    ' Choix de la date
        Dim MaDate As Variant
            MaDate = "Date"
        While Not IsDate(MaDate)
            MaDate = InputBox("Entrez une date", "Date", MaDate)
        Wend
     
    ' Boucle sur les feuilles
        For i = 4 To 6
            With ThisWorkbook.Worksheets(i)
    ' La première cellule vide de la colonne trois
                With .Cells(.Rows.Count, 3).End(xlUp)(2)
    ' Ecriture des valeurs
                    .Value = CDate(MaDate)  ' le .Parent c'est pour remonter sur l'objet "Feuille"
                    .Offset(0, 1).Value = .Parent.Range("B3").Value
                End With
            End With
        Next i
    Application.ScreenUpdating = True
    End Sub

  4. #4
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132

  5. #5
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut
    Merci, merci et merci

    précieuses vos interventions

  6. #6
    Membre averti
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Août 2013
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel
    Secteur : Service public

    Informations forums :
    Inscription : Août 2013
    Messages : 45
    Par défaut
    merci pour ton code joe, je ne comprends pas encore tout mais je ne souhaite pas sélectionner la première ligne vide (il y a des blancs) mais la dernière ligne vide tout à la fin du tableau
    pour ça que je prenais la dernière remplie +1

    merci aussi unparia et j'accepte avec plaisir ta proposition, d'autant que ce n'est que le début de mon projet, au final j'aimerais pouvoir importer un csv et répartir les données en fonction de code placé à chaque ligne.
    mais bon plus tard ça ... je vais d'abord essayer de bien comprendre ce que vous m'avez renseigné et je reviens plus tard

  7. #7
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    après si vous avez un conseil pour améliorer ce petit code je suis preneur
    Oui -->> travailler directement avec les objets au lieu de le faire à coups de select, etc ...
    ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <s>For i = 4 To 6
      Sheets(i).Activate
      DLig.Offset(1, 0).Select <---- ça coince là au second passage et ça n'a rien inscrit dans la première non plus.
      ActiveCell.Value = MaDate
      ActiveCell.Offset(0, 1).Select
      ActiveCell.Value = Range("B3").Value
    Next i</s>
    s'écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i = 4 to 6
      with sheet(i)
        .dlig.offset(1,0).value = madate
        .dlig.offset(1,1).value = .range("b3").value
      end with
    next
    Je comprends que tu as déclaré Madate en Variant pour faciliter la gestion de ton inputbox.
    Ce n'est pas une bonne pratique. Mieux vaut typer en date, quitte à gérer plus difficilement. Ainsi, par exemple et entre autres possibilités :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim MaDate As Date, toto as boolean, titi as string
    '.......
    '......
    '
    toto = False
    Do While toto = False
      titi = InputBox("Entrez une date", "Date")
      If IsDate(titi) Then toto = True
    Loop
    MaDate = CDate(titi)
    Quelle que soit la méthode, méfie-toi des facéties de VBA.
    Amuse-toi à saisir dans l'inputbox une date inexistante : 10/14/2017, par exemple -->> vba la reconnaîtra comme date valable et la transformera en 14/10/2017
    j'aime beaucoup que tu aies écrit toi-même ton bout de code --->> Tu as mis cette discussion en RESOLU. J'accepterai toutefois d'y revenir si tu voulais éviter le piège dont je t'ai parlé (la date)
    Amitiés

Discussions similaires

  1. [Débutant] Premiers pas
    Par Colbix dans le forum CORBA
    Réponses: 3
    Dernier message: 15/05/2009, 16h27
  2. Premiers pas en UML : différents problèmes de débutant
    Par Spout dans le forum Cas d'utilisation
    Réponses: 4
    Dernier message: 28/09/2008, 17h04
  3. [VBA] Formulaire pas en premier plan
    Par dalmasma dans le forum VBA Access
    Réponses: 6
    Dernier message: 20/07/2007, 16h19
  4. [VBA]Macro Excel : les premiers pas ?
    Par epfyffer dans le forum SDK
    Réponses: 3
    Dernier message: 28/03/2007, 15h12
  5. [Débutant] Premiers pas
    Par bleach dans le forum Langage
    Réponses: 3
    Dernier message: 24/03/2006, 09h23

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