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 FunctionHmmm 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
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
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
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
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 ^^