在Excel文件的VBA代码中替换文本

Dav*_*ras 6 .net c# vba excel-vba office-interop

我们有几十个启用宏的excel文件,每个文件包含很少的VBA模块,每个模块都有SQL服务器名和sql登录的用户名/密码.

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

谢谢!

Sid*_*out 11

首先

很抱歉花了一些时间在发布,但我正在为它创建一个用户界面,这样它不仅可以帮助你,还可以帮助你寻找相同功能的其他任何人.

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

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

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

在此输入图像描述

下一步在VBA编辑器中

单击工具| 选项并在"编辑器"选项卡下选中复选框Require Variable Declaration

在此输入图像描述

下一步从此处下载示例文件,只需按下RunSheet1中的Button即可启动用户窗体,如下所示.

只需选择仅包含 Excel文件的文件夹即可.输入相关信息并单击Start Replace,您就完成了:)

在此输入图像描述

使用的代码

Sheet1代码区

Option Explicit

Private Sub CommandButton1_Click()
    UserForm1.Show
End Sub
Run Code Online (Sandbox Code Playgroud)

用户形式代码区域

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
Run Code Online (Sandbox Code Playgroud)

更多快照

在此输入图像描述

文件在运行宏之前需要替换的代码

在此输入图像描述

宏运行后

在此输入图像描述

编辑

替代文件下载位置

如果上述wikisend链接死亡,则可以从此处下载该文件

  • +1好的.一旦完成任务以避免病毒攻击,我建议恢复VBA设置.:) (4认同)

Ant*_*ser 5

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

这样,只需编辑或替换文本文件,即可随时更改访问数据.