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 :

VBA recopier n fois une valeur dans n colonnes qui se suivent [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur Méthodes
    Inscrit en
    Février 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 4
    Par défaut VBA recopier n fois une valeur dans n colonnes qui se suivent
    Bonjour à tous,

    Tout nouveau sur ce site
    Et en reprise de programmation VBA, délaissée depuis mes études (6 ans)....

    Un vrai noob régalez-vous ^^

    Mon souci:

    Je bosse sur un tableau de ventilation de coût. Ventilation par mois
    Je bosse à la ligne. La dernière non vide.

    Je voudrais ventiler une somme (ex: 5000€) en la recopiant n fois à partir du 1er mois de ventilation (ex: mars = 3)
    "n" étant le nombre de mois donc le nombre de colonne dans lequel recopier la valeur consécutivement (ex= 9 mois / qui est calculé dans une cellule)
    => coller 555.55€ (=5000/9) à partir de la colonne C

    Le tout en commençant le collage dans la colonne du 1er mois de ventilation (cette valeur est calculée dans une cellule)

    Voilà quelqu'un aurait-il une solution ??

    Merci :-)

    Exemple_Ventilation.xlsxExemple_Ventilation.xlsx

  2. #2
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour Tonio Saeba,

    Une proposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Ventiller(ByVal Montant As Double, ByVal PermierMois As Long, ByVal NombreMois As Long, ByVal ligne As Long)
        Dim j&
            For j = PermierMois To PermierMois + NombreMois - 1
                ActiveSheet.Cells(ligne, j).Formula = "=" & Montant & "/" & NombreMois
            Next j
    End Sub
     
    Sub test()
        Call Ventiller(5000, 3, 9, 1)
    End Sub
    La procédure de test va écrire sur la ligne dans les colonnes C à K la formule : =5000/9

  3. #3
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonjour !

    Pourquoi ne pas l'effectuer directement par formule dans les cellules sans en passer par le VBA ?

    Sinon une démonstration VBA :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Demo()
        Application.ScreenUpdating = False
    With Feuil1.Cells(1).CurrentRegion
        For R& = 2 To .Rows.Count
            If .Cells(R, 9).Value Then
                SP = Split(.Cells(R, 4).Text, "/")
                If UBound(SP) = 2 And .Cells(R, 7).Value Then .Cells(R, 9 + SP(1)).Resize(, .Cells(R, 7).Value) = CDbl(.Cells(R, 9).Text)
            End If
        Next
    End With
        Application.ScreenUpdating = True
    End Sub
    ______________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, …

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur Méthodes
    Inscrit en
    Février 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 4
    Par défaut
    Bonjour Antony,

    Ecoute tout d'abord un grand merci car le principe de ta procédure est exactement ce que je recherchais !
    D'ailleurs je trouve ça très ingénieux ^^

    J'ai changé la procédure test () de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
        Call Ventiller(Range("I" & Rows.Count).End(xlUp).Value, Range("E" & Rows.Count).End(xlUp).Value, Range("I" & Rows.Count).End(xlUp).Value, Range("A" & Rows.Count).End(xlUp).Rows)
    End Sub
    Afin que le calcul se fasse sur la dernière ligne non vide du tableau, avec des valeurs déjà calculées en automatique et disponibles dans les dernières cellules non vides des colonnes E, G et I (PremierMois, NombreMois, Montant).

    Dès lors, comment coller non pas de C à K, mais de façon variable c'est-à-dire:
    En J si le mois de début est Janvier
    En K si '' '' Février
    En L si '' '' Mars
    En M si '' '' Avril
    Etc...
    Et cela sur la dernière ligne non vide du tableau ?

    Je suis désolé, je ne saisie pas encore où as-tu mis la commande "coller" dans ta procédure ...

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut


    Merci d'éditer ton post afin de respecter les règles du forum en balisant le code via l'icône dédiée # !

    Ma démonstration devrait répondre à ton besoin ! J'ai utilisé la fonction Split car j'ai vu du texte à la place d'une date …

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur Méthodes
    Inscrit en
    Février 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Méthodes
    Secteur : Transports

    Informations forums :
    Inscription : Février 2016
    Messages : 4
    Par défaut
    Bonjour Marc-L,

    Je te remercie pour ta procédure
    Malheureusement je ne parviens pas à la faire fonctionner

    Comment dois-je déclarer tes variables ?


    PS: Merci également pour ton indication sur la bonne utilisation du #

  7. #7
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    J'ai dû avoir un souci lors de la conversion de ton classeur sous Excel 2003 car après un plantage d'Excel,
    plus de problème de date donc voici un nouveau code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Demo2()
        Application.ScreenUpdating = False
    With Feuil1.Cells(1).CurrentRegion
        For R& = 2 To .Rows.Count
             V = .Cells(R, 9).Text
             If IsNumeric(V) Then If V Then .Cells(R, 9 + Month(.Cells(R, 4).Value2)).Resize(, .Cells(R, 7).Value) = CDbl(V)
        Next
    End With
        Application.ScreenUpdating = True
    End Sub
    Aucune besoin de déclaration de variables car typées à la volée si nécessaire (vérifie dans la fenêtre des Variables locales) …
    Sauf si tu utilises Option Explicit, là c'est tel qu'elles apparaissent la première fois dans le code !
    Pour plus d'information, lire l'aide VBA concernant les différents types de variables …

    ______________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

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

Discussions similaires

  1. [XL-2003] Correspondance d'une valeur dans différentes colonnes et lignes
    Par bari89 dans le forum Excel
    Réponses: 2
    Dernier message: 06/06/2013, 09h11
  2. Recherche d'une valeur dans plusieurs colonnes
    Par Arnaud F. dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/03/2009, 11h44
  3. [VBA-E]Recherche d'une valeur avec la colonne comme variable
    Par Corlo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/04/2007, 09h21
  4. Réponses: 4
    Dernier message: 27/11/2006, 23h20
  5. Réponses: 5
    Dernier message: 09/09/2005, 17h51

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