Problème appel procédure
Bonjour,
je travaille sur un rapport Excel que je créé par automation depuis Access.
j'essaie d'améliorer un peu mon code en "fonctionnalisant" une partie de mon code
pour ce faire, j'ai créé une procédure Sub budget(Annee As Integer) que j'appelle depuis ma procédure principale Sub FinancialReport()
or, j'ai un message d'erreur qui apparait :
erreur d'exécution '91':
Variable objet ou variable de bloc with non définie
sur la ligne
appexcel.Sheets.Add(After:=appexcel.Worksheets("Financial report")).Name = "Budget " & Format(Date_fin, "yyyy")code procédure appelée :
Sub budget(Annee As Integer)
Dim appexcel As Excel.Application
Dim wbexcel As Excel.Workbook
appexcel.Sheets.Add(After:=appexcel.Worksheets("Financial report")).Name = "Budget " & Format(Date_fin, "yyyy")
appexcel.Sheets("Budget " & Format(Date_fin, "yyyy")).Select
appexcel.ActiveWindow.Zoom = 80
appexcel.Cells(1, 1) = "Funders"
appexcel.Cells(1, 2) = "Output"
appexcel.Cells(1, 3) = "Activity"
appexcel.Cells(1, 4) = "Sub-activity"
appexcel.Cells(1, 5) = "Organisation name"
appexcel.Cells(1, 6) = "Years"
appexcel.Cells(1, 7) = "Country"
appexcel.Cells(1, 8) = "Expense class (Direct / Indirect)"
appexcel.Cells(1, 9) = "Expense group"
appexcel.Cells(1, 10) = "Expense type"
appexcel.Cells(1, 11) = "Expense description"
appexcel.Cells(1, 12) = "Measurement unit"
appexcel.Cells(1, 13) = "Unit Cost"
appexcel.Cells(1, 14) = "Number of Units"
appexcel.Cells(1, 15) = "Multiplier"
appexcel.Cells(1, 16) = "% Allocated"
appexcel.Cells(1, 17) = "Total Costs"
appexcel.Cells(1, 18) = "Expense justification"
appexcel.Cells(1, 19) = "Cost assumption sources"
appexcel.Cells(1, 20) = "Travel / staff description"
sql = "SELECT budget.Funders, budget.Output, budget.Activity, budget.[Sub-activity], budget.[Organisation name], budget.Years, budget.Country, budget.[Expense class (Direct / Indirect)], budget.[Expense group], budget.[Expense type], budget.[Expense description], budget.[Measurement unit], budget.[Unit Cost], budget.[Number of Units], budget.Multiplier, budget.[% Allocated to UNITAID], budget.[Total Costs], budget.[Expense justification], budget.[Cost assumption sources], budget.[Travel / staff description] " _
& "FROM budget " _
& "WHERE " _
& "budget.Funders=Funder() AND " _
& "budget.[Organisation name]=Organisation() AND " _
& "budget.Country=Country() AND " _
& "Left(budget.Years,4)= " & Format(Date_fin, "yyyy") & " " _
& "ORDER BY budget.Funders, budget.Output, budget.Activity, budget.[Sub-activity], budget.[Organisation name], budget.Years, budget.Country, budget.[Expense class (Direct / Indirect)], budget.[Expense group], budget.[Expense type], budget.[Expense description], budget.[Travel / staff description];"
Set rs1 = CurrentDb.OpenRecordset(sql)
If Not rs1.EOF Then rs1.MoveFirst
x = 2
Do While Not rs1.EOF
appexcel.Sheets("Budget " & Annee_0).Select
appexcel.Cells(x, 1) = rs1.Fields(0).Value
appexcel.Cells(x, 2) = rs1.Fields(1).Value
appexcel.Cells(x, 3) = rs1.Fields(2).Value
appexcel.Cells(x, 4) = rs1.Fields(3).Value
appexcel.Cells(x, 5) = rs1.Fields(4).Value
appexcel.Cells(x, 6) = rs1.Fields(5).Value
appexcel.Cells(x, 7) = rs1.Fields(6).Value
appexcel.Cells(x, 8) = rs1.Fields(7).Value
appexcel.Cells(x, 9) = rs1.Fields(8).Value
appexcel.Cells(x, 10) = rs1.Fields(9).Value
appexcel.Cells(x, 11) = rs1.Fields(10).Value
appexcel.Cells(x, 12) = rs1.Fields(11).Value
appexcel.Cells(x, 13) = rs1.Fields(12).Value
appexcel.Cells(x, 14) = rs1.Fields(13).Value
appexcel.Cells(x, 15) = rs1.Fields(14).Value
appexcel.Cells(x, 16) = rs1.Fields(15).Value
appexcel.Cells(x, 17) = rs1.Fields(16).Value
appexcel.Cells(x, 18) = rs1.Fields(17).Value
appexcel.Cells(x, 19) = rs1.Fields(18).Value
appexcel.Cells(x, 20) = rs1.Fields(19).Value
rs1.MoveNext
x = x + 1
Loop
rs1.Close
End SubCode procédure principale :
Sub FinancialReport()
Dim appexcel As Excel.Application
Dim wbexcel As Excel.Workbook
Dim rs1, rs2 As DAO.Recordset
Dim Lig As Long
Dim Period As String
'Tableau pour stocker les niveaux hiérarchiques
'Dim Tableau(1000, 5) As String
Dim Tableau() As String
Dim Tableau1() As String
'http://forum.excel-pratique.com/excel/copier-fichiers-xls-vers-repertoire-t26489.html#p150986
Dim fso As Object, Src$, Dest$, Fiche1$, Fiche2$
'récupération de la date du merger ou date du jour
Date_report = Format(Now(), "yyyymmdd_hhmmss")
Period = Format(Date_debut, "yyyy") & "/" & Format(Date_fin, "yyyy")
Set fso = CreateObject("Scripting.FileSystemObject")
Src = "D:\Users\jl3\2_ETUDES\10_TB_Speed\Template financier\"
Dest = "D:\Users\jl3\2_ETUDES\10_TB_Speed\Template financier\"
Fiche1$ = "TB-Speed_financial_reporting.xlsm"
Fiche2$ = "TB-Speed_financial_reporting_" & Funder & "_" & Organisation & "_" & Date_report & ".xlsm"
fso.CopyFile Src & Fiche1, Dest & Fiche2
Set appexcel = CreateObject("Excel.Application")
appexcel.Visible = False
Set wbexcel = appexcel.Workbooks.Open("D:\Users\jl3\2_ETUDES\10_TB_Speed\Template financier\" & Fiche2 & "")
'******************Budget***********************************************************************************************
Years = Format(Date_fin, "yyyy") - Format(Date_debut, "yyyy")
Select Case Years
Case 0
Call budget(Format(Date_fin, "yyyy"))
Case 1
Case 2
Case 3
Case 4
End Select
'.... reste du code
End subd'avance merci pour votre aide
Bonjour
Sans voir le fichier, le nom de la feuille est correct --> Financial Report ? Ce n'est pas ceci --> Financial_Report ?
Il n'y pas d'espace dans le nom de la feuille après Report ?
Cordialement
Bonjour, Salut Dan !
appexcel n'est pas initialisée.
Mais as-tu besoin d'instancier l'application ? Si tu opères à partir d'un classeur Excel, tu es déjà dans l'application et tu n'as nul besoin d'y faire référence, et pas non plus d'en initier une nouvelle instance...
Cordialement.
bonjour et merci à tous les 2 d'avoir répondu
le nom de la feuille est le bon
d'ailleurs, lorsque j'intègre le code dans ma procédure principale aucun problème
je ne comprends pas trop ce que signifie "appexcel n'est pas initialisé"
et encore moins "instancier une application"
je suis dans access et je "pilote" excel en vba depuis ma base access
Dans ce cas, déclare appexcel, voire wbexcel, au niveau Module : elle sont initialisées dans ton autre procédure mais ce sont des variables locales.
Et si tu l'initialiser dans ta nouvelle procédure tu obtiendrais une nouvelle instance d'Excel ne contenant pas le classeur...
Cordialement.
j'avais essayé mais cela ne fonctionnait pas
il faut que je récupère la valeur de webexcel (le nom de mon classeur donc) dans ma procédure Budget() pour l'ouvrir dans ma procédure appelée plutôt que dans ma procédure principale ?
j'avais essayé mais cela ne fonctionnait pas
Ce serait plutôt curieux que des variables module ne fonctionnent pas !
Tu as deux solutions simples : déclarer tes variables niveau module pour qu'elles soient accessibles des deux procédures (les deux étant dans le même module, sinon il faut les déclarer en Public...
ou passer le classeur en argument à ta procédure appelée...
Cordialement.
je comprend un peu le principe mais je suis un peu perdu dans la mise en oeuvre
1. j'ai donc mis mes 2 procédures (principale et appelée) dans le même module
2. je déclare les variable qui entre dans le nom de mon classeur en variables globales
Cependant, je suis quand même obligé d'initialiser appexcel et webexcel dans ma procédure appelée, sinon j'ai le message d'erreur
erreur d'exécution '91':
Variable objet ou variable de bloc with non définie
Mais si j'initialise à nouveau appexcel et webexcel dans ma procédure appelée, lorsque j'ouvre mon classeur excel, j'ai un message m'indiquant que le classeur est déjà ouvert et que je vais perdre toutes les modifications
En fait les données ne s'inscrivent pas dans le même classeur
Option Compare Database
Dim fso As Object, Src$, Dest$, Fiche1$, Fiche2$Procédure principale
Dim appexcel As Excel.Application
Dim wbexcel As Excel.Workbook
Dim rs1, rs2 As DAO.Recordset
Dim Lig As Long
Dim Period As String
''http://forum.excel-pratique.com/excel/copier-fichiers-xls-vers-repertoire-t26489.html#p150986
'Dim fso As Object, Src$, Dest$, Fiche1$, Fiche2$
'récupération de la date du merger ou date du jour
Date_report = Format(Now(), "yyyymmdd_hhmmss")
'Funder (module 1): Funder --> sélection menu déroulant
'Organisation (module 1): Organisation --> sélection menu déroulant
Period = Format(Date_debut, "yyyy") & "/" & Format(Date_fin, "yyyy")
'Debug.Print Period
Set fso = CreateObject("Scripting.FileSystemObject")
Src = "D:\Users\jl3\2_ETUDES\10_TB_Speed\Template financier\"
Dest = "D:\Users\jl3\2_ETUDES\10_TB_Speed\Template financier\"
Fiche1$ = "TB-Speed_financial_reporting.xlsm"
Fiche2$ = "TB-Speed_financial_reporting_" & Funder & "_" & Organisation & "_" & Date_report & ".xlsm"
fso.CopyFile Src & Fiche1, Dest & Fiche2
Set appexcel = CreateObject("Excel.Application")
appexcel.Visible = False
Set wbexcel = appexcel.Workbooks.Open("D:\Users\jl3\2_ETUDES\10_TB_Speed\Template financier\" & Fiche2 & "")
'******************Budget***********************************************************************************************
Years = Format(Date_fin, "yyyy") - Format(Date_debut, "yyyy")
'Debug.Print Years
Select Case Years
Case 0
Call budget(Format(Date_fin, "yyyy"))
Case 1
Case 2
Case 3
Case 4
End SelectEnd sub
Procédure appelée
Sub budget(Annee As Integer)
Dim appexcel As Excel.Application
Dim wbexcel As Excel.Workbook
Set appexcel = CreateObject("Excel.Application")
appexcel.Visible = False
Set wbexcel = appexcel.Workbooks.Open("D:\Users\jl3\2_ETUDES\10_TB_Speed\Template financier\" & Fiche2 & "")
appexcel.Sheets.Add(After:=appexcel.Worksheets("Financial report")).Name = "Budget " & Format(Date_fin, "yyyy")
'reste du code
End subCependant, je suis quand même obligé d'initialiser appexcel et webexcel
Tant qu'elles ne sont pas initialisées leur valeur est Nothing (variables objet qui ne contiennent pas d'objet).
Les procédures étant dans le même module, tu les déclares niveau module avec Dim (si les proc ne sont pas dans le même module tu les déclares dans un avec Public)
et tu ne les déclares plus au niveau des procédures, cela créerait des confusions.
Tu les initialises dans ta procédure principale, et les utilise. Dans ta procédure secondaire tu n'as plus qu'à les utiiliser, elles sont initialisées, tu travailles directement avec.
nickel çà marche parfaitement
et j'ai mieux compris le fonctionnement donc un grand merci
Bonne continuation.