Newsgroup: it.comp.programmare.win32
Titolo: Excel, Automation e diavolo di macro

Non riesco a capire come rintracciare i nomi delle macro memorizzate
dentro
un file d'excel per poterle eseguire. uso automation da vb6 ed accetto
qualunque idea. Buona notte a tutti Paolo
Ecco il codice che adopero:
Sub Procedere(WorkBookDaElaborare)
Dim MyExcel As Excel.Application
    Set MyExcel = New Excel.Application
    Call ElaboraWorkBook(MyExcel, WorkBookDaElaborare)
    MyExcel.Quit
    Set MyExcel = Nothing
End Sub
Sub ElaboraWorkBook(MyExcel, WorkBookDaElaborare)
    Dim Foglio As Excel.Worksheet
    MyExcel.Workbooks.Open (WorkBookDaElaborare)
    For Each Foglio In MyExcel.Worksheets
        Foglio.Activate
        MyExcel.Run ("macro2") '<<=== qui vorrei inserirre un loop per
lanciare tutte le macro ivi contenute!!!!
    Next Foglio
    MyExcel.ActiveWorkbook.Save
End Sub

 dentro > un file d'excel per poterle eseguire. uso automation da vb6
mi autorispondo con questo codice quasi funzionante (non c'e' il form,
eliminate i riferimenti e passate al programma la stringa "/BATCH
nomefilediexcel")
se qualcuno ha voglia di leggerlo sarà gradito commentatore; per chi non
ha voglia di leggere, la chiave è tutta nell'oggetto VBProject
Attribute VB_Name = "Module1"
Option Explicit
Public lInd As Long
Const lUno As Long = 1
Const vZero As Variant = 0
Sub Main()
Dim lNumErrore As Long
Dim sDescErrore As String
Dim bBatch As Boolean
On Error GoTo Error_Check
bBatch = UCase(Left(Command, 6&)) = "/BATCH"
If App.PrevInstance Then
If bBatch Then MsgBox "Già aperto"
End
End If
If bBatch Then
Call Procedere(Mid(Command, 8&))
Else
Form1.Show vbModal
End If
End 'CHIUDE
'TRAPPATURA
Error_Check:
lNumErrore = Err.Number
sDescErrore = Err.Description
Resume Error_Stop
Error_Stop:
On Error Resume Next 'SI SA MAI
End
End Sub
Sub Procedere(ByVal WorkBookDaElaborare)
'Uso Automation per Excel ed elaboro le macro con la collezione sotto
VBProjects
' (da VBE che rappresenta la root per qualunque cosa di VB for
Application)
Dim MyExcel As Excel.Application
Dim ListaMacro() As String
Dim Componente As VBComponent
Dim NumeroMacro As Long
Set MyExcel = New Excel.Application
MyExcel.Workbooks.Open (WorkBookDaElaborare)
Debug.Print 
MyExcel.ActiveWorkbook.Name
Debug.Print MyExcel.ActiveWorkbook.VBProject.Description
Debug.Print MyExcel.AutomationSecurity
For Each Componente In MyExcel.ActiveWorkbook.VBProject.VBComponents
If Componente.Type = vbext_ct_StdModule Then
Call PreparaListaMacro(NumeroMacro, ListaMacro(), Componente)
End If
Next Componente
Call ElaboraWorkBook(ListaMacro(), MyExcel)
MyExcel.ActiveWorkbook.Save
MyExcel.ActiveWorkbook.Close
MyExcel.Quit
Set MyExcel = Nothing
Beep
End Sub
Sub PreparaListaMacro(NumeroMacro As Long, ListaMacro() As String,
ModuloMacro As VBComponent)
'Anche se la norma è di solo un modulo a nome "Modulo1" è possibile con
l'editor
'inserire un qualunque numero di moduli VB con macro che saranno tutte
disponibili
'Lista tutte le macro del modulo
' per ogni linea controllo a che macro appartiene la riga stessa
' e quando cambia il nome (c'e' una rottura) lo carico in tabella
Dim RompiMacro As String
Dim PuntaLinea As Long
Dim Filler As Long
With ModuloMacro
For PuntaLinea = .CodeModule.CountOfDeclarationLines + lUno To
.CodeModule.CountOfLines
If RompiMacro <> .CodeModule.ProcOfLine(PuntaLinea, Filler) Then
NumeroMacro = NumeroMacro + lUno
ReDim Preserve ListaMacro(NumeroMacro)
RompiMacro = .CodeModule.ProcOfLine(PuntaLinea, Filler)
ListaMacro(NumeroMacro) = RompiMacro
End If
Next PuntaLinea
End With
End Sub
Sub ElaboraWorkBook(ListaMacro() As String, MyExcel)
' at last, attivo foglio per foglio e lancio tutte le macro
Dim Foglio As Excel.Worksheet
For Each Foglio In MyExcel.Worksheets
For lInd = 1 To UBound(ListaMacro)
Foglio.Activate
MyExcel.Run (ListaMacro(lInd))
Next lInd
Next Foglio
End Sub