#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