VBA:将主代码和程序分离,xlam和xlsm的结合

有的时候,我们不希望别人看到我们的代码。

平时我都是放在"personal.xlsb",但是可能有的时候,我们希望是放在公司内部网络上。

首先 ,我们需要在打开xlsm的时候自动加载xlam到“开发工具”>"Excel加载项"这个选项卡。
Private Sub Workbook_Open()
Run_AddIns                '没有按模块.过程名,也运行了
End Sub
步骤二、创建一个xlam文件:

2.1,新建一个文档

2.2,在代码编辑器中写(这里只是简单测试一下xlsm如何调用xlam):

Sub auto_open()      '不要写auto_open,在xlam中写这个不是很好用,或者不要打勾
'Sub test1()
Debug.Print "Start"
'Workbooks("工作簿1").ActiveSheet.Cells(1, 1) = "AAA"      '此处必须指定workbooks,否则它自以为是test1.xlam的cells(1,1)
'Workbooks("xlam.xlsm").ActiveSheet.Cells(1, 1) = "CCC"
MsgBox "SSSS", vbOKCancel
End Sub

Sub test()
'Workbooks("xlam.xlsm").ActiveSheet.Cells(2, 1) = "CCC"
Debug.Print "BBB"
End Sub

2.3,选择文件,保存为“加载宏(*.xlam)

路径如下(OneDrive其实也可以,到时候我可以共享这个xlam文件给用户):C:\Users\ta61042\OneDrive - Welbilt\Test2.xlam

步骤三、加载我们之前写的xlam到“开发工具”>"Excel加载项"这个选项卡中。
Sub Run_addins()
Dim addr As String
Dim str
Dim add_in As AddIn
addr = "C:\Users\ta61042\OneDrive - Welbilt\Test2.xlam"
For Each add_in In Application.AddIns
    If add_in.Title = "Test2" Then
        MsgBox "Test2 is already existing!"
        AddIns("Test2").Installed = False
        'Exit Sub
        'GoTo Allen
    Else
        AddIns.Add Filename:=addr
        'AddIns("Test1").Installed = True
    End If
Next
'Allen:
'Application.Run "'" & addr & "'!模块1.test"         'Passed:把M1改为模块1,不要强制去改test1.xlam的模块名字,好像会自动还原!
End Sub
'测试一:如果存在就告知“test2 is already existing!",不存在就加载到addins中(但是还没有打勾)
'测试一结果:Passed,在加载项中已经安装了,而且没有打勾,勾选test2,并“确认”会弹出“SSSS”
'测试二:如果打勾状态下关闭xlsm文件,下次打开文件是不是会直接运行test2.
'测试二结果:没有再弹出“SSSS",意味着没有运行
'最终决定:还是将“打勾+确认”这个机会给到手工来控制,在If add_in.Title = "Test2" Then下写上AddIns("Test1").Installed = false吧
'而且在xlsm退出的时候,也需要设置Installed = false

步骤四:退出时,我需要将Test2这个加载项的“勾”去掉:

我们在workbook_beforeClose事件中写入以下代码:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
For Each add_in In Application.AddIns
    If add_in.Title = "Test2" Then
        AddIns("Test2").Installed = False
    End If
Next
End Sub

步骤五:最后我们需要做的就是在xlam中写我们各种工作需要代码:

1,运行一个UserForm,放置一些按钮,每个按钮赋予不同的功能

2,运行一个Ctrl+M控制的菜单,放置一些菜单

3,直接启动加载项,和2差不多,整个MRP的内容都可以放置在xlam中(这个就很多了,我写了近一周的代码)

4,单个功能(处理Forecast,ABC分类,库存周转率分析,呆滞分析,XYZ分析,Stock,BOM分解,WhereUsed,ECO分析等等)

<think>我们正在处理一个关于在Excel中(或类似表格应用)添加文件选择输入框执行按钮的需求。 根据用户描述,需要在Sheet1页面添加: 1. 一个输入框用于显示选择的文件路径 2. 一个选择文件按钮(点击后可以选择文件并将路径显示在输入框中) 3. 一个执行按钮(点击后开始处理选定的文件) 由于用户提到的是Excel,我们可以使用VBA(Visual Basic for Applications)来实现这个功能。 另外,用户也可能是在其他环境中(如网页表格)但根据引用内容(尤其是引用[1]引用[2])来看,用户似乎是在Excel环境中。 引用[1]中提到了VBA代码(如InputBox,ActiveWorkbook等),引用[2]提到了HTML代码(如input type="file"),但用户的问题是在Sheet1页面添加,因此我们要考虑Excel VBA的解决方案。 在Excel VBA中,我们可以通过以下步骤实现: 1. 添加一个按钮(作为“选择文件”按钮),点击时弹出文件选择对话框,并将选择的文件路径显示在一个文本框中(或一个单元格中)。 2. 添加另一个按钮(作为“执行按钮”),点击时获取文件路径并执行处理操作。 但是,Excel VBA本身没有提供直接的文件选择输入框控件(像HTML那样)。我们可以: - 使用一个文本框(ActiveX控件)来显示文件路径 - 使用一个按钮(ActiveX控件)来触发文件选择对话框 - 另一个按钮(ActiveX控件)来执行处理 或者,我们也可以使用单元格来显示路径,然后按钮使用表单控件或ActiveX控件。 这里我们使用ActiveX控件,因为它更灵活。 步骤: 1. 在开发工具选项卡中,插入一个文本框(ActiveX控件)用于显示文件路径。 2. 插入一个按钮,命名为“选择文件”,点击这个按钮时弹出文件选择对话框(使用Application.GetOpenFilename方法),并将选择的文件路径赋值给文本框。 3. 插入另一个按钮,命名为“执行”,点击这个按钮时获取文本框中的文件路径,然后执行处理该文件的代码。 注意:用户需求中并没有明确处理文件的具体操作,所以我们在执行按钮的点击事件中,需要调用一个处理文件的子过程,并将文件路径作为参数传递。 下面是一个示例代码框架: 首先,在Sheet1上放置控件: - TextBox1(用于显示文件路径) - CommandButton1(选择文件按钮) - CommandButton2(执行按钮) 然后编写VBA代码: ```vba ' 选择文件按钮的点击事件 Private Sub CommandButton1_Click() ' 打开文件选择对话框 Dim filePath As Variant filePath = Application.GetOpenFilename( _ Title:="请选择文件", _ FileFilter:="Excel Files (*.xls*), *.xls*") ' 如果用户选择了文件(没有取消) If filePath <> False Then Me.TextBox1.Text = filePath End If End Sub ' 执行按钮的点击事件 Private Sub CommandButton2_Click() Dim filePath As String filePath = Me.TextBox1.Text ' 检查文件路径是否为空 If filePath = "" Then MsgBox "请先选择文件!", vbExclamation Exit Sub End If ' 调用处理文件的子过程,这里假设处理文件的子过程名为ProcessFile ProcessFile filePath End Sub ' 处理文件的子过程(需要根据实际需求编写) Private Sub ProcessFile(filePath As String) ' 这里写处理文件的代码,例如打开文件,读取数据等 ' 示例:打开选中的工作簿 Dim wb As Workbook Set wb = Workbooks.Open(filePath) ' ... 执行你的操作 ... ' 完成后关闭工作簿(根据需求决定是否保存关闭) wb.Close SaveChanges:=False End Sub ``` 注意:以上代码需要放在Sheet1的代码窗口中(在VBA编辑器中,双击Sheet1,然后将代码粘贴进去)。 另外,用户需要确保启用了宏,并且开发工具选项卡可用。如果用户使用的是Excel,可以通过以下方式启用开发工具选项卡: 文件 -> 选项 -> 自定义功能区 -> 勾选“开发工具” 关于控件: - 插入控件:在开发工具选项卡中,点击“插入”,在ActiveX控件中选择文本框命令按钮。 - 设置控件属性:可以右键单击控件,选择“属性”来更改名称、标题等。 如果用户希望使用表单控件(而不是ActiveX控件),也可以实现,但ActiveX控件的事件处理更方便。 另外,引用[3]提到了使用Python合并多个Excel文件,但用户的需求是在Excel内部添加界面,所以这里我们使用VBA。 如果用户希望使用其他方式(如Excel的插件或外部程序),但根据问题描述,用户要求的是在Sheet1页面添加控件,所以VBA是最直接的。 相关问题: 1. 如何确保VBA代码的安全性(防止宏病毒)? 2. 如果处理文件需要长时间运行,如何避免Excel界面卡死? 3. 除了VBA,还有哪些方法可以在Excel中实现类似功能?</think>### 在Excel中添加文件选择输入框执行按钮的实现方案 在Excel中实现文件选择路径显示执行功能,可以通过以下两种流方法实现: #### 方法一:使用VBA控件(推荐) 1. **添加文件路径输入框** - 打开开发工具选项卡:文件 → 选项 → 自定义功能区 → 勾选"开发工具" - 插入ActiveX文本框控件: ```vba ' 在Sheet1代码窗口中 Private Sub CommandButton1_Click() ' 选择文件按钮 Dim filePath As String filePath = Application.GetOpenFilename("Excel Files (*.xlsx), *.xlsx") If filePath <> "False" Then TextBox1.Text = filePath ' 显示路径到文本框 End If End Sub ``` 2. **添加执行按钮** ```vba Private Sub CommandButton2_Click() ' 执行按钮 If TextBox1.Text = "" Then MsgBox "请先选择文件!", vbExclamation Exit Sub End If ProcessFile TextBox1.Text ' 调用处理函数 End Sub Private Sub ProcessFile(filePath As String) ' 示例处理逻辑(实际替换为你的业务代码) Dim wb As Workbook Set wb = Workbooks.Open(filePath) MsgBox "已打开文件:" & wb.Name, vbInformation ' 添加你的文件处理代码... End Sub ``` 3. **界面效果**: - `TextBox1`:显示文件路径的输入框 - `CommandButton1`:标签设为"选择文件" - `CommandButton2`:标签设为"开始执行" #### 方法二:使用表单控件+单元格显示 ```vba ' 选择文件按钮 Sub SelectFile() Dim path As String path = Application.GetOpenFilename() If path <> "False" Then Range("B2").Value = path ' 在B2单元格显示路径 End If End Sub ' 执行按钮 Sub ExecuteProcess() If Range("B2").Value = "" Then Exit Sub ProcessFile Range("B2").Value End Sub ``` #### 关键注意事项 1. **安全设置**: - 需启用宏:文件 → 选项 → 信任中心 → 启用所有宏 - 保存为`.xlsm`格式 2. **路径处理**: - 使用`Application.GetOpenFilename`获取合法路径 - 验证路径存在性:`If Dir(filePath) = "" Then` 3. **错误处理**: ```vba On Error Resume Next Workbooks.Open filePath If Err.Number <> 0 Then MsgBox "文件打开失败:" & Err.Description, vbCritical End If ``` [^1]: 在文件操作中动态获取路径是VBA的常见实践,可避免硬编码路径问题。 [^2]: 界面控件需与功能逻辑分离,保持代码可维护性。 [^3]: 文件处理函数应根据实际需求设计,如数据提取或格式转换。 --- ### 相关问题 1. **如何防止用户取消文件选择时出现错误路径?** *(检查`Application.GetOpenFilename`返回"False"的情况)* 2. **VBA中如何处理批量文件选择而不仅是单个文件?** *(使用`Application.GetOpenFilename`的MultiSelect参数)* 3. **当处理大型Excel文件时,如何避免界面卡死?** *(使用`Application.ScreenUpdating = False`异步处理技术)* 4. **能否在Excel中实现文件夹选择而不仅是文件选择?** *(使用Windows API调用或`FileDialog`对象)* 5. **如何将这种VBA功能转换为Excel插件供多用户使用?** *(通过导出为XLAM加载项并分发)*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值