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. #21
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    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 576
    Par défaut
    Oui c'est bien ce que je t'ai dit cette ligne ne concerne pas sql serveur mais excel !
    Donc regardes bien mon code et tu verras la différence !

  2. #22
    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
    reprenons à zero
    voici ta ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")
    puis je la remplacer par
    celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, ThisWorkbook.FullName)

  3. #23
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    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 576
    Par défaut
    Non en replace rien par rien!

    ThisWorkbook.FullName c'est le fichier Excel sur lequel tu travailles, c'est pas ta base de données SQL Serveur !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    GenereCSTRING(xls, ThisWorkbook.FullName)
     
    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)

  4. #24
    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
    Désolé d'insister
    Je comprend la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, ThisWorkbook.FullName)
    mais c'est cette ligne de code ci dessous que je ne parviens à pas à analyser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")
    "TblCAB" est le nom du fichier mais si le nom du fichier change quel impact ?
    et à quoi correspond les 2 "MOI" ?

  5. #25
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    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 576
    Par défaut
    regarde l'instruction selon choit TYPEBASE!
    selon la valeur de TYPEDEBASE on ce connecte à SqlServeur2018 ou Excel!

    tu n'a pas besoin de modifier la fonction GenereCSTRING car tu lui passe déjà les information en paramètres!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sub test()
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, "Archive" , "MdP", "exploitation","00.00.00.00")
    CnExcel.Open GenereCSTRING(xls, ThisWorkbook.FullName)
    end sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    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)
        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 SQLSERVER2018
                  GenereCSTRING = "Provider=SQLOLEDB.1;Password=" & PassWord & ";Persist Security Info=True;User ID=" & User & ";Initial Catalog=" & Base & ";Data Source=" & Server
            Case Else
                GenereCSTRING = "PAS ASSEZ DE PARAMETRES RENSEIGNES !!!"      
        End Select
    End Function

  6. #26
    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
    C'est ce que j'ai cru comprendre lol
    Donc pour resumer, dans ta ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS"))
    On aurait pu mettre n'importe quelle autre expression que "TblCAB" , "moi", "moi" et "DESKTOP-NQG9COU\SQLEXPRESS"

  7. #27
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    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 576
    Par défaut
    oui tu lui donnes le informations utile à la connexion à la base de données!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Base ="Archive" :User="MdP" :PassWord="exploitation" :Server=​"00.00.00.00")
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, Base ,User,PassWord,Server)
    Base = "C:\MyRep\MyFichier.Xlsx"
    CnExcel.Open GenereCSTRING(xls,Base )
    en revanche il faut rétablir le code de GenereCSTRING au moins comme j'ais fais au poste #25!

  8. #28
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    cool merci Thumb
    mais mon code me pose un problème au niveau de la requete en elle même .
    Je m'explique:
    Si ma table MyTblCAB existe dans ma base de donnée customer , Je la supprime. Et je la crée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sql = "IF OBJECT_ID('customer.dbo.MyTblCAB') IS NOT NULL DROP TABLE customer.dbo.MyTblCAB" & vbCrLf & _
         "CREATE  TABLE customer.dbo.MyTblCAB (CAB varchar(30))" & vbCrLf
    ensuite ,j'inserer dans la table MyTblCAB ,les nouvelles données issues de Excel

    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 [NumCAB$]")
       If Not .EOF Then[ATTACH=CONFIG]624894[/ATTACH]
            t = "('" & .GetString(, , "", "'),('", "")
            t = Left(t, Len(t) - 3)
            sql = sql & "INSERT INTO customer.dbo.MyTblCAB  VALUES " & vbCrLf
            sql = sql & t & vbCrLf
       End If
       .Close
    End With
    je fais ensuite un print pour pour visualiser ma requete sql.
    et voici ce que j'obtiens
    IF OBJECT_ID('customer.dbo.MyTblCAB') IS NOT NULL DROP TABLE customer.dbo.MyTblCAB
    CREATE TABLE customer.dbo.MyTblCAB (CAB varchar(30))
    INSERT INTO customer.dbo.MyTblCAB VALUES
    ('CA330624175DE'),('CM918473853DE'),('CC090971735DE'),('6A21054526032'),('6A21054526018'),('6A21054526025'),('9V31125509666'),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),('')
    Lorsque j'insere ce code dans sql serveur, elle fonctionen trés bien . Elle me donne le résultat escompter

    Mais lorsque , en vba excel, je poursuit le code avec la ligne de code

    J'ai ce message d'erreur qui s'affiche
    Nom : messag_erreur.PNG
Affichages : 180
Taille : 18,9 Ko

    En résumer, pourquoi lorsque je suis sur SQL server, je peux supprimer une table et la créer mais lorsque je lance cette suppression et création de table à partir d'Excel, cela ne fonctionne pas

  9. #29
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    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 576
    Par défaut
    tu utilise le mêmes informations pour te connecter Via Sql Manager?
    car le message dit que tu n'as pas les droits! de plus ce n'est plus un un table Temporaire #MyTblCAB!

    j'ai fais ce test là et ça a fonctionné!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
    Sql = "if OBJECT_ID('customer.dbo.#MyTblCAB') IS NOT NULL   DROP TABLE customer.dbo.#MyTblCAB"
    Sql = Sql & vbCrLf & "CREATE TABLE customer.dbo.#MyTblCAB (CAB varchar(30))"
    Sql = Sql & vbCrLf & "INSERT INTO customer.dbo.#MyTblCAB VALUES"
    Sql = Sql & vbCrLf & "('CA330624175DE'),('CM918473853DE'),('CC090971735DE'),('6A21054526032'),('6A21054526018'),('6A21054526025'),('9V31125509666')"
    Set CnServeur = CreateObject("AdoDb.Connection")
    CnServeur.Open = GenereCSTRING(SQLSERVER2018, "TblCAB", "MOI", "MOI", "DESKTOP-NQG9COU\SQLEXPRESS")
    CnServeur.Execute Sql
    CnServeur.Close
    End Sub

  10. #30
    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
    effectivement , tu as raison , je n'utilisais pas les mêmes informations pour me connecter à Sql Manager.
    ET là cà fonctionne..
    Mais j'ai encore quelques questions pour en finir avec cette discussion lol.

    Question 1)
    La table temporaire local que je crée #MyTblCAB est une table où je n'insère qu'un seul champ (CAB). Ce sont les données de ce champ qui seront amenées à être supprimées et remplacées par des nouvelles données issues de Excel.
    Et cette table local est visible uniquement sur la scession où je me connecte. Je me pose alors la question si je dois créer une table temporaire local ou une table définitif qui sera supprimer et créer à chaque fois que je lancerais ce code VBA
    Pour toi, tu ferais quoi ?

    Question 2)
    Que la table soit temporaire ou définitif, j'essaye de transformer le champ CAB en clef primaire afin que mes requêtes avec ce champ soit optimisées.
    Mais je n'y parviens car à cause des violations de clefs primaire.


    Voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sql = "IF OBJECT_ID('customer.dbo.MyTblCAB') IS NOT NULL DROP TABLE customer.dbo.MyTblCAB" & vbCrLf & _
         '"CREATE  TABLE customer.dbo.MyTblCAB (CAB varchar(30)," & vbCrLf & _
         '"Primary Key(CAB))"
    et voila ce que cela me donne avec le print

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF OBJECT_ID('customer.dbo.MyTblCAB') IS NOT NULL DROP TABLE customer.dbo.MyTblCAB
    CREATE  TABLE customer.dbo.MyTblCAB (CAB varchar(30))
    INSERT INTO customer.dbo.MyTblCAB  VALUES 
    ('CA330624175DE'),('CM918473853DE'),('CC090971735DE'),('6A21054526032'),('6A21054526018'),('6A21054526025'),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),('')

    le problème vient de cette redondance de
    (''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),(''),('')
    Comment faire pour les supprimer ??
    ci dessous le message d'erreur
    Images attachées Images attachées  

  11. #31
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    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 576
    Par défaut
    Bonjour,
    Essais cette requête !
    With CnExcel.Execute("Select DISTINCT [CAB] From [NumCAB$] Where [CAB] IS Not Null")

  12. #32
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Super ..Avec du recul, c'était simple
    Thumb, pour ce choix de table temporaire local globale ou définitif tu aurais choisis quelle type de table ?

  13. #33
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    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 576
    Par défaut
    En fait je choisis pas !

    Quand tu ajoutes une table part requête, tu as l'obligation de la dropper !

    Si elle doit être définitive autant la créer via sql manager et faire un delete par requête !

    Un create table par requête ne peut être que temporaire donc un create table #MyTable a la durée de vie de la session !

    Le choix t'appartient table definive via sql manager et delete table, oucreat #table par requête !

  14. #34
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Ok ..lol
    Thumb , une derniere question
    pourrais tu m'expliquer les lignes de code 2 ,3 et 4 de ton code ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With CnExcel.Execute("Select [CAB] From [NumCAB$] where [CAB] is not null")
       If Not .EOF Then
            t = "('" & .GetString(, , "", "'),('", "")
            t = Left(t, Len(t) - 3)
            sql = sql & "INSERT INTO customer.dbo.MyTblCAB  VALUES " & vbCrLf
            sql = sql & t & vbCrLf
       End If

  15. #35
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 576
    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 576
    Par défaut
    la méthode Execute de l'objet ADODB.CONNECTION execute une requête mais retourne également le résultat de celle-ci sous forme de RecordSet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set RecordSet= CnExcel.Execute(SQL)
    il ne suffit pas de récupérer le résultat d'une requête dans un recordSet encor faut-il savoir si elle retourne une ou plusieurs valeurs avant de la traiter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if not RecordSet.eof then 'Vérifie si le récorset retourne des valeurs!
    si le recordSet retourne des valeurs on récupère la totalitée des valeurs sou forme de texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txt=RecordSet.getString
    fais ce test
    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
    Sub test()
    Dim CnEXCEL As Object
    Set CnEXCEL = CreateObject("Adodb.Connection"): CnEXCEL.Open GenereCSTRING(xls, ThisWorkbook.FullName)
    Dim rs As ADODB.Recordset
    Set rs = CnEXCEL.Execute("Select * From [NumCAB$A1:B10]")
    Debug.Print rs.GetString
    Debug.Print "Tous"
    Debug.Print CnEXCEL.Execute("Select * From [NumCAB$A1:B10]").GetString
    Debug.Print "Deux lignes"
    Debug.Print CnEXCEL.Execute("Select * From [NumCAB$A1:B10]").GetString(, 2)
    Debug.Print "Deux lignes avec sépareteur de colonnes"
    Debug.Print CnEXCEL.Execute("Select * From [NumCAB$A1:B10]").GetString(, 2, "[Colonne]")
    Debug.Print "Deux lignes avec sépareteur de colonnes et séparateur ligne"
    Debug.Print CnEXCEL.Execute("Select * From [NumCAB$A1:B10]").GetString(, 2, "[Colonne]", "[Ligne]")
    End Sub

  16. #36
    Membre éprouvé
    Inscrit en
    Avril 2007
    Messages
    1 247
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 247
    Par défaut
    Merci pour tout Thumb.
    Je ferme cette discussion

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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