6

数十個のマクロ対応Excelファイルがあり、それぞれにいくつかのVBAモジュールが含まれており、これらのモジュールのそれぞれにSQLサーバー名とSQLログインのユーザーID/パスワードがあります。

これらのファイルを 1 つずつロードする C# ユーティリティを、.NET-Office Interop を使用して作成できるかどうか疑問に思っています。または他のアプローチは、これらの文字列を別のものに置き換えます...これらすべてのVBAマクロを別のサーバー名に再ポイントし、別のSQLログイン名とパスワードを使用する必要があるためです...私は本当にこの置換を手 :( :( :(

ありがとう!

4

3 に答える 3

11

まずはじめに

投稿に時間がかかって申し訳ありませんが、あなただけでなく、同じ機能を探している他の人にも役立つように、UI を作成していました。

最初に有効にする必要がありますTrust Access to the VBA project Object model

Excel を開き、[ファイル] タブをクリックします。オプション | トラスト センター | セキュリティ センターの設定 | マクロ設定

マクロを有効にしてクリックTrust access to Visual Basic projects

ここに画像の説明を入力

次へ VBA エディタで

ツール | をクリックします。オプションをクリックし、[エディター] タブでチェックボックスを選択しますRequire Variable Declaration

ここに画像の説明を入力

次に、ここからサンプル ファイルをダウンロードし、RunSheet1のボタンを押すだけで、以下に示すようにユーザー フォームが起動します。

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リンクが切れた場合、ファイルはここからダウンロードできます

于 2012-06-14T14:14:53.487 に答える
5

サーバー名と資格情報を含む構成ファイルを作成することをお勧めします。次に、起動時にこの構成ファイルを解析し、それをグローバル変数に入力するモジュールを各 Excel ファイルに追加します。すべての VBA モジュールのサーバー名などの変数を新しいグローバル変数に調整するだけです。

このように、テキスト ファイルを編集または置換するだけで、いつでもアクセス データを変更できます。

于 2012-06-14T13:53:14.770 に答える
0

あなたの問題を解決するこの方法を提案します。個別の vba または vbscript プロジェクトを作成して、すべてのスプレッドシートを 1 つずつ読み込み、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
于 2012-06-14T14:15:54.253 に答える