【问题标题】:How to put Excel VBA into git如何将 Excel VBA 放入 git
【发布时间】:2020-05-30 01:17:15
【问题描述】:

我在 Excel 中继承了一些 VBA,并希望将其放入 git。就目前而言,git 将其视为二进制文件,并且不想进行文件更改增量,而是复制整个文件。

我想将单个宏分解成文件以将它们放入 git。有标准的方法吗?

【问题讨论】:

标签: excel git


【解决方案1】:

如果你使用 Rubberduck VBA,点击后

您可以使用文件菜单“导出活动项目”,它将表单二进制文件和代码导出为 BAS 对象,它们只是纯文本。然后你可以提交到 git。

【讨论】:

  • 这个开源插件很棒。
【解决方案2】:

您应该能够将模块作为文本导出到 git 文件夹,然后按如下方式提交。

在 VBA 编辑器中为每个宏添加模块(菜单插入/模块)将每个宏代码复制到一个模块中并使用 control + E 保存为文本文件。保存到您的 git 文件夹并使用正常的 git 程序提交任何变化。

当您更改 vba 代码时,重新保存(control+E)模块并正常更新 git。

【讨论】:

  • 也可以导出VBE代码,但应该信任对项目代码的访问
【解决方案3】:

您可以创建一个运行以下 Python 脚本的 git 预提交挂钩,以自动提取您的 VBA 代码并将其添加到您的提交中(请参阅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))

更多详情,请查看https://www.xltrail.com/blog/auto-export-vba-commit-hook

【讨论】:

  • 如果您愿意,请注意:如果您要将 Python 带入等式,您现在可以使用openpyxl Python 包来编写代码而不是 VBA,它可以将 Excel 工作簿数据加载到内存而不实际打开 Excel,在 Excel 中执行任何操作,然后以 Excel 格式再次保存。然后你就可以正常使用 git 和 python 代码,并且从 python 也可以将 Excel 数据单独保存为文本或 JSON 等,它可以与 git 一起使用。
【解决方案4】:

我遇到了这个问题,并通过创建一个 VBA 模块来导出其他 VBA 模块来解决它。使用说明和原始代码可以在以下位置找到:

https://github.com/ColmBhandal/VbaSync.

C# 替代方案

有一个 C# 替代方法可以将 VBA 置于 Excel 版本控制之下。该代码已添加到 C# 库中,可用于进行版本控制,例如通过 CLI 工具或通过 VSTO 插件:

https://gitlab.com/hectorjsmith/csharp-excel-vba-sync

免责声明

我参与了上述 repos 的编码。它们都是免费使用和开源的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 2018-09-23
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多