IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème de variables ? Appel d'un fichier sur le serveur/màj bdd mysql


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Par défaut Problème de variables ? Appel d'un fichier sur le serveur/màj bdd mysql
    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!

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 682
    Par défaut
    salut,
    je partirai sur une simplification comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set wsCtcts = Worksheets(Textbox1.Value)
     
    With wsCtcts
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 48
    Par défaut
    ça marche comme ça en effet, merci bien pour la réponse.

    Je crée un autre post pour mon problème de boucle, pour que ce ne soit pas trop confus.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/09/2007, 15h09
  2. même problème acces concurrent aux fichiers sur le serveur
    Par al3alwa dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 11/06/2007, 16h51
  3. Problème de dépot de fichier sur un serveur
    Par PHIL45 dans le forum Delphi
    Réponses: 3
    Dernier message: 18/01/2007, 17h13
  4. Réponses: 2
    Dernier message: 18/08/2006, 12h30
  5. Réponses: 1
    Dernier message: 21/01/2006, 16h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo