Bonjour,

je suis en train de faire une macro pour Excel à l'aide de VBA qui doit appeler des fichiers distants présent sur le serveur.
Cette macro marche.
Ensuite, je dois utiliser les données récupérées par cette macro et les insérer dans une base de données MySQL.
Cela marche aussi.

Mon problème est, que pour l'instant je n'arrive à faire marcher cela que quand je copie/colle tout le code en entier en fonction de chaque utilisateur (un fichier sur le serveur par utilisateur), ce qui n'est pas très optimal !

Donc j'ai créé un Userform avec des CommandButton et je voulais donc qu'une variable prenne tel ou tel nom en fonction du bouton sur lequel on clique, et que mon code se lance. Ainsi j'espère n'avoir qu'une seule fois mon code (au lieu de 19 fois actuellement !)

Seulement, ça ne marche pas ! Au début j'avais des soucis pour que mes variables apparaissent bien dans les modules et maintenant, cela semble bloquer au niveau du With, j'ai sans arrêt ce message qui s'affiche :

l'objet associé doit être de type défini par l'utilisateur object ou variant
Là j'ai essayé de passer par des Textbox avec une valeur qui s'insère dans la Textbox en fonction du bouton, et ensuite utiliser Textbox.Value, ça semblait une bonne idée... mais ça plante au niveau du With (sans message d'erreur, mais Excel ne répond plus).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
Sub MaJBase()
    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 = "\\Serveur\Fichiers Individuels\" & Textbox1.Value & ".xls"
    MsgBox Fichier
    'Nom de la feuille dans le classeur fermé
    NomFeuille = "saisie"
    
    Set Cn = New ADODB.Connection
    
    '--- Connection ---
    With Cn
        .Provider = "Microsoft.Jet.OLEDB.4.0"
        .ConnectionString = "Data Source=" & Fichier & _
            ";Extended Properties=Excel 8.0;"
        .Open
    End With
    '-----------------
    
    'Définit la requête.
    '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
    texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
    
    Set Rst = New ADODB.Recordset
    Set Rst = Cn.Execute(texte_SQL)
    
    'Ecrit le résultat de la requête dans la cellule A2
    Sheets("" & Textbox1.Value & "").Select
    ActiveSheet.Range("A2").CopyFromRecordset Rst
    Sheets("MaJ").Select
    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing
xlInsertData
End Sub

Function esc(txt As String) ' fonction pour remplacer les simples quotes par \'
    esc = Trim(Replace(txt, "'", "\'"))
End Function

Sub xlInsertData()
Dim Rs As ADODB.Recordset
Set Rs = New ADODB.Recordset
Dim oconn2 As ADODB.Connection
Set oconn2 = New ADODB.Connection
On Error Resume Next
oconn2.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _
"SERVER=localhost;" & _
"DATABASE=test;" & _
"USER=test;" & _
"PASSWORD=test;" & _
"Option=3"
Set NomColl3 = blop
MsgBox NomColl3

Dim wsCtcts As Worksheet
Set wsCtcts = Worksheets("" & Textbox1.Value & "")

With " & Textbox1.Value & "  '<- c'est souvent là que ça bloque
Dim rowctr As Integer
Dim strSQL As String
        rowctr = 4 ' commencer depuis la ligne 4
        While Trim(.Cells(rowctr, 1)) <> ""
            strSQL = "INSERT INTO saisie (Journee, Imputation, Tache, Lieu, Notes, Collaborateur) " & _
            "VALUES ('" & esc(Trim(Format(.Cells(rowctr, 1).Value, "YYYY/MM/DD"))) & "', '" & _
            esc(Trim(.Cells(rowctr, 2).Value)) & "', '" & _
            esc(Trim(.Cells(rowctr, 3).Value)) & "', '" & _
            esc(Trim(.Cells(rowctr, 4).Value)) & "', '" & _
            esc(Trim(.Cells(rowctr, 5).Value)) & "', '" & _
            esc(Trim(.Cells(rowctr, 7).Value)) & "')" & _
            "ON DUPLICATE KEY UPDATE Journee = '" & _
            esc(Trim(Format(.Cells(rowctr, 1).Value, "YYYY/MM/DD"))) & "', Imputation = '" & _
            esc(Trim(.Cells(rowctr, 2).Value)) & "', Tache = '" & _
            esc(Trim(.Cells(rowctr, 3).Value)) & "', Lieu = '" & _
            esc(Trim(.Cells(rowctr, 4).Value)) & "', Notes = '" & _
            esc(Trim(.Cells(rowctr, 5).Value)) & "', Collaborateur = '" & _
            esc(Trim(.Cells(rowctr, 7).Value)) & "'"

            Rs.Open strSQL, oconn2, adOpenDynamic, adLockOptimistic
            rowctr = rowctr + 1
        Wend
'        Strsql2 = "Delete from saisie where Imputation = ''"
'       Rs.Open Strsql2
    End With
    oconn2.Close
    Set oconn2 = Nothing
    Rs.Close
    Set Rs = Nothing
End Sub
Il est possible que mon code soit loin d'être propre, je suis ouvert à toute suggestion!

Note : si je mets mon code dans un module, sans variables (avec directement le nom de l'utilisateur) : il marche.
Mais si je mets à la suite des Commandbutton_click dans le code de mon userform : il ne marche pas. Je ne sais pas si ça peut aider, mais je dis un peu tout ce que j'ai pu observé lors de mes tests.

D'ailleurs, actuellement j'écris les données de la feuille sur le serveur dans mon fichier ouvert, car je n'ai pas réussis à exploiter le Recordset créé, et à appliquer dessus une autre commande sur une autre connexion, donc c'est un peu du bricolage mais ça a le mérite de marcher... (l'idéal serait je pense :
créer la connexion avec le fichier excel, faire la commande qui crée le recordset des données, fermer la connexion avec le fichier, ouvrir la connexion avec la base de données mysql, effectuer une commande sur le recordset en utilisant la nouvelle connexion, fermer la connexion, fermer le recordset, vider, mais je n'y suis pas parvenu).

Merci par avance pour votre aide!