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 :

Variable SQL issu d'une liste de données Excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut Variable SQL issu d'une liste de données Excel
    Bonjour
    Avoir avoir créée une table et inséré une variable grace à l'aide ce forum à la rubrique SQL, je bascule dans la rubrique Excel pour poursuivre ce que j'essaie de faire
    J'essaie d'insérer dans une variable d'une requete SQL, une liste de donnée issue d'une plage de données Excel.
    Ci dessous ma procédure stockée.

    Code SQL : 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
    USE [Customer]
    GO
    /****** Object:  StoredProcedure [dbo].[MAJ_TableCAB]    Script Date: 30/08/2022 13:16:04 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    /****** Object:  StoredProcedure [dbo].[MAJ_TableCAB]    Script Date: 30/08/2022 09:50:23 ******/
     
     
    ALTER PROCEDURE [dbo].[MAJ_TableCAB] -- Creation de la procedure
     
    @Nom varchar(50)
     
    AS
    BEGIN
    SET NOCOUNT ON;
     
     
     
    IF OBJECT_ID('tempdb..#MyTblCAB') IS NOT NULL DROP TABLE #MyTblCAB -- 
     
     
    CREATE  TABLE #MyTblCAB (
        CAB varchar(30)
      )
     
     
    ----Inserer les données dans la table  "TblCAB"
    INSERT INTO #MyTblCAB (CAB)
    Values(@nom)
     
     
    select*
    from #MyTblCAB MyTblCAB
     
    end


    Ce que j'essaie de faire, c'est d'insérer dans la variable @nom, une liste de donnée issue d'une feuille Excel de la cellule A2 jusqu'à la dernier ligne vide de la colonne A exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    With Sheets("NumCAB")
            Derligne = .Range("A65000").End(xlUp).Row
            For i = 2 To Derligne
    Cette variable serait je suppose avec la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sql = "[Customer].dbo.MAJ_TableCAB" ' je nomme ma procédure stockée

    Voici le code VBA
    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
    Sub MAJ_InsertionCAB()
     
     
      Dim cn As ADODB.Connection
      Dim cm As ADODB.Command
      Dim rs As ADODB.Recordset
      Dim sql As String
      Dim GenereCSTRING As String
      Dim i As Integer
      Dim lesCols As Range
      Dim Feuille As Worksheet
     
     
     
    Set Feuille = Worksheets("test")
     
      'supprimer les annciennes données
    Set lesCols = Feuille.Range("A1")
    lesCols.EntireColumn.ClearContents
     
     
    Set cn = New ADODB.Connection
     
     sql = "[Customer].dbo.MAJ_TableCAB" ' je nomme ma procédure stockée
     
     GenereCSTRING = "Provider=SQLOLEDB.1;Password=" & "MdP & ";Persist Security Info=True;User ID=" & "exploitation" & ";Initial Catalog=" & "NomServeur" & ";Data Source=" & "adresse IP" & " " '* SQLServer2008R2
     cn.Open GenereCSTRING 'J'ouvre ma connection.
     
     
     
    P1 = Sheets("NumCAB").Range("A2")
     
      Set cm = New ADODB.Command
      With cm
        .ActiveConnection = cn
        .CommandText = sql
        .CommandTimeout = 0 'evite que le delai d'attente de requete expire (que la requte bugue)
        .CommandType = adCmdStoredProc 'invoque une procédure stockée. Le serveur SQL doit savoir où aller chercher la commande, c'est le pourquoi de la ligne qui spécifie le CommandType
       .Parameters.Append .CreateParameter("P1", adVarChar, adParamInput, 129, Sheets("NumCab").Range("A2")) 'CAB
     
     
      End With
     
     
      Set rs = cm.Execute()
     
     
     
      With ThisWorkbook.Sheets("test")
         For i = 0 To rs.Fields.Count - 1 'On place le nom des champs sur la ligne 4 de ma feuille Excel
                   .Range("A1").Offset(0, i) = rs(i).Name
         Next
            .Range("A2").CopyFromRecordset rs 'la on copie le résultat de la requête
     
     
    End With
     
     
    End Sub

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    si ta variable s'appelle @nom pourquoi nomes tu le paramètre "P1" ?

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Thumb
    Pour résumer, ce que j'essaie de faire c'est de créer une table sql server avec un seul champ et que ce champ récupère des données issues d'une colonne Excel.
    L'import du tableau Excel sous sql ne me convient pas car ce que je souhaiterais ensuite c'est la possibilité de pouvoir supprimer les anciennes données pour de nouvelles données.

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    J'ai bien compris tout ça, mais ta variable s'appelle @Nom alors utilises la dans tes paramètres et n'utilises pas p2!

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Thum
    Je ne sais pas comment remplacer la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    P1 = Sheets("NumCAB").Range("A2")
    par la déclaration de la variable @nom car il faudrait que cette variable pointe vers la liste des données Excel; ce que ne parviens pas à réaliser

  6. #6
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Parameters.Append .CreateParameter("@nom", adVarChar, adParamInput, 129, Sheets("NumCab").Range("A2")) 'CAB
    EDITE:

    Perso voila ce que j'ai fait de mon coté!
    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
    95
    96
    Public Enum MyAdo
        ACCESS97 
        ACCESS2000 
        ACCESS2012 
        ODBC 
        ORACLE
        SQLSERVER2005
        SQLServer2008R2 
        SQLite
        SQLite3
        CSV 
        xls 
        MySQL
    End Enum
    Sub Test()
    Dim CnServeur As Object, CnExcel As Object: Set CnServeur = CreateObject("AdoDb.Connection"): Set CnExcel = CreateObject("AdoDb.Connection")
    CnServeur.Open = GenereCSTRING(SQLSERVER2005, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")
    CnExcel.Open GenereCSTRING(xls, ThisWorkbook.FullName)
     
    Sql = "CREATE  TABLE #MyTblCAB (CAB varchar(30))" & vbCrLf
    With CnExcel.Execute("Select [CAB] From [TblCAB$]")
       If Not .EOF Then
            t = "('" & .GetString(, , "", "'),('", "")
            t = Left(t, Len(t) - 3)
            Sql = Sql & "INSERT INTO #MyTblCAB  VALUES " & vbCrLf
            Sql = Sql & t & vbCrLf
       End If
       .Close
    End With
    CnServeur.Execute Sql
     ActiveCell.CopyFromRecordset CnServeur.Execute("Select * from #MyTblCAB")
     
    Sql = "dbo.MAJ_TableCAB" ' je nomme ma procédure stockée
      With CreateObject("ADODB.Command")
        .ActiveConnection = CnServeur
        .CommandText = Sql
        .CommandTimeout = 0 'evite que le delai d'attente de requete expire (que la requte bugue)
        .CommandType = 4 'invoque une procédure stockée. Le serveur SQL doit savoir où aller chercher la commande, c'est le pourquoi de la ligne qui spécifie le CommandType
       .Parameters.Append .CreateParameter("@nom", 200, 1, 129, "AA") 'CAB
     
     Set Rs = .Execute
     ActiveCell.CopyFromRecordset Rs
      End With
       With CreateObject("ADODB.Command")
        .ActiveConnection = CnServeur
        .CommandText = Sql
        .CommandTimeout = 0 'evite que le delai d'attente de requete expire (que la requte bugue)
        .CommandType = 4 'invoque une procédure stockée. Le serveur SQL doit savoir où aller chercher la commande, c'est le pourquoi de la ligne qui spécifie le CommandType
       .Parameters.Append .CreateParameter("@nom", 200, 1, 129, "BB") 'CAB
     
     ActiveCell.CopyFromRecordset .Execute
      End With
    End Sub
    Private Function GenereCSTRING(TYPEBASE As MyAdo, Base As String, Optional User As String, Optional PassWord As String, Optional Server As String, Optional AvecTitre As Boolean = True)
    'Permet de générer le Cornec String
    '1 - ACCESS 97
    '2 - ACCESS 2000
    '3 - ACCESS 2012
    '4 - ODBC
    '5 - ORACLE
    '6 - SQL SERVER 2005
    '7 - SQL Server 2008 R2
    '8 - SQLite
    '9 - SQLite3
    If Trim("" & Base) = "" Then Base = Base
    Select Case TYPEBASE
        Case xls
                GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Base & ";Extended Properties=""Excel 12.0;HDR=" & Array("No", "YES")(Abs(AvecTitre)) & ";"""
        Case ACCESS97
            GenereCSTRING = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & Base
        Case ACCESS2000
            GenereCSTRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Base & ";Persist Security Info=False"
        Case ACCESS2012
            GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Base & ";"
        Case MySQL
        GenereCSTRING = " DRIVER={MySQL ODBC 5.1 Driver};SERVER=" & Server & ";UID=" & User & ";DATABASE=" & Base & ";Password=" & PassWord
        Case ODBC
            GenereCSTRING = "Provider=MSDASQL.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Data Source=" & Base
        Case ORACLE
            GenereCSTRING = "Provider=OraOLEDB.Oracle.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Data Source=" & Base
        Case SQLSERVER2005
            'GenereCSTRING = "Driver={SQL Server};SERVER=" & Server & ";DATABASE=" & Base & ";UID=" & User & ";Pwd=" & PassWord & ";"
            GenereCSTRING = "Provider=SQLOLEDB.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Initial Catalog=" & Base & ";Data Source=" & Server
        Case SQLServer2008R2
            GenereCSTRING = "Provider=SQLNCLI;Server=" & Server & ";Database=" & Base & ";UID=" & User & ";PWD=" & PassWord & ";"
        Case SQLite
            GenereCSTRING = "Provider=OleSQLite.SQLiteSource.3; Data Source=" & Base
            GenereCSTRING = "Driver={SQLite ODBC (UTF-8) Driver};Database=" & Base & ";StepAPI=;Timeout="
        Case SQLite3
            GenereCSTRING = "Driver={SQLite3 ODBC Driver};Database=" & Base & ";LongNames=0;Timeout=4000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;"
        Case CSV
            GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Server & ";Extended Properties=""Text;HDR=" & Array("No", "YES")(Abs(AvecTitre)) & ";FMT=Delimited;"""
        Case Else
            GenereCSTRING = "PAS ASSEZ DE PARAMETRES RENSEIGNES !!!"
    End Select
    End Function

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour Thum
    Wouai wouai ..
    je vais regarder ton code de plus prés car là je suis un peu largué

  8. #8
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    En fait y'a pas grand chose à comprendre !

    Si tu regardes la fonction GenereCSTRING tu y retrouveras la méthode de connexion que tu utilises habituellement !

    Ce qui compte c'est ce qui ce trouve dans la sub test! GenereCSTRING retourne le connecstring à la base de données choisi ! Dans notre ça sql serveur et Excel.

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour Thum
    J'ai inséré ton code dans ma feuille excel et voici l'ereur que j'ai lorsque j'esséaie d'exécuter le code vba
    Images attachées Images attachées  

  10. #10
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Thum
    Lorsque je regarde ton code vba, je ne vois pas la ligne de code ou j'insère mes donnes issues de Excel dans ma requete sql

  11. #11
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour,
    T'occupe de mon code!

    Pour ce qui te concerne il te faut remplace Parameters.Append .CreateParameter("P1", adVarCharPart
    Parameters.Append .CreateParameter("@nom", adVarChardans ton code actuel du poste #1 et ça fonctionnera

  12. #12
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Thumb
    J'ai pu exécuter ton Code. C'est moi qui avait mal orthographier ton code lorsque je l'ai inséré dans ma feuille Excel.
    Je regarde cela et je reviens vers toi

  13. #13
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Thum
    Apré&s avoir exceuter ton code, voici le message d'erreur que j'ai à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    With CnExcel.Execute("Select [CAB] From [TblCAB$]")
    Images attachées Images attachées  

  14. #14
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    En même temps je ne connais pas le nom de ta feuille excel !

    Il faut mettre le nom de ta [feuille$] entre crochets [] et rajouter un $ à la fin de sont nom!
    Le nom du champ c'est l'entête de colonne {le texte qui ce trouve sur la première ligne de la colonne}
    "Select [champ] From [Feuille1$]"

  15. #15
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Thumb
    Apres quelques corrections pour etre en adéquation avec mon fichier et mes contraintes , ton code marche à merveille
    J'ai quelques question à te poser concernant ce code VBA pour le maitriser et le déployer sur d'autres fichier

    1)J'ai inhibé les Ligne 36, 53 et 62. D ailleurs pourquoi ces lignes de code. Elles sont inutiles dans mas cas non ?
    2) Sur la la ligne de code 24 où est inséré la requete sql , j'ai rajouté une ligne qui supprimer la table afin de pourvoir la créer avec de nouveaux enregistrements
    3) j'ai supprimer les lignes de codes 48 et 60 . Nul besoin de déclarer des variables dans mon cas
    4) j'ai supprimer les la partie allant de 55 à 60 car elle est en doublon

    Donc voici ton code vba avec mes changement
    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    Public Enum MyAdo
        ACCESS97
        ACCESS2000
        ACCESS2012
        ODBC
        ORACLE
        SQLSERVER2005
        SQLSERVER2018
        SQLite
        SQLite3
        CSV
        xls
        MySQL
    End Enum
    
    
    Sub Test()
    Dim CnServeur As Object, CnExcel As Object: Set CnServeur = CreateObject("AdoDb.Connection"): Set CnExcel = CreateObject("AdoDb.Connection")
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")
    CnExcel.Open GenereCSTRING(xls, ThisWorkbook.FullName)
     
     Range("A:C").ClearContents
     
    sql = "IF OBJECT_ID('tempdb..#MyTblCAB') IS NOT NULL DROP TABLE #MyTblCAB" & vbCrLf & _
           "CREATE  TABLE #MyTblCAB (CAB varchar(30))" & vbCrLf
    With CnExcel.Execute("Select [CAB] From [TblCAB$]")
       If Not .EOF Then
            t = "('" & .GetString(, , "", "'),('", "")
            t = Left(t, Len(t) - 3)
            sql = sql & "INSERT INTO #MyTblCAB  VALUES " & vbCrLf
            sql = sql & t & vbCrLf
       End If
       .Close
    End With
    CnServeur.Execute sql
     'ActiveCell.CopyFromRecordset CnServeur.Execute("Select * from #MyTblCAB")
     
    
     Debug.Print sql
     
     
    sql = "[Customer].dbo.MAJ_TableCAB" ' je nomme ma procédure stockée MAJ_TableCAB
      With CreateObject("ADODB.Command")
        .ActiveConnection = CnServeur
        .CommandText = sql
        .CommandTimeout = 0 'evite que le delai d'attente de requete expire (que la requte bugue)
        .CommandType = 4 'invoque une procédure stockée. Le serveur SQL doit savoir où aller chercher la commande, c'est le pourquoi de la ligne qui spécifie le CommandType
       .Parameters.Append .CreateParameter("@nom", 200, 1, 129, "AA") 'CAB
     
     Debug.Print sql
    
     Set rs = .Execute
     'ActiveCell.CopyFromRecordset rs
      End With
    
       With CreateObject("ADODB.Command")
        .ActiveConnection = CnServeur
        .CommandText = sql
        .CommandTimeout = 0 'evite que le delai d'attente de requete expire (que la requte bugue)
        .CommandType = 4 'invoque une procédure stockée. Le serveur SQL doit savoir où aller chercher la commande, c'est le pourquoi de la ligne qui spécifie le CommandType
       .Parameters.Append .CreateParameter("@nom", 200, 1, 129, "BB") 'CAB
     
    ' ActiveCell.CopyFromRecordset .Execute
      End With
      
    
    
    With ThisWorkbook.Sheets("test")
         For i = 0 To rs.Fields.Count - 1 'On place le nom des champs sur la ligne 4 de ma feuille Excel
                   .Range("A1").Offset(0, i) = rs(i).Name
         Next
            .Range("A2").CopyFromRecordset rs 'la on copie le résultat de la requête
            
            
    End With
      
      
    End Sub
    Private Function GenereCSTRING(TYPEBASE As MyAdo, Base As String, Optional User As String, Optional PassWord As String, Optional Server As String, Optional AvecTitre As Boolean = True)
    'Permet de générer le Cornec String
    '1 - ACCESS 97
    '2 - ACCESS 2000
    '3 - ACCESS 2012
    '4 - ODBC
    '5 - ORACLE
    '6 - SQL SERVER 2005
    '7 - SQL Server 2008 R2
    '8 - SQLite
    '9 - SQLite3
    If Trim("" & Base) = "" Then Base = Base
    Select Case TYPEBASE
        Case xls
                GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Base & ";Extended Properties=""Excel 12.0;HDR=" & Array("No", "YES")(Abs(AvecTitre)) & ";"""
                
        Case ACCESS97
            GenereCSTRING = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & Base
            
        Case ACCESS2000
            GenereCSTRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Base & ";Persist Security Info=False"
            
        Case ACCESS2012
            GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Base & ";"
            
        Case MySQL
        GenereCSTRING = " DRIVER={MySQL ODBC 5.1 Driver};SERVER=" & Server & ";UID=" & User & ";DATABASE=" & Base & ";Password=" & PassWord
        
        Case ODBC
            GenereCSTRING = "Provider=MSDASQL.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Data Source=" & Base
            
        Case ORACLE
            GenereCSTRING = "Provider=OraOLEDB.Oracle.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Data Source=" & Base
            
        Case SQLSERVER2005
            'GenereCSTRING = "Driver={SQL Server};SERVER=" & Server & ";DATABASE=" & Base & ";UID=" & User & ";Pwd=" & PassWord & ";"
            GenereCSTRING = "Provider=SQLOLEDB.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Initial Catalog=" & Base & ";Data Source=" & Server
            
        Case SQLSERVER2018
            GenereCSTRING = "Provider=SQLOLEDB.1;Password=" & "exploitation" & ";Persist Security Info=True;User ID=" & "MdP" & ";Initial Catalog=" & "Archive" & ";Data Source=" & "00.00.00.00" & " " '* SQLServer2018
            
        Case SQLite
            GenereCSTRING = "Provider=OleSQLite.SQLiteSource.3; Data Source=" & Base
            GenereCSTRING = "Driver={SQLite ODBC (UTF-8) Driver};Database=" & Base & ";StepAPI=;Timeout="
            
        Case SQLite3
            GenereCSTRING = "Driver={SQLite3 ODBC Driver};Database=" & Base & ";LongNames=0;Timeout=4000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;"
        Case CSV
            GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Server & ";Extended Properties=""Text;HDR=" & Array("No", "YES")(Abs(AvecTitre)) & ";FMT=Delimited;"""
            
        Case Else
            GenereCSTRING = "PAS ASSEZ DE PARAMETRES RENSEIGNES !!!"
            
    End Select
    
    End Function

  16. #16
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Thum encore une question.
    Pourrais tu m'expliquer cette ligne de code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")

  17. #17
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Citation Envoyé par facteur Voir le message
    Thum encore une question.
    Pourrais tu m'expliquer cette ligne de code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")
    cette ligne tu la connais bien elle ce trouve en ligne 87 du poste #6 c'est le code que tu utilisais précédament!
    GenereCSTRING = "Provider=SQLOLEDB.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Initial Catalog=" & Base & ";Data Source=" & Server
    c
    e type de connexion est apparu avec la version 2005 ce qui explique le nom que je lui avais donné à l'époque et que tu as renommé en 2018 ce qui n'est pas choquant!

    voici la même chose pour effectuer un connexon sur un fichier Excel lige 68 du même poste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GenereCSTRING = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Base & ";Extended Properties=""Excel 12.0;HDR=" & Array("No", "YES")(Abs(AvecTitre)) & ";"""

    en fait à l'origine GenereCSTRING est une fonction qui permet de générer un conctionString pour n'importe quelle base de données Access, SQL Serveur, Oracle Autre...

    j'ai donc défini un tableau de constantes sou forme d'énumérateur, cela permet de numéroter automatiquement des constante en leur donnant un nom!
    Code énumérateur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Enum MyAdo
        ACCESS97
        ACCESS2000
        ACCESS2012
        ODBC
        ORACLE
        SQLSERVER2005
        SQLSERVER2018
        SQLite
        SQLite3
        CSV
        xls
        MySQL End Enum
    ici nous avons
    TYPEBASE As MyAdo qui nous permet de sélectionner dans l'énumérateur MyADO la bas de données ou le fichier Excel dans notre ca
    User pour sql serceur , Oracle etc.
    PassWord pour sql serceur , Oracle etc.
    Server pour sql serceur , Oracle etc.
    AvecTitre pour Excel et CSV
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function GenereCSTRING(TYPEBASE As MyAdo, Base AsString, Optional User AsString, Optional PassWord AsString, Optional Server AsString, Optional AvecTitre AsBoolean = True)

  18. #18
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Bonjour Thumb
    Une question
    Donc tu ouvres le serveur sql à partir d excel, par cette la ligne de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GenereCSTRING(TYPEBASE As MyAdo, Base As String, Optional User As String, Optional PassWord As String, Optional Server As String, Optional AvecTitre As Boolean = True)
    Ce qui me chagrine , c'est ta ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")
    et est ce que la remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, ThisWorkbook.FullName)
    n'est pas mieux ?

  19. #19
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 574
    Par défaut
    Bonjour Facteur,
    Relis le code attentivement tu verras que la deuxième connecstring ce fait sur le fichier excel !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")
    et est ce que la remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnExcel.Open = GenereCSTRING(Xls, ThisWorkbook.FullName)
    Car on fait un requête Excel pour récupérer toutes les valeurs avec l'instruction GetSting !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with CnExcel.Execute("Select [CAB] From [TblCAB$]")
       If Not .EOF Then
            t = "('" & .GetString(, , "", "'),('", "")
            t = Left(t, Len(t) - 3)
            Sql = Sql & "INSERT INTO #MyTblCAB  VALUES " & vbCrLf
            Sql = Sql & t & vbCrLf
       End If
       .Close
    End With

  20. #20
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Oups Thum
    Je me suis trompé de ligne je voulais dire cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, ThisWorkbook.FullName)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2010] Stocker une liste de données Excel complexe dans une variable
    Par SpaceX dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/03/2018, 14h11
  2. Réponses: 5
    Dernier message: 21/01/2014, 20h43
  3. Réponses: 5
    Dernier message: 14/01/2014, 23h05
  4. Réponses: 16
    Dernier message: 20/05/2011, 20h12
  5. [SQL] Choix dans une liste déroulante issue d'une requête SQL
    Par Moustic74 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 01/06/2007, 14h06

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