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
| Option Explicit
' Flag d'erreur de connexion
Dim FlgErrCon As Boolean
' sPathBdD = nom et chemin complet de la Base de données
' sTable = nom de la feuille contenant les données
' sCrit = nom du champ contenant le critère de filtre
' vCrit = valeur du filtre
' ColId = colonne ID unique
' FlgTout = Afficher tout le matériel
Sub RemplirCbxCrit(ObjCbx As MSForms.ComboBox, sPathBdD As String, sTable As String, _
sCrit As String, vCrit As String, ColId As Integer, FlgTout As Boolean)
Dim sRqt As String, sCond As String, Sql As String, Inc As Integer
Dim NbField As Integer, NbRecord As Integer
' En cas d'erreur
FlgErrCon = False
On Error GoTo Erreur_Proc
' Vider la combobox en question
ObjCbx.Clear
' Créer une nouvelle instance ADO
Set Cnn = CreateObject("ADODB.Connection")
' Créer la connexion selon la version d'Excel
sConn = Replace(sConnect, "#sPathBdD#", sPathBdD, Compare:=vbTextCompare)
' Tenter d'uvrir la connexion
Cnn.Open sConn
' En cas d'erreur message d'information à l'utilisateur
If FlgErrCon = True Then
MsgBox "Impossible de se connecter à la base de données !", vbCritical, "OUPS..."
GoTo FermetureCnn
End If
' Préparer la requête
If InStr(1, sTable, " ") > 0 Then
Sql = "SELECT * FROM ['" & sTable & "$']"
Else
Sql = "SELECT * FROM [" & sTable & "$]"
End If
' S'il s'agit du matériel on saute directement
If InStr(1, ObjCbx.Name, "Mat") > 0 Then GoTo FiltreMatériel
' Préparer la condition pour les moyens humains
If InStr(1, vCrit, "*") > 1 Then
sCond = "WHERE (" & sCrit & " Like '" & Replace(vCrit, "*", "") & "');"
ElseIf InStr(1, vCrit, "*") = 1 Then
sCond = ";"
Else
sCond = "WHERE " & sCrit & "='" & vCrit & "';"
End If
GoTo SuiteRequète
'
' Préparer la condition pour les moyens matériel
FiltreMatériel:
' Préparer la condition pour les moyens humains
sCond = "WHERE ("
' Si la checkbox tout afficher est à FAUX
If FlgTout = False And InStr(1, vCrit, "AFFECTATION") = 0 Then
sCond = sCond & "NOM_Prénom Like 'SANS AFFECTATION') AND ("
End If
' Ensuite affecter l'autre condition
If InStr(1, vCrit, "*") > 1 Then
sCond = sCond & sCrit & " Like '" & Replace(vCrit, "*", "") & "');"
ElseIf InStr(1, vCrit, "*") = 1 Then
sCond = ";"
Else
sCond = sCond & sCrit & "='" & vCrit & "');"
End If
'
SuiteRequète:
' Créer la syntaxe de la requête
sRqt = Sql & " " & sCond
' Créer un nouveau Recordset et l'ouvre
Set Rs = CreateObject("ADODB.Recordset")
Rs.Open sRqt, Cnn, CursorType
' En cas d'erreur on stop tout
If FlgErrCon = True Then GoTo FermetureRs
' Nombre de champ
NbField = Rs.Fields.Count - 1
ObjCbx.ColumnCount = NbField + 1
ObjCbx.BoundColumn = ColId
' Pour chaque enregistrement
For NbRecord = 0 To Rs.RecordCount - 1
' Ajouter le 1er champ au combobox
If IsNull(Rs(0)) Then
ObjCbx.AddItem "REC" & Format(NbRecord, "00")
Else
ObjCbx.AddItem Rs(0)
End If
' Pour chaque autre champ l'ajouter
For Inc = 1 To NbField
If Rs(Inc).Name = "PxU" Then ColPx = Inc
If Not IsNull(Rs(Inc)) Then
ObjCbx.List(ObjCbx.ListCount - 1, Inc) = Rs(Inc)
Else
On Error Resume Next
ObjCbx.List(ObjCbx.ListCount - 1, Inc) = "."
On Error GoTo 0
End If
Next Inc
Rs.MoveNext
Next NbRecord
' Fermeture du Recordset
FermetureRs:
Rs.Close
Set Rs = Nothing
' Fermeture de la connexion
FermetureCnn:
Cnn.Close: Set Cnn = Nothing
On Error GoTo 0
Exit Sub
Erreur_Proc:
LogError Err, "Sub RemplirCbxCrit(ObjCbx" & ObjCbx.Name & ", sPathBdD=" & sPathBdD & ", sTable=" & sTable & ", sCrit=" & sCrit & ", vCrit=" & vCrit & ", ColId=" & ColId & ")"
FlgErrCon = True ' Mettre le FLAG d'erreur de connexion à vrai
Resume Next
End Sub |
Partager