26 sierpnia 2008

Zarządzanie komponentami projektu VBA

Tutaj dwaj panowie dyskutowali o automatycznym eksportowaniu i importowaniu modułów kodu VBA do i z plików .xls. Jeden z nich postawił problem, który wydał mi się na tyle interesujący, by się z nim zmierzyć (problemem, nie panem). Rozwiązanie, które znalazłem, uważam za na tyle zadowalające, by je zamieścić na stronie.

Na samym początku uwaga organizacyjna. Zamieszczony poniżej kod nie zadziała, o ile nie nakażemy Excelowi ufać wszelkim próbom dostępu do programu Visual Basic Project. Aby to uczynić należy w Excelu z menu Narzędzia wybrać Makro, a następnie Zabezpieczenia:
ToolsMacro

W okienku zabezpieczenia należy przejść do zakładki Źródła zaufane i zaznaczyć opcję Ufaj dostępowi do programu Visual Basic Project:
ToolsMacroSecurity

Postępowanie w przypadku innych wersji Excela jest opisane na stronach Microsoftu.

Kod korzysta z bibliotek:

  • Microsoft Scripting Library
  • Microsoft Visual Basic for Applications Extensibility

Słowa kluczowe: excel, vba, makra, vbe, Microsoft Scripting Library, Microsoft Visual Basic for Applications Extensibility


04 sierpnia 2007

Formatowanie kodu - dodatek Excel

Wczoraj wieczorem napisałem krótki program, którego zadaniem jest formatowanie kodów VBA zapisywanych w plikach xls. Do tego zadania skłoniła mnie dyskusja na forum Excel w praktyce w ramach serwisu goldenline.pl.

Ten kilka funkcji robi ładne wcięcia. Na razie nie radzi sobie z wierszami kodu nie mieszczącymi się w jednej linii (tzn. zakończonymi znakiem podkreślenia). Z tego powodu funkcja Indents wymaga przemyślenia. Poza tym chciałbym dodać możliwość wyróżniania bloków kodu poprzez dodanie spacji przed i po.

Poniżej funkcja testująca napisany przeze mnie dodatek z zaznaczonym wywołaniem głównej procedury odpowiedzialnej za formatowanie kodu.

Sub aTest()  Dim VbComp As VBIDE.VBComponent  Dim CodeModule As VBIDE.CodeModule  Dim LastLine As Long  Dim CodeString As String  For Each VbComp In ThisWorkbook.VBProject.VbComponents   If VbComp.Type = vbext_ct_StdModule Then    Set CodeModule = VbComp.CodeModule    With CodeModule     LastLine = .CountOfLines     CodeString = FormatCode(CodeModule)     Call .DeleteLines(1, LastLine)     Call .InsertLines(1, CodeString)    End With   End If  Next VbComp End Sub

Powyższy kod zadziała jedynie wtedy, gdy w VBE zlinkowane zostaną biblioteki:

  • Microsoft Scripting Runtime
  • Microsoft Visual Basic for Applications Extensibility
No i wreszcie sam dodatek:

Słowa kluczowe: excel, vba, addin, makra, vbe, Microsoft Visual Basic for Applications Extensibility