2012-06-14 14 views
6

Mamy kilkadziesiąt plików Excela z włączoną obsługą makr, z których każda zawiera kilka modułów VBA, aw każdym z tych modułów znajdują się nazwy serwerów SQL i id_użytkowników/hasła logowania sql.Zastępowanie tekstu w kodzie VBA plików Excela

Zastanawiam się, czy mógłbym napisać coś w rodzaju narzędzia C#, które ładuje te pliki jeden po drugim i albo z .NET-Office Interop. lub jakiekolwiek inne podejście zamienia te łańcuchy na coś innego ... tylko dlatego, że muszę ponownie wskazać wszystkie makra VBA na inną nazwę serwera i użyć innej nazwy logowania i hasła sql ... Naprawdę nie chciałbym tego zastąpić przez ręka :(:(:(

dzięki!

+0

+ 1 dobre pytanie :) Mam kodu VBA będzie gotowy, że pomoc lub chcesz się kod C# konkretnie? Jeśli chcesz C#, będę musiał go poprawić i przetestować w C# zanim go opublikuję. –

+0

Kod VBA działający samodzielnie jest ok, samodzielny, mam na myśli VBScript lub oddzielny plik Excela, w jaki sposób przekazujesz nazwy plików do wyszukiwania i zamiany? Jeśli udostępniasz swój VBA, na pewno zagłosuję, ponieważ odpowiedź nie musi być w 100% lub tylko C# i .NET :) –

+2

Głosowanie nie jest problemem. :) Tak, będzie to osobny plik Excel, który pozwoli ci wybrać folder, a następnie kod zastąpi odpowiedni tekst we wszystkich modułach VBA we wszystkich plikach Excela w tym folderze. –

Odpowiedz

10

zacząć

Niestety za poświęcenie trochę czasu opublikowania ale było stworzenie interfejsu użytkownika dla niego tak, że nie tylko pomaga, ale ktoś, kto przychodzi szuka tej samej funkcjonalności.

trzeba najpierw włączyć Trust Access to the VBA project Object model

Otwórz Excel i kliknij kartę Plik | Opcje | Centrum zaufania | Ustawienia Centrum zaufania | Ustawienia makro

Włącz makro i kliknij Trust access to Visual Basic projects

enter image description here

Następny w VBA Edytor

Kliknij na narzędzia | Opcje i pod „Edytor” Zakładka zaznacz pole wyboru Require Variable Declaration

enter image description here

Następny Pobierz przykładowy plik z here i wystarczy nacisnąć przycisk Run W Arkusz1, aby uruchomić userform jak pokazano poniżej.

Wystarczy wybrać folder, który ma TYLKO plików Excel.Wpisz odpowiednie informacje i kliknij Start Replace i gotowe :)

enter image description here

kod używany

Arkusz1 numerem kierunkowym

Option Explicit 

Private Sub CommandButton1_Click() 
    UserForm1.Show 
End Sub 

kodu UserForm palących

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 

WIĘCEJ Migawki

enter image description here

którego kod musi zostać wymieniona przed makro jest prowadzony

enter image description here

Po makro jest prowadzony pliku

enter image description here

EDIT

ALTERNATIVE Pobierz plik LOKALIZACJA

W przypadku, gdy powyższy link wikisend umiera, plik można pobrać z here

+0

Pomysł jest dobry, otrzymuję nieprawidłowy błąd porządkowy, będę debugować i naprawiać, dziękuję bardzo !! –

+0

W której linii występuje błąd? Skomentuj wiersz z napisem "On Error GoTo Whoa' –

+0

Dwie rzeczy wymienione w moim poście powyżej' 1) 'Trust Access to the VBA project Model obiektu' 2) 'Folder powinien zawierać tylko pliki Excel' 3) 'Nie mogę myśleć każda inna linia kodu, która może spowodować błąd. Przetestowałem to całkowicie przed opublikowaniem odpowiedzi. –

5

proponuję utworzyć plik konfiguracyjny, który obejmuje swoje nazwy serwerów i poświadczeń. Następnie należy dodać moduł do każdego z plików Excela, który analizuje plik konfiguracyjny przy uruchomieniu i wypełnia zmienne globalne, wystarczy zmienić zmienne nazwy serwera itp. we wszystkich modułach VBA na nowe zmienne globalne.W ten sposób możesz zmienić dane dostępu w dowolnym momencie, edytując lub zastępując plik tekstowy.

+0

to świetny pomysł! –

0

proponuję ten sposób rozwiązania problemu. Możesz utworzyć oddzielny projekt vba lub vbscript, który będzie ładował wszystkie arkusze kalkulacyjne jeden po drugim, eksportując zawartość swoich projektów vba do oddzielnych plików tekstowych. Następnie możesz załadować te pliki tekstowe i dokonać zamiany ciągów znaków. Następnie możesz importować pliki tekstowe z powrotem do arkusza kalkulacyjnego jako komponenty projektu vba (przez proste cofnięcie procesu eksportu).

Można użyć tego kodu jak ten na eksport komponentów:

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 
Powiązane problemy