Connection fichier fermé

[Résolu/Fermé]
Signaler
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020
-
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020
-
Bonjour chers amis
Quelqu'un aurait il sous le coude une fonction qui me permette de vérifier dans un fichier fermé "X " la présence d'une feuille "A" .Au cas échéant y coller des données , sinon créer la feuille "A" et y coller les données.
Et tout ça sans ouvrir le dit fichier "X" qui se trouve dans le meme répertoire que le fichier source "W" .
Je vous remercie de votre aide.

Cordialement




8 réponses

Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 705
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020
32
Merci Patrice
Oui je connais bien ce site incontournable qui permet de se connecter dans un classeur fermé.
Mais dans mon cas , il ne s'agit pas d'une database access .
.
Cordialement
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 705
et l'ajout de feuille n'est-il pas réalisable par cette méthode ?
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020
32
Bonjour

J'obtiens l'erreur "erreur de compilation" sur la déclaration
Dim ExcelCn As ADODB.Connection


Sinon je tente d'envoyer le fichier test mais le site ci-joint est visiblement non fonctionnel. Yaurai t il un autre moyen pour joindre le fichier?

Bien à vous
Messages postés
16527
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
23 octobre 2021
3 232
Bonjour

C'est possible mais compliqué et long si une feuille Excel est considéré comme une table de base de données : en plus de ADODB il faut utiliser ADOX (ADOX: gestion des métadonnées pour création de table ou absence de tables, champs, type de données...).

Il faut que le classeur X n'ait pas de mots de passe (classeur et feuilles) et que les feuilles soient organisées en liste de données; Les ent^tes ne doivent pas comporter d'espace ni de caractères accentués.

un exemple (XL2003) recherche table(feuille) SI A existe on liste les champs (ent^te)
Set cat = New ADOX.Catalog
Set cat.ActiveConnection = conn
' énumère les tables de la base commencant par "A"
For Each T_xxx In cat.Tables
If Left(T_xxx.Name, 1) = "A" Then
Msgbox "A existe"
End If
Next


si A n'existe pas il faut créer la liste de données (table): le plus facile est d'ouvrir ton fichier et de créer cette feuille avec les noms de champs sans espace ni caractère accentués. on ne fait cela qu'une fois. sinon on peut le faire avec ADOX (bonjour le boulot)

Ensuite pour insérer des données tu utilises "INSERT TO" avec une requête en SQL ou add.new si c'est une nouvelle ligne

Compte bien 2 jours de boulot avec les essais
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020
32
Merci les gars

Une autre approche sur laquelle j'ai travaillé la semaine dernière mais qui me parait maintenant plus simple comparée à la méthode ADOX.
Le fichier X est créé dans un dossier situé dans le même répertoire puis la présence de la feuille A est testée avant d'engager l'ajout des données.
Je suis sure que ce fichier joint sera plus parlant que mes explications.
http://www.cjoint.com/c/FJgiOFZTSOA
Pourriez-vous me le sublimer?

Merci de votre aide
Messages postés
16527
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
23 octobre 2021
3 232
RE,

d'accord mais tu avais écris
Et tout ça sans ouvrir le dit fichier "X"

et dans le code que tu indiques, on a:
Set OutputFile = Workbooks.Open(fissa)

?????

Nota:Si tu as posé ton pb sur plusieurs forums, il est d'usage d'indiquer ceux ci dans ta demande


Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020
32
Oui Michel
Etant donné que la méthode adox qui peut me permettre de me connecter sans ouvrir la feuille est plutôt "compliquée" pour moi, j'ai ressorti celle-ci que j'avais débuté la semaine dernière.
Mais toujours est-il , si tu me proposes une solution ado (plus rapide et sans ouverture intempestive de feuille ) je suis vraiment preneuse.

Julia
Messages postés
16527
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
23 octobre 2021
3 232
re,
je t'avais écris que il y en avait pour 2 jours de boulot (peut-^tre 1,5 ou1) et là, on est loin du coup de main sur une difficulté qui est la raison des forums d'entraide...

Etant donné que la méthode adox qui peut me permettre de me connecter sans ouvrir la feuille est plutôt "compliquée" pour moi

pour se connecter, ce n'est pas ADOX mais ADO

ADOX est utilisé si tu as à construire ou décrire une base de données et ses tables (table= feuille A) la technique est identique que ce soit access ou excel (pas de clés primaires et étrangères avec excel). je t'ai indiqué les conditions: "noms de champs sans espace ni caractère accentués" Michel Tanguy-silkyroad a énoncé ces règles et d'autres sur DVP

tuto sur adox
https://vb.developpez.com/bidou/adox/

Mais si ton fichier X est unique pourquoi ne pas créer la feuille et ses ent^tes une bonne fois pour toutes ?

un exemple sur XL2000 le script de connexion change à partir de XL2007
Sub ecrire_db_fermé()
'écrit enregistrements dans une table de base de données "db_ecrire"
' Michel_M, modifié en septembre 04

Dim source As ADODB.Connection
Dim externe As ADODB.Recordset
Dim fichier As String, texte_SQL As String
Dim valeur0 As Variant
Dim valeur1 As Variant

'teste si le classeur source est fermé
If FichOuvert("fermé_ado.xls") = True Then
MsgBox "Pour que l'opération demandée soit effectuée," & vbCr & _
"Le classeur ""fermé_ado.xls"" doit être fermé ", vbCritical
Exit Sub
End If

' affecte la valeur à écrire dans fermé.xls
'nota: penser à exclusion si valeurX est vide
valeur0 = Range("J2").Value
valeur1 = Range("K2").Value

' connecte à la database "source" dans le classeur excel fermé
fichier = ActiveWorkbook.Path & "\fermé_ado.xls"
Set source = New ADODB.Connection ' ADAPTER SI>= XL2007
source.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & _
"data source=" & fichier & ";" & _
"extended properties=""Excel 8.0;"""

' travail demandé: insère dans le champ "report" de "db_ecrire" (cellules nommées) la valeur de "J2 et K2,"
texte_SQL = "INSERT INTO db_ecrire (champ0,champ1) VALUES ('" & (valeur0) & "','" & (valeur1) & "')"
' éxécute le travail demandé
Set externe = New ADODB.Recordset
Set externe = source.Execute(texte_SQL)

source.Close

MsgBox " opération terminée"

End Sub


Bon courage

 Michel
Messages postés
493
Date d'inscription
jeudi 27 mars 2014
Statut
Membre
Dernière intervention
26 décembre 2020
32
Merci de ton aide Michel

Sinon par rapport au fichier que j'ai envoyé , qu'est ce qu'il est possible de faire pour le corriger?
Julia