Que faire pour nettoyer mon code ?

nak

XLDnaute Occasionnel
Bonjour à tous,

J’utilise actuellement une connexion adodb pour renseigner un fichier base.xlsx.
Cette méthode fonctionne mais j’ai quelque problème de format dû au fichier Excel.

Edit du 24/06 : Mon idée première n'était pas bonne. Sur les conseils de Jam et de Chris je garde une base au format XLSX.
Voir mon nouveau message du 24/06 pour reprise du fil. Merci.

C’est pour cette raison que j’aimerais utiliser une base au format txt.

J’ai donc essayé de modifier mon code pour réaliser une connexion sur le txt au lieu du xlsx.
Code:
Sub Sauvegarder_en_TXT()
Dim Cn As ADODB.Connection
Dim Cd As ADODB.Command
Dim Rst As ADODB.Recordset
Dim Fichier As String, NomFeuille As String, Direction As String
Dim VSearch As String, i As Integer
 
' Chemin d'accès de la base
Direction = ThisWorkbook.Path
Fichier = "base.txt"
 
' Créer la connexion
Set Cn = New ADODB.Connection
With Cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & Direction & ";Extended Properties='text;HDR=NO;FMT=Delimited'"
    .Open
End With
 
Set Cd = New ADODB.Command
Cd.ActiveConnection = Cn
 
' Ouvrir 1000 lignes d'enegistrement
Cd.CommandText = "SELECT * FROM [" & Fichier & "]"
Set Rst = New ADODB.Recordset
Rst.Open Cd, , adOpenKeyset, adLockOptimistic
 
'Boucler sur plusieurs lignes
DernLigne = Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row
For L = 11 To DernLigne
 
' Chercher la valeur dans la BdD
Rst.Find "F1 = '" & Cells(L, 1) & "'", , adSearchForward, 1
   
' Si on se retrouve à la fin des enregistrement
' On en créé un nouveau
If Rst.EOF = True Then Rst.AddNew
 
    ' On rempli la ligne d'enregistrement avec les valeurs
    For i = 0 To 19 ' Mettre ici le nombre de champs -1
    Rst(i).Value = Sheets("Feuil1").Cells(L, 1 + i)
    Next i
 
Next L
 
' Metre à jour la ligne d'enregistrement
Rst.Update
   
' Fermer la connexion
Cn.Close
 
' Effacer les variables objet
Set Cn = Nothing
Set Cd = Nothing
Set Rst = Nothing
 
End Sub

La connexion semble s’effectuer correctement mais les recherché bloquent.

Pouvez-vous m’aider à modifier ce code SVP ?

Merci
 

Pièces jointes

  • ADODB txt.zip
    24.5 KB · Affichages: 53
Dernière édition:

Jam

XLDnaute Accro
Re : Que faire pour nettoyer mon code ?

Salut Nak,

Désolé de ne pas être revenu vers toi plus vite (et encore ce sera court aujourd'hui).
Concernant ton dernier bout de code je ferais 2 modifs:

1. A titre perso, je n'aime pas les lignes regroupées et séparées par les : car je trouve personnellement que cela rend illisible le code. Dans certain cas, notamment pour quelques affectations de valeurs à des variables je peux comprendre, sinon bof.

2. Etant donné que tu utilises les variables liées à ta BDD dans plusieurs procédures différentes, je te conseille vivement de déclarer tes variables en en-tête de module afin de les rendre dispo pour tout le module et de ne pas à avoir à les écrire plusieurs fois dans ton code. De même tu peux déclarer des constantes (i.e. des variables figées) pour toutes les chaînes de déclaration de connexion à ta BDD par exemple comme cela:
VB:
'en entête de module (avant toute procédure)
'déclaration des constantes du programme
Const sProvider As String ="Microsoft.ACE.OLEDB.12.0;"
Const sExtProp As String = "Excel 12.0;HDR=Yes;"
....
'déclaration des variables du programme
Dim oCon As ADODB.Connection
Dim oRst As ADODB.Recordset
...

Sub maSub
    Set oCon = New ADODB.Connection
    Source.Open sProvider & masource & ... & sExtProp & ";"";"
    ...
End Sub

Le seul truc alors important c'est de bien "ouvrir" et "fermer" les variables pour faire en sorte qu'il n'y ait pas de conflit entre plusieurs procédures qui partageraient la même variable du type ouvrir une connexion déjà ouverte ;)

Bon courage
 

nak

XLDnaute Occasionnel
Re : Que faire pour nettoyer mon code ?

Bonjour,

Oui tu as raison Jam, le problème d'OCX cité dans le lien concerne les TreeView et ListView. Donc rien à voir avec mon erreur d'automation.

Sinon, j'ai essayer de nettoyer mon code avec la déclaration des variables en début de module. D'ailleurs cela ma permis d'identifier une variable qui était déclarée en double. Malheureusement cela ne fonctionne pas mieux puisque j'ai toujours mes erreurs.
Par contre je ne suis pas arrivé à déclarer mes constantes...
Code:
Source.Open sProvider & "Data Source=" & ThisWorkbook.Path & "\Base_FI_test.xlsx" & sExtProp & ";"";"

J'ai oublié quelque chose ?

C'est vraiment pas facile de faire un code propre... :)

Merci

A+
 

Jam

XLDnaute Accro
Re : Que faire pour nettoyer mon code ?

Salut nak,

Hum vu comme cela ce n'est pas suffisant pour dire si tu as oublié quelque chose. Il faudrait voir les constantes ;)
Pour t'aider, il ne faut pas hésister à utiliser les outils de débogage:
- La fenêtre d'execution (en mode pause tu peux taper des debug.? mavariable puis Entrée pour connaître le résultat)
- Les espions: permet d'arrêter le code quand une variable change de valeur
- La fenêtre des variables locales permet elle de connaître en temps réel toutes les variables du programme et leur contenus, qu'il s'agisse de simples variables ou d'objets.

Bon courage,
 

Discussions similaires

Statistiques des forums

Discussions
312 239
Messages
2 086 508
Membres
103 236
dernier inscrit
Menni