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 :

Alimentation tableau temporaire [VBA] [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 9
    Par défaut Alimentation tableau temporaire [VBA]
    Bonjour à toutes et à tous,

    Dans une macro, je souhaite extraire des données d'un tableau et les réécrire en fonction d'une variable (un paquet) dans des lignes différentes au besoin.

    Exemple : une ligne avec une valeur "quantité" = 100 à séparer en 3 lignes de 30 et une ligne de 10 (pour arriver au même total).

    Voici donc la macro que j'ai écrite ("Option Explicit" inscrit en début, je vous épargne donc toutes les variables définies) :

    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
    Dim r As Integer ' N° de ligne en-cours en lecture
    Dim l As Integer ' N° de ligne en-cours en écriture
     
    l = 2
    For r = 2 To ligFin
         ligDat = Cells(r, colDat).Value
         ligCde = Cells(r, colCde).Value
         ligGen = Cells(r, colEan).Value
         ligPcb = Cells(r, colPcb).Value
         ligRec = Cells(r, colQte).Value
     
    ligEcr:
         If ligRec <= ligPcb Then
             tabTmp(l, 1) = ligDat
             tabTmp(l, 2) = ligCde
             tabTmp(l, 3) = ligGen
             tabTmp(l, 4) = ligPcb
             tabTmp(l, 5) = ligRec
         GoTo ligSui
     
         ElseIf ligRec > ligPcb Then
             tabTmp(l, 1) = ligDat
             tabTmp(l, 2) = ligCde
             tabTmp(l, 3) = ligGen
             tabTmp(l, 4) = ligPcb
             tabTmp(l, 5) = ligPcb
             ligRec = ligRec - ligPcb
             l = l + 1
         GoTo ligEcr
         End If
     
    ligSui:
          Next r
    Il passe en premier dans la boucle "ElseIf" (car la quantité totale est supérieur à la quantité d'un paquet donc nécessité de créer plusieurs lignes) puis bloque lorsqu'il repasse dans la boucle " If ligRec <= ligPcb Then" pour écrire la dernière ligne.
    Je me retrouve avec une "Erreur d'exécution 9 : l'indice n'appartient pas à la sélection" sur la ligne "tabTmp(l, 1) = ligDat".

    Je pense que cela vient de "l = l + 1" qui pour moi devait me servir à écrire sur une ligne différente que la ligne de lecture d'origine mais je ne trouve pas la solution.

    Merci d'avance pour vos éclaircissements.

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Deux petits conseils qui ne règleront pas ton problème mais t'aideront à développer : Fais des itération pour mieux visualiser tes structures et évite au maximum les Goto (perso, je n'en utilise JAMAIS, il y a toujours un moyen de s'en passer).

    Exemple pour ton 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
    18
    19
    20
    l = 2
    For r = 2 To ligFin
    	ligDat = Cells(r, colDat).Value
    	ligCde = Cells(r, colCde).Value
    	ligGen = Cells(r, colEan).Value
    	ligPcb = Cells(r, colPcb).Value
    	ligRec = Cells(r, colQte).Value
     
    	Do
    		tabTmp(l, 1) = ligDat
    		tabTmp(l, 2) = ligCde
    		tabTmp(l, 3) = ligGen
    		tabTmp(l, 4) = ligPcb
    		tabTmp(l, 5) = ligRec
     
    		ligRec = ligRec - ligPcb
    		l = l + 1
    	Loop Until ligRec <= ligPcb
     
    Next r
    Ou bien :

    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
    l = 2
    For r = 2 To ligFin
    	ligDat = Cells(r, colDat).Value
    	ligCde = Cells(r, colCde).Value
    	ligGen = Cells(r, colEan).Value
    	ligPcb = Cells(r, colPcb).Value
     
    	For ligRec = Cells(r, colQte).Value To ligPcb Step  -ligPcb
    		tabTmp(l, 1) = ligDat
    		tabTmp(l, 2) = ligCde
    		tabTmp(l, 3) = ligGen
    		tabTmp(l, 4) = ligPcb
    		tabTmp(l, 5) = ligRec
    	Next ligRec
     
    Next r
    Pour le second code, je suis un peu moins sûr que pour le premier qu'il fasse la même chose que ton code mais tu vois un peu l'idée pour ce qui est de itération et de la suppression des Goto.

  3. #3
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par Menhir Voir le message
    évite au maximum les Goto (perso, je n'en utilise JAMAIS, il y a toujours un moyen de s'en passer).
    Enfin, presque toujours

    On ne peut pas toujours éviter ou, du moins, on ne devrait pas toujours éviter...

    Mais bon c'est un GoTo "exotique".

  4. #4
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 9
    Par défaut
    Merci pour vos réponses.

    Je vais enlever les GoTo (j'ai pris cette - plus ou moins - "mauvaise" habitude ).

    Je planche toujours sur mon problème, si quelqu'un a une solution, merci d'avance.

    Bonne journée !!!

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Enfin, presque toujours
    Depuis que le Basic a abandonné les numéros systématiques des lignes (c'est-à-dire depuis que je suis passé au Quick Basic fin des années 80) et a emprunté au Pascal ses boucles, je n'ai plus jamais utilisé un Goto. Je n'ai même plus le réflexe d'imaginer en utiliser un.

    Mais bon c'est un GoTo "exotique".
    J'évite celui-ci encore plus que les autres.
    Il a encore plus de défaut puisqu'on n'est même pas sûr de la ligne qui va le déclencher.
    De plus, il masque les problèmes plutôt que de les résoudre.
    A utiliser avec autant de précaution que de la nitroglycérine et uniquement en fin de développement quand le programme est entièrement débugué.

    Mais, bien entendu, tout ça est un avis personnel qui n'est pas gravé dans le marbre. Chacun a son style de développement.

  6. #6
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par Menhir Voir le message
    J'évite celui-ci encore plus que les autres.
    Il a encore plus de défaut puisqu'on n'est même pas sûr de la ligne qui va le déclencher.
    De plus, il masque les problèmes plutôt que de les résoudre.
    A utiliser avec autant de précaution que de la nitroglycérine et uniquement en fin de développement quand le programme est entièrement débugué.
    L'idée c'est de traiter la condition d'erreur et d'appliquer les mesures correctives pour éviter de planter le programme.

    C'est comme à l'époque des disquettes. On pouvait passer par là pour dire à l'utilisateur de changer de disquette. Mais, je suis tout à fait d'accord pour dire qu'il faut être quand même prudent, et surtout pas, l'utiliser sans discernement. Cela peut devenir de la dynamite.

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 9
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Deux petits conseils qui ne règleront pas ton problème mais t'aideront à développer : Fais des itération pour mieux visualiser tes structures et évite au maximum les Goto (perso, je n'en utilise JAMAIS, il y a toujours un moyen de s'en passer).

    Exemple pour ton 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
    18
    19
    20
    l = 2
    For r = 2 To ligFin
    	ligDat = Cells(r, colDat).Value
    	ligCde = Cells(r, colCde).Value
    	ligGen = Cells(r, colEan).Value
    	ligPcb = Cells(r, colPcb).Value
    	ligRec = Cells(r, colQte).Value
     
    	Do
    		tabTmp(l, 1) = ligDat
    		tabTmp(l, 2) = ligCde
    		tabTmp(l, 3) = ligGen
    		tabTmp(l, 4) = ligPcb
    		tabTmp(l, 5) = ligRec
     
    		ligRec = ligRec - ligPcb
    		l = l + 1
    	Loop Until ligRec <= ligPcb
     
    Next r
    J'ai utilisé ton code mais j'obtiens un problème lors de l'écriture de mon tableau dont voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(1, 1), Cells(UBound(tabTmp, 1), UBound(tabTmp, 2))) = tabTmp
    Du coup je pense vraiment que le problème de mon code qui pour moi devait me servir à écrire sur une ligne différente que la ligne de lecture d'origine mais je ne trouve pas la solution.

    Merci d'avance pour vos retours.

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Noël35 Voir le message
    J'ai utilisé ton code mais j'obtiens un problème lors de l'écriture de mon tableau dont voici le code
    "j'obtiens un problème", c'est un peu vague comme description de défaut...

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 9
    Par défaut
    Oui pardon

    La macro bloque sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(Cells(1, 1), Cells(UBound(tabTmp, 1), UBound(tabTmp, 2))) = tabTmp
    avec le message d'erreur
    "Erreur d'exécution '1004' : Erreur définie par l'application ou par l'objet"
    Merci d'avance.

  10. #10
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Tu as écrit "j'ai utilisé ton code" mais cette ligne n'est dans aucun des deux codes que je t'ai donnés.
    Tu as donc du le mélanger à autre chose.
    Sans savoir ce qui conduit à cette ligne, impossible de savoir ce qui provoque l'erreur.
    Mais commence par regarder ce que renvoie tes Ubound.

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

Discussions similaires

  1. VBA : alimenter tableau PowerPoint 2003
    Par Manu355 dans le forum VBA PowerPoint
    Réponses: 8
    Dernier message: 16/08/2010, 17h05
  2. pb alimentation tableau
    Par niro75 dans le forum VBScript
    Réponses: 3
    Dernier message: 27/06/2008, 12h12
  3. [VBA-E] Comment créer un tableau sous vba excel
    Par jeanpierreco dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/01/2007, 09h52
  4. tableau temporaire
    Par grosFab dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/02/2006, 13h59

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