2009-02-12 7 views
6

Jak rozumiem, kiedy tworzę arkusz Excela z kodem VBA, kod VBA jest zapisywany jako binarny w arkuszu. Dlatego nie mogę umieścić kodu w źródłowej kontroli w użyteczny sposób, mieć wielu programistów pracujących nad problemami, diffowanie jest trudne, itp.Czy istnieje rozwiązanie taktyczne (czytaj "hack"), aby uniknąć posiadania kodu VBA i arkusza Excel jako jednego pliku binarnego?

Czy istnieje sposób obejścia tego bez przełączania na VSTO, dodatki COM itp? Na przykład. dla arkusza do załadowania wszystko jest VBA w czasie wykonywania z usługi sieciowej, wspólnego dysku, itp? Wszelkie pomysły docenione.

Dzięki.

+3

Tylko uwaga - skoroszyty, które programowo zmieniają swój kod VBA, są często oznaczane jako wirusy ... –

Odpowiedz

11

Napisałem rodzaj systemu kompilacji dla programu Excel, który importuje kod VBA z plików źródłowych (który może następnie zostać importowane do kontroli źródła, diffowane itd.). Działa poprzez utworzenie nowego pliku Excel, który zawiera zaimportowany kod, więc może nie działać w twoim przypadku.

Build makro wygląda to tak, ja zapisać go w pliku o nazwie Build.xls:

Sub Build() 
    Dim path As String 
    path = "excelfiles" 

    Dim vbaProject As VBIDE.VBProject 
    Set vbaProject = ThisWorkbook.VBProject 

    ChDir "C:\Excel" 
    ' Below are the files that are imported 
    vbaProject.VBComponents.Import (path & "\something.frm") 
    vbaProject.VBComponents.Import (path & "\somethingelse.frm") 

    Application.DisplayAlerts = False 
    ActiveWorkbook.SaveAs "Output.xls" 
    Application.DisplayAlerts = True 

    Application.Quit 
End Sub 

Teraz rzeczy VBIDE oznacza, że ​​trzeba importować referencję o nazwie „Microsoft Visual Basic for Applications rozciągliwość 5.3 ”Myślę, że

oczywiście nadal masz problem z konieczności uruchamiania programu Excel budować To może być ustalona z małego skryptu VB:..

currentPath = CreateObject("Scripting.FileSystemObject") _ 
    .GetAbsolutePathName(".") 
filePath = currentPath & "\" & "Build.xls" 

Dim objXL 
Set objXL = CreateObject("Excel.Application") 
With objXL 
    .Workbooks.Open(filePath) 
    .Application.Run "Build.Build" 
End With 
Set objXL = Nothing 

Ru nning powyższy skrypt powinien rozpocząć kompilację pliku Excel, który wyprowadza wynikowy arkusz. Prawdopodobnie musisz zmienić niektóre rzeczy, aby były ruchome w systemie plików. Mam nadzieję że to pomoże!

1

Interesujące pytanie ... mamy również problem z kontrolą źródła VBA, ale nigdy nie udało się go rozwiązać.

Czy to Microsoft KB article pasuje do Twojego kraju? Kod jest umieszczany w pliku .BAS, który może znajdować się w arbitralnej lokalizacji (i oddzielony od .xls).

Jak już powiedziałem, nigdy nie próbowałem tego zrobić, ale wygląda na to, że może to być jedno podejście.

+0

FWIW "mamy również problem z kontrolą źródła VBS" powinien przeczytać "mamy również problem z kontrolą źródła VBA" – shearichard

3

Zdecydowanie zaleca się, aby nie próbować załadować VBA w czasie wykonywania. Automatyzacja VBIDE jest w najlepszym wypadku niestabilna i myślę, że napotkasz wiele problemów związanych z utrzymaniem i wsparciem.

Moim rozwiązaniem było wyeksportowanie kodu peryferyjnego do kontroli źródła jako plików tekstowych. Usunąłbym także cały kod z xls (całkowite usunięcie formularzy, modułów i modułów klasy oraz usunięcie kodu z modułów arkusza roboczego i skoroszytu) i wstawienie tylko tego "kodu pośredniczącego" do kontrolki źródłowej.

Przebudowa z kontroli kodu źródłowego polegałaby na wykonaniu "kodu pośredniczącego" xls, zaimportowaniu wszystkich formularzy, modułów klas i modułów oraz skopiowaniu i wklejeniu całego kodu do modułów arkusza roboczego i skoroszytu.

Podczas gdy był to bolesny proces, pozwolił on na prawidłową kontrolę kodu źródłowego ze wszystkimi typowymi możliwościami różnicowania, rozgałęziania itp. Niestety większość była ręczna. Napisałem dodatek, który zautomatyzował niektóre z nich, ale szybko został zhakowany razem, tj. Dość nieporęczny i wymagający ręcznej interwencji. Jeśli kiedykolwiek zdarzy mi się to powtórzyć, a potem wszystko zostanie zrobione, to dam ci znać :-)

0

Odradzam również ładowanie w czasie pracy i szukam narzędzia w stylu make.W końcu, jeśli twój kod jest pod kontrolą źródła, powinieneś tylko zaktualizować skoroszyty po zatwierdzeniu.

Niestety, nie ma takiego narzędzia, a przynajmniej nie takiego, które mógłbym znaleźć.

0

Myślę, że w porównaniu z alternatywami (tj. Stale odbudowujących plików skoroszytu programu Excel) byłoby znacznie mniej kłopotów, aby przejść do VSTO lub dodatków COM, przy użyciu VBA do pracy światła prototypowania. Można również uzyskać dodatkową korzyść nie łatwo posiadające kod „hackable” źródło (tj trzeba więcej niż odgadnąć hasło projektu VBA)

+0

jest to najlepsza odpowiedź na złożone pytanie. –

0

Najkrótsza droga do przodu korzysta SourceTools.xla Addin z http://www.codeproject.com/KB/office/SourceTools.aspx

Innym podejściem jest napisanie podobnego narzędzia za pomocą powiązań COM z twoim ulubionym językiem programowania. Mój zdolny kolega stworzył jeden w Pythonie, który mógł eksportować wszystkie elementy, w tym kod VBA, zawartość arkusza roboczego i formuły, a nawet odniesienia VBA do plików tekstowych i mógł z nich zbudować działający skoroszyt. To było również przed formatem XLSX.

Powiązane problemy