Bonjour à tous,

Je suis dans de l'incompréhension

Je suis modéliste et je construis différents projets comme une locomotive et un avion de la seconde guerre mondiale.
Par curiosité, j'aimerais savoir combien de vis j'ai installé sur ces projets en fonction de leurs type

Vu le nombre de type de vis différentes pour les différents projets, c'est trop compliqué de mettre à jour les données.
Car ces projets, se sont des fascicules que j'achète en magasin. Jusqu'à 140 pour certain d'entre eux.

Alors, j'essaie d'utiliser le SQL. C'est très facile.
(En théorie)

En pratique, il accepte sans rien dire "SELECT * FROM [Vis$]" et cela fonctionne
Par contre, si je lui demande "SELECT * FROM [Vis$] WHERE projet = 'Locomotive' " Il y a une erreur

"No value given for one or more required parameters" ...

Alors ...
Commençons par les explications pour comprendre:

Sur une feuille Excel s'appelant "Vis", il y a un tableau comme celui que je montre ci-dessous

La première ligne de la feuille Excel sont les titres. Dans l'exemple ci-dessous, se sont les mêmes titres que le vrai document.

Projet Fascicule AP BP
Locomotive 001 7 4
Locomotive 002 0 2
Locomotive 003 8 6
AM6 Zero 001 4 0
AM6 Zero 002 2 6
AM6 Zero 003 2 2

Le code:

A) La connexion:

J'ai écris une procédure pour ouvrir une connexion

l'appel:
ouvre_connection("modelisme.xlsm")

status:
conn.state = 1 (connexion ouverte)
conn.state = 0 (connexion fermée)

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
 
 
' Variable publique:
Public conn As ADODB.Connection
 
Sub ouvre_connection(srcFile As String)
    ' srcFile : nom du fichier Excel
    Dim str As String
    Set conn = New ADODB.Connection
 
    If Len(srcFile) > 0 Then
 
        srcFile = Replace(srcFile, "http://", "\\")
        srcFile = Replace(srcFile, "/", "\")
 
        str = "Provider=Microsoft.ACE.OLEDB.12.0;"
        str = str & "Data Source=" & srcFile & ";"
        str = str & "Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
 
 
        conn.ConnectionString = str
        conn.CursorLocation = adUseClient
 
        If conn.State = 0 Then
            conn.Open
        End If
    End If
End Sub
Rien de sorcier. Cela fonctionne très bien

B - Accéder à l'information

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
Sub test()
    Dim IndexArr, compteur
    Dim nom_fichier As String
 
    nom_fichier = "modélisme.xlsm"
 
    ouvre_connection (nom_fichier)
 
    GetData "Locomotive", "001", "BP", 5, False, outArr, compteur
 
End Sub
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
Function GetData(Project As String, Fascicule As String, Vis_Type As String, QT_reçus As Integer, TTL As Boolean, outArr As Variant, compteur As Variant)
    ' IN:
    '     Project: Nom du projet contenant les différentes vis
    '   Fascicule: N° du fascicule à mettre à jour
    '    Vis_Type: Type de vis (majuscule)
    '    QT_reçus: Nombre de vis reçue
    
    Dim myRS As ADODB.Recordset
    
    Dim RS_n As Integer
    Dim RS_f As Integer
    
    Dim nbLigne As Integer
    Dim nbColonne As Integer
    
    Dim Arr
    Dim ct(1, 2) As Integer

    Set myRS = New ADODB.Recordset
    
   ' Le problème est ici:'
   ' Si je retire la clause WHERE, cela fonctionne
   ' Autrement, le code s'arrête avec l'erreur: "No value given for one or more required parameters"

    sqlstr = "SELECT * FROM [Vis$] WHERE Projet = " & Chr(34) & Project & Chr(34)
    myRS.Open sqlstr, conn, adOpenStatic, adLockReadOnly, adCmdText
    
    nbLigne = myRS.RecordCount
    nbColonne = myRS.Fields.Count
    
    If Not myRS.EOF Then
        ReDim Arr(1 To nbLigne, 1 To nbColonne)
        Do While Not myRS.EOF
            For RS_n = 1 To myRS.RecordCount 'lignes
                For RS_f = 0 To myRS.Fields.Count - 1 'colonnes
                    valeur = myRS.Fields(RS_f).Value
                    Arr(RS_n, RS_f + 1) = valeur
                Next
                myRS.MoveNext
            Next
        Loop
    End If
    
    myRS.Close
    
    Set myRS = Nothing
    
        ct(1, 1) = nbLigne
        ct(1, 2) = nbColonne
    
    outArr = Arr
    compteur = ct

End Function
Pour information, j'ai déjà regardé sur votre site la formation que vous donnez sur le SQL et je l'ai essayé. Sans succès
J'ai également regardé dans ce forum les différentes discussion qui traite le SQL ... Sans succès.
Je me suis promené sur "stackoverflow" et autre forum Excel. Sans succès.

Où se trouve mon erreur, je ne la voie pas !
Peut être que quelqu'un parmis vous la voyez !

Merci d'avance de votre aide.
André