Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню Заметки | Excel 97, 2000 : Подсчёт количества замен


Rambler's Top100


Counter CO.KZ



Если Вы работаете в MS Excel 97 или 2000 и уже пользовались заменой, то, скорее всего, замечали, что в случае отсутствия текста, подлежащего замене, выдаётся соответствующее предупреждение. Однако, если замена происходит, то мы можем только гадать в скольких же ячейках она произошла. В последующих версиях разработчики исправили этот "недостаток" информации *, но если Вы обладатель именно вышеупомянутых версий, то в некоторых случаях, осуществить такой подсчёт можно программно, причём без создания имитаций стандартных диалоговых окон.

Для этого, перейдите в редактор VBA (ALT+F11), найдите личную книгу макросов PERSONAL.xls (если оная изволит отсутствовать, то загляните сюда [FAQ1])

И в модуль книги ThisWorkbook(ЭтаКнига) скопируйте следующий код :
Private WithEvents XLApp As Excel.Application

Private Sub Workbook_Open()
    Set XLApp = Excel.Application

    XLApp.OnKey Key:="^h", Procedure:="ReplaceDialogShow"
    XLApp.CommandBars.FindControl(ID:=313).OnAction = "ReplaceDialogShow"
End Sub

Private Sub XLApp_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If iFlagReplace = True Then iCount = iCount + 1
End Sub
А в любой стандартный модуль :
Public iFlagReplace As Boolean, iCount&

Private Sub ReplaceDialogShow()
    If ActiveWorkbook Is Nothing Then Exit Sub
    If ActiveWorkbook.ActiveSheet.ProtectContents = True Then
       MsgBox "Нельзя вызывать замену в защищённом листе", vbExclamation
       Exit Sub
    End If

    iFlagReplace = True
    If Application.Dialogs(xlDialogFormulaReplace).Show = True Then
       If iCount > 0 Then MsgBox _
       "Поиск завершён; выполнено " & iCount & " замен.", vbInformation
    End If
    iFlagReplace = False: iCount = 0
End Sub
Теперь, сохраните все изменения, и при следующем запуске, Вы сможете узнать в скольких ячейках произошла замена текста (а если не хотите ждать следующего открытия личной книги макросов, то просто выполните событие Workbook_Open)

Примечание :
  • Если существует вероятность, что кнопка будет удалена (не перемещана, а именно удалена), то в таком случае, Вы получите ошибку, которую можно избежать, если добавить соответствующую проверку и в случае отсутствия кнопки просто создавать её программно.
  • Если кнопка будет найдена, но окажется заблокированной (т.е. значение свойства Enabled = False), то в этом случае ничего фатального не произойдёт, однако, и воспользоваться такой кнопкой Вы не сможете, разумеется, пока её не разблокируете.
  • При замене, вызываемой из стандартного диалогового окна Найти, подсчёт осуществляться не будет.

    * Следует отметить, что информация о замене в Microsoft Excel XP содержит не количество ячеек, где произошла замена, а количество замен, что не всегда одно и тоже. Например, если в ячейке A1 содержится текст "наша Таня громко плачет" , а в ячейке A2 наличествует текст "уронила в речку мячек" и мы в диапазоне A1:A2 меняем "а" на "$", то количество замен - 5 , а ячеек всего 2



    Автор : Климов Павел Юрьевич
  • © 2004-2016 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff