【问题标题】:Text replace in VBA code of Excel filesExcel文件的VBA代码中的文本替换
【发布时间】:2020-01-25 00:41:14
【问题描述】:

我们有几十个启用宏的 excel 文件,每个文件都包含几个 VBA 模块,并且在每个模块中都有 SQL 服务器名称和 sql 登录的用户 ID/密码。

我想知道我是否可以编写某种 C# 实用程序来逐个加载这些文件,或者使用 .NET-Office Interop。或任何其他方法用其他东西替换这些字符串......只是因为我必须将所有这些 VBA 宏重新指向另一个服务器名称并使用另一个 sql 登录名和密码......我真的不想通过手 :( :( :(

谢谢!

【问题讨论】:

  • + 1 好问题 :) 我已经准备好 VBA 代码,这对您有帮助吗?或者您是否需要专门的 C# 代码?如果你想要 C#,那么我将不得不在发布之前对其进行修改并在 C# 中对其进行测试。
  • 独立运行的VBA代码也可以,独立我的意思是VBScript或在单独的excel文件中,然后如何传递文件名以进行搜索和替换?如果你分享你的 VBA,我肯定会投票,因为答案不必是 100% 或只有 C# 和 .NET :)
  • 投票不是问题。 :) 是的,它将是一个单独的 Excel 文件,可让您选择一个文件夹,然后代码将替换该文件夹中所有 excel 文件中所有 VBA 模块中的相关文本。
  • 快速提问。 VBA 文件会有密码吗?
  • 好的,我的代码已经准备好了。你能确认以上吗?还有你正在使用的 Excel 版本

标签: c# .net excel vba office-interop


【解决方案1】:

开始

很抱歉花了一些时间来发帖,但我正在为它创建一个 UI,这样它不仅可以帮助您,还可以帮助其他任何寻求相同功能的人。

您需要先启用Trust Access to the VBA project Object model

打开 Excel 并单击文件选项卡 |选项 |信任中心 |信任中心设置 |宏设置

启用宏并点击Trust access to Visual Basic projects

VBA 编辑器中的下一步

点击工具 |选项并在“编辑器”选项卡下选中复选框Require Variable Declaration

接下来从here 下载示例文件,只需按下Sheet1 中的Run 按钮即可启动用户表单,如下所示。

简单地选择包含ONLY 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链接失效,可以从here下载文件

【讨论】:

  • 想法很好,我得到一个无效的序数错误,将调试和修复,非常感谢!!
  • 您在哪一行得到错误?评论On Error GoTo Whoa
  • 我在上面的帖子中提到的两件事 1) 信任对 VBA 项目对象模型的访问权限 2) 文件夹应该只有 Excel 文件 3) 我想不出任何其他可以提供的代码行你的错误。我在发布答案之前对其进行了全面测试。
  • 如果 VBE.VBE.CodePanes.Item(i).CodeModule.CountOfLines > 0 那么
  • +1 好。完成任务后,我建议您恢复 VBA 设置以避免病毒攻击。 :)
【解决方案2】:

我建议您创建一个配置文件,其中包含您的服务器名称和凭据。 然后,您向每个 Excel 文件添加一个模块,该模块在启动时解析此配置文件并用它填充全局变量。您只需将所有 VBA 模块中的服务器名称等变量调整为新的全局变量。

这样您就可以随时通过编辑或替换文本文件来更改访问数据。

【讨论】:

    【解决方案3】:

    我建议用这种方法来解决您的问题。您可以创建单独的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2018-05-04
      • 2015-09-10
      相关资源
      最近更新 更多