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.
Partager