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 :

Utilisation de tableaux dans VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Par défaut Utilisation de tableaux dans VBA
    Bonjour à tous,

    J'ai beaucoup apprécié votre publication "Utiliser les variables tableau en VBA Excel" de SilkyRoad.
    Félicitation à cette personne et merci à Developpez.com de mettre à notre disposition ces outils très bien ficelés !

    J'ai 3 questions précises à poser concernant le sujet actuel :

    1/ Utiliser un tableau pour copier une plage de cellule relativement grande (comme indiqué page 3 du manuel) est-ce vraiment plus rapide ou moins "lourd" pour la mémoire interne que de faire par VBA un classique "Copier/Coller" ?

    2/ Dans le développement du programme qui m'occupe actuellement, la plage dont je parle ci-dessus consiste en de nombreuses lignes et une vingtaine de colonne. Aucune procédures de mon programme n'utilise plus de 4 colonnes, mais elles doit pouvoir accéder à toutes les lignes.
    Pour économiser de la mémoire, j'ai pensé à 3 solutions.
    > La première est de charger dans plusieurs tableaux les seules colonnes nécessaires à la procédure (en groupant, si c'est possible, des colonnes consécutives dans le même tableau).
    > La seconde est de copier à droite de ma plage les seules colonnes dont j'ai besoin et de charger dans un seule tableau cette nouvelle plage plus compacte.
    > La troisième est de créer dans ma feuille Excel une formule nommée qui fera automatiquement le transfert de ma solution 2 aussitôt que ma procédure aura indiqué dans une cellule "pilote" l'opération que la feuille doit exécuter.
    Cette troisième solution a ma préférence dés lors que ma formule est présente sur chaque ligne pour transférer tout changement ultérieur des données de la plage originale vers la plage compactée.
    Mais avant d'essayer cette solution, je dois recevoir, si vous voulez bien, une réponse à ma troisième question.

    3/ Si un procédure VBA modifie la valeur d'une cellule dans un feuille Excel et que cette cellule intervient dans une formule présente dans d'autres cellules (nombreuses), ces dernières seront-elles mises à jour avant que VBA ne traite la suite de la procédure ?
    Cela, pour lui permettre de travailler sur de nouvelles données.

    Pour terminer cette longue introduction à ma nouvelle discussion, permettez-moi de suggérer une petite correction à la publication citée au début :

    En page 9 vous indiquez :
    "Ajoutez le mot clé "Preserve" pour agrandir un tableau dynamique tout en conservant les valeurs existantes."

    J'ai souvent utilisé ce mot-clé pour REDUIRE la taille d'un tableau.
    Les données stockées dans la taille restante sont AUSSI préservées (dans ma version d'Excel au moins).
    Cela peut-être très utile pour éliminer au fur et à mesure des actions traitées en boucle, par exemple...

    Merci à tous ceux qui auront eut la patience de me lire et surtout à ceux qui prendront le temps d'y répondre...

  2. #2
    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
    Autant de questions auxquelles de simples tests apporteraient une réponse ...
    Qu'attends-tu pour les faire ?

    Tu es ici sur dans la section VBA de ce forum (qui a des règles). Rencontres-tu une difficulté spécifique et parfaitement isolée dans le cours de ton développement ? Si oui : expose-là.

  3. #3
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    > La première est de charger dans plusieurs tableaux les seules colonnes nécessaires à la procédure (en groupant, si c'est possible, des colonnes consécutives dans le même tableau).

    Dans cet exemple, on ne charge dans le tableau Tbl() que les colonnes 1,3,6

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sub ExtraitCol136Champ()
     Set Rng = [A2:F8]
     Dim tmp(): ReDim tmp(1 To Rng.Rows.Count, 1 To 1): For i = 1 To Rng.Rows.Count: tmp(i, 1) = i: Next
     Tbl = Application.Index(Rng, tmp, Array(1, 3, 6))
     [M2].Resize(UBound(Tbl), UBound(Tbl,2)) = Tbl
    End Sub
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub ExtraitCol136Tableau2()
     a = [A2:F8]
     b = Application.Index(a, Evaluate("Row(1:" & UBound(a) & ")"), Array(1, 3, 6))
     [M2].Resize(UBound(b), UBound(b, 2)) = b
    End Sub
    Boisgontier
    http://boisgontierjacques.free.fr
    Fichiers attachés Fichiers attachés

  4. #4
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Par défaut
    Citation Envoyé par boisgontierjacques Voir le message
    Bonjour,

    > La première est de charger dans plusieurs tableaux les seules colonnes nécessaires à la procédure (en groupant, si c'est possible, des colonnes consécutives dans le même tableau).

    Dans cet exemple, on ne charge dans le tableau Tbl() que les colonnes 1,3,6

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sub ExtraitCol136Champ()
     Set Rng = [A2:F8]
     Dim tmp(): ReDim tmp(1 To Rng.Rows.Count, 1 To 1): For i = 1 To Rng.Rows.Count: tmp(i, 1) = i: Next
     Tbl = Application.Index(Rng, tmp, Array(1, 3, 6))
     [M2].Resize(UBound(Tbl), UBound(Tbl,2)) = Tbl
    End Sub
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub ExtraitCol136Tableau2()
     a = [A2:F8]
     b = Application.Index(a, Evaluate("Row(1:" & UBound(a) & ")"), Array(1, 3, 6))
     [M2].Resize(UBound(b), UBound(b, 2)) = b
    End Sub
    Boisgontier
    http://boisgontierjacques.free.fr
    Merci, c'est génial, j'essaye tout de suite !

    Georges L, le belge

  5. #5
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Par défaut
    Citation Envoyé par boisgontierjacques Voir le message
    Bonjour,

    > La première est de charger dans plusieurs tableaux les seules colonnes nécessaires à la procédure (en groupant, si c'est possible, des colonnes consécutives dans le même tableau).

    Dans cet exemple, on ne charge dans le tableau Tbl() que les colonnes 1,3,6

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Sub ExtraitCol136Champ()
     Set Rng = [A2:F8]
     Dim tmp(): ReDim tmp(1 To Rng.Rows.Count, 1 To 1): For i = 1 To Rng.Rows.Count: tmp(i, 1) = i: Next
     Tbl = Application.Index(Rng, tmp, Array(1, 3, 6))
     [M2].Resize(UBound(Tbl), UBound(Tbl,2)) = Tbl
    End Sub
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub ExtraitCol136Tableau2()
     a = [A2:F8]
     b = Application.Index(a, Evaluate("Row(1:" & UBound(a) & ")"), Array(1, 3, 6))
     [M2].Resize(UBound(b), UBound(b, 2)) = b
    End Sub
    Boisgontier
    http://boisgontierjacques.free.fr
    Bonjour Boisgontier,

    J'ai essayer les 2 solutions.
    La première fonctionne très bien, mais la seconde plante !
    C'est dommage car je la préfère (elle me semble plus rapide et plus économe en mémoire interne).
    Si tu avais 5 min pour voir si tu n'as pas fait une petite erreur de syntaxe ?
    Par la même occasion, si tu pouvais m'indiquer le type des variables utilisées car je travaille toujours en mode "explicit" et cela m'aide à mieux comprendre certaines astuces et à les réemployer dans d'autres circonstances.
    Merci encore pour ta réponse.

  6. #6
    Membre extrêmement actif
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Par défaut
    Bonjour,

    CF PJ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub ExtraitCol136Tableau2()
     Set Rng = Range("A1:H" & [A65000].End(xlUp).Row)
     Tbl = Application.Index(Rng, Evaluate("Row(1:" & Rng.Rows.Count & ")"), Array(1, 3, 6))
     [M1].Resize(UBound(Tbl), UBound(Tbl, 2)) = Tbl
    End Sub
    Boisgontier
    http://boisgontierjacques.free.fr
    Fichiers attachés Fichiers attachés

  7. #7
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour
    Autant de questions auxquelles de simples tests apporteraient une réponse ...
    Qu'attends-tu pour les faire ?

    Tu es ici sur dans la section VBA de ce forum (qui a des règles). Rencontres-tu une difficulté spécifique et parfaitement isolée dans le cours de ton développement ? Si oui : expose-là.
    Réponse à "unparia" :
    Bon, c'est possible que je n'ai pas encore saisi la bonne façon de communiquer sur un forum informatique.
    Il faut m'excuser cela ne fait que quelques jours seulement que je me suis lancé dans cet exercice...
    Je m'y suis décidé contre mon gré car je suis persuadé que la meilleure façon de maîtriser un logiciel aussi complexe qu'Excel et surtout en VBA, c'est d'acheter un bon manuel et d'appliquer dans des cas pratiques ce que j'ai appris en le parcourant systématiquement.

    C'est ce que j'ai fait pendant les 4 dernières années de mon activité professionnelle et depuis 6 ans dans le cadre de 2 activités de bénévolat.
    Mes clients et les informaticiens de l'entreprise danoise pour laquelle je bossait jusqu'en 2011 m'ont félicité plus d'une fois !
    Même si j'ai encore quelques lacunes, je n'en fait plus un complexe car qui peut prétendre maîtriser complètement ce monstre qu'est Excel ?

    Mais aujourd'hui que je suis, comme toi, à la retraite, je me suis lancé dans un programme très complexe pour lequel l'aide d'un informaticien chevronné est nécessaire.
    N'ayant personne dans mon entourage qui réponde à ce profil, je me suis rabattu sur votre forum.
    Les premières réponses de Pierre Fauconnier et de quelques autres m'ont fort aidé et encouragé à continuer...

    Puis, tu t'es inséré, mais au lieu de répondre aux questions tu pointes chaque fois l'une ou l'autre petite erreur de syntaxe !
    Pour info, ces erreur ne sont pas dans les procédure que je développe sur le PC que l'association que j'aide m'a prêté (non-connectable sur Internet) mais proviennent de leur retranscription sur le "Mac" privé qui me permet de "surfer" !

    Aujourd'hui, tu essayes de m'enfoncer encore plus en me disant n'importe quoi.
    J'ai fait pas mal de tests avant de poser mes questions !
    Si tu peux m'expliquer quels tests je pourrais faire pour avoir la réponse à mes 2 premières questions ?
    J'aurais pu faire un test pour la troisième, mais peut-être que la réponse de l'un ou l'autre aux deux premières ne l'aurait pas rendu necessaire...

    Tu m'as cependant appris une bonne chose, celle de ne pas être trop bavard sur un forum.
    Je comprends que les visiteurs n'ont pas le temps de lire des longues tartines et qu'il faut être clair et concis et sans doute essayer de poser une question à la fois.
    Pour la dernière discussion, j'ai cependant cru bon d'indiquer les pistes que j'avais explorées pour éviter trop d'aller-retour dans le débat.

    PS :
    > Si Pierre Fauconnier ou l'un ou l'autre modérateur devaient m'indiquer que ma place n'est pas dans votre forum, je promet de ne plus vous déranger.
    > Unparia, j'ai indiqué que, malgré (ou à cause) de mon âge avancé, je suis novice dans ce mode de communication. Si tu pouvais m'indiquer si Pierre Fauconnier et les autres membres ont la possibilité de lire cette réponse (rédigée sur ta propre réponse), ce serait très sympa de ta part.

    Salutations (à tous ?)

  8. #8
    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
    Pour quelqu'un qui aurait appris à ne pas être bavard et aller à l'essentiel ...
    Si tu peux m'expliquer quels tests je pourrais faire pour avoir la réponse à mes 2 premières questions ?
    voilà un test simple, déjà (pour ta question 1) :
    Exemple simple de mesure de la durée d'exécution d'instructions --->>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim debut as double
    debut = timer
     '--------------les instructions
     '------------- à exécuter
    msgbox "ces instructions ont été exécutées en " & timer - debut & " secondes
    je persiste à dire que telle (tes questions) n'est à mon sens pas la vocation d'un forum de développement, mais celle d'un site d'apprentissage et de formation.
    Bonne chance

  9. #9
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Août 2017
    Messages : 62
    Par défaut
    Citation Envoyé par unparia Voir le message
    Pour quelqu'un qui aurait appris à ne pas être bavard et aller à l'essentiel ...

    voilà un test simple, déjà (pour ta question 1) :
    Exemple simple de mesure de la durée d'exécution d'instructions --->>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim debut as double
    debut = timer
     '--------------les instructions
     '------------- à exécuter
    msgbox "ces instructions ont été exécutées en " & timer - debut & " secondes
    je persiste à dire que telle (tes questions) n'est à mon sens pas la vocation d'un forum de développement, mais celle d'un site d'apprentissage et de formation.
    Bonne chance
    Et bien voilà enfin une bonne réponse !

    Merci beaucoup, mais tu m'en fais poser une autre :

    Tu connais un site d'apprentissage qui peut m'aider à avancer sans m'obliger à laisser mon projet de côté pendant trois ans pour me farcir des tas de choses que je connais déjà ?

    Bien à toi,

    Georges L, le belge

    PS : pour info, j'ai reçu entretemps une autre réponse qui répond très simplement à ma première question et que je vais essayer tout de suite !

  10. #10
    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
    Tu connais un site d'apprentissage qui peut m'aider à avancer
    Personnellement ? Aucun. Je me suis quant à moi formé en VBA en lisant l'aide interne de VBA. Elle m'a été suffisante.
    sans m'obliger à laisser mon projet de côté pendant trois ans
    Cela ne m'a pas pris trois ans
    pour me farcir des tas de choses que je connais déjà ?
    tu es seul à savoir ce que tu connais déjà. *****
    Je te quitte là.

    EDIT : ***** : essayer de ne pas confondre "ce que l'on sait déjà faire" avec ce que l'on "connaît déjà".
    Il arrive (je le constate fréquemment) que l'on sait déjà faire (ou refaire) sans avoir réellement maîtrisé les raisons fondamentales pour lesquelles on a fait ainsi. Ce genre de carence éventuelle n'est pas sans effets sur les progrès, la créativité, l'efficacité, etc ...
    A contrario, une excellente maîtrise des fondements-mêmes est le sésame de l'accès aux meilleurs choix, décisions, créations, etc ...

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Citation Envoyé par Benevole V1 Voir le message
    [...]
    PS :
    > Si Pierre Fauconnier ou l'un ou l'autre modérateur devaient m'indiquer que ma place n'est pas dans votre forum, je promet de ne plus vous déranger.
    > Unparia, j'ai indiqué que, malgré (ou à cause) de mon âge avancé, je suis novice dans ce mode de communication. Si tu pouvais m'indiquer si Pierre Fauconnier et les autres membres ont la possibilité de lire cette réponse (rédigée sur ta propre réponse), ce serait très sympa de ta part.

    Salutations (à tous ?)
    Pas de soucis pour la place dans le forum. J'ai simplement déplacé la discussion sur le bon forum et ce déplacement a généré l'envoi d'un message pour t'informer du déplacement. Tu es donc maintenant sur le bon forum . Quant à qui lit ta discussion, la réponse est simple: Tout qui a accès à ce forum (membre et non membre) peut lire la discussion et les réponses postées
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. utiliser des tableaux dans une class
    Par artemis93 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 24/04/2011, 11h45
  2. [XL-2003] Utiliser fonction excel dans VBA
    Par bebel9313 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/07/2009, 05h55
  3. [E-02] : utilisation de matrice dans Vba
    Par Oupss dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/04/2009, 11h16
  4. Réponses: 5
    Dernier message: 27/05/2008, 18h43
  5. Réponses: 1
    Dernier message: 12/12/2007, 13h46

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