Search code examples
c#.netexcelvbaoffice-interop

Text replace in VBA code of Excel files


we have several tens of macro enabled excel files, each of those contains few VBA modules and in each of those modules there are SQL server names and userid/passwords of the sql login.

I wonder if I could write some kind of C# utility which loads those files one by one and either with .NET-Office Interop. or any other approach replace those strings with something else... just because I have to repoint all those VBA macros to another server name and to use another sql login name and password... I really wouldn't like to do this replacement by hand :( :( :(

thanks!


Solution

  • To begin With

    Sorry for taking some time in posting but I was creating a UI for it so that it not only helps you but anyone else who comes looking for the same functionality.

    You need to first enable Trust Access to the VBA project Object model

    Open Excel and Click on File Tab | Options | Trust Center | Trust Center Settings | Macro Settings

    Enable macro and click on Trust access to Visual Basic projects

    enter image description here

    Next In VBA Editor

    Click on Tool | Options and under the "Editor" Tab select the checkbox Require Variable Declaration

    enter image description here

    Next Download the Sample file from here and simply press the Run Button In Sheet1 to launch the userform as shown below.

    Simple select the folder which has ONLY Excel Files. Enter the relevant info and click on Start Replace and you are done :)

    enter image description here

    Code Used

    Sheet1 Code Area

    Option Explicit
    
    Private Sub CommandButton1_Click()
        UserForm1.Show
    End Sub
    

    Userform Code Area

    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
    

    MORE SNAPSHOTS

    enter image description here

    File Whose code needs to be replaced before the macro is Run

    enter image description here

    After the macro is run

    enter image description here

    EDIT

    ALTERNATIVE FILE DOWNLOAD LOCATION

    In case the above wikisend link dies, the file can be downloaded from here