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 :

Aide VBA pour recopier une cellule


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Aide VBA pour recopier une cellule
    Bonjour,

    Je suis complètement novice sous VBA mais j’aurais besoin d’un dépannage rapide si cela vous est possible !

    Voilà mon besoin :

    J’ai un fichier avec en : Colonne A : Date début de location JJ/M/AAAA
    Colonne B : Date de fin de location JJ/M/AAAA

    Et colonne C à MP le jour de l’année (de 1 à 365)


    J’aurais besoin qu’une macro me positionne le chiffre 1 dans chaque colonne comprise entre ce deux dates.

    Par exemple pour une location de chalet entre le 01/06/2010 et le 07/06/2010 je souhaiterais avoir 0 dans chaque colonne sauf dans les colonnes EX à FD (jour 152 à 158) ou je souhaiterais avoir un 1 dans chacune d’elle.

    Il faudrait que la macro s’exécute sur autant de ligne que la feuille en contient !

    J’imagine que c’est possible mais que c’est compliqué ?

    Merci d’avance.

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    891
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 891
    Points : 831
    Points
    831
    Par défaut bonsoir titou2911, le forum
    une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub esvba()
        For Each rw In Sheets("Feuil1").Range("A2:A" & Sheets("Feuil1").Range("A65000").End(xlUp).Row)
            For Each cn In Range("C1:MP1")
                If DateSerial(Year(Cells(rw.Row, 1).Value), 1, 0) + cn.Value >= Cells(rw.Row, 1) And _
                   DateSerial(Year(Cells(rw.Row, 2).Value), 1, 0) + cn.Value <= Cells(rw.Row, 2) Then
                    Cells(rw.Row, cn.Column).Value = 1
                Else
                    Cells(rw.Row, cn.Column).Value = ""
                End If
            Next cn
        Next rw
    End Sub
    ESVBA

  3. #3
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Je suis complètement novice sous VBA mais j’aurais besoin d’un dépannage rapide si cela vous est possible !

    J’imagine que c’est possible mais que c’est compliqué ?
    C'est possible et pour juger de la complexité, ça dépend, si on s'y met par désir d'apprendre ou simplement suite à la première citation.
    Un dépannage rapide ne te sera d'aucune utilité.
    ESBVA a la gentillesse de te donner une proposition avec 2 boucles (assez gourmande)
    Une autre proposition avec une seule boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim LastLig As Long, i As Long
    Dim d As Integer, f As Integer
     
    With Sheets("Feuil1")
        LastLig = .Cells(.Rows.Count, "A").End(xlUp).Row
        For i = 2 To LastLig
            .Range("C" & i & ":ND" & i).ClearContents
            d = DatePart("y", CDate(.Range("A" & i).Value), , vbFirstJan1)
            f = DatePart("y", CDate(.Range("B" & i).Value), , vbFirstJan1)
            .Range(.Cells(i, 2 + d), .Cells(i, 2 + f)).Value = 1
        Next i
    End With
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

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

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

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Essaie ce code, en adaptant le numéro de feuille (1) et la première cellule contenant la date de début (A2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
      Dim C As Range
      With Worksheets(1)
        For Each C In .Range("A2:A" & .Cells(.Rows.Count, "A").End(xlUp).Row).Cells
          C.Offset(, C.Value - DateSerial(Year(Date), 1, 0) + 1) _
           .Resize(, DateDiff("d", C.Value, C.Offset(, 1).Value) + 1).Value = 1
        Next C
      End With
    End Sub
    Patrice
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  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
    12 773
    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 : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sauf s'il est impératif de passer par du VBA, c'est un cas classique d'un planning qui peut être réglé par une simple fonction Excel
    En A3 la date de début, en B2 la date de fin, dd représente le 1er jour de l'année, sur la ligne 1 à partir de la colonne C les nombres de 1 à 366
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =(($A2-dd)<C$1) * (($B2-dd)+1>=C$1)
    Pour cacher les 0, décocher l'option d'affichage des valeurs nulles ou utiliser la mise en forme conditionnelle.
    Autre possibilité, en plaçant cette formule dans la Mise en forme conditionnelle, permet de mettre la cellule en évidence tout en laissant la possibilité de remplir la cellule avec une autre valeur.
    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

Discussions similaires

  1. Recherche en vba pour inserer une formule dans une cellule
    Par jerem1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/03/2011, 19h36
  2. [VBA-E] Copier une cellule XL pour l'insérer dans un document Word
    Par lucarno dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/03/2009, 13h12
  3. Code VBA pour Copier une cellule dans un filtre?
    Par Redisdead dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/02/2009, 05h48
  4. Formater une cellule en VBA pour recevoir une date
    Par *.Har(d)t dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/05/2007, 17h39

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