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 :

Problème pour compléter un tableau


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Contrôle de gestion
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôle de gestion

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Points : 9
    Points
    9
    Par défaut Problème pour compléter un tableau
    Bonjour,

    Je tente de compléter un tableau vba à l'aide du code ci dessous :

    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 Tablo()
     
    Dim an%, nbj%, i%, c%, dateDébut As Date, dep As Range, mois, jour As Long
    Dim pâques, Lundi_de_Pâques, Ascension, Pentecôte As Variant
    Dim saisie, Jour_de_noël As Variant
    Dim Longue, Large As Variant
        Cells.Select
        Selection.Delete Shift:=xlUp
     
    saisie = Application.InputBox("Saisir l'année de début du tableau ? ", "Saisie de l'année de référence", 0, 500, 500, , , 1)
     
    If Not IsNumeric(saisie) Then Exit Sub
     
    If saisie = False Then MsgBox "Vous n'avez rien saisi"
     
    dateDébut = "1/5/" & saisie 'Première date
     
    Set dep = [A1] 'Coin supérieur gauche du calendrier.
     
     
    nbj = DateSerial(Year(dateDébut) + 1, Month((dateDébut)), Day(dateDébut)) - dateDébut
     
    Dim tabdate() As Variant
    ReDim tabdate(nbj)
    Dim iii As Long
    For iii = LBound(tabdate, 1) To UBound(tabdate, 1)
    tabdate = Range(dateDébut)
    dateDébut = dateDébut + 1
    Next
    Sheets("Feuil1").Activate
    Application.EnableEvents = False
    With Sheets("Feuil1")
    .Range("B5").Resize(UBound(tabdate, 1), UBound(tabdate, 2)) = tabdate
    End With
    Application.EnableEvents = True

    Cela "plante" sur l'instruction tabdate = Range(dateDébut)

    Savez vous pourquoi et pouvez vous m'expliquer s'il vous plaît ?

    D'avance merci.

    Philippe

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2009
    Messages
    1 794
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 85
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 1 794
    Points : 3 094
    Points
    3 094
    Par défaut
    Bonjour,
    Vous avez dimensionné un tableau à 1 dimension
    Or dans la boucle vouse mettez tabdate = ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For iii = LBound(tabdate, 1) To UBound(tabdate, 1)
    tabdate = Range(dateDébut)
    dateDébut = dateDébut + 1
    Essayez
    tabdate(iii)=dateDébut

    Mais alors une nouvelle erreur apparaît là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("Feuil1")
    .Range("B5").Resize(UBound(tabdate, 1), UBound(tabdate, 2)) = tabdate
    End With
    car le tableau est à une dimension et vous évoquez une deuxième dimension
    ce qui est hors indice évidemment
    Cordialement.

    RJ

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Contrôle de gestion
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôle de gestion

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci pour votre réponse.

    Toutefois, j'avais aussi essayé d'ajouter la variable "iii" à tabdate mais cela donne Nom : Capture.PNG
Affichages : 161
Taille : 8,7 Ko

    Je pense que range attend autre chose qu'une variable et je bloque.

    Cordialement.

    Philippe


    En fait, je viens de trouver et c'était tout simple. il suffit d'enlever le range en tapant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabdate(iii) = dateDébut
    et l'affaire est jouée !

    En revanche, il faut que je revois ma copie sur la date puisqu'il me recopie 365 fois (dans la cas ou ma variable dateDébut est 2014 ) le 1/5/2014 sans tenir compte de l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dateDébut = dateDébut + 1
    qui devrait avancer la date d'un jour.

    Cordialement.

    Philippe

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Contrôle de gestion
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôle de gestion

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Re bonsoir,

    J'ai avancé et cela ne plante plus. En revanche, le résultat obtenu n'est pas celui espéré :

    avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Feuil1").Range(Cells(1, 1), Cells(UBound(tabdate), 1)).Value = Application.WorksheetFunction.Transpose(tabdate)
    J'ai bien quelque chose qui se copie sur ma "Feuil1" mais pas ce que j'espère.

    En effet, au lieu de me copier la liste des dates allant du 1/5/N au 30/4/N+1, j'ai une succession de mauvaise date et de bonnes dates (voir image ci dessous) :

    Nom : Capture.PNG
Affichages : 126
Taille : 4,9 Ko

    J'ai bien vérifié dans ma fenêtre variable que "tabdate" contient les bons éléments (voir image ci-dessous):
    Nom : Capture.PNG
Affichages : 114
Taille : 8,9 Ko

    L'erreur semble séquentielle puisqu'elle ne se reproduit que sur les douze premiers jours de chaque moi.

    Je vous recopie ci dessous l'ensemble de mon code pour plus de compréhension :

    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
    Sub Tablo()
     
    Dim an%, nbj%, i%, c%, dateDébut As Date, dep As Range, mois, jour As Long
    Dim pâques, Lundi_de_Pâques, Ascension, Pentecôte As Variant
    Dim saisie, Jour_de_noël As Variant
    Dim Longue, Large As Variant
        Cells.Select
        Selection.Delete Shift:=xlUp
     
    saisie = Application.InputBox("Saisir l'année de début du tableau ? ", "Saisie de l'année de référence", 0, 500, 500, , , 1)
     
    If Not IsNumeric(saisie) Then Exit Sub
     
    If saisie = False Then MsgBox "Vous n'avez rien saisi"
     
    dateDébut = "1/5/" & saisie 'Première date
     
    Set dep = [A1] 'Coin supérieur gauche du calendrier.
     
     
    nbj = DateSerial(Year(dateDébut) + 1, Month((dateDébut)), Day(dateDébut)) - dateDébut
     
    Dim tabdate() As Variant
    ReDim tabdate(nbj)
    Dim iii As Long
    For iii = LBound(tabdate, 1) To UBound(tabdate, 1)
    tabdate(iii) = dateDébut
    dateDébut = dateDébut + 1
    Next
    Sheets("Feuil1").Activate
    Application.EnableEvents = False
    Sheets("Feuil1").Range(Cells(1, 1), Cells(UBound(tabdate), 1)).Value = Application.WorksheetFunction.Transpose(tabdate)
    Application.EnableEvents = True
    Merci pour votre aide.

    Cordiales salutations.

    Philippe

  5. #5
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Ici, sans passer par un tableau :
    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
     
    Sub Test()
     
        Dim dateDebut As Date
        Dim Nbj As Long
        Dim Saisie
     
        Saisie = Application.InputBox("Saisir l'année de début du tableau ? ", "Saisie de l'année de référence", 0, 500, 500, , , 1)
     
        If Not IsNumeric(Saisie) Or Saisie = False Then Exit Sub
     
        dateDebut = "1/5/" & Saisie 'Première date
     
        Nbj = DateSerial(Year(dateDebut) + 1, Month((dateDebut)), Day(dateDebut)) - dateDebut
     
        Range("A1").Value = dateDebut
        Range("A1").Offset(1, 0).Value = dateDebut + 1
        Range("A1").AutoFill Range(Range("A1"), Range("A1").Offset(Nbj))
     
    End Sub
    Hervé.

    Et tu peux même supprimer cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Range("A1").Offset(1, 0).Value = dateDebut + 1
    Hervé.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Contrôle de gestion
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôle de gestion

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Bonjour et merci pour cette réponse.

    Je souhaite toutefois passer par l'utilisation de tableau afin de gagner du temps de traitement (j'avais déjà réussi l'opération sans tableau mais cela dure trop longtemps).

    Pour aller plus loin dans l'observation du résultat décrit dans les post plus haut, je constate que, lorsque ma macro va copier les données contenues dans mon tableau sur la "feuil1",
    les douze premières valeurs mensuelles ont un format date de type MM/JJ/AAAA alors que le reste des dates du mois sont recopiées sous un format "standard".

    Merci pour vos remarques et solutions.

    Cordiale salutations.

    Philippe

  7. #7
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut


    Bonjour,

    pour créer la variable tableau utiliser à la place de Value la propriété Value2 !
    Il faut aussi paramétrer la plage de destination au format Date

    Pour une simple copie avec format d'une plage, il est bien plus simple d'utiliser la méthode Copy

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Contrôle de gestion
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôle de gestion

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Marc-L Voir le message


    ...
    pour créer la variable tableau utiliser à la place de Value la propriété Value2 !
    Je viens d'essayer et j'ai malheureusement le même résulat.

    Citation Envoyé par Marc-L Voir le message

    Il faut aussi paramétrer la plage de destination au format Date
    Peux tu, s'il te plaît, me donner unr méthode pour faire ceci ?

    Citation Envoyé par Marc-L Voir le message

    Pour une simple copie avec format d'une plage, il est bien plus simple d'utiliser la méthode Copy

    __________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …
    Merci pour ta réponse.

    Cordialement.

    Philippe

  9. #9
    Expert éminent sénior
    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
    Points : 18 677
    Points
    18 677
    Par défaut

    La propriété Value2 ne renvoyant qu'une valeur numérique … Rien qu'en lisant l'aide VBA !

    Test : à partir d'un nouveau classeur dans une feuille de calcul vierge, entrer dans la cellule A1 la valeur 41967.
    (Jusque là cela devrait aller …)

    Dans la cellule B1, saisir la formule de calculs =A1.
    Puis paramétrer la cellule B1 au format Date, français comme anglo-saxon, peu importe …

    Il y a tout ce qu'il faut dans les tutoriels de ce forum pour gérer les dates …
    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Contrôle de gestion
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôle de gestion

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Re bonjour,

    Je recherche de l'aide, pas de la condescendance...

    Je vois que tu es développeur. Désolé mais je ne suis qu'un amateur.

    Ma question de départ est de savoir pourquoi, avec le code donné, lorsque que j'ai une recopie d'un tableau, le résultat est séquentiel.

    Merci quand même...

    Bien cordialement.

    Philippe

  11. #11
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour.

    Ce qui affecte la valeur des dates, c'est Transpose qui ré-interprète les dates du tableau en inversant jours et mois car il ne reconnaît que le format américain (mm/jj/aaaa).
    Pour affecter un tableau à un range sans devoir utiliser Transpose, le tableau doit être à 2 dimensions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ReDim tabdate(nbj, 1) 'Tableau a 2 dimensions
    Dim iii As Long
    For iii = LBound(tabdate, 1) To UBound(tabdate, 1)
    tabdate(iii, 0) = dateDébut
    dateDébut = dateDébut + 1
    Next
    Sheets("Feuil2").Activate
    Application.EnableEvents = False
    Sheets("Feuil2").Range(Cells(1, 1), Cells(UBound(tabdate), 1)).Value = tabdate
    Cordialement

    Docmarti.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Contrôle de gestion
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Contrôle de gestion

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Bonsoir et merci.

    En appliquant votre solution, cela fonctionne parfaitement.

    Si j'avais à recopier un tableau à deux dimension, faut il déclarer mon tableau "tabdate" à trois dimensions ?

    Merci pour ce complément.

    Bien cordialement.

    Philippe

  13. #13
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par PSAIMOND Voir le message
    Bonsoir et merci.

    Si j'avais à recopier un tableau à deux dimension, faut il déclarer mon tableau "tabdate" à trois dimensions ?
    Non. C'est toujours 2 dimensions : la première dimension indique le nombre de lignes et la seconde le nombre de colonnes.

    Pour un tableau de 100 lignes et 1 colonne, la commande est
    ReDim tabdate(99, 0)
    car, par défaut, le premier élément du tableau est tabdate(0, 0).

    Par contre, si on met en début du module
    le premier élément sera tabdate(1, 1) et le dimensionnement pour 100 lignes et 1 colonne sera
    ReDim tabdate(100, 1)
    Cordialement

    Docmarti.

  14. #14
    Invité
    Invité(e)
    Par défaut
    bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For iii = LBound(tabdate, 1) To UBound(tabdate, 1)
    tabdate(iii) = Format(dateDébut, "yyyy-mm-dd")
    dateDébut = dateDébut + 1
    Next

  15. #15
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Merci Robert de nous rappeler que, faute de pouvoir utiliser le format de date américain, on peut également utiliser le format de date international (aaaa-mm-jj) qui est toujours interprété correctement par VBA.
    Cordialement

    Docmarti.

  16. #16
    Invité
    Invité(e)
    Par défaut
    bonjour Docmarti,
    j'ai trouvé que notre ami était entre de bonne mains et qu'il ne me revenait pas de droit de commenté cette précision.

Discussions similaires

  1. probléme pour parcourir un tableau dans une JSP
    Par nightcyborg dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 02/12/2007, 17h28
  2. Problème pour remplir un tableau.
    Par sandball22 dans le forum C
    Réponses: 2
    Dernier message: 02/05/2007, 14h54
  3. [MySQL] Problème pour trier un tableau
    Par jojo57 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/04/2007, 13h12
  4. problème pour trier un tableau de hashage
    Par Jasmine80 dans le forum Langage
    Réponses: 1
    Dernier message: 25/02/2007, 13h02
  5. [Tableaux] Problème pour contrôler un tableau
    Par renaud26 dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2006, 11h45

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