Переменная счетчика заполнения VBA Excel через поле ввода - PullRequest
1 голос
/ 02 мая 2019

У меня есть некоторый код, который я положил вместе с рекордером макросов, и несколько проб и ошибок, которые я запускаю, и он работает нормально, но я хотел бы добавить поле ввода, которое будет заполнять значение счетчика как ввод, а не жестко заданный код.

Проще говоря, я перелистываю данные в одном столбце с помощью функции поиска. В большинстве случаев 10 циклов помогут найти эти данные и очистить содержимое. Я бы хотел изменить счетчик через поле ввода вместо редактирования моего кода.

Конечно, это легко, но я в тупике

Sub Searchclear()
    'Search and clear Macro

    Do Until counter = 10
        counter = counter + 1
        On Error Resume Next

        Range("B2:B4000").Select
        Selection.Find(What:="Date Range ", After:=ActiveCell,
        LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
        ActiveCell.Select
        Selection.ClearContents
    Loop

End Sub

Следующий код такой же, как и выше, но с моей попыткой ввести поле ввода

Sub Searchcleara()
    ' Search and clear Macro

    Dim counter As Integer
    counter = InputBox("Enter number of Cycles")
    Do Until counter = InputBox
        counter = counter + 1
        On Error Resume Next
        Range("B2:B4000").Select
        Selection.Find(What:="Date Range", After:=ActiveCell,
        LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
        ActiveCell.Select
        Selection.ClearContents
    Loop

End Sub

1 Ответ

0 голосов
/ 02 мая 2019
Dim counter As Integer
counter = InputBox("Enter number of Cycles")

Вы доверяете пользователю вводить правильный номер здесь. Я бы вытащил эту инструкцию в свою собственную функцию, но главная проблема в следующей строке:

Do Until counter = InputBox

InputBox - это функция с обязательным Prompt параметром ... что вы, вероятно, хотите сделать, это иметь другую переменную (скажем, cycleCounts), а затем Do Until counter = cycleCounts.

On Error Resume Next 'suppresses runtime errors
Dim cycleCounts As Integer
cycleCounts = InputBox("Enter number of cycles") 'possible type mismatch here
On Error GoTo 0 'restores runtime errors **IMPORTANT**
'note: cycleCounts is 0 if an error was raised

Dim counter As Integer
Do Until counter = cycleCounts
    counter = counter + 1
    '...
Loop

On Error Resume Next нельзя позволять просто весело продолжать выполнение в состоянии ошибки - это делает код намного сложнее для отладки, чем необходимо.

Есть и другие проблемы: Range.Find вернет Nothing, если не найдет то, что ищет, что приведет к вызову цепочечного вызова .Select, выдающему ошибку 91 (которую вы подавляете с помощью On Error Resume Next). Удалите .Select и запишите результат в переменную объекта:

    Dim result As Range
    Set result = Range("B2:B4000").Find(...)
    If Not result Is Nothing Then
        result.ClearContents
    End If

Обратите внимание, что в этом случае нет необходимости Select или Activate, и глотание ошибок заменено стандартным If...End If контролем потока.

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