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 :

maj feuille excel via connexion ADO [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 54
    Par défaut maj feuille excel via connexion ADO
    Bonjour à tout les développeurs.
    Je vais essayer d'être assez clair :

    J'ai excel 2007.
    J'ai crée deux classeurs excel, "Panel_fournisseurs.xls" et "Tableau_de_suivi_des_Actions_Correctives_et_Préventives.xlsm", DSL pour les noms à rallonge

    Dans le premier classeur il n'y a qu'une feuille (panel_fournisseurs) avec un tableau avec entête. Au dessus de ce tableau il y a 7 lignes qui ne font pas parti de ce tableau.

    Dans le second classeur j'ai crée un bouton affecté à une macro qui ouvre un formulaire avec différentes données à renseigner puis un bouton valider.

    Jusque là tout va bien, je souhaite en cliquant sur le bouton valider mettre à jour un champ du tableau du 1er classeur sans ouvrir celui-ci.
    j'utilise donc la connection ADO, voici un bout de code pomper sur le net bien sûr :

    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
     
    Dim Cn As ADODB.Connection
    Dim Fichier As String, Feuille As String, strSQL As String
    Dim point As Integer
    Dim nom As String
    Fichier = "Panel_fournisseurs.xls"
    Feuille = "Panel_fournisseurs"
    point = 0
    nom = "test"
    Set Cn = New ADODB.Connection
        With Cn
            .Provider = "MSDASQL"
            .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
            "DBQ=" & Fichier & "; ReadOnly=False;"
            .Open
        End With
    strSQL = "UPDATE [" & Feuille & "$] SET " & _
            "Notes_obtenues = " & point & " WHERE Fournisseurs = '" & nom & "'"
        Cn.Execute strSQL   
        Cn.Close
        Set Cn = Nothing
    Ce code fonctionne très bien si mon tableau n'a aucune ligne au dessus de lui mais des que j'insère du texte dans une ligne au dessus ou même que la ligne (vide) est un peu trop haute il me dit :

    Erreur d'exécution'-2147217904 (30040e10)':
    [Microsoft][Pilote ODBC Excel] trop peu de paramètres. 2 attendu.


    Je suppose qu'il n'arrive pas à trouver l'entête du tableau a cause de ces lignes supplémentaires au dessus.

    J'essaye depuis hier de trouver un moyen de lui indiquer le nom du tableau qui est "table" dans ma requête strSQL mais il doit me manquer des infos au niveau de la syntaxe, quoique j'essaye il me dit erreur syntaxe UPDATE.

    Ces lignes au dessus du tableau sont obligatoires car c'est un formulaire imposé je ne peux donc pas les effacer et ca m'embête d'abandonner ce projet qui nous ferai gagner un temps précieux pour les m.a.j.

    Je vous remercie par avance pour votre aide.

  2. #2
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Bonjour,
    j'utilise ADO en VBA excel mais pas avec une source excel.
    Qu'importe, voici le code que j'utilise, il te suffira d'adapter le driver.

    Le principe est que via un Userform je saisis la source, le nom de la feuille résultat (qui se crée si inexistante) et la cellule de départ pour coller l'import.

    cela devrait t'aider.
    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
    Option Explicit
     
    Public Sub ReadFileI5Full(ByVal Input_File As String, ByVal Target_worksheet As String, ByVal Target_range As String)
    'ReadFileI5Full : get I5 data from Lib.file(member) and insert that in Worksheet at désired range cell
    'usage : ReadFileI5Full (File, Worksheet, Range)
    ' Input_File : can be either Lib.file
    '                    or Lib.File(member)
    ' Target_Worksheet : Must be a valid Worksheet Name : if exists : cleared before fullfillment
    '                                              if not exists : will be created
    ' Target_Range     : Must be a valid cell name : Example "A1"
     
        On Error GoTo ErrorHandler
     
        Dim cn          As New ADODB.Connection
        Dim rs          As New ADODB.Recordset
        Dim sConn       As String
        Dim SqlString   As String
        Dim FileName    As String
        Dim DSN_Name As String
        Dim ws          As String 'Results Storing Worksheet name
        Dim Rg          As String 'results Cells top left
        Dim cellule     As Range
        Dim CompA       As Integer
        Dim idx         As Long
        Dim sheet_found As Boolean
        Dim ActShName   As String
     
     
     
     
     
        sConn = "provider=IBMDA400;Data source=xxx.xxx.xxx.xxx;USER ID=xxxx;PASSWORD=xxxx"
        FileName = Trim(Input_File)
        ws = Trim(Target_worksheet)
        Rg = Trim(Target_range)
     
        'check target Worsksheet exists and if not build
        sheet_found = False
        For idx = 1 To Sheets.Count
            If Sheets(idx).Name = ws Then
                Application.DisplayAlerts = False
                Sheets(idx).Cells.Clear
                Application.DisplayAlerts = True
                sheet_found = True
                Exit For
            End If
        Next idx
        'Build Ws
        If Not sheet_found Then
            ActShName = ActiveSheet.Name
            Sheets.Add
            ActiveSheet.Name = ws
            Sheets(ActShName).Activate
        End If
     
        'Open Connection
        cn.ConnectionString = sConn
        cn.Open
        SqlString = "SELECT * FROM " & FileName & ""
     
        'open record Set
        rs.Open SqlString, cn
     
     
     
        'Paste Fields names in line 1
        Set cellule = Worksheets(ws).Range(Rg)
        For CompA = 0 To rs.Fields.Count - 1
            cellule.Offset(0, CompA).Value = rs.Fields(CompA).Name
        Next CompA
        'Paste results line above names
        Worksheets(ws).Range(Rg).Offset(1, 0).CopyFromRecordset rs
     
        rs.Close
        cn.Close
        Set cn = Nothing
        Set rs = Nothing
     
        Exit Sub
    ErrorHandler:
        ' clean up
        If Not cn Is Nothing Then
            If cn.State = adstateopen Then cn.Close
        End If
        Set cn = Nothing
        If Not rs Is Nothing Then
            If rs.State = adstateopen Then rs.Close
        End If
        If Err <> 0 Then
          MsgBox Err.Source & "-->" & Err.Description, , "Error"
        End If
     
    End Sub

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 54
    Par défaut
    Bonjour Godzestla,

    Merci pour ta réponse, c'est du rapide

    J'ai oublié de préciser que je suis complètement novice en vba donc je prend des bouts de codes à droite à gauche en essayant de comprendre comment ca marche.
    Je vais regarder ton code demain dans la journée au travail. Mais à première vue je vais bien galérer pour le comprendre lol.

    Tu te connecte sur quoi comme source alors une base access ?

    Merci encore pour l'aide.

  4. #4
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    C'est une base IBM I5. c'est vrai que si tu es novice en VBA, c'est plutôt pour commencer, mais qui n'ose rien ne peut décrocher la lune.

    Il y a pas mal de post dans le forum sur l'ADO avec excel.
    Retiens le principe de la fin de mon exemple pour le stockage des données à l'endroit que tu souhaites, le stockage du nom des zones au dessus des data et la récup des données en 1 seule instruction via .CopyFromrecordset.

    Bonne chance et surtout bonne lecture sur ce site. Je lui dois énormément.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Par défaut
    Bonjour,

    Si ton tableau est nommé,tu n'as pas besoin de la feuille

    si ton tableau n'est pas nommé par ex B6:F200

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tableau="B6:F200"
     UPDATE [" & Feuille & "$" & tableau"] SET

    Tu as un très tuto sur ado :
    http://silkyroad.developpez.com/VBA/ClasseursFermes/


  6. #6
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 54
    Par défaut
    Merci à vous,
    j'ai fait ca du coup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tableau = "A8:I109"
    strSQL = "UPDATE [" & NomFeuille & "$" & tableau & "] SET " & _
            "Notes_obtenues = " & point & " WHERE Fournisseurs = '" & nom & "'"
    Quand je met juste UPDATE Tableau SET c'est comme ça que j'ai nommé mon tableau.
    Il me dit qu'il connaît pas l'objet Tableau. J'essayerai de me pencher sur la question quand j'aurai du temps devant moi.

    En tout cas ça fonctionne c'est le principal merci à vous

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

Discussions similaires

  1. rendre visible une feuille Excel via un mot de passe
    Par babybell dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2022, 15h19
  2. Réponses: 7
    Dernier message: 14/03/2014, 13h39
  3. [XL-2003] rechercher les données d'une feuille excel via une useform
    Par t'chi ben dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/04/2009, 11h12
  4. Création de nouvelle feuilles Excel via ASP
    Par insane1 dans le forum Débuter
    Réponses: 4
    Dernier message: 13/02/2009, 15h48
  5. Feuilles Excel via VBA Access
    Par h_adil dans le forum VBA Access
    Réponses: 2
    Dernier message: 08/07/2008, 22h05

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