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.
Bonjour,
Attention que ces 2 opérateurs ne sont pas équivalents et substituables, les résultats peuvent être différents.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?
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
Bonsoir,
J'ai quelques observations sur les triés.
Dans la Function RechercheW() du Tome 6
code 1:
Il est possible de faire l’économie de cette boucle en faisant :
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)
code 2:
Vous avez choisie le code 1 par préférence ou bien pour des considérations techniques?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 TabDonnées= PlageDonnées.Value
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 4:
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)
Sinon, en cas d'erreur la boucle suivante risque de tourner indéfiniment:
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:
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
Bonjour.
Mes réponses à ces questions:
Non, pour deux raisons :Il est possible de faire l'économie de cette boucle en faisant : TabDonnées = PlageDonnées.Value
- 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).
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.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.
Dit autrement il faut déclarer TabDonnées ainsi :
et non pas :
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.
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 ReDim TabDonnées(1 To i) ' où i est le nombre d'éléments.
Merci pour ces remarques très constructives.
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
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
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/
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
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
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.
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.
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager