Ecrire et Modifier dans un classeur .xlsm fermé

naru31

XLDnaute Nouveau
Bonjour,

D'abord, voici ma situation :
-J'ai un 1er classeur en .xlsm me servant de base de données, que j'ai nommé "BDD TMT.xlsm" et dont mes données se trouvent sur la première feuille nommé "Topics".
-J'ai un 2ème classeur en .xlsm me servant de visionneuse, que j'ai nommé "Topic Management Tool.xlsm" et dont les données de la feuille "Topics" du classeur fermé "BDD TMT.xlsm" sont récupérés dans la 1ère feuille nommé aussi "Topics" via la macro suivante :

Sub Import_Data()
Dim Cn As ADODB.Connection
Dim Fichier As String
Dim NomFeuille As String, texte_SQL As String
Dim Rst As ADODB.Recordset

'Définit le classeur fermé servant de base de données
Fichier = "C:\BDD TMT.xlsm"
'Nom de la feuille dans le classeur fermé
NomFeuille = "Topics"

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
'-----------------

'Définit la requête.
texte_SQL = "SELECT * FROM [Topics$]"

Set Rst = New ADODB.Recordset
Set Rst = Cn.Execute(texte_SQL)

'Ecrit le résultat de la requête dans la cellule A2
Range("A2").CopyFromRecordset Rst

'--- Fermeture connexion ---
Cn.Close
Set Cn = Nothing

End Sub

Donc j'arrive bien à récupérer les données de mon classeur fermé "BDD TMT.xlsm" mais je n'arrive pas à comprendre comment je peux modifier les données et écrire des nouvelles données (nouvelles lignes) dans mon classeur fermé "BDD TMT.xlsm" à partir de mon classeur ouvert "Topic Management Tool.xlsm".
Bref je souhaiterai renvoyez toute mes modifications et mes nouvelles données de mon classeur ouvert "Topic Management Tool.xlsm" dans mon classeur fermé "BDD TMT.xlsm".

Est-ce que quelqu'un peut m'aider, svp ?

Merci d'avance
 
Dernière édition:

naru31

XLDnaute Nouveau
Re : Ecrire et Modifier dans un classeur .xlsm fermé

À la base, je pensai posé la question sur plusieurs sites pour être sûr d'avoir une réponse qui convienne à mon problème.

Donc désolé mais je ne savais pas que le site excel-downloads.com et developez.com étaient "le" même site.... et qu'ils avaient la même communauté de personnes...dans ce cas là, pourquoi 2 sites ?

Pour le :
on ne t'as pas déjà donné la solution? Par exemple ICI

Je n'arrive pas à l'appliquer, voir ma réponse ICI.


Et pour le :

Et on t'as même donné ceci SOLUTION

Justement, j'indique que je n'arrive pas à la comprendre et à l'appliquer et c'est pour ça que j'ai ouvert ces discussions ?
 
Dernière édition:

naru31

XLDnaute Nouveau
Re : Ecrire et Modifier dans un classeur .xlsm fermé

Merci tatiak de ta réponse, je vais regarder ça de plus près et je vous tiens au courant dans le weekend ;)

@Lone-Wolf : c'est aussi ce qui m'étonnait suite à ta précédente réponse, ça me donnait une impression d'être..."pister"...comme si j'avais écrit 2 topic sur le même site et que j'étais remis à l'ordre !!!...
 

Roland_M

XLDnaute Barbatruc
Re : Ecrire et Modifier dans un classeur .xlsm fermé

Bonjour,

travailler sur des classeurs fermés c'est valable si c'est sur un grand nombre !

ici franchement, sur un seul classeur, tu aurais plus vite fait de l'ouvrir, effectuer tes modif, sauver puis refermer.
tout ceci par code évidemment !
 

naru31

XLDnaute Nouveau
Re : Ecrire et Modifier dans un classeur .xlsm fermé

@tatiak : j'ai regardé ton exemple qui est génial !!! mais ta base est sur Access et comme tous les futurs utilisateurs de mon programme n'ont pas forcément Access, j'ai peur que cela créé certaine problématique, donc je souhaiterais rester sur Excel avec une BDD Excel...

@Roland_M : J'avoue que j'ai pensé à ton idée qui est beaucoup, beaucoup plus simple (ça je sais faire !!!) mais si tout se passe bien, ce serait un programme utilisé par plusieurs utilisateurs en même temps (>10pers) et je souhaiterai que ceux-ci puisse charger la BDD au démarrage et qu'à chaque enregistrement il puisse renvoyer les nouvelles données ou les données modifiées directement dans la BDD sans que cela créé des litiges de partage de dossiers ou des problèmes d'enregistrement car le fichier est déjà ouvert par une autre personne...Après si il y a moyen par ce biais là en évitant ces problématiques, je suis preneur...

Pour info, j'ai commencé à comprendre un peu comment faut faire, j'ai fait des boucles pour que ça prenne toutes les données de mon tableau en long et en large (ligne et colonne), mais je rencontre quelques problèmes de syntaxe... à priori les requêtes SQL n'aime pas trop les "." ou les "^", etc... Est-ce qu'il existe une liste de tous ce qu'il n'aime pas ? Et est-ce qu'il y a moyen de contourner ce problème ? Ou est-ce que c'est mon code qui est mauvais ?

Code:
Sub miseAJour_Enregistrement()

    Dim Cn As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim BDD As String
    Dim SheetBDD As String, Req_SQL As String
    Dim valID As String, Header As String, valField As String
    Dim l_col, l_row
    Dim i, j
    
    'Définit le classeur fermé servant de base de données
    BDD = "C:\BDD.xlsm"
    SheetBDD = "Topics"
    l_col = Sheets("Topics").Range("XFD1").End(xlToLeft).Column
    l_row = Sheets("Topics").Range("A1048576").End(xlUp).Row
        
    Set Cn = New ADODB.Connection
    
    '--- Connection ---
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & BDD & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
    '-----------------
    
    'Définit la requête.
    
    For i = 1 To l_row - 1
        valID = Sheets(SheetBDD).Range("A" & i + 1).Value
        For j = 1 To l_col - 1
            Header = Sheets(SheetBDD).Cells(1, j + 1).Value
            If Sheets(SheetBDD).Cells(i + 1, j + 1).Value <> "" Then
                valField = Sheets(SheetBDD).Cells(i + 1, j + 1).Value
                Req_SQL = "UPDATE [" & SheetBDD & "$] SET [" & Header & "]= '" & valField & "' WHERE [ID] = '" & valID & "';"
                Set Rst = Cn.Execute(Req_SQL)
            End If
        Next j
    Next i
    
    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing
    
        
End Sub
 

pascal21

XLDnaute Barbatruc
Re : Ecrire et Modifier dans un classeur .xlsm fermé

Bonjour tatiak :)

@naru: bein tu te trompe, Developpez.com et Excel-Downloads.com sont deux sites bien distincts. Rien à voir l'un avec l'autre.
bonjour et si l'on retrouve les memes contributeurs c'est parceque ils sont passionnés et veulent pouvoir aider partout
 

naru31

XLDnaute Nouveau
Re : Ecrire et Modifier dans un classeur .xlsm fermé

@tatiak : merci encore de ton aide, je vais regarder cela de plus près...et je pense m'être tromper sur l'enregistrement de plusieurs car de toute façon fera du ligne par ligne, donc il faut que je revois mon code...

@pascal : c'est bien l'idée que je me faisait des contributeurs ;)
 

naru31

XLDnaute Nouveau
Re : Ecrire et Modifier dans un classeur .xlsm fermé

A priori ce code a l'air de bien fonctionner pour mettre à jour les données, et je n'ai plus de problème avec certains cararactères pour l'instant, et je n'ai pas fait grand chose à part limiter la modification à 1 seule ligne... Youpie !! :D :

Code:
Sub Update_Data()
 
    Dim Cn As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim BDD As String
    Dim SheetBDD As String, Req_SQL As String
    Dim valID As String, Header As String, valField As String
    Dim l_col, l_row
    Dim i, j
 
    'Définit le classeur fermé servant de base de données
    BDD = "C:\BDD.xlsm"
    SheetBDD = "Topics"
    l_col = Sheets("Topics").Range("XFD1").End(xlToLeft).Column
    l_row = Sheets("Topics").Range("A1048576").End(xlUp).Row
 
    Set Cn = New ADODB.Connection
 
    '--- Connection ---
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & BDD & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
    '-----------------
 
    'Définit la requête.
 
    For i = 1 To l_row - 1
        valID = Sheets(SheetBDD).Range("A" & i + 1).Value
        If valID = "xxxxx" Then
            For j = 1 To l_col - 1
                Header = Sheets(SheetBDD).Cells(1, j + 1).Value
                If Sheets(SheetBDD).Cells(i + 1, j + 1).Value <> "" Then
                    valField = Sheets(SheetBDD).Cells(i + 1, j + 1).Value
                    Req_SQL = "UPDATE [" & SheetBDD & "$] SET [" & Header & "]= '" & valField & "' WHERE [ID] = '" & valID & "';"
                    Set Rst = Cn.Execute(Req_SQL)
                End If
            Next j
        End If
    Next i
 
    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing
 
End Sub


Mais je bloque maintenant sur l'enregistrement de nouvelle données (ajout de nouvelle ligne dans la BDD), quand j'exécute la macro ci-dessous, ben absolument rien ne se passe, pas d'erreur et pas d'enregistrement... :confused:

Code:
Sub Add_Data()
 
    Dim Cn As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim BDD As String
    Dim SheetBDD As String, Req_SQL As String
    Dim valID As String, Header As String, valField As String
 
    'Définit le classeur fermé servant de base de données
    BDD = "C:\BDD.xlsm"
    SheetBDD = "Topics"
 
    Set Cn = New ADODB.Connection
 
    '--- Connection ---
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
            & BDD & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        .Open
    End With
    '-----------------
 
    'Définit la requête.
    Req_SQL = "INSERT INTO [Topics$] (ID,TOPIC) VALUES ('00-A0-0001','Test');"
 
    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing
 
End Sub

Pourquoi ?
 
Dernière édition:

naru31

XLDnaute Nouveau
Re : Ecrire et Modifier dans un classeur .xlsm fermé

Merci beaucoup de vos aides ... dans le doute je garde comme même tous vos conseils de côté ;)

Voici mon code qui fonctionne pour le moment, Youpie !!! :D :

-Pour importer des données de ma BDD

Sub Import_Data_SQL()
'
'
' Macro made by Naru

'
' =Import Data= '

'===========================================================================================
'Statements
'-------------------------------------------------------------------------------------------
Dim Cn As ADODB.Connection
Dim BDD As String
Dim SheetBDD As String, Req_SQL As String
Dim Rst As ADODB.Recordset
'===========================================================================================

'===========================================================================================
'Boots
'-------------------------------------------------------------------------------------------
BDD = "C:\BDD.xlsm"
SheetBDD = "Topics"
'===========================================================================================

'==>Init
If Sheets(SheetBDD).Range("A2").Value <> "" Then
Sheets(SheetBDD).Range(Rows("2:2"), Rows("2:2").End(xlDown)).Delete Shift:=xlUp
End If
Set Cn = New ADODB.Connection


'==>Open connection
With Cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& BDD & ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
End With


'==>Request
Req_SQL = "SELECT * FROM [" & SheetBDD & "$]"
Set Rst = New ADODB.Recordset
Set Rst = Cn.Execute(Req_SQL)

'==>Update Data
Sheets(SheetBDD).Range("A2").CopyFromRecordset Rst

'==>Close connection
Cn.Close
Set Cn = Nothing

End Sub


-Pour mettre à jour des données dans ma BDD

Sub Update_Data_SQL()
'
'
' Macro made by Naru

'
' =Update Data= '

'===========================================================================================
'Statements
'-------------------------------------------------------------------------------------------
Dim Cn As ADODB.Connection
Dim Rst As ADODB.Recordset
Dim BDD As String
Dim SheetBDD As String, Req_SQL As String
Dim valID As String, Header As String, valField As String
Dim l_col, l_row
Dim i, j
'===========================================================================================

'===========================================================================================
'Boots
'-------------------------------------------------------------------------------------------
BDD = "C:\BDD.xlsm"
SheetBDD = "Topics"
l_col = Sheets(SheetBDD).Range("XFD1").End(xlToLeft).Column
l_row = Sheets(SheetBDD).Range("A1048576").End(xlUp).Row
'===========================================================================================

'==>Init
Set Cn = New ADODB.Connection


'==>Open connection
With Cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& BDD & ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
End With


'==>Request
For i = 1 To l_row - 1
valID = Sheets(SheetBDD).Cells(1 + i, 1).Value
If valID = Sheets(SheetBDD).Range("DQ1").Value Then
For j = 1 To l_col - 1
Header = Sheets(SheetBDD).Cells(1, j + 1).Value
If Sheets(SheetBDD).Cells(i + 1, j + 1).Value <> "" Then
valField = Sheets(SheetBDD).Cells(i + 1, j + 1).Value
Req_SQL = "UPDATE [" & SheetBDD & "$] SET [" & Header & "]= '" & valField & "' WHERE [ID] = '" & valID & "';"
Set Rst = Cn.Execute(Req_SQL)
End If
Next j
End If
Next i


'==>Close connection
Cn.Close
Set Cn = Nothing

'==>Import Data
Call Import_Data_SQL

End Sub


-Pour ajouter des nouvelles données dans ma BDD

Sub Add_Data_SQL()
'
'
' Macro made by Naru

'
' =Add Data= '

'===========================================================================================
'Statements
'-------------------------------------------------------------------------------------------
Dim Cn As ADODB.Connection
Dim Rst As ADODB.Recordset
Dim BDD As String
Dim SheetBDD As String, Req_SQL As String
Dim valID As String
'===========================================================================================

'===========================================================================================
'Boots
'-------------------------------------------------------------------------------------------
BDD = "C:\BDD.xlsm"
SheetBDD = "Topics"
'===========================================================================================

'==>Init
Set Cn = New ADODB.Connection


'==>Open connection
With Cn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
& BDD & ";Extended Properties=""Excel 12.0;HDR=YES;"""
.Open
End With


'==>Request
valID = Sheets(SheetBDD).Range("DQ1").Value
Req_SQL = "INSERT INTO [Topics$] (ID) VALUES ('" & valID & "');"
Set Rst = Cn.Execute(Req_SQL)


'==>Close connection
Cn.Close
Set Cn = Nothing

'==>Update Request
Call Update_Data_SQL

End Sub
 

Chombi

XLDnaute Occasionnel
Bonjour à tous, Bonjour naru31, tatiak

je me permet de rouvrir ce fil qui pourrait m'apporter une bonne solution

ma BDD comporte des données sur les colonnes A à BC, je voudrai récupérer ces données sur un fichier A. (avec le code 1 ça fonctionne parfaitement)
Dans le fichier A, Chaque lignes peuvent être amener a être modifier de même que le nombre de lignes peut être amener à augmenter ou diminuer, les codes 2 et 3 devraient pouvoir me permettre de mettre à jour ma BDD si j'ai bien compris.
le code Sub Import_Data_SQL() fonctionne parfaitement
le code Sub Update_Data_SQL() ne fait rien alors qu'il devrait modifier la BDD (si j'ai tout compris)
le code Sub Add_Data_SQL() bug sur la ligne "Set Rst = Cn.Execute(Req_SQL) la fenêtre qui apparaît est :
"l'instruction INSERT INTO contient un nom de champ inconnu suivant: "ID" etc.." j'ai pourtant défini le champ mais je n'ai pas du le faire correctement

si quelqu'un peut m 'aider Merci
 

Chombi

XLDnaute Occasionnel
Re Bonjour

ci joint les 2 fichiers de naru31 qui font la même chose que mes fichiers
- importation fonctionne bien avec le code 1
- pas de modification avec le code 2
- pas de mise à jour avec le code 3 et bug sur la ligne : "Set Rst = Cn.Execute(Req_SQL)"

si une bonne âme passe par ici
 

Pièces jointes

  • TMT.xlsm
    38.6 KB · Affichages: 27
  • BDD TMT.xlsm
    17.5 KB · Affichages: 20

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
314 628
Messages
2 111 337
Membres
111 105
dernier inscrit
Joffrette