2015-06-15 1 views
0

Добрый день. Мы перемещаем наши программы и файлы в новую папку. Есть ли способ прокрутить все пользовательские формы, чтобы изменить путь по умолчанию, который кодируется почти во всех пользовательских формах? Или есть способ сохранить путь по умолчанию, например, к макросу или другому модулю, который могут считывать все коды пользовательской формы (тогда мне нужно только изменить путь один раз)?excel vba 2013 Как прокрутить пользовательские формы и изменить текст во всех из них

Les

+0

Я не уверен, что вы имеете в виду, прокручивая пользовательские формы, если путь изменился на новый путь, почему бы вам не заменить строку для старого пути на путь со строкой из нового пути во всем проекте? – Jeanno

+0

Объявите публичную константу в регулярном модуле и укажите, что из ваших форм. Если это не то, что вы ищете, то, возможно, добавьте еще несколько деталей к вашему вопросу - например, какова цель жестко закодированного пути и что там хранится. Можете ли вы заменить жестко закодированный путь (например) 'ThisWorkbook.Path &" \ subfolderHere \ "'? –

+0

Jeanno, у меня есть дюжина пользовательских форм, которые ссылаются на разные рабочие листы в одной папке. Изменяя папки, мне нужно будет перейти к каждой пользовательской форме и вручную изменить путь к новому пути - вот что я имею в виду, прокручивая таблицы, поэтому мне не нужно вручную открывать и изменять каждый экземпляр пути. Я попробую предложение Тима и поставлю ссылку на путь в одном месте и «позвоню», когда мне это понадобится. –

ответ

0

Добавить этот код в новую книгу с поддержкой макросов. Установите константы FIND_WHAT и REPLACE_WITH, откройте другие книги и запустите код.

Исходный код приходит от [сайт Чарльза Пирсона] [1]

ВНИМАНИЕ: Только основное тестирование было сделано!

Option Explicit 

Sub ReplaceTextInCodeModules() 

' Must add a reference to "Microsoft Visual Basic For Applications Extensibility 5.3" 
' Also must set "Trust access to the VBA project object model" 
' See the url below for more info on these. 
' Based on code found at: 
' Source: www.cpearson.com/excel/vbe.aspx Copyright 2013, Charles H. Pearson 

Dim theWorkbook As Workbook 
Dim VBProj As VBIDE.VBProject 
Dim VBComp As VBIDE.VBComponent 
Dim CodeMod As VBIDE.CodeModule 
Dim numLines As Long ' end line 
Dim lineNum As Long 
Dim thisLine As String 
Dim message As String 
Dim numFound As Long 

Const FIND_WHAT As String = "findthis" 
Const REPLACE_WITH As String = "replaced" 

    numFound = 0 

    For Each theWorkbook In Application.Workbooks 
     If theWorkbook.Name <> ThisWorkbook.Name Then 
      If theWorkbook.HasVBProject Then 
       Set VBProj = theWorkbook.VBProject 
       For Each VBComp In VBProj.VBComponents 
        'Set VBComp = VBProj.VBComponents("Module1") 
        Set CodeMod = VBComp.CodeModule 

        With CodeMod 
         numLines = .CountOfLines 
         For lineNum = 1 To numLines 
          thisLine = .Lines(lineNum, 1) 
          If InStr(1, thisLine, FIND_WHAT, vbTextCompare) > 0 Then 
           message = message & theWorkbook.Name & " | " & VBComp.Name & " | Line #" & lineNum & vbNewLine 
           .ReplaceLine lineNum, Replace(thisLine, FIND_WHAT, REPLACE_WITH, , , vbTextCompare) 
           numFound = numFound + 1 
          End If 
         Next lineNum 
        End With 
       Next VBComp 
      End If 
     End If 
    Next theWorkbook 

    Debug.Print "Found: " & numFound 
    If message <> "" Then 
     Debug.Print message 
    End If 

End Sub 
0

Тим, Это был простой и достаточно простое решение, спасибо. Я объявлял «путь» как строку, а не константу, чтобы допускать будущие изменения (моя компания делает слишком много изменений). У меня есть пользовательская форма обслуживания для других вещей и добавлена ​​кнопка ввода, которая запрашивает у пользователя «путь». Я помещаю флаг в подпункт «pathname», который проверяет, был ли вызов вызван из модуля обслуживания. Если вспомогательный модуль «pathname» не был вызван из модуля обслуживания, он просто возвращает текущий «путь» к вызывающему модулю. И я изменил код во всех модулях пользовательской формы (которые ссылаются на путь), чтобы вызвать sub.

+0

'Public Const THE_PATH As String =" C: \ your \ path \ go \ here \ "' должно быть хорошо. 'Const' не означает, что он никогда не изменяется, только после того, как проект был скомпилирован. Вы все равно можете редактировать код и изменять значение в любое время, но с помощью Constant защищает значение от изменения во время выполнения кода. –

+0

Тим, до сих пор обучения. Спасибо за объяснение, и это имеет смысл. –