我们有几十个启用宏的 excel 文件,每个都包含几个 VBA 模块,在每个模块中都有 SQL 服务器名称和 sql 登录的用户名/密码。
我想知道我是否可以编写某种 C# 实用程序来一个一个地加载这些文件,或者使用 .NET-Office Interop。或任何其他方法用其他东西替换这些字符串......只是因为我必须将所有这些 VBA 宏重新指向另一个服务器名称并使用另一个 sql 登录名和密码......我真的不想通过手 :( :( :(
谢谢!
我们有几十个启用宏的 excel 文件,每个都包含几个 VBA 模块,在每个模块中都有 SQL 服务器名称和 sql 登录的用户名/密码。
我想知道我是否可以编写某种 C# 实用程序来一个一个地加载这些文件,或者使用 .NET-Office Interop。或任何其他方法用其他东西替换这些字符串......只是因为我必须将所有这些 VBA 宏重新指向另一个服务器名称并使用另一个 sql 登录名和密码......我真的不想通过手 :( :( :(
谢谢!
开始于
很抱歉花了一些时间来发帖,但我正在为它创建一个 UI,这样它不仅可以帮助您,还可以帮助其他任何寻求相同功能的人。
您需要先启用Trust Access to the VBA project Object model
打开 Excel 并单击文件选项卡 | 选项 | 信任中心 | 信任中心设置 | 宏设置
启用宏并单击Trust access to Visual Basic projects
下一步 在 VBA 编辑器中
点击工具 | 选项并在“编辑器”选项卡下选中复选框Require Variable Declaration
接下来从这里下载示例文件,只需按下Run
Sheet1 中的按钮即可启动用户表单,如下所示。
简单地选择只有Excel 文件的文件夹。输入相关信息并点击Start Replace
即可完成:)
使用的代码
Sheet1 代码区
Option Explicit
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
用户表单代码区
Option Explicit
Private Sub CommandButton1_Click()
Dim Ret
Ret = BrowseForFolder
If Ret = False Then Exit Sub
TextBox1.Text = Ret
End Sub
Private Sub CommandButton3_Click()
On Error GoTo Whoa
Dim wb As Workbook
Dim strPath As String, strfile As String
Dim strToReplaceWith As String, strToReplace As String
Dim i As Long, j As Long
Dim VBE As Object
strPath = TextBox1.Text & "\"
strfile = Dir(strPath)
While strfile <> ""
Set wb = Workbooks.Open(strPath & strfile)
Set VBE = ActiveWorkbook.VBProject
If VBE.VBComponents.Item(1).Properties("HasPassword").Value = False Then
If VBE.VBComponents.Count > 0 Then
For i = 1 To VBE.VBComponents.Count
VBE.VBComponents.Item(i).Activate
If VBE.VBE.CodePanes.Item(i).CodeModule.CountOfLines > 0 Then
For j = 1 To VBE.VBE.CodePanes.Item(i).CodeModule.CountOfLines
If InStr(1, VBE.VBE.CodePanes.Item(i).CodeModule.Lines(j, 1), TextBox2.Text, vbTextCompare) Then
strToReplace = VBE.VBE.CodePanes.Item(i).CodeModule.Lines(j, 1)
strToReplaceWith = Replace(strToReplace, TextBox2.Text, TextBox3.Text, 1, 1, vbTextCompare)
VBE.VBE.CodePanes.Item(i).CodeModule.ReplaceLine j, strToReplaceWith
End If
Next
End If
Next i
End If
End If
wb.Close True
strfile = Dir
Wend
LetsContinue:
Application.ScreenUpdating = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume LetsContinue
End Sub
'~~> Function to pop the browse folder dialog
Function BrowseForFolder(Optional OpenAt As Variant) As Variant
Dim ShellApp As Object
'~~> Create a file browser window at the default folder
Set ShellApp = CreateObject("Shell.Application"). _
BrowseForFolder(0, "Please choose a folder", 0, OpenAt)
'~~> Set the folder to that selected. (On error in case cancelled)
On Error Resume Next
BrowseForFolder = ShellApp.self.Path
On Error GoTo 0
'~~> Destroy the Shell Application
Set ShellApp = Nothing
Select Case Mid(BrowseForFolder, 2, 1)
Case Is = ":"
If Left(BrowseForFolder, 1) = ":" Then GoTo Invalid
Case Is = "\"
If Not Left(BrowseForFolder, 1) = "\" Then GoTo Invalid
Case Else
GoTo Invalid
End Select
Exit Function
Invalid:
BrowseForFolder = False
End Function
Private Sub CommandButton4_Click()
Unload Me
End Sub
更多快照
在宏运行之前需要替换其代码的文件
宏运行后
编辑
替代文件下载位置
如果上面的 wikisend 链接失效,可以从这里下载文件
我建议您创建一个配置文件,其中包含您的服务器名称和凭据。然后,您向每个 Excel 文件添加一个模块,该模块在启动时解析此配置文件并用它填充全局变量。您只需将所有 VBA 模块中的服务器名称等变量调整为新的全局变量。
这样,您可以随时更改访问数据,只需编辑或替换文本文件即可。
我建议用这种方法来解决你的问题。您可以创建单独的 vba 或 vbscript 项目,它们将一一加载所有电子表格,将其 vba 项目的内容导出到单独的文本文件中。然后您可以加载这些文本文件并执行字符串替换。之后,您可以将文本文件作为 vba 项目组件导入回电子表格(通过简单还原导出过程)。
您可以使用这样的代码来导出组件:
Public Sub ExportAppSrcs(targetWb as Workbook)
Dim wb As Workbook, Component As Object, Suffix As String, fileName As String
Set wb = targetWb
For Each Component In wb.VBProject.VBComponents
Select Case Component.Type
Case 1 'modul
Suffix = ".bas"
Case 2 'class modul
Suffix = ".cls"
Case 3 'form
Suffix = ".frm"
Case 100 'dokument
Suffix = ".xwk"
Case Else
Suffix = ""
End Select
If Suffix <> "" Then
On Error Resume Next
fileName = wb.Path & "\spreadsheet.xlsm.src\" & Component.name & Suffix
Component.Export fileName
End If
Next
End Sub