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:

nak

XLDnaute Occasionnel
Re : Connexion ADODB sur fichier TXT

un ptit dernier...

Merci

Je ne trouve pas d'aide sur le net, aucun tuto... :(
Ou peut être pouvez-vous me conseiller un autre système de connexion ? ADODB n'est peut être pas approprié ?

Merci

A+
 

Jam

XLDnaute Accro
Re : Connexion ADODB sur fichier TXT

Salut,

J'ai pas beaucoup de temps mais tu m'as l'air désespéré ;)
D'abord une petite question de compréhension:
Pourquoi faire une recherche dans un Recordset au lieu de faire un SELECT .... WHERE monchamp = Cells(L,1) et si on trouve l'enregistrement faire alors un update directement dans la table ?
Autre méthode, tout importer dans un onglet et pour chaque enregistrement qui existe déjà faire la mise à jour ou ajouter.

De plus je ne saisis pas bien pourquoi tu passes cet argument à ton Rst.Find comme cet exemple F1 = 'OF130001304E202'
Je pense, sauf si j'ai mal compris, que cela serait plus simple.

Bon courage
 

nak

XLDnaute Occasionnel
Re : Connexion ADODB sur fichier TXT

Bonjour Jam,

Oui je commence un peu à désespérer car par moment mon code devient instable (erreur automation).
Pourtant celui-ci fonctionne la plupart du temps.

C'est un code que j'ai trouvé sur le net et qui est donné fonctionnel. Mais si j'en crois tes remarques il présente plusieurs incohérences de taille.

Pour t'expliquer le fonctionnement, chaque ligne du fichier saisie correspond à un enregistrement. Les enregistrement sont stockés dans le fichier base.xlsx. J'aimerais passer sur un format plus simple style txt ou csv.
Remplacer le Recordset par un SELECT est une bonne idée mais cela demande un changement en profondeur du code non ?

Je crois que je suis vraiment largué... :(

Merci
 

Jam

XLDnaute Accro
Re : Connexion ADODB sur fichier TXT

Slt nak,

L'utilisation de base de données demande de bien prévoir l'utilisation en amont. En effet, on ne gère pas une base de données comme un "bête" tableau excel.
Petite remarque, utiliser un fichier type texte pour une base de données n'est pas une bonne idée. Une vrai base de données type Access est beaucoup mieux adaptée voir un simple tableau Excel dans la mesure où il n'y a pas de relation de tables ou beaucoup d'enregistrements à gérer.
De plus ton code n'est pas très propre, si je puis me permettre, car il y a peu de déclaration de variables. Le code est peu lisible aussi, bref ce type de détails peuvent générer les erreurs que tu rencontres.

Si j'ai un peu plus de temps aujourd'hui, j'essaierai de regarder un peu plus en profondeur ton fichier.

Petite suggestion en attendant, ne peux-tu pas simplement gérer ton programme en stockant tes données dans une feuille masquée de ton fichier ? Pourquoi vouloir utiliser une base de données externe (en-dehors de mes remarques ci-dessus) ?

Bon courage
 

nak

XLDnaute Occasionnel
Re : Connexion ADODB sur fichier TXT

Salut Jam,

Malheureusement non je ne peux pas stocker mes données dans une feuille cachée car le projet est encore plus tordu qu'il te semble ! :)
En réalité ce code est utilisé dans un fichier en lecture seule pour éviter les accidents vu que plusieurs utilisateurs sont amenés à s'en servir. Le fichier base est dans un coin du réseau bien caché par les arborescences.

Ce n'est pas très propre mais c'est la seule solution que j'ai à cause de nombreuses contraites.

En tout cas si tu m'aide à nettoyer le code je t'en serais très reconnaissant. ;)

Merci

A+
 

Jam

XLDnaute Accro
Re : Connexion ADODB sur fichier TXT

Re,

Vu ce que tu me dis je te déconseille donc fortement d'utiliser les fichiers type texte pour gérer une base multi-utilisateurs. En cas de conflit tu risques de mettre le bazar dans ta base de données. Access (ou mieux SQLServer) sera le plus adapté.

Bon courage
 

nak

XLDnaute Occasionnel
Re : Connexion ADODB sur fichier TXT

Re Jam, bonjour chris,

Malheureusement je n'ai gère le choix... Impossible d'utiliser une vraie base. Je veux bien laisser tomber l'idée du fichier txt. Mais il faut que je persiste sur le fichier XLSX.
Pour éviter les conflits, je me base sur un identifiant (colonne 1) issu d'un ERP. Il est donc impossible de tomber sur des données incompatibles.
C'est pour cette raison que je pense que mon code n'est pas propre. En plus Jam, tu me l'a confirmé ! :eek:
Si vous avez des astuces, je suis preneur.

Merci

A+
 

nak

XLDnaute Occasionnel
Re : Connexion ADODB sur fichier TXT

Bonjour à tous,

Je persiste donc avec ma connexion sur mon fichier XLSX :

Code:
Sub Sauvegarder_en_XLSX()
Dim Cn As ADODB.Connection
Dim Cd As ADODB.Command
Dim Rst As ADODB.Recordset
Dim Fichier As String, NomFeuille As String
Dim VSearch As String, i As Integer, L As Integer, DernLigne As String

' Chemin d'accès de la base
Fichier = ThisWorkbook.Path & "\base.xlsx"
' Nom de la feuille dans le classeur fermé
NomFeuille = "Feuil1"

' Créer la connexion avec le fichier base
Set Cn = New ADODB.Connection
With Cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
        & Fichier & ";Extended Properties=""Excel 12.0;HDR=NO;"""
    .Open
End With

Set Cd = New ADODB.Command
Cd.ActiveConnection = Cn

' Ouvrir l'enegistrement du fichier base
Cd.CommandText = "SELECT * FROM [Feuil1$A1:T1048576]"
Set Rst = New ADODB.Recordset
Rst.Open Cd, , adOpenKeyset, adLockOptimistic

' Boucler sur plusieurs lignes du fichier saisies
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

J'ai donc essayé de le rendre plus clair, mais aussi de définir toutes les variables.
Est-ce que vous pensez que cela est suffisant ? Avez-vous des conseils à me donner ?
Peut-être que certaines fonctions peuvent être remplacées pour que cela soit plus fonctionnel ?

Merci de votre aide.

A+
 
Dernière édition:

nak

XLDnaute Occasionnel
Re : Que faire pour nettoyer mon code ?

Bonsoir,

Je n'ai pas pensé qu'il fallait aussi revoir mon code qui sert à récupérer les infos dans le fichier base.xlsx.

Le voici :
Code:
Sub extractionValeurCelluleClasseurFermeXLSX()
Dim Donnee As String
    Application.ScreenUpdating = False: Range("A11").Resize(Range("A" & 2 ^ 20).End(xlUp).Row, 20).ClearContents
    Donnee = Range("F4").Value: Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\base.xlsx" & ";Extended Properties=""Excel 12.0;HDR=Yes;"";"
    Range("A11").CopyFromRecordset Source.Execute("SELECT * FROM [Feuil1$] WHERE Donnée_2= '" & Donnee & "'")
    Source.Close
    Set Source = Nothing
    Application.ScreenUpdating = True
End Sub

Est-ce que mes variables sont bien définies ?
J'ai un doute sur "Source".

Pouvez-vous m'aider SVP ?

Merci
 

Discussions similaires

Statistiques des forums

Discussions
312 238
Messages
2 086 492
Membres
103 234
dernier inscrit
matteo75654548