#excel #vba
#преуспеть #vba #excel
Вопрос:
В настоящее время у меня есть рабочая книга, в которой при завершении задания пользователь выбирает «Завершить» из выпадающего списка в столбце G, когда ячейка изменяется на «завершить», в окне сообщения пользователю предлагается ввести Y или N в той же строке, но в столбце M. Я хотел бы использовать поле ввода вместо окна сообщения для Y или N, но понятия не имею, как ввести ответ в правильную ячейку в столбце M. Кто-нибудь может указать мне правильное направление? Ниже то, что у меня есть на данный момент. Заранее благодарю.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G:G")) Is Nothing Then
If Target = "COMPLETE" Then
MsgBox "If Warranty job please enter Y in correct cell in column M"
End If
End If
End Sub
Комментарии:
1. Вы можете использовать что-то вроде
Target.Worksheet.Range("M" amp; Target.Row).Value = <myValue>
Ответ №1:
Я хотел бы использовать поле ввода вместо окна сообщения
Дружеский совет: не делайте этого. Затем вам нужно будет управлять пользовательским вводом, который может быть любым. В этом примере использования InputBox
мы должны Trim
при вводе использовать только самый левый символ результата и применять согласованный регистр, в противном случае мы должны рассмотреть, является ли «y» = «Y» = «YES» = «yes» = «Да» = «Да» и т.д. … И, возможно, обрабатывать недопустимый ввод (что, если пользователь вводит «G» или «123456789» и т.д.), Что добавляет сложности там, где это действительно не нужно.
Dim userInput as String
GetUserInput:
userInput = InputBox("Is this a warranty job? Y/N")
userInput = UCase(Left(Trim(userInput),1)
If userInput = "Y" Then
' put the value "Y" in column G
ElseIf userInput = "N" Then
' do nothing
Else
' If user input is not Y or N, send them back to the input box
GoTo GetUserInput
End If
Конечно, вы можете сделать это, если хотите, но для простого варианта «Да» / «Нет» MsgBox
на самом деле разработан, чтобы довольно легко приспособиться к этому, со стандартными параметрами кнопок.
Вместо этого используйте a MsgBox
с параметрами Да / Нет и управляйте вводом на рабочий лист напрямую, а не предлагайте пользователю делать это вручную. В приведенном ниже примере я поместил «Y» в ту же строку, что и Target
ячейка, столбец M. Измените по мере необходимости.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim mbResponse as VbMsgBoxResult
If Not Intersect(Target, Range("G:G")) Is Nothing Then
If Target = "COMPLETE" Then
mbResponse = MsgBox("Is this a warranty job?", vbYesNo)
If mbResponse = vbYes Then
Target.Offset(0, 6).Value = "Y"
Else:
'do nothing
End If
End If
End If
End Sub
Комментарии:
1. Спасибо. Я понимаю, что вы имеете в виду, говоря о поле ввода и сложности пользовательского ввода. Предложение Msgbox идеально, еще раз спасибо.
Ответ №2:
Как насчет:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("G:G")) Is Nothing Then
If Target = "COMPLETE" Then
roww = Target.Row
Application.EnableEvents = False
Cells(roww, "M").Value = Application.InputBox(Prompt:="Warranty job? Please enter Y or N", Type:=2)
Application.EnableEvents = True
End If
End If
End Sub
Комментарии:
1. Я воспользовался советом Дэвида Земенса и выбрал окно сообщения YesNo, оно устраняет любые ошибки пользовательского ввода. Хотя спасибо.