Comment accélérer mon code ?

  • Initiateur de la discussion Initiateur de la discussion nak
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

nak

XLDnaute Occasionnel
Bonjour,

Voici un code qui me permet de récupérer les données d'une base et d'ensuite supprimer les lignes de la base qui ne correspondent pas à mon filtre en F4.

VB:
Sub extractionValeurBase()
    Dim Source As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim ADOCommand As ADODB.Command
    Dim Fichier As String, Cellule As String, Feuille As String
 
    'Adresse de la cellule contenant la donnée à rechercher
    Cellule = "A2:T"
 
    Feuille = "Feuil1$" 'n'oubliez pas d'ajouter $ au nom de la feuille.
    'Chemin complet du classeur fermé
    Fichier = ThisWorkbook.Path & "\base.xls"
 
    Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & Fichier & ";Extended Properties=""Excel 8.0;HDR=No;"";"
 
    Set ADOCommand = New ADODB.Command
    With ADOCommand
        .ActiveConnection = Source
        .CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
    End With
 
    Set Rst = New ADODB.Recordset
    Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic
 
    Set Rst = Source.Execute("[" & Feuille & Cellule & "]")
 
    Range("A11").CopyFromRecordset Rst
 
    Rst.Close
    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing
 
    Call supprimerOF
 
End Sub
VB:
Sub supprimerOF()
Dim i As Long, derligne As Long
derligne = Range("A65536").End(xlUp).Row
Application.ScreenUpdating = False
'Suppression des lignes inutiles
For i = derligne To 11 Step -1
If UCase(Range("B" & i).Value) <> UCase(Range("F4").Value) Then Rows(i).Delete
Next i
Application.ScreenUpdating = True
End Sub

Comment faire pour l'accélérer ? En sachant que le problème vient de la partie suppression.

Merci
 
Re : Comment accélérer mon code ?

Bonjour à tous

Le matin, étant beaucoup plus perspicace sur le problème, j,ai pensé à cette solution beaucoup plus simple et plus rapide encore de 80 pour cent.
Dans mon autre exemple, je crée en colonne "T" une colonne d, index de la ligne 11 à la fin pour repérer le placement de chaque lignes avec la boucle "do. Loop".
Cette boucle perd beaucoup de temps.
Elle est finalement inutile.
Le plus efficace à mes yeux serait.
-Trier tableau par colonne "B"
-rechercher en col B par Match valeur F4
-Supprimer lignés de 11 à valeur Match -1
-Garder les lignes valides
-Supprimer lignés dessous jusqu'à la fin.

Par ce principe, ton traitement sera très rapide!
Je suis sur mon téléphone et ne peux fournir l'exemple.

À+

Rene
 
Re : Comment accélérer mon code ?

Bonjour,

En poste #14 j'ai juste modifié une instruction :

' Modification d'une instruction :
' Explication :
' Je colle ici avec ce code = UBound(tabVal, 2)
' 20 colonnes (c'est a Dire les 19 colones + celle créer par Redim Preserve donc 1) soit 20 colonnes
' et je doit en faite coller que 19 colonnes
' soit avec la modif ici = UBound(tabVal, 2)-1 soit les 20 colonnes moins la colonnee crée par Redim Preserve
' donc les 19 colonnes initial
' puis en dessous pour les lignes correspondant la recherche
' Extraire le tableau
' de la premiere ligne du tableau a une ligne donnée
' exemple tableau de 1 a 500 ligne et cpt = la 230 éme ligne
' soit ligne 1 a 230 sur toute les colonnes du tableau
' Ici colle les 20 colonnes = F.Cells(10, 1).Resize(cpt, UBound(tabVal, 2)).Value = tabVal
' ci dessous colle les 19 colonnes
F.Cells(10, 1).Resize(cpt, UBound(tabVal, 2) - 1).Value = tabVal

ps : le fichier est corrigé en poste #14

laurent
 
Dernière édition:
Re : Comment accélérer mon code ?

Bonjour à tous !

Déjà merci pour votre contribution, ça fait très plaisir d'avoir une aide aussi précieuse.

René, je viens de tester la dernière version proposée. En rapidité il n'y a rien à dire, on ne peut pas rêver plus.
Par contre il y a des erreurs dans le tri. Par exemple, j'ai 12 lignes pour l'OF 130100 (voir fichier joint) et la macro ne m'en conserve que 11. Pour les autres il n'y a pas de problème.
Chose bizarre également ma ligne 10 saute lors de l'exécution du tri. Pourtant j'ai modifier les deux Cells(10,1) par des Cells(11,1), mais ça ne veux pas...

Merci !
 

Pièces jointes

Re : Comment accélérer mon code ?

Re,

Voici l'erreur corrigée !

Tu m'avais placé un cas spécial où la valeur F4 était la plus grande de toutes les valeurs.

Testes avec ce programme et avec une base plus importante pour voir au niveau vitesse .

A+

René
 

Pièces jointes

Re : Comment accélérer mon code ?

Bonsoir à tous

nak
Une question me turlupine depuis le premier message de ce fil:
Pourquoi ne pas extraire directement uniquement les valeurs souhaitées et ce directement dans ta requête SQL?
(en adaptant ton code selon tes besoins)
Set ADOCommand = New ADODB.Command
With ADOCommand
.ActiveConnection = Source
.CommandText = "SELECT * FROM [" & Feuille & Cellule & "]"
EndWith
Ainsi plus besoin de macro pour supprimer des lignes

En espérant que je ne fourvoie pas et que quelques membres du forum maitrisant sur le bout de leur String, le langage SQL passeont dans ce fil et confirmeront ma "turlipination" (ou l'infirmeront si je m'a trompé 😉 )

EDITION: Apparemment j'avais du revêtir ma cape d'invisibilité 😉
Bonsoir néné06 😉
 
Dernière édition:
Re : Comment accélérer mon code ?

Bonsoir,

@ Nak

Voici l'erreur réparée

@ Yaloo

Je place d = CVErr(xlErrNA) car lorsque j'ai utilise Match pour les premieres fois , on m'avais donné cette formule qui force (d) en erreur mais je pense que ce n'est pas obligatoire car l'on arrive à gerer les erreurs par la suite.
D'autres membres donneront peut-être une explication logique ?

A tous, Bonne nuit

Édit:Bonsoir Staple 1600
 

Pièces jointes

Dernière édition:
Re : Comment accélérer mon code ?

Bonjour à tous,

René, je te remercie pour ton code corrigé et 100% fonctionnel. Grâce à toi mon projet va pouvoir continuer. Merci, merci !

Staple1600, ta question est très bonne. D'ailleurs c'était la première chose que je voulais faire. Malheureusement je ne suis pas parvenu à ajouter la condition dans le code. J'avais même fait un appel à l'aide sur le forum. Maintenant crois-tu qu'une requête SQL serait plus rapide que la solution de tout importer puis de supprimer ?

Merci à tous pour votre participation.

A+
 
Dernière édition:
Re : Comment accélérer mon code ?

Bonjour à tous

J'ai pas trop suivi l'affaire 😱.

Mais, comme dit Jean-Marie 🙂, pour extraire des données, on peux utiliser les extractions de type ODBC avec SQL. Sinon, les filtres élaborés sont souvent très rapide. On peut aussi utiliser les tableaux 🙂.

Enfin, il faut vraiment penser à fournir des le début un fichier pour ce genre de question 😕.

PS: j'ai regardé le dernier fichier de Néné 🙂. SI j'avais du le faire, j'aurais mis 1 ligne de code en nommant 3 zones: 1 _BD contenant ma base de données, 1 _CR avec la zone de critère et 1 avec _ZD et sa zone de destination avec ce code.

Code:
 Range("_BD").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
        "_CR"), CopyToRange:=Range("_ZD"), Unique:=False
 

Pièces jointes

Dernière édition:
Re : Comment accélérer mon code ?

Bonjour nak, Yaloo, ROGER2327, Papou-net, laurent950, néné06, MJ13, le fil

nak
Maintenant crois-tu qu'une requête SQL serait plus rapide que la solution de tout importer puis de supprimer ?
Je le suppute fortement, mais j'attends la confirmation des aficionados de SQL
(que je ne suis pas encore, pour cause de pratique inusitée de SQL dans le cadre de mon boulot)
Attendons qu'ils se manifestent et sortent leur String SQL 😉 pour savoir si l'idée est à creuser ... ou pas. 😉
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
1 K
Réponses
5
Affichages
715
Réponses
4
Affichages
409
Réponses
2
Affichages
333
  • Question Question
Microsoft 365 Code VBA
Réponses
7
Affichages
914
Réponses
5
Affichages
312
Réponses
4
Affichages
582
Retour