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 :

Mémento sur la programmation en VBA pour EXCEL [Tutoriel]


Sujet :

Macros et VBA Excel

  1. #41
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2013
    Messages : 9
    Points : 34
    Points
    34
    Par défaut Trie pour les class ou collections
    Citation Envoyé par laurent_ott Voir le message
    À noter qu'il y a encore plus rapide que SELECT CASE, c'est WHILE .... WEND, ou encore DO UNTIL ... LOOP
    J'utilise parfois cela dans l'algorithme QuickRanking.
    Est il possible d'adapter ces algo de trie pour un tableau de class ou une collection sans perdre leur puissance?

  2. #42
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 974
    Points : 4 093
    Points
    4 093
    Par défaut
    Je ne peux pas te répondre car je n'utilise pas les class et les collections. Et je n'y connais rien. Donc je donne ma langue au chat.
    Tu trouveras un exemple pratique de QuickRanking dans le tome 6.

  3. #43
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Points : 3 666
    Points
    3 666
    Par défaut
    Bonjour,

    Milieu = (Début + Fin) / 2
    Pourquoi avoir utiliser le / en lieu et place du \? Étant donné qu'on a besoin de la partie entière de la division, le second n'est il pas plus rapide?
    Attention que ces 2 opérateurs ne sont pas équivalents et substituables, les résultats peuvent être différents.
    Avec Début = 1 et Fin = 6, soit une somme impaire :
    (Début + Fin) / 2 = 3.5, qui sera arrondi à 4 lors de la conversion si Milieu est typé Entier
    (Début + Fin) \ 2 = 3, résultat de la division entière, et restera à 3.
    Il faut penser à en tenir compte.
    eric

  4. #44
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2013
    Messages : 9
    Points : 34
    Points
    34
    Par défaut
    Bonsoir,
    J'ai quelques observations sur les triés.

    Dans la Function RechercheW() du Tome 6

    code 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     ' Mémorise les données:
    Application.Cursor = xlWait
     
    For i = 1 To UBound(PlageDonnées())
    TabDonnées(i - 1) = PlageDonnées(i, ColRecherche).Value
    Next i
     
    ' Trie les données et retourne leur ordre de classement:
    Classement = QuickRanking(TabDonnées(), True, 2)
    Il est possible de faire l’économie de cette boucle en faisant :

    code 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    TabDonnées= PlageDonnées.Value
    Vous avez choisie le code 1 par préférence ou bien pour des considérations techniques?

    Dans la Function QuickRanking(), je pense qu'il est préférence de remettre une gestion pour annuler On Error Resume Next dans le code 3 ci-dessous

    code 3:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ' Bornes du tableau des données d'origine :
    Dim TabDébut As Long, TabFin As Long
     
    On Error Resume Next ' Si aucune donnée à trier.
    TabDébut = LBound(TabDonnées)
    TabFin = UBound(TabDonnées)
    code 4:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ' Bornes du tableau des données d'origine :
    Dim TabDébut As Long, TabFin As Long
     
    On Error Resume Next ' Si aucune donnée à trier.
    TabDébut = LBound(TabDonnées)
    TabFin = UBound(TabDonnées)
     
    On Error GoTo FIN
     
    ..........
     
    FIN:
    Sinon, en cas d'erreur la boucle suivante risque de tourner indéfiniment:

    code 5:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    i = TabTps(Anc) ' Plus proche donnée inférieure connue.
    While Anc < MiniRac: MiniRac =Anc: Wend ' Plus rapide que If Anc < MiniRac Then MiniRac = Anc

    Si l'indice min du tableau (LBound(TabDonnées)) est différent de 0, la boucle suivante tourne indéfiniment.

    code 6:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    While TabDonnées(TabTps(Début + 1)) < Tps: Début = Début + 1: Wend

  5. #45
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 974
    Points : 4 093
    Points
    4 093
    Par défaut
    Bonjour.
    Mes réponses à ces questions:

    Il est possible de faire l'économie de cette boucle en faisant : TabDonnées = PlageDonnées.Value
    Non, pour deux raisons :
    - TabDonnées doit être en base 0 alors que PlageDonnées.Value est en base 1 ;
    - PlageDonnées est une plage qui peut avoir plusieurs colonnes, et TabDonnées(i - 1) = PlageDonnées(i, ColRecherche).Value permet de mémoriser les données de la colonne sur laquelle porte la recherche dans cette plage (qui n'est pas forcément la première colonne).

    Dans la Function QuickRanking(), je pense qu'il est préférable de remettre une gestion pour annuler On Error Resume Next.
    Si l'indice min du tableau (LBound(TabDonnées)) est différent de 0, la boucle suivante tourne indéfiniment.
    C'est vrai que je n'ai pas mentionné explicitement qu'il faut que TabDonnées (la mémoire qui contient les données à trier) soit en base 0.
    Dit autrement il faut déclarer TabDonnées ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim TabDonnées() As Variant
    ReDim TabDonnées(0 To i-1) ' où i est le nombre d'éléments.
    et non pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReDim TabDonnées(1 To i) ' où i est le nombre d'éléments.
    Effectivement, tu peux faire une gestion des erreurs pour les cas où TabDonnées n'est pas en base 0 :

    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
    ' Bornes du tableau des données d'origine:
    Dim TabDébut As Long, TabFin As Long
    On Error Resume Next ' Si aucune donnée à trier.
    TabDébut = LBound(TabDonnées)
    TabFin = UBound(TabDonnées)
     
    ' Controle que TabDonnées est de la forme TabDonnées(0 To i):
    If TabDébut <> 0 Then
        MsgBox "Erreur de programmation: TabDonnées doit être de la forme TabDonnées(0 To i)", _
                vbCritical + vbOKOnly, "QuickRanking"
        Exit Function
    End If
     
    ' Gestion des erreurs:
    Err.Clear
    On Error GoTo Gest_Err
     
    ..............
     
    QuickRanking = Pos()
     
    Gest_Err:
    If Err.Number <> 0 Then MsgBox "Erreur: " & Err.Number & " - " & Err.Description, _
                            vbCritical + vbOKOnly, "QuickRanking"
    Err.Clear
    End Function
    Merci pour ces remarques très constructives.

  6. #46
    Candidat au Club
    Homme Profil pro
    Utilisateur Excel + VBA
    Inscrit en
    Février 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Utilisateur Excel + VBA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2019
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Merci et Chapeau pour ces tutos
    Citation Envoyé par laurent_ott Voir le message
    Chers membres du club,

    J'ai le plaisir de vous présenter ce sixième mémento qui va vous apprendre la programmation de nouvelles fonctions Excel pour l'utilisateur.


    Bonne lecture et n'hésitez pas à apporter vos commentaires



    Retrouvez les meilleurs cours et tutoriels pour apprendre Microsoft Excel

    Bonjour Laurent,

    J'ai commencé à faire du VBA en 'suivant' un Laurent (Longre) il y a longtemps, sur Excel 5 ...
    petitement, je suis simple utilisateurs de Excel
    J'imagine le temps passé sur c'est ouvrages.
    Merci donc
    Bonjour à Alice

  7. #47
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2013
    Messages : 115
    Points : 72
    Points
    72
    Par défaut Problème Annexe Tome 1
    J'ai bien suivi votre mémento et l'ai fort apprécié.

    Mais j'ai un problème avec l'annexe.

    Le jeu d'arcade Snake est pour Excel 2003. Je travaille en Excel 2013 64 Bits. Je n'arrive pas à modifier pour cette version. auriez-vous une solution?

    Merci d'avance

  8. #48
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 974
    Points : 4 093
    Points
    4 093
    Par défaut
    Citation Envoyé par boulser Voir le message
    ...Snake est pour Excel 2003. Je travaille en Excel 2013 64 Bits. Je n'arrive pas à modifier pour cette version. auriez-vous une solution?
    Effectivement les API 32 bits ne sont pas toujours compatibles 64 bits, et leur mise à niveau est souvent fastidieuse.
    N'ayant pas la version 64 Bits d'Excel je ne me suis jamais lancé sur ce terrain.

    Mais Thierry GASPERMENT (arkham46) est un expert du sujet :
    https://arkham46.developpez.com/arti...ice/vba64bits/

    Et de la programmation en mode graphique :
    https://arkham46.developpez.com/arti...ice/clgdiplus/

  9. #49
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 1
    Points : 3
    Points
    3
    Par défaut
    Merci Laurent pour ces documents vba . Moi aussi je code : Super site d'info : Merci à toutes les personnes pour repondre et partager vos connaissances. Pierre

  10. #50
    Candidat au Club
    Femme Profil pro
    Cadre administratif
    Inscrit en
    Avril 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Cadre administratif
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2017
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Tout simplement Génial !!
    Merci de ce(s) memento(s)
    Je ne le découvre que maintenant, et c'est bien dommage !
    Il part de la base, certes , mais nous emmène bien plus loin.
    C'est top,
    Merci

  11. #51
    Candidat au Club
    Femme Profil pro
    Assistante de gestion
    Inscrit en
    Juillet 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Assistante de gestion
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2011
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par bernardassyst Voir le message
    Bonjour ,
    C est mon premier post sur ce forum que je consulte trés souvent.
    Je programme un peu maladroitement et j aimerias me structurer et donc je reprends les bases .

    Dans la fonction CompterPoche du tuto Apprendre la programmation en VBA pour EXCEL par la pratique - Première partie , je ne retrouve pas les variables publics MesBonbon et MesScoubidou. On a NbBonbon = NbBonbon + 1 . N'ai je rien compris ou y a-t-il un pb de copier/coller dans ce tuto ?

    A tout cas merci pour ce tuto que je vais continuer a lire.
    Bonjour,
    Pour répondre à ta question, voici les étapes à faire :
    - ouvrir un classeur Excel
    - sélectionner dans le ruban "Développeur"
    - cliquer sur l'icône "Visual Basic" en haut à gauche
    - se positionner sur "Feuille 1" qui se trouve dans la colonne de gauche, faire un clique droit, se positionner sur "Insertion" puis sélectionner "Module"
    - la page "Module 1" apparaît
    - dans le module 1 il y a un ruban qui se trouve en haut, tu as " Fichier", "Edition", Affichage", "Insertion", "Format", etc...
    - cliquer sur "Insertion" puis choisir "Procédure" , une fenêtre apparait où l'on peut nommer la procédure en complétant la case "Nom:", choisir le type "Sub", "Function" ou "Property" et sélection la portée " Public" ou "Private".
    Dans le cas du mémento, tu aura juste à nommer la procédure par "CompterMesBonbons" puis valider par OK.
    Voilà pour le début.

  12. #52
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2023
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2023
    Messages : 1
    Points : 3
    Points
    3
    Par défaut [Update 2016]
    Bonjour,

    Tout d'abord, je tiens à vous remercier pour vos Mémento et cours qui sont vraiment excellent.
    Je travaille actuellement sur Excel 2016, et je souhaite savoir si vous pouviez mettre à jour quelques informations dans le tome 1 "vba-excel-tome-1" pour être d'avantage compatible avec Excel 2016.

    Dans la partie "XXI Les procédures récursives", je ne suis pas sûre si c'est volontaire, mais je pense qu'il manque un "End If" dans la fonction "MesRepertoires(StrRepertoire As String)".

    Sur la partie des "XXII. Les API", il y'a besoin de rajouter l'attribut PtrSafe lors de la déclaration des fonctions (suite à Excel 2016).
    Exemple : Declare PtrSafe Function SearchTreeForFile Lib "imagehlp" (ByVal RootPath As String, ByVal InputPathName As String, ByVal OutputPathBuffer As String) As Long

    J'ai aussi observé un oubli des guillemets sur l'exemple fournit qui m'a un peu porté à confusion :
    Declare PtrSafe Sub Attente Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

    Merci encore pour tout le travail que vous avez fait, j'ai hâte de lire vos futurs tomes déjà existant.

  13. #53
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 974
    Points : 4 093
    Points
    4 093
    Par défaut
    Bonjour,
    Merci pour vos remarques et vos encouragements.
    J'ai corrigé ces coquilles dans la version en ligne.
    Effectivement il faudrait que j'adapte ce premier tome aux versions récentes, et surtout préciser qu'aujourd'hui on utilise les tableaux structurés et plus les plages de données (voir ma signature) mais avant d'apprendre à courir il faut déjà apprendre à marcher.

    Bonne continuation.

Discussions similaires

  1. [VBA pour Excel] Différence entre activate et select
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/10/2008, 17h20
  2. [VBA-E] Help création d'un programme vba pour excel
    Par yampi dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/01/2007, 11h46
  3. [VBA-E] tri sur VBA pour Excel
    Par mariedrouin dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 21/05/2006, 13h32
  4. Réaliser une macro en VBA pour excel afin de créer un graphe
    Par xavier le breuil dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 04/12/2005, 14h41

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