Поле ввода VBA и ячейка назначения

#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, оно устраняет любые ошибки пользовательского ввода. Хотя спасибо.