Ecrire dans classeur fermé partagé excel 2007 [Résolu/Fermé]

Signaler
Messages postés
2
Date d'inscription
jeudi 22 septembre 2011
Statut
Membre
Dernière intervention
23 septembre 2011
-
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
-
Bonjour,

J'ai pris cette procédure sur le net :

Sub EcrireFermé()
'
Dim chemin$, NomFich$
Dim classeur As Workbook
Dim base As Range

chemin = "d:\Mondossier\"
NomFich = "FichierFermé.xlsx"
Set classeur = GetObject(chemin & NomFich)
Set base = classeur.Sheets("Essai").Range("H2")
base = "Ecrire dans cellule"
MsgBox base

Workbooks(NomFich).Close False
'
End Sub

Je n'arrive pas à écrire dans la cellule base = Range("H2") du fichier fermé. Le message s'affiche correctement dans MsgBox

Merci pour votre aide et bonne journée

zeguedoua

5 réponses

Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 467
Bonjour,
Pour lire et écrire dans un classeur fermé grâce à excel, voir ce tutoriel
Messages postés
2
Date d'inscription
jeudi 22 septembre 2011
Statut
Membre
Dernière intervention
23 septembre 2011

Merci pijaku

J'ai adapté le code comme suit :

Sub ExportDonneeDansCelluleClasseurFerme()
    
    Dim Cn As ADODB.Connection
    Dim Cd As ADODB.Command
    Dim Rst As ADODB.Recordset
    Dim Fichier As String
    
    Fichier = "e:\ClasseurFermé.xlsx"
    
    Set Cn = New ADODB.Connection
    '--- 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=YES;"""
        .Open
    End With
    
    Set Cd = New ADODB.Command
    Cd.ActiveConnection = Cn
    Cd.CommandText = "SELECT * FROM [Liste$D2:D2]"
    
    Set Rst = New ADODB.Recordset
    Rst.Open Cd, , adOpenKeyset, adLockOptimistic
    Rst(0).Value = "Donnée test"
    Rst.Update
    Cn.Close
    Set Cn = Nothing
    Set Cd = Nothing
    Set Rst = Nothing
    
End Sub


Mais je n'arrive pas à modifier la cellule D2. Le message "Erreur 3021" BOF ou EOF est égal à True s'affiche. La commande Rst(0).Value = "Donnée test" est sélectionnée au debbogage. Au passage quel est le role des différents variables (en particulier Rst et Rst(0)) ?
Merci et à bientot

zeguedoua
Messages postés
16178
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
14 août 2020
3 004
bonjour

macro à adapter (XL2000)

Sub ecrire_cellule_dans_fermé()
'écrit la valeur de "G2" dans classeur fermé

Dim source As Object
Dim externe As Object
Dim fichier As String, onglet As String, nom_plage As String, texte_SQL As String


onglet = "ecrire" 'à adapter
' ouvre la  connexion avec la database "source" dans le classeur excel fermé
fichier = ActiveWorkbook.Path & "\fermé_ado.xls" ' à adapter
Set source = CreateObject("ADODB.Connection")
source.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & _
                "data source=" & fichier & ";" & _
                "extended properties=""Excel 8.0;HDR=No;"";"
                
nom_plage = "B2:B2" 'à adapter
' requete SQL de la cellule de destination; "nom_plage" est une "vraie-fausse base _
de données": une étiquette,une ligne
texte_SQL = "SELECT * FROM [" & onglet & "$" & nom_plage & "]"
Set externe = CreateObject("ADODB.Recordset")
externe.Open texte_SQL, source, adOpenKeyset, adLockOptimistic
    'externe.MoveFirst
    externe(0).Value = Range("G2").Value 'a adapter
    externe.Update
 
 externe.Close
 source.Close
 Set externe = Nothing
 Set source = Nothing
 
MsgBox "opération terminée"
End Sub
Messages postés
16178
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
14 août 2020
3 004
bonjour

il suffirait de paramétrer la macro
Sub ecrire_cellule_dans_fermé(cible)

....le code sans changement
nom_plage =cible & ":" & cible"

.....le code sans changement
End sub

et pour écrire dans la cellule C24 par ex.
sub reporter()
ecrire_cellule_dans_fermé "C24"
end sub

non testé

mais si tu as plusieurs cellules "cible", il faudrait revoir l'ensemble mais ce n'est pas ce que tu as demandé
Merci Michel_m.
J'ai adapté le code relatif au paramétrage des limites de plage et çà marche pour seulement la lecture. Ce code m'a été envoyé par pijaku. J'apprends beaucoup et merci pour l'aide spontanée que tous apportez aux débutants en programmation .

Sub LirePlageClasseurFerme()
    
    '     
    Dim Cn As ADODB.Connection
    Dim fichier As String
    Dim NomFeuille As String, Plage As String, texte_SQL As String
    Dim Ldeb, Lfin As Long
    Dim Rst As ADODB.Recordset
    
    'Définit le classeur fermé servant de base de données
    fichier = "e:\ClasseurFermé.xlsx"

    'Nom de la feuille dans le classeur fermé
    NomFeuille = "Liste$"       ' Ne pas oublier le $ à la fin des noms de feuille
        
    Ldeb = 2        ' Numéro de la première ligne de la plage
    Lfin = 10        ' Numéro de la dernière ligne de la plage
    Plage = "D" & Ldeb & ":D" & Lfin

    '--- Connexion ---
    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;"""
        ' Ici HDR=NO pour lire la bonne plage
        .Open
    End With
    
    ' *********************************** Lit une plage donnée du classeur fermé **************
    
    texte_SQL = "SELECT * FROM [" & NomFeuille & Plage & "]"
    Set Rst = New ADODB.Recordset
    Set Rst = Cn.Execute(texte_SQL)
    
    'Ecrit le résultat de la requête dans la plage de la feuille active du classeur actif
    Range("D" & Ldeb).CopyFromRecordset Rst  '  écrit le resultat dans D & Ldeb
    MsgBox Range("D" & Ldeb)
    
    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing
    '
End Sub


Avec cette aide je crois que je réussirai à écrire dans n'importe quelle cellule de classeur fermé.
Trois questions qui me tiennent à coeur
1 - peut-on supprimer une ligne d'un classeur fermé?
2 - peut-on faire un aperçu et imprimer une feuille d'un classeur fermé?
3 - peut-on appliquer un filtrage progressif selon un champ ( Nom ou Prenom) dans excel? (ex: taper B dans un textbox, puis R ce qui donne BR, ainsi de suite et afficher le résultat dans une listview)
Existe-t-il un chat sur les sites informatiques tels que CommentCamarche? Cela faciliterait les échanges

Mille fois merci, bonne soirée et A+
Messages postés
16178
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
14 août 2020
3 004
Bonjour,

Ci joint extrait sur les limitations d'XL d'un topo sur la technologie ADO rédigé par Michel_xld (silkyroad) avec les apports de @+Thierry et moi m^me

*	Les limitations d'Excel , utilisé comme une base de données 
Il n'est pas possible de supprimer les lignes complétes dans un classeur fermé (enregistrements )
Vous obtiendrez un message d'erreur "La suppression des données dans un table attachée n'est pas géré par le pilote ISAM" 
Vous pourrez uniquement vider les cellules 
Vous ne pourrez pas supprimer les lignes vides qui contenaient les données supprimées et les requetes continueront d'afficher l'es enregistrements vides correspondant à ces lignes vides. 
Il n'est pas possible de supprimer une cellule contenant une formule :
Vous aurez un message d'erreur "L'opération demandée n'est pas autorisée dans ce contexte"

Excel ne peut pas gérer les connections multiples et simultanées à un meme classeur
Les requetes répétées peuvent entrainer des problemes de mémoire disponible dans Excel
https://support.microsoft.com/en-us/help/319998 

Il n'est pas possible d'utiliser un classeur protégé par un mot de passe
Il n'est pas possible d'utiliser le classeur si la feuille contenant les données est protégée 

La gestion des tables :
Les onglets ( les tables ) contiennent le symbole $ en fin de nom , ce qui n'est pas le cas des plages de cellules nommées ( pourtant aussi considérées comme des tables lors des requetes )
Par contre si vous avez ajouté une table dynamiquement dans un classeur ( en utilisant par exemple "Create Table" ou "SELECT INTO" ) , 2 noms différents sont renvoyés pour cette nouvelle table : avec et sans $ 
En fait si vous ouvrez le classeur manuellement vous constaterez que l'onglet est bien ajouté mais aussi une plage de cellules nommées correspondant à la plage de données insérées dynamiquement ( voir Insertion/nom/definir )  ar exemple =maNouvelleFeuille!$A$1:$C$1265 

Nota :
Lors des requètes pour lister le nom des onglets d'un classeur fermé , par ADOX ou ADO(méthode openSchema) , les noms sont renvoyés par ordre alphabétique 
Par défaut , le pilote ODBC analyse uniquement les 8 premieres lignes du classeur fermé pour déterminer le type de données dans chaque colonne. 
Cela peut entrainer 2 types de problemes :
1. Dans certains cas particuliers , les données exportées vers un classeur fermé peuvent etre tronquées . Si , par exemple , les 8 premiers enregistrements d'un champ contiennent des données texte inférieur ou égal à 255 caractères , le champ sera considéré de type Texte . Si ensuite vous ajoutez des enregistrements de longueur plus importante ils seront tronqués .
https://support.microsoft.com/en-us/help/189897/ 
2. Si vous voulez importer les informations d'une colonne qui contient à la fois des données numériques et texte , c'est le type majoritaire dans les 8 premiere lignes qui définira le type de données à récupérer : les autres données de la colonnes seront considérées comme NULL (vide) 
Si la colonne contient 4 valeurs numériques et 4 valeurs texte , la requete renvoie 4 nombres et 4 valeurs NULL.
La seule solution consiste à activer l'option d'importation "IMEX=1" ( exemple : "extended properties=""Excel 8.0;IMEX=1""" ) . Les données numériques seront importées comme du texte .
Je n'ai pas vérifié le point suivant , mais l'aide MSDN indique :
Avertissement concernant la modification de données Excel à l'aide d'ADO : Lorsque vous insérez des données texte , la valeur de texte est précédée d'une apostrophe. Ceci peut provoquer des problèmes par la suite lors du travail 
Merci michel_m pour cette aide précieuse.
En effet le classeur de données est partagé et mis à jour par 06 utilisateurs. C'est le classeur de commande qui contient toute la programmation de l'application. Les procédures utilisées sont classiques et l'accès simultané au classeur partagé pose des problèmes (redémarrage d'excel : excel a cessé de fonctionner, création d'un fichier de récupération, conflit, etc.). Mon souhait est de permettre aux utilisateurs d'ajouter, de supprimer, de modifier ou de consulter des informations dans le classeur partagé. S'il existe d'autres possibilités alors je suis partant . Je vous enverrai l'application complète si cela ne vous gêne pas.
Bonne journée et A+
Salut Michel_m
Il y a eu une intérruption due à un problème de santé. Une fois de plus merci pour tout ce soutien sans lequel je n'aurai pas compris qu'excel est limité. Néanmoins comme je l'ai signifié dans le précédent message, j'enverrai le projet sur ci-joint, mais depuis j'essaie et çà ne passe pas. Cette petite application, conçue avec VBA excel 2007, permet de gérer un GVC de planteurs de plusieurs régions.
Merci à pijaku. A+
Messages postés
8700
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
22 janvier 2020
1 099
Bonjour tous,
Ce que tu veux faire n'est pas possible mais rien ne t'empêche d'ouvrir le classeur, de le mettre invisible et de travailler dessus ?
A+
Merci lermite222
Je posterai un message concernant un autre sujet. L'on m'a conseillé access, Je le trouve un peu compliqué pour moi. Mais je vais m'y mettre et exporter vers excel dont les tableaux ont un meilleur design.
A+
Messages postés
30
Date d'inscription
lundi 24 juin 2013
Statut
Membre
Dernière intervention
21 octobre 2013
3
salut tout le monde je me retrouve encore avec une run-time error '3021' avec ce code ci :
Sub spider_graph()
Dim Cn As ADODB.Connection
Dim Cd As ADODB.Command
Dim Rst As ADODB.Recordset
Dim fichier As String

fichier = "C:\Documents and Settings\mslimani060313\Desktop\Tests\Radar spider graph de risque.xlsx"
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=YES;"""
.Open
End With

Set Cd = New ADODB.Command
Cd.ActiveConnection = Cn
Cd.CommandText = " SELECT * FROM [Spider Graph $F43:F43]"

Set Rst = New ADODB.Recordset

Rst.Open Cd, , adOpenKeyset, adLockOptimistic
If Rst.EOF Then
MsgBox "matching data"
Rst(0).Value = "avec bdd tout est possible"
Else
MsgBox "no matching data"
End If
Rst.Update
Cn.Close

Set Cn = Nothing
Set Cd = Nothing
Set Rst = Nothing

End Sub

Private Sub spider_graph_2()

'écrit la valeur de "G2" dans classeur fermé

Dim source As Object
Dim externe As Object
Dim fichier As String, onglet As String, nom_plage As String, texte_SQL As String


onglet = "Spider Graph " 'à adapter
' ouvre la connexion avec la database "source" dans le classeur excel fermé
fichier = "C:\Documents and Settings\mslimani060313\Desktop\Tests\Radar spider graph de risque.xlsx" ' à adapter
Set source = CreateObject("ADODB.Connection")
With source
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
End With
'source.Open "Provider = Microsoft.Jet.OLEDB.4.0;" & _
' "data source=" & fichier & ";" & _
' "extended properties=""Excel 12.0;HDR=No;"";"

nom_plage = "B2:B2" 'à adapter
' requete SQL de la cellule de destination; "nom_plage" est une "vraie-fausse base _
de données": une étiquette,une ligne
texte_SQL = "SELECT * FROM [" & onglet & "$" & nom_plage & "]"
Set externe = CreateObject("ADODB.Recordset")
externe.Open texte_SQL, source, adOpenKeyset, adLockOptimistic
'externe.MoveFirst
externe(0).Value = Range("G2").Value 'a adapter
externe.Update

externe.Close
source.Close
Set externe = Nothing
Set source = Nothing

MsgBox "opération terminée"
End Sub


quelqu'un pour m'aider s'il vous plait ?
Messages postés
12184
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
31 juillet 2020
2 467
Bonjour,
Pour que ta demande soit traitée dans les meilleures conditions, je te recommande d'ouvrir un nouveau sujet.