Liaison libelle Excel a base de données SQL server

Bonjour le forum ,

Je voudrais savoir si il est possible de lié des libelle ( donc un texte compréhensible par tout le monde ) à des codes qui leurs sont liés sur une BDD SQL Server.

Je vais expliquer mon projet de façon j’espère plus clair pour vous.

J'ai une feuille " REFERENCES" sur mon classeur de projet qui contient plusieurs Colonne (CodeRef,Désignation,Famille,Type,Constructeur...)

Ce qui va m’intéresser ce sont les colonnes Famille et Type qui sont des listes déroulantes en cascade c'est à dire que quand je choisis ma famille les type qui seront affichés sont liés à la famille . Ce que je voudrais faire c'est une macro qui quand la famille et le type sont sélectionné cela les lies aux CodeFamille et CodeType qui sont présent sur ma base de données SQL Server.

Pour exemple le code SQL de liaisons libelle/code du type serait ;

Les C_ --> Code

Les L_ --> Libelle

SELECT C_TYPOBJ , L_TYPOJ
FROM BDD.TYPOBJ AS T LEFT JOIN BDD.FAMOBJ AS F ON T.C_FAMOBJ = F.C_FAMOBJ
WHERE F.C_NATURE = 'ELT'

En espérant qu'on pourra trouver une solution ensemble ;D

bonjour

tu as :

  • une base SQL
  • un fichier Excel

Excel te sert à visualiser et synthétiser les données de la base. Et aussi à compléter certaines données ne figurant pas dans la base, par exemple des commentaires)

alors il te faut faire menu Données/récupérer

c'est alors Power Query qui va agir pour ouvrir la base, et te la fournir soit sur une feuille de ton Excel, soit dans le modèle de données.

ensuite, soit tu bosses sur Excel pur soit sur Power Pivot si tu payes.

pas de macro

Salut je ne comprend pas trop ta solution ,

La j'ai l'impression que tu me dis d'importer la BDD sur EXCEL alors que je veux juste faire un lien entre les codes ( qui eux sont sur la BDD ) et les libellés qui eux sont choisis dans les listes déroulantes.

Ce serait dérangeant de créer un menu de récupération de données juste pour un lien ?

Salut je ne comprend pas trop ta solution ,

La j'ai l'impression que tu me dis d'importer la BDD sur EXCEL alors que je veux juste faire un lien entre les codes ( qui eux sont sur la BDD ) et les libellés qui eux sont choisis dans les listes déroulantes.

Ce serait dérangeant de créer un menu de récupération de données juste pour un lien ?

re

créer un lien n'est pas ton but, c'est un moyen

quel est ton but ? que veux-tu afficher au final sur l'écran de ton PC ? quelles données veux-tu visualiser ?

Bonjour Paul, bonjour Jmd, salut à tous,

Une alternative, avec VBA, que j'utilise régulièrement : une fonction 'Query' qui place le résultat des requêtes SQL dans une variable tableau 'Rcd'.

Les données de ce tableau peuvent ensuite être utilisées comme on veut.

Ici dans le code exemple, le tableau est simplement collé en Feuil1.

A noter : dans la fonction, on aura renseigné les identifiants de connexion habituels (ligne Cnx.Open ...)

Pour l'exécution de la requête, on renseigne le nom de la base.

L'intérêt de cette méthode est de ne pas limiter les requêtes à des 'SELECT', on peut également utiliser des 'INSERT', 'UPDATE', 'DELETE', ... bref interagir dans les 2 sens avec la base.

Bonne journée

Pierre

Option Explicit

Public Rcd() As Variant

Sub Recup_data()
Dim Req As String

    Req = "SELECT C_TYPOBJ , L_TYPOJ " & _
          " FROM BDD.TYPOBJ AS T " & _
          " LEFT JOIN BDD.FAMOBJ AS F ON T.C_FAMOBJ = F.C_FAMOBJ " & _
          " WHERE F.C_NATURE = 'ELT'"

    If Query(Req, "maBaseSQLserver") > 0 Then
        Sheets("Feuil1").Range("A1").Resize(UBound(Rcd, 1), UBound(Rcd, 2)) = Rcd
    End If

End Sub

Function Query(Req As String, BDD As String) As Long
Dim Cnx As Object, Rst As Object, T As Variant
Dim Col As Integer, i As Long, j As Long

    On Error GoTo errhdlr
    Set Cnx = CreateObject("ADODB.Connection")
    Cnx.Open "Driver={SQL Server};Server=NomDuServeur;Database=" & BDD & ";" & _
             "Uid=NomUtilisateur;Pwd=MotDePasse;"

    If Left(Req, 6) = "SELECT" Then
        Set Rst = CreateObject("ADODB.Recordset")
        Rst.Open Req, Cnx, 3

        Query = Rst.RecordCount
        Col = Rst.Fields.Count - 1

        ReDim Rcd(Query + 1, Col + 1)
        For j = 0 To Col
            Rcd(0, j) = Rst.Fields(j).Name
        Next j

        If Not Query = 0 Then
            Rst.MoveFirst
            T = Rst.GetRows
            For i = 1 To Query
                For j = 0 To Col
                    Rcd(i, j) = IIf(IsNull(T(j, i - 1)), 0, T(j, i - 1))
                Next j
            Next i
        End If
    Else
        Cnx.Execute Req
        Query = 0
    End If

    Cnx.Close
    Set Rst = Nothing
    Set Cnx = Nothing
    Exit Function

errhdlr:
    If Not Rst Is Nothing Then If Rst.State = 1 Then Rst.Close
    If Not Cnx Is Nothing Then If Cnx.State = 1 Then Cnx.Close
    Set Rst = Nothing
    Set Cnx = Nothing
    Query = -1
    Debug.Print (Err.Description & vbCrLf & "Requête : " & Req)
End Function

Hmmm alors en fait ce classeur excel c'est l'utilisateur qui va l'utiliser

Ce qui va se passer c'est qu'il va ajouter les références qu'il veut avoir , et après il va avoir un accès a un bouton ( déjà programmé) qui va convertir la feuille EXCEL "REFERENCES" en fichier CSV que je vais utiliser dans une application pour ajouter les références qu'il aura ajouter.

MAIS car oui il y a un mais l'application va enregistrer les données a partir du CSV dans la BDD SQL SERVER et ce qui est important ce n'est pas les libelle que l'utilisateur aura choisit ( qui sont mis car plus visible pour lui) mais les codes des familles et types qui auront été choisit.

Tu comprends ce que je veux dire ?

re

salut Pierre

Paul, avec des fichiers exemples (tous en xlsx) ce serait plus facile

Hmmm le soucis c'est que le fichier XSLX est trop volumineux je vais essayer de le compresser pour le mettre en Pièce jointe

Meme zipper le fichier reste trop volumineux

Bon j'ai essayer de simplifier mon problème

J'ai donc importer depuis ma BDD les TYPES et FAMILLES ( Code et libelle) dans un onglet "DATA".

CE qui me faudrait maintenant c'est que les Colonnes Libelle_Famille et Code_Famille soit liés et pareil pour types comme ça dans ma feuille Références je n'aurais plus qu'a faire ressortir le liens qui existerait déjà dans la feuille DATA

re

joins des fichiers de test que tu auras créés au clavier, avec 3 lignes ça suffit.

Voila en fait je veux faire en sorte que les valeurs sur la ligne soit lié genre :

  • Libelle_famille lié a code_famille
  • Libelle_Type lié a code_type

J’espère que ça t’éclairera un peu sur ce que j'essaie de faire

la feuille de test correspond à l'onglet DATA de mon véritable classeur

48test-liaison.xlsx (9.88 Ko)

re

je ne comprends pas avec quoi tu veux lier cet unique fichier

une liaison nécessite fichiers.

si besoin simule une base SQL avec un fichier Excel.

Alors j'ai rajouter une feuille "REFERENCES" pour essayer de mieux expliquer

en fait comme tu peux voir ans "REFERENCES" j'ai colorier 2 colonnes qui sont Famille et Type.

Type ne peut s'afficher qu'en fonction de la Famille. La chose est que ce ne sont que des libellé.

J'ai une fonction qui va importer un CSV a partir du de la feuille EXCELL "REFERENCES" jusque la tout va bien

Le fait est que les libelle ne sont juste une solution pour que le l'utilisateur puisse s'y retrouver mais lors de mon import CSV je veux que ce soit les codes qui remplacent les libelles dans le CSV

Tu vois ? En fait je veux un échange Code-Libelle au moment de mon import CSV a partir de la feuille "REFERENCES"

si tu veux voila mon code pour l'export de la feuille en CSV

Sub MaJData()

Dim Fe As Worksheet
    Dim Plage As Range
    Dim Cel As Range
    Dim Tbl() As String
    Dim Ligne As String
    Dim Dossier As String
    Dim chemin As String
    Dim Fichier As String
    Dim i As Long
    Dim j As Long

    Dossier = "C:\Users\paul.fabre\OneDrive\INTERFACE\CSV\REFERENCES\" '<--- chemin à adapter !

    'nom du fichier avec la date du jour
    Fichier = "Ajout_Référence_ISA" & " " & Format(Now, "dd-mm-yyyy") & ".csv"

    'full path
    chemin = Dossier & Fichier

    'si clic sur "Non", fin du programme
    If MsgBox("Voulez-vous créer le fichier '" & Fichier & "' qui sera stocké dans le dossier '" & Dossier & "'?", vbQuestion + vbYesNo, "Fichier .CSV") = vbNo Then Exit Sub

    'adapter le nom de la feuille à exporter
    Set Fe = Worksheets("REFERENCES")

    'défini la plage sur toute la feuille à exporter
    Set Plage = DefPlage(Fe, 1, 1)

    '

    'crée les lignes pour les enregistrements tabulés avec comme séparateur ","
    For i = 1 To Plage.Rows.Count

        For j = 1 To Plage.Columns.Count: Ligne = Ligne & Plage(i, j).Value & ";": Next j

        'supprime le "," de fin
        Ligne = Left(Ligne, Len(Ligne) - 1)

        'stocke dans un tableau et met un | a la place d'un emplacement vide dans le CSV ( Esthetique)
        ReDim Preserve Tbl(1 To i)
        Tbl(i) = Ligne

        'pour la suivante
        Ligne = ""

    Next i

    'création du fichier .csv
    Open chemin For Output As #1

        For i = 1 To UBound(Tbl): Print #1, Tbl(i): Next i

    Close #1

    'vérifie que le fichier est bien sur le disque sinon, message d'erreur
    If Dir(chemin) <> "" Then

        'message de confirmation
       MsgBox "Le fichier '" & Fichier & "' a bien été créé et enregistré dans le dossier '" & Dossier & "' !", vbInformation

    Else

        MsgBox "Une erreur c'est produite durant la création du fichier .csv !", vbExclamation

    End If

End Sub

Function DefPlage(Fe As Worksheet, L As Long, c As Long) As Range

    On Error GoTo fin

    With Fe

        Set DefPlage = .Range(.Cells(L, c), _
                       .Cells(.Cells.Find("*", .[A1], -4123, , _
                       1, 2).row, .Cells.Find("*", .[A1], -4123, , _
                       2, 2).Column))

    End With

    Exit Function

fin:

    Set DefPlage = Nothing

End Function
22test-liaison.xlsx (11.46 Ko)

Juste une question : est-ce tu as vu le code que j'ai donné précédemment?

Pierre

Bonjour Pierre ,

Oui c'est très gentil je l'ai tester et ton aide ma permis de voir que la solution que j'essayais à l'origine n’était pas la plus facile

Du coup je suis parti sur quelque chose de plus simple en allant juste modifier les variables qui seront afficher lors de l'import CSV de la feuille sur laquelle je travaille.

En gros comme j'ai importer les données que je voulais depuis ma BDD SQL Server sur une feuille EXCEL que j'ai nommé DATA ce qu'il reste juste a faire c'est en gros comme tu peux le voir dans le fichier test liaison c'est sur cette feuille "DATA" lié les code et type pour Famille et Type de sorte a ce que quand je je veux exporter en CSV la feuille "REFERENCES" ( que j'ai mise aussi dans mon petit fichier exemple) les valeurs afficher dans le CSV seront les codes de ces 2 variables et non pas les libelle qui sont juste visuels pour que l'utilisateur arrive a s'y retrouver .

Apres un bon weekend de repos on repart à la charge

Juste pour infos je tente finalement une solution qui me parait plus simple a vous de me dire si c'est vraiment le cas ou pas ;D

En gros, comme je l'ai expliqué précédemment je voulais faire en sort que les libelle et les codes des colonnes familles et types soient liés pour que je puisse les permuter ensuite.

Mais serait t'il possible de juste ( je ne sais pas encore comment ) changer au moment de l'export en CSV les libelle et encode en gros excel ne récupère pas les libelle sur la page mais les codes (donc ce qu'il faudrait c'est que au moment que ma macro CSV se déclenche il y ait du VBA qui dise pour les colonnes Famille et type chaque valeur des cellules sur les lignes remplies sont remplacer par les codes liés a ces valeurs)

Désolé si j'en demande beaucoup je debute pas mal en VBA ^^

Rechercher des sujets similaires à "liaison libelle base donnees sql server"