Excel: как я могу ускорить процесс поиска и замены?Изменение 32 000 ссылок на рабочую книгу - PullRequest
5 голосов
/ 27 августа 2010

Я сравниваю много данных для более чем 30 категорий. Каждая книга категории сохраняется в «MyFolder» со своим собственным отличительным именем (категория). Данные в рабочей книге находятся на листе с тем же именем, что и категория: [Category.xls] CategoryYear_Final!

Казалось, лучше всего создать стандартный шаблон, который ссылается на данные и который производит необходимые графики и макеты. Все работало хорошо. Пришло время запустить двигатели и сделать графики для всех категорий, изменив названия ссылок ...

Используя FIND & REPLACE, каждая рабочая книга занимает более 20 минут, поскольку существует более 32 000 мест (по два на ячейку), где должны происходить обновления. Crikey!

Любые предположения о том, как это можно было бы сделать быстрее, или мне просто нужно посвятить 20 часов наблюдению за борьбой Excel.

Большое спасибо Майкл.

Ответы [ 6 ]

7 голосов
/ 27 августа 2010

Я бы так и сделал.Перед обновлением:

Application.EnableEvents = False
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

После выполнения обновления:

Application.EnableEvents = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.CalculateFull

Возможно, вы захотите убедиться, что в случае проблемы с вашим обновлением вы поймете ошибку и выполнитев любом случае подпрограмма повторного включения.Например, если вы допустили ошибку и не смогли повторно включить Excel ScreenUpdating, это сделает сеанс непригодным для пользователя (хотя его можно исправить через окно редактора VBA, если вы знаете, что делать).

5 голосов
/ 05 апреля 2012

Работает в Excel 2010. Это супер-быстро! Произведено 851000 замен примерно за 10 секунд.

Sub Macro1()

    Application.EnableEvents = False
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

    ' fill your range in here
    Range("E3:CN9254").Select
    ' choose what to search for and what to replace with here
    Selection.Replace What:="", Replacement:="0", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.CalculateFull

End Sub
0 голосов
/ 24 июня 2019

Основанный на превосходном коде cellyson'а, вот, надеюсь, довольно закаленный макрос, который я сделал для себя.Работает в Excel 2016 (и нет причин, по которым он не должен работать в предыдущих версиях).

Option Explicit

Sub FastReplace(Optional CalculateAfterReplace As Boolean = True)

Dim SelectedRange As Range
Dim What As String, Replacement As String

    'Let's set the 3 input data in place, and allow the user to exit if he hits cancel (or if he wants to look for an emprty string)
    Set SelectedRange = Selection

    What = InputBox("This macro will work on the EXISTING selection, so please cancel and restart it if you haven't selected the desired range." _
        & vbCrLf & vbCrLf & "The selection is " & SelectedRange.Address(ReferenceStyle:=xlA1, RowAbsolute:=False, ColumnAbsolute:=False) _
        & vbCrLf & vbCrLf & "What is the text that needs to be replaced?", "Fast replace stage 1 of 2")
    If What = "" Then Exit Sub

    Replacement = InputBox("You chose to look for " _
    & vbCrLf & vbCrLf & """" & What & """" _
    & vbCrLf & vbCrLf & "Now, what is the replacement text?", "Fast replace stage 2 of 2")
    If StrPtr(Replacement) = 0 Then Exit Sub 'We want to allow an empty string for replacement, hence this StrPtr trick, source https://stackoverflow.com/questions/26264814/how-to-detect-if-user-select-cancel-inputbox-vba-excel

Dim StoreCalculation As Integer

On Error GoTo FastReplace_error 'So that we're not stuck due to the ScreenUpdating = False in case of an error

    Application.EnableEvents = False
    Application.ScreenUpdating = False
    StoreCalculation = Application.Calculation
    Application.Calculation = xlCalculationManual

    'Let's log what we're doing in the debug window, just in case
    Debug.Print "Working on " & SelectedRange.Address(ReferenceStyle:=xlA1, RowAbsolute:=False, ColumnAbsolute:=False)
    Debug.Print "Replacing """ & What & """ for """ & Replacement & """."
    Debug.Print "CalculateAfterReplace = " & CalculateAfterReplace

    'The heart of this sub
    SelectedRange.Replace What:=What, Replacement:=Replacement, LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

    'Wrapping up
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.Calculation = StoreCalculation
    If CalculateAfterReplace Then Application.CalculateFull
    Beep
    Exit Sub

FastReplace_error:
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    Application.Calculation = StoreCalculation
    If CalculateAfterReplace Then Application.CalculateFull
    Err.Raise Err.Number, Err.Source, Err.Description

End Sub

0 голосов
/ 18 февраля 2014

Установка расчетов в ручную не поможет, равно как и написание кода VBA.

Единственное, что вам нужно сделать, это оставить все соответствующие файлы открытыми.

Например: Допустим, у вас есть 3 файла: A , B и C . C собирает информацию от A , но теперь вместо нее требуется информация от B .

Вы обновляете ссылку с помощью find/replace.

Решение состоит в том, чтобы одновременно держать открытыми B и C , тогда это работает безупречно.

Джон ХельгасонСтатистика Исландии

0 голосов
/ 27 августа 2010

Чтобы отключить вычисления:

Если у вас Excel 2007 или более поздняя версия (с лентой):

  • Перейдите в меню ленты (кружок вверху слева).
  • Нажмите «Параметры Excel» в правом нижнем углу.
  • Нажмите категорию «Формулы»
  • В разделе параметров расчета выберите «Вручную»
0 голосов
/ 27 августа 2010

Вероятно, вам нужно отключить вычисления (как уже упоминалось) и, возможно, другие вещи, такие как обновления экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...