en un clic
vba-v2
现代化VBA窗体应用生成器 - 支持图片背景、样式按钮、专业布局,一键输出.xlsm
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Menu
现代化VBA窗体应用生成器 - 支持图片背景、样式按钮、专业布局,一键输出.xlsm
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Basé sur la classification professionnelle SOC
| name | VBA窗体生成器V2 |
| description | 现代化VBA窗体应用生成器 - 支持图片背景、样式按钮、专业布局,一键输出.xlsm |
一句话: 一键生成现代化UI的Excel VBA应用程序(UserForm + 功能模块 + .xlsm),摆脱老式Win32土气界面。
与V1的核心差异: 从「能用」升级到「好看」,内嵌背景/控件/布局三大美化模块。
┌─────────── 分析 ───────────┐
│ 需求理解 → 模块识别 → 布局规划 │
└────────────┬────────────────┘
│ 产出:配置方案
▼
┌─────────── 规划 ───────────┐
│ 配置编写 → 样式选择 → 控件设计 │
└────────────┬────────────────┘
│ 产出:config.json
▼
┌─────────── 实现 ───────────┐
│ 脚本执行 → 窗体生成 → 代码注入 │
└────────────┬────────────────┘
│ 产出:.xlsm文件
▼
┌─────────── 验证 ───────────┐
│ 文件打开 → 窗体显示 → 功能测试 │
└─────────────────────────────┘
{
"output_file": "我的工具.xlsm",
"form": {
"title": "数据分析工具箱",
"width": 280,
"height": 420,
"font_name": "微软雅黑",
"font_size": 11
},
"modules": ["模块1.bas", "模块2.bas"],
"buttons": [
{"name": "btn1", "caption": "数据清洗", "module": "数据清洗", "top": 50},
{"name": "btn2", "caption": "报表生成", "module": "生成报表", "top": 95},
{"name": "btnExit", "caption": "退出", "module": "Unload Me", "top": 340}
],
"auto_start": true
}
python templates/create_vba_app.py --config templates/config.json
打开生成的文件 → 窗体自动弹出 → 测试每个按钮
完整配置示例含现代化选项 → 见 templates/config.json
所有参数通过 JSON 定义,零代码修改即可定制:
| 配置块 | 必填 | 说明 |
|---|---|---|
output_file | ✓ | 输出 .xlsm 文件名 |
form.title | ✓ | 窗体标题 |
form.width / height | 尺寸(默认 240×自动计算) | |
modules | ✓ | .bas 模块文件路径数组 |
buttons | ✓ | 按钮配置数组 |
buttons[].name | ✓ | 控件名(如 btn1) |
buttons[].caption | ✓ | 显示文本 |
buttons[].module | ✓ | 调用函数名(或 "Unload Me") |
buttons[].top | ✓ | 距顶部位置(像素) |
auto_start | 是否打开时自动显示(默认 true) |
控件在设计器画布上可见,永久保存在文件中。
# 获取 UserForm 设计器对象
designer = userform.Designer
# 在设计器画布上添加控件(设计时创建)
ctrl = designer.Controls.Add("Forms.CommandButton.1", "btn1")
# ✅ 正确:直接属性访问
ctrl.Caption = "功能按钮"
ctrl.Left = 20
ctrl.Top = 20
ctrl.Width = 180
ctrl.Height = 28
MSForms 是 ActiveX 控件,属性系统与标准 COM 不同:
| 方式 | 结果 |
|---|---|
ctrl.Caption = "文字" | ✅ 推荐 |
win32.Dispatch(ctrl).Caption | ✅ 可用 |
ctrl.Properties("Caption").Value | ❌ 失败 |
根因: MSForms 的 Properties 集合不是标准 COM 集合,.Item() 对其无效。
生成的 VBA 代码遵循以下模板:
Option Explicit
' === 窗体初始化 ===
Private Sub UserForm_Initialize()
Me.Caption = "窗体标题"
End Sub
' === 功能按钮事件 ===
Private Sub btn1_Click()
On Error Resume Next
Call 功能函数名
On Error GoTo 0
End Sub
' === 退出按钮 ===
Private Sub btnExit_Click()
Unload Me
End Sub
' ThisWorkbook 中(自动触发)
Private Sub Workbook_Open()
On Error Resume Next
frmMain.Show
On Error GoTo 0
End Sub
' 启动器模块中(手动触发)
Sub 显示窗体()
frmMain.Show
End Sub
在窗体底层放置等大 Image 控件作为背景:
{
"form": {
"background": {
"enabled": true,
"image_path": "assets/bg_gradient.png",
"mode": "stretch"
}
}
}
推荐背景风格:
隐藏原生标题栏和边框,完全自定义界面:
{
"form": {
"border_style": "none", // 隐藏边框
"show_caption": false, // 隐藏标题栏
"custom_close_button": true // 自制关闭按钮
}
}
效果: 完全不像 Excel 窗体,像独立桌面软件。
不用原生按钮,改用 Image 控件 + PNG 透明按钮图:
{
"buttons": [
{
"name": "btnSave",
"type": "image", // 图片按钮模式
"caption": "保存数据",
"images": {
"normal": "assets/btn_blue_normal.png",
"hover": "assets/btn_blue_hover.png",
"press": "assets/btn_blue_press.png"
},
"module": "保存数据",
"top": 50
}
]
}
按钮制作工具(5分钟搞定):
| 类型 | 样式 | 适用场景 |
|---|---|---|
| 主按钮 | 高亮蓝/绿 + 大圆角 + 居中文 | 核心操作 |
| 次按钮 | 浅灰 + 细边框 | 辅助操作 |
| 图标按钮 | 小图标 + 短文字 | 工具类操作 |
| 危险按钮 | 红色系 | 删除/退出 |
硬性规则:
┌─────────────────────────────┐
│ ▎ 顶部标题栏 │ ← Logo + 名称 + 深色背景
├─────────────────────────────┤
│ │ │
│ 左侧 │ 中间操作区 │ ← 输入框/下拉框集中摆放
│ 导航 │ │
│ │ │
├─────────────────────────────┤
│ ▎ 底部按钮栏 │ ← 保存/取消/查询 固定底部
└─────────────────────────────┘
| 规则 | 说明 |
|---|---|
| 对齐统一 | 标签左对齐,输入框右对齐 |
| 尺寸统一 | 同类控件高度/宽度完全一致 |
| 间距统一 | 控件间留相等空隙(留白=现代化的关键) |
| 分隔清晰 | 用细线/浅色块区分功能区 |
| 场景 | 按钮间距 | 按钮高度 | 窗体宽度 |
|---|---|---|---|
| 单列(<10个功能) | 40pt | 28pt | 240pt |
| 双列(10-20个) | 40pt | 28pt | 360pt |
| 分组布局 | 组内35pt | 28pt | 280pt |
| 控件 | 老式写法 | 现代化写法 |
|---|---|---|
| Label | 宋体+边框+阴影 | 微软雅黑 +无边框 + 深灰字色 |
| TextBox | 3D凹陷效果 | 平面样式 + 白色背景 + 细边框 |
| ComboBox/ListBox | 默认立体感 | 平面化 + 匹配输入框风格 |
| 全局字体 | 宋体/Tahoma | 全程微软雅黑 |
| 配色 | 五颜六色 | 2主色 + 黑白灰(极简) |
读取 config.json
↓
扫描 & 导入 .bas 模块
↓
创建 UserForm(设计时)
├── 设置窗体属性(尺寸/标题/背景)
├── 添加控件到设计器画布
│ ├── CommandButton(传统模式)
│ └── Image + Label(现代模式)
└── 注入事件代码
↓
添加启动宏(Workbook_Open + 启动器模块)
↓
保存为 .xlsm → 完成
输出文件结构:
工具箱.xlsm
├── ThisWorkbook → Workbook_Open() 自动启动
├── 启动器 → 显示窗体() 手动调用
├── 模块1 → 功能代码(来自 .bas)
├── 模块2 → 功能代码(来自 .bas)
└── frmMain → UserForm(设计器 + 事件代码)
| 错误现象 | 根因 | 解决方案 |
|---|---|---|
| 窗体不显示 | 宏被禁用 | 信任中心→启用宏 |
| 按钮空白无文字 | Properties.Item() 失败 | 改用 ctrl.Caption = "文字" 直接赋值 |
| 按钮点击无反应 | 函数名不匹配 | 检查 config 的 module 与 .bas 中函数名一致 |
| 找不到模块 | 路径错误 | 用绝对路径或相对于 config.json 的相对路径 |
| 文件无法保存 | Excel 进程占用 | 先关闭所有 Excel 再运行脚本 |
详细排查步骤 → references/common_errors.md
btnSaveData > btn1)Option Explicit + 错误处理Properties.Item() 设置 MSForms 属性On Error Resume Next 保护| 文档 | 内容 |
|---|---|
| userform_patterns.md | 布局模式、按钮规范、事件模板、性能优化 |
| common_errors.md | 11种常见错误的完整排查流程 |
| config.json | 含现代化选项的完整配置模板 |
| create_vba_app.py | Python 生成脚本(支持现代化配置) |