Pro přístup k Excelu v Delphi 12 používám objekt TExcelApplication.
Nejprve si jej vytvořím App:=TExcelApplication.Create(Nil);
Pak se k němu připojím App.Connect;
Nastavím si úroveň zabezpečení App.AutomationSecurity:=3;
A nechám to běžet na pozadí App.Visible[0]:=False;
Pak si otevřu sešit WB:=App.Workbooks.Open("Soubor",Nul,True,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,0);
A připojím si projektovou část Project:=WB.VBProject;
Mým cílem je přidat si jeden list a do jeho vba modulu si zapsat jenom poznámku 'Moje poznámka
Sešit vložím v pohodě: Sheet:=WB.WorkSheets.Add(Null,WB.Worksheets[WB.Worksheets.Count],1.xlWorkSheet,0);
Nastavím mu nějaké požadované jméno Sheet.Name:='JmenoSesitu'
Ale nedokážu se dostat na jeho Modul. Přijde mi, že se mi ani nevytvoří. Pokud si zobrazím před přidáním Project.VBComponents.Count a po přidání, jsou tam stejné hodnoty. I obsah je stejný. Přitom by to mělo to přidání registrovat. V tomto seznamu jsou totiž jak listy, tak i moduly, formuláře a třídy.
Když si vyzkouším podobný kód přímo ve vba, tak se počet VBKomponentů zvýší o 1 (což je správně)
Tohle je ten VBA kód
Private Function Pocet() As Integer
Dim I As Long
Pocet = ThisWorkbook.VBProject.VBComponents.Count
End Function
Public Sub Test()
Dim WB As Workbook
Dim WS As Worksheet
Debug.Print "Pred pridanim=" & Pocet()
Set WB = ThisWorkbook
Set WS = WB.Worksheets.Add(Null, WB.Worksheets(WB.Worksheets.Count), 1, xlWorksheet)
Debug.Print "Po pridani=" & Pocet()
WS.Name = "JmenoSesitu2"
ThisWorkbook.VBProject.VBComponents(ThisWorkbook.VBProject.VBComponents.Count).CodeModule.AddFromString ("'Testovací poznámka")
Set WS = Nothing
Set WB = Nothing
End Sub
Zkoušel jsem přidat list přímo do VBComponents, ale to vyvolalo Ole chybu. Takže list vytvořím, ale modul k němu nenajdu. Neexistuje nějaký refresh, nebo nemá nějakou chvilku počkat, než se vytvořený modul "propíše" i do seznamu VBComponents?
Máte nějaké nápady co s tím? Mě už došly.
Díky
Pb