Bonjour,

Je cherche à lancer une procédure SQL avec une macro Excel (VBA). La procédure SQL fonctionne mais lorsque je lance la macro Exel j'ai une erreur :" Cette opération n'est pas autorisée si l'objet est ouvert."

Etant débutant sur VBA - Excel je sollicite l'aide du Forum

Voici le code VBA:

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
56
Option Explicit
 
 
Sub Procedure()
Dim sql11 As String
Dim valcel As String
Dim valcel2 As String
Dim valcel3 As String
valcel = Excel.Range("Feuil1!L1").Value
valcel2 = Excel.Range("Feuil1!L2").Value
valcel3 = Excel.Range("Feuil1!L3").Value
 
sql11 = "exec Q_T_p_L100_Affaire_Encours  " & valcel & ", " & valcel2 & ", " & valcel3
Call ExecSQL(sql11)
 
MsgBox (sql11)
MsgBox "Procédure Exécutée.  ", 64
 
End Sub
 
 
Sub ExecSQL(StoredProcedure As String, Optional Parameters As String)
    Dim CN As ADODB.Connection
    Dim cmd As ADODB.Command
    Dim prm As ADODB.Parameter
    Dim rs As ADODB.Recordset
    Dim connectionString As String, sqlServer As String, sqlDatabase As String
    Dim sql11 As String
 
' Connexion   
    Set CN = New ADODB.Connection
    CN.connectionString = "Provider=SQLOLEDB;Persist Security Info=True;User ID=sa;Password=XXXXX;Data Source=XXXXXXXX;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=XXXXXXX;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=DB"
    CN.Open
 
' Set CommandText
    sql11 = StoredProcedure
    Set cmd = New ADODB.Command
    cmd.CommandText = sql11
    cmd.ActiveConnection = CN
 
' Exec Query
    Set rs = cmd.Execute
    rs.Open sql11, CN, adOpenStatic
 
With ThisWorkbook.Worksheets("Feuil1")
    .UsedRange.ClearContents
    .Range("A1").CopyFromRecordset rs
End With
 
ExitHere:
    CN.Close
 
    Set rs = Nothing
    Set CN = Nothing
    Exit Sub
End Sub

Pour info la procédure SQL est la suivante:

Code SQL : 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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
ALTER
PROCEDURE [dbo].[Q_T_p_L100_Affaire_Encours] (
    @CODE_SOCIETE int,
    @DATE_AFFAIRE_DEB nvarchar(20),
    @DATE_AFFAIRE_FIN nvarchar(20)
                                                )
AS
 
DECLARE
    @debugg char(1),
    @wt varchar(4000)
 
BEGIN
set @debugg='1'
 
-- Création Table Tempo
if (@debugg>'0') begin
    set @wt='> Création Table Tempo ['+convert(char(19),getdate(),121)+']'
    raiserror (@wt,0,1) WITH NOWAIT
end
CREATE TABLE #t (
        CODE_SOCIETE INT not null,
        DATE_AFFAIRE_DEB date not null,
        DATE_AFFAIRE_FIN date not null,
        CODE_CLIENT nvarchar(20) null,
        NOM_CLIENT nvarchar(50) null,
        CODE_AFFAIRE nvarchar(20) null
                )
 
-- Insertion Table Tempo 
if (@debugg>'0') begin
    set @wt='> Insertion Table Tempo  ['+convert(char(19),getdate(),121)+']'
    raiserror (@wt,0,1) WITH NOWAIT
end
INSERT INTO #t    
SELECT        
            1,
            CAST (@DATE_AFFAIRE_DEB AS SMALLDATETIME),
            CAST (@DATE_AFFAIRE_FIN AS SMALLDATETIME),
            doc.CT_Num,
            Tiers.CT_Intitule,
            doc.CA_Num
 
FROM        F_DOCLIGNE      doc    
INNER JOIN     F_COMPTET     Tiers
            on doc.ct_num = tiers.ct_num and Tiers.CT_Type=0
INNER JOIN T_AFFAIRE A
            ON A.CODE_SOCIETE=1 AND A.CODE_AFFAIRE=doc.CA_Num
 
WHERE         doc.DL_Qte<>0 and         
            ((doc.DO_Type in (1,2,3) and doc.DO_Date <= (CAST (@DATE_AFFAIRE_DEB AS SMALLDATETIME))) or
            (doc.DO_Type in (6,7,8) and doc.DO_Date > (CAST (@DATE_AFFAIRE_FIN AS SMALLDATETIME))))    
 
select
        CODE_SOCIETE,
        DATE_AFFAIRE_DEB,
        DATE_AFFAIRE_FIN,
        CODE_CLIENT,
        NOM_CLIENT,
        CODE_AFFAIRE
FROM #t
GROUP BY
        CODE_SOCIETE,
        DATE_AFFAIRE_DEB,
        DATE_AFFAIRE_FIN,
        CODE_CLIENT,
        NOM_CLIENT,
        CODE_AFFAIRE
END



Merci de votre aide.