2016-03-15 8 views
5

Odziedziczyłem trochę VBA w Excelu i chciałbym umieścić go w git. W obecnej wersji git traktuje go jako plik binarny i nie chce robić delt plików, ale powielać cały plik.Jak umieścić Excel VBA w git

Chcę podzielić poszczególne makra na pliki, aby umieścić je w git. Czy istnieje standardowy sposób, aby to zrobić?

+0

Nie jesteś pewien, że możesz rozdzielić makra VBA na oddzielne pliki bez konieczności ich późniejszego wstawiania. Może zajrzeć do tego: http://stackoverflow.com/questions/540535/managing-large-binary-files-with-git –

+1

https://stackoverflow.com/questions/805032/vba-multiple-developers-in-a -projektu-współbieżnego rozwoju, https://christopherjmcclellan.wordpress.com/2014/10/10/vba-and-git/ (i linki tam), https://github.com/hilkoc/vbaDeveloper – max630

+0

Nigdy nie próbuj, ale rozwiązaniem może być kontrola źródła RUBBERDUCK http://rubberduckvba.com/SourceControl –

Odpowiedz

1

Powinieneś być w stanie wyeksportować moduły jako tekst do folderu git, a następnie zatwierdzić w następujący sposób.

W edytorze VBA Dodaj moduły dla każdego makra (Menu Insert/Module) skopiuj każdy kod makra do modułu i zapisz jako plik tekstowy z formantem + E. Zapisz w swoim folderze git i użyj normalnych procedur git do zatwierdzenia jakieś zmiany.

Po zmianie kodu vba ponownie zapisz (control + E) moduł i aktualizuj git jak zwykle.

+0

Istnieje również możliwość eksportowania kodu VBE, ale powinno zaufaj dostępowi do kodu projektu –

0

Można utworzyć git pre-commit, który działa następujący skrypt Pythona, aby automatycznie wyodrębnić kodu VBA i dodać go do listy commit (patrz https://www.xltrail.com/blog/auto-export-vba-commit-hook):

import os 
import shutil 
from oletools.olevba3 import VBA_Parser 


EXCEL_FILE_EXTENSIONS = ('xlsb', 'xls', 'xlsm', 'xla', 'xlt', 'xlam',) 


def parse(workbook_path): 
    vba_path = workbook_path + '.vba' 
    vba_parser = VBA_Parser(workbook_path) 
    vba_modules = vba_parser.extract_all_macros() if vba_parser.detect_vba_macros() else [] 

    for _, _, _, content in vba_modules: 
     decoded_content = content.decode('latin-1') 
     lines = [] 
     if '\r\n' in decoded_content: 
      lines = decoded_content.split('\r\n') 
     else: 
      lines = decoded_content.split('\n') 
     if lines: 
      name = lines[0].replace('Attribute VB_Name = ', '').strip('"') 
      content = [line for line in lines[1:] if not (
       line.startswith('Attribute') and 'VB_' in line)] 
      if content and content[-1] == '': 
       content.pop(len(content)-1) 
       lines_of_code = len(content) 
       non_empty_lines_of_code = len([c for c in content if c]) 
       if non_empty_lines_of_code > 0: 
        if not os.path.exists(os.path.join(vba_path)): 
         os.makedirs(vba_path) 
        with open(os.path.join(vba_path, name + '.bas'), 'w') as f: 
         f.write('\n'.join(content)) 


if __name__ == '__main__': 
    for root, dirs, files in os.walk('.'): 
     for f in dirs: 
      if f.endswith('.vba'): 
       shutil.rmtree(os.path.join(root, f)) 

     for f in files: 
      if f.endswith(EXCEL_FILE_EXTENSIONS): 
       parse(os.path.join(root, f)) 

celu uzyskania dalszych informacji, zajrzyj pod adresem https://www.xltrail.com/blog/auto-export-vba-commit-hook.