Как обрабатывать пустые / недопустимые данные для элемента управления RefEdit в форме пользователя VBA или как проверить, является ли Range() допустимой / нет ошибкой в VBA

#excel #vba #userform

#excel #vba #пользовательская форма

Вопрос:

Я использую пользовательскую форму Excel VBA, чтобы изменить регистр шрифта, как показано на рисунке ниже. Когда элемент управления RefEdit имеет правильный диапазон, он работает нормально. Но если я нажму кнопку «Применить», оставив RefEdit пустым / только пробел / любое слово (недопустимый диапазон), пользовательская форма исчезнет без отображения какого-либо уведомления об ошибке.

Для прописного кода:-

 Sub UpperCaseFont()
        For Each x In Range(CaseRefEdit.Value)
        If Not IsEmpty(x.Value) Then
            x.Value = UCase(x.Value)
        End If
        Next
MsgBox "Done"
End Sub
 

Код в нижнем регистре:-

 Sub LowerCaseFont()
    For Each x In Range(CaseRefEdit.Value)
    If Not IsEmpty(x.Value) Then
        x.Value = LCase(x.Value)
    End If
    Next
MsgBox "Done"
End Sub
 

Правильный код:-

 Sub ProperCaseFont()
    For Each x In Range(CaseRefEdit.Value)
    If Not IsEmpty(x.Value) Then
        x.Value = WorksheetFunction.Proper(x.Value)
    End If
    Next
End Sub
 

Код командной кнопки:-

 Private Sub CaseApplyCommandButton_Click()
    If UpperCase = True Then Call UpperCaseFont
    If LowerCase = True Then Call LowerCaseFont
    If ProperCase = True Then Call ProperCaseFont
 

По этой причине я попытался изменить, как показано ниже, но все же я сталкиваюсь с проблемой, что если RefEdit пуст, и я нажимаю на кнопку «Применить», то пользовательская форма исчезает, а также обнаружил, что другие все пользовательские формы запускают неизвестную проблему для инициализации.

 Private Sub CaseApplyCommandButton_Click()
'Font Case
Dim Rng As Range
On Error Resume Next
Set Rng = Range(Me.CaseRefEdit.Value)
MsgBox Rng
On Error GoTo 0
If Rng Is Nothing Then
    MsgBox "Select the Cells to change the case"
Else
    If UpperCase = True Then Call UpperCaseFont
    If LowerCase = True Then Call LowerCaseFont
    If ProperCase = True Then Call ProperCaseFont
End If

End Sub
 

Я обнаружил, что проблема возникает, когда я добавляю приведенный ниже код:-

 Private Sub CaseRefEdit_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Range(CaseRefEdit.Value).Select
End Sub
 

Насколько я понимаю, когда RefEdit не предоставляет никакого диапазона для ввода любого числа или слова или сохраняет пустым, пользовательская форма исчезает. Какое-либо решение для этого?

введите описание изображения здесь

Ответ №1:

По второму вопросу. Тогда [если IsError (range («Привет») …] выражение сначала оценивает диапазон («Привет»), и если он недействителен, перед вызовом функции возникает ошибка. Поэтому лучше передать адрес диапазона в функцию IsError, а затем вычислить диапазон внутри функции и определить его правильность.

 Function IsError(addr As String) As Boolean
    Dim rng As Range
    On Error Resume Next
    Set rng = Range(addr)
    IsError = rng Is Nothing
End Function

Sub test1()
    If IsError("%$%W34") Then
        Debug.Print "Range is invalid"
    Else
        Debug.Print "Range is correct"
    End If
End Sub
 

Ответ №2:

Вы можете использовать оператор On Error, например:

 Function testRNG(addr As String) As Range   ' returns correct Range object or Nothing otherwise
    ' initially testRNG = Nothing
    On Error Resume Next
    Set testRNG = Range(addr)   ' if the address is correct, testRNG returns Range, otherwise an error occurs, the expression is not evaluated and testRNG remains Nothing
End Function

Sub foo() 
    Dim addr As String
    addr = "W12"
    Set Rng = testRNG(addr)
    If Rng Is Nothing Then
        Debug.Print "Address " amp; addr amp; " is wrong"
    Else
        Debug.Print "Range " amp; Rng.Address amp; " is correct"
    End If
End Sub
 

Комментарии:

1. Я обновил код с помощью инструкции On error. По-прежнему отображается проблема. Я думаю, что нашел причину. Он подходит Private Sub CaseRefEdit_Exit(ByVal Cancel As MSForms.ReturnBoolean) , и я обновил свой вопрос.

2. Я думаю, вам также следует обрабатывать Range (CaseRefEdit.Value). Выберите с ошибкой в CaseRefEdit_Exit()

3. В зависимости от вашего кода, диапазон (CaseRefEdit.Value) . Инструкция Select вообще не требуется, я думаю, вы можете просто удалить ее

4. Я добавил следующее сообщение об ошибке … таким образом, я получил решение. Спасибо за вашу помощь… Я добавил комментарий, поскольку он помогает другим найти решение. Знаете ли вы какой-либо способ проверить, является ли Range («Hello») допустимым или нет, как if IsError(range("Hello") then...

Ответ №3:

моя проблема решена, как показано ниже. Thanks @Алексей Р.

 Private Sub CaseRefEdit_Exit(ByVal Cancel As MSForms.ReturnBoolean)
On error resume next    
Range(CaseRefEdit.Value).Select
End Sub
 

Кто-нибудь знает, как проверить, является ли Range («etc») / Range (123) допустимым или нет? Нравится-

 If IsError(range("etc")) then
...
else
....
end if