Как реализовать сбрасываемое значение ячейки по умолчанию в Excel?

>> Резюме вопроса

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


>> Основной корпус и детали

Хорошо, вот ситуация; этот снимок относится к соответствующей области репозитория данных на нескольких листах. Две интересующие вас ячейки выделены зеленым для ясности, а самая высокая видимая строка - это строка 1.

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

  • Ячейка Стек использует данные из ячейки Поиск элемента в следующей формуле ...

    =IF(COUNTIF(C3:F315,J6),VLOOKUP(J6,C3:F315,4,FALSE),"~")
    

    ... где J6 - это ячейка Поиск элемента, а диапазон C3: F315 - соответствующая часть таблицы поиска на том же листе.

    Снимок, отображающий область документа Excel, имеющую отношение к вопросу.

Вот что я хотел бы сделать в ячейке Стек ...

  • Current functionality:
    • When an invalid input is entered into the Item Search cell, a tilde is displayed instead of a number.
    • Когда вводится действительный ввод, в ячейке отображается соответствующий номер из справочной таблицы. Ячейки Купить и Продать также обновляются аналогичным образом.
  • Desired additional functionality:
    • In the first instance, the tilde cannot be overwritten.
    • Во втором случае номер «по умолчанию» можно перезаписать, введя другое число в ячейку Стек.
    • Когда в ячейку Поиск элемента вводится новый ввод (или снова тот же ввод), снова отображается номер по умолчанию (или тильда).
  • Wish list (non-essential):
    • To have a check-box (or similar; such as a yes/no input in an adjacent cell) that, if ticked, means that the displayed number in the Stack cell will not be changed/affected by any new 'default value' being read in from the lookup table. The number can still be modified by manually entering a new one.
    • В ячейке Поиск элемента в настоящее время есть раскрывающийся алфавитный список всех возможных допустимых вводов данных. Есть ли способ использовать этот же список для добавления функции автозаполнения в ячейку? Возможно, немного похоже на поисковую систему Google, раскрывающийся список появляется по мере ввода, а элементы, заполняющие этот список, постоянно ограничиваются теми, которые содержат (под) строку, которую вы уже набрали.

NB: любое значение, отображаемое в ячейке Стек, должно быть доступно для чтения формулами в других ячейках; а именно ячейки Купить и Продать, значения которых станут соотношением значения поиска ячейки Стек и значения, отображаемого в ячейке в то время. .

Возможно ли это в какой-то степени? Желательно (но не исключительно) без использования макросов. Эта книга предназначена для распространения среди других людей, при этом большая ее часть заблокирована и защищена, чтобы избежать каких-либо изменений в основных данных.

Заранее спасибо.


На данный момент найдена информация:

... но не совсем решаю свой вопрос.

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

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

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Intersect(Target, Range("C2")) Is Nothing Then
            If Range("C2").Value = "" Then
                Range("C2").Value = 1234
            End If
        End If
    End Sub
    

    Однако я не совсем понимаю, что имеется в виду и как это сделать.
    - C2 - это номинальная ячейка, используемая в примере другого человека.

  3. Кто-то задал (возможно) аналогичный вопрос, и ему предоставили этот ответ, связанный с использованием пользовательских числовых форматов. Примет ли произвольный числовой формат формулу, подобную той, которая сейчас используется в ячейке Стек?


Загрузка документа:

Включены текущие и желаемые функции, элементы из списка желаний еще впереди.
Item-inary (общедоступный) .xlsm - (MediaFire)
18 марта 2012 г., 07:40 МСК

Текущая и желаемая функциональность + «Список желаний 1».
Item-inary (общедоступный) .xlsm - (Mediafire)
20 марта 2012 г., 19:50 МСК


>> ИЗМЕНИТЬ # 1:

Это мой код в различных разделах:

In ThisWorkbook

Public temp As Integer 'Used to contain Range("M6").Value once CheckBox5 is ticked
Public warn As Boolean 'True if CheckBox1 is ticked whilst (vVal = "~")

Private Sub Workbook_Open()
    warn = False 'Initialise to False
End Sub

In Sheet1 (Price List)

Private Sub CheckBox1_Click()
    If OLEObjects("CheckBox1").Object.Value = True Then
        If Range("M6").Value = "~" Then
            warn = True
        Else
            temp = Range("M6").Value
            warn = False
        End If
    End If
End Sub


Private Sub Worksheet_Change(ByVal Target As Range)
    Dim vVal As Variant

    On Error GoTo Whoa

    vVal = Application.Evaluate("=IF(COUNTIF(C3:F315,J6),VLOOKUP(J6,C3:F315,4,FALSE),""~"")")

    '~~> If J6 has been changed, then continue. Otherwise skip.
    If Not Intersect(Target, Range("J6")) Is Nothing Then
        Application.EnableEvents = False
        ActiveSheet.Unprotect ("012370asdf")

        If vVal = "~" Then
            Range("M6").Value = "~"
            Range("M6:M7").Locked = True
        Else
            '~~> Check if CheckBox5 is ticked.
            If OLEObjects("CheckBox5").Object.Value = True Then
                '~~> Checks if CheckBox5 was ticked whilst (vVal = "~")
                If warn = True Then
                    temp = vVal
                    warn = False 'Reset warn status now that special case is resolved
                End If
                Range("M6").Value = temp
            Else
                Range("M6").Value = vVal
            End If
            Range("M6:M7").Locked = False
        End If

        ActiveSheet.Protect ("012370asdf")
        GoTo LetsContinue
    End If

    '~~> If M6 has been changed, then continue. Otherwise skip.
    If Not Intersect(Target, Range("M6")) Is Nothing Then
        Application.EnableEvents = False

        If OLEObjects("CheckBox5").Object.Value = True Then
            temp = Range("M6").Value
        End If

        GoTo LetsContinue
    End If

LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox err.Description
    Resume LetsContinue
End Sub

Этот код еще не включает никаких функций «Список желаний 2», но в остальном работает нормально.

Большое спасибо тем, кто помогал.


person Community    schedule 18.03.2012    source источник
comment
+1 За то, что написал такой подробный вопрос!   -  person Jeremy Harris    schedule 18.03.2012
comment
+1 Фантастическая детализация и расположение в вашем вопросе. Было бы полезно увидеть фактический файл, учитывая детали, которые вы хотели бы применить.   -  person brettdj    schedule 18.03.2012
comment
+1 за красивое объяснение вопроса :) быстрый вопрос. Если в ячейке J6 есть проверка данных, то как она может иметь недопустимый ввод?   -  person Siddharth Rout    schedule 18.03.2012
comment
Также одно предложение. При использовании Worksheet_Change ВСЕГДА используйте обработку ошибок и переключите события включения на False, чтобы избежать бесконечного цикла :)   -  person Siddharth Rout    schedule 18.03.2012
comment
@SiddharthRout: потому что я установил предупреждение об ошибке в стиле «предупреждение». Это позволяет пользователю продолжить работу даже с неверным вводом данных. Это было для того особенного человека, который либо не понимает, что они хотят ввести, либо не знает его точного написания, и не оценит спам с помощью типа остановки, который невозможно обойти. предупреждения об ошибках.   -  person Iakovosian    schedule 18.03.2012
comment
+1 за подробный вопрос   -  person Pradeep Kumar    schedule 19.03.2012
comment
@Iakovosian: Не могли бы вы подтвердить, соответствует ли предоставленный мной образец файла вашим требованиям?   -  person Siddharth Rout    schedule 19.03.2012


Ответы (2)


@SiddharthRout: Я все равно загружу текущую копию файла для вашего прочтения. На часть моего вопроса был дан ответ, но есть еще два предмета из моего «Списка желаний», с которыми нужно покончить! -

Согласно моему предыдущему предложению, текущий код, который вы используете, должен быть записан как

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Whoa

    If Not Intersect(Target, Range("J6")) Is Nothing Then
        Application.EnableEvents = False
        ActiveSheet.Unprotect ("012370asdf")
        If Application.Evaluate("=IF(COUNTIF(C3:F315,J6),VLOOKUP(J6,C3:F315,4,FALSE),""~"")") = "~" Then
            Range("M6").Value = "~"
            Range("M6:M7").Locked = True
        Else
            Range("M6").Formula = "=IF(COUNTIF(C3:F315,J6),VLOOKUP(J6,C3:F315,4,FALSE),""~"")"
            Range("M6:M7").Locked = False
        End If
        ActiveSheet.Protect ("012370asdf")
    End If

LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub

Это также исключает использование дополнительной ячейки N6.

Сейчас я просматриваю остальные материалы и скоро обновлю их.

ОБНОВЛЕНИЕ: оба ваших запроса в WishList выполнены.

Ваше Worksheet_Change мероприятие теперь становится таким, чтобы включить Список желаний 1 (См. Прикрепленный снимок)

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim vVal As Variant

    On Error GoTo Whoa

    vVal = Application.Evaluate("=IF(COUNTIF(C3:F315,J6),VLOOKUP(J6,C3:F315,4,FALSE),""~"")")

    If Not Intersect(Target, Range("J6")) Is Nothing Then
        Application.EnableEvents = False

        ActiveSheet.Unprotect ("012370asdf")

        '~~> Check the value of the CheckBox and update cells only if false
        '~~> This is valid for "~" as well i.e if the checkbox is Checked then
        '~~> even "~" remain unchanged. If you don't want this, then move the 
        '~~> below condition inside "ELSE" part :)
        If OLEObjects("Checkbox1").Object.Value = False Then
            If vVal = "~" Then
                Range("M6").Value = "~"
                Range("M6:M7").Locked = True
            Else
                Range("M6").Value = vVal
                Range("M6:M7").Locked = False
            End If
        End If

        ActiveSheet.Protect ("012370asdf")
    End If

LetsContinue:
    Application.EnableEvents = True
    Exit Sub
Whoa:
    MsgBox Err.Description
    Resume LetsContinue
End Sub

Для вашего второго списка желаний у меня было два варианта. Я выбрал второй вариант.

1) Используйте метод, описанный на сайте www.ozgrid.com.

Тема: Автозаполнение в списке проверки данных Excel

Ссылка: http://www.ozgrid.com/Excel/autocomplete-validation.htm

И

2) Используйте элемент управления вместо списка DV. Для этого я внес эти изменения в список

  • Удалить проверку данных в ячейке J6
  • Присвойте «Имя» вашему списку X3: X315 из Диспетчера имен. Я назвал это "Список"
  • Поместите ComboBox поверх ячейки J6 и установите .ListFillRange в приведенный выше «Список» в режиме разработки.
  • Добавлен приведенный ниже код в область кода рабочего листа.

КОД

Private Sub ComboBox1_Click()
    Range("J6").Value = ComboBox1.Value
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
    If KeyCode = 13 Then
        Range("J6").Value = ComboBox1.Value
    End If
End Sub`

Теперь ваш ComboBox будет автоматически заполняться всякий раз, когда вы вводите что-нибудь в поле.

SNAPSHOT

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

ССЫЛКА НА ПРИМЕР ФАЙЛА (эта ссылка активна 7 дней)

Образец файла

HTH

Сид

person Siddharth Rout    schedule 18.03.2012
comment
+1 за обработку ошибок + включение событий + исполнение желания;) - person Pradeep Kumar; 19.03.2012
comment
Я не мог вернуться к этому до сегодняшнего дня. По какой-то причине ваш образец файла не работает для меня, как в вашем снимке. Во-первых, поле со списком не заполняется. Однако код в вашем ответе и код в вашем образце файла были очень полезны. У меня была игра, и полученный код показан в разделе ИЗМЕНИТЬ 1: в моем вопросе. - person Iakovosian; 20.03.2012
comment
Включены ли макросы на вашем компьютере? - person Siddharth Rout; 20.03.2012
comment
Я добавил снимок своего текущего сообщения об ошибке. И да, макросы включены (если их также не нужно включать где-то за пределами параметров в Excel). - person Iakovosian; 20.03.2012
comment
Активированы ли объекты ActiveX? Какую версию Excel вы используете? - person Siddharth Rout; 20.03.2012
comment
Настройки ActiveX: Запрашивать меня перед включением всех элементов управления с минимальными ограничениями и отмечен флажок Безопасный режим. Настройки макроса: Отключить все макросы с уведомлением и отмечен флажок Доверять доступ к объектной модели проекта VBA. Версия Excel: 14.0.6112.5000 (32-разрядная), входит в состав Microsoft Office Professional 2010. - person Iakovosian; 20.03.2012
comment
Хорошо Сделай это. Снимите защиту с файла и нажмите «Режим дизайна» на вкладке «Разработчик». Теперь щелкните правой кнопкой мыши поле со списком и выберите свойства. Во всплывающем окне свойств в разделе свойства ListFillRange введите List. Закройте окно свойств и выйдите из режима дизайна. Теперь проверьте - person Siddharth Rout; 20.03.2012
comment
Предполагая, что это относится к загруженному вами образцу файла, я сделал, как было сказано, но после закрытия и повторного открытия документа свойство ListFillRange было очищено. - person Iakovosian; 20.03.2012
comment
Честно говоря, это из-за моей глупости! Перейдите к коду workbook_open и удалите там весь код. Эта штука его сбрасывает. Я забыл это удалить. Мои извинения. - person Siddharth Rout; 20.03.2012
comment
давайте продолжим обсуждение в чате - person Siddharth Rout; 20.03.2012

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

Номер 2 в вашем «На данный момент найдена информация» - это правильное направление, даже если вы сказали, что вам не нужны макросы.

Переместите формулу для ячейки Stack в другую ячейку, которая не используется. Заблокируйте эту ячейку и установите одинаковые цвета фона и текста (чтобы она была «скрытой»). А пока допустим, что это в O6. (Или просто поместите эту ячейку на другой лист, к которому они не могут получить доступ. У меня часто есть скрытый лист только для них.)

Щелкните правой кнопкой мыши вкладку рабочего листа и выберите View Code. В новом окне дважды щелкните имя листа, на котором вы хотите запустить этот код.

Private Sub Worksheet_Change(ByVal Target As Range) должна быть функцией по умолчанию, которая появляется (и она будет пустой).

Поместите следующий код в процедуру Worksheet_Change:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Set rng = Intersect(Range("J6"), Target)

    'If J6 has not been changed, then exit.  Otherwise continue.
    If rng Is Nothing Then
        Exit Sub
    Else
        'Replace password with the password that you use to protect the sheet (two places)
        ActiveSheet.Unprotect ("password")
        If Range("O6").Value = "~" Then
            Range("M6").Value = "~"
            Range("M6:M7").Locked = True
        Else
            Range("M6").Value = Range("O6").Value
            'Use M6:M7 here instead of just M6 because cells are merged.
            Range("M6:M7").Locked = False
        End If 
        ActiveSheet.Protect ("password")
    End If
End Sub
person lnafziger    schedule 18.03.2012
comment
Ваш пункт списка желаний может быть добавлен к этому довольно легко, но мне нужно будет находиться за своим компьютером, чтобы рассказать вам, как это сделать. Это не будет раньше понедельника, но, может быть, кто-то еще сможет помочь вам в этом тем временем! Однако (очень) короткая версия состоит в том, чтобы добавить элемент управления флажком и связать его с ячейкой, чтобы при проверке он изменял значение связанной ячейки. Затем вы просто проверяете значение этой ячейки перед записью нового значения в M6. - person lnafziger; 18.03.2012
comment
Спасибо за ваш ответ. У меня есть некоторый опыт работы с другими языками программирования, поэтому я могу в значительной степени понять, для чего предназначен код (это заставило меня улыбнуться, когда я увидел элегантность вашего решения). Я смог выполнить ваши инструкции, но при запуске получаю сообщение об ошибке; это связано с изменением свойства «Locked» класса «Range». Беглым взглядом на соответствующую справку Excel я включил доступ к объектной модели проекта VBA, но, похоже, это не было ответом. Возможно, у собственности немного другое название? Я взгляну. Я использую Excel 2010. - person Iakovosian; 18.03.2012
comment
Только что сообразил, что мне нужно поставить свой настоящий пароль блокировки / разблокировки вместо слов! Также я попытался изменить одну из строк на Me.Protect ("password"), userinterfaceonly:=True, основываясь на том, что я прочитал здесь. Я также предполагаю, что последняя строка должна была быть End Sub. По-прежнему появляется ошибка времени выполнения «1004». - person Iakovosian; 18.03.2012
comment
Я скопировал код, который использовал Me. Я обновил его, чтобы использовать ActiveSheet как следует. - person lnafziger; 18.03.2012
comment
Если вы используете только интерфейс пользователя, вы можете удалить вызовы Unprotected / Protect все вместе (но если вы ДЕЙСТВИТЕЛЬНО защищаете его, вы должны использовать эту опцию). Причина, по которой я не использовал его, заключалась в том, чтобы вы могли защитить его от обычного excel, так как в своем вопросе вы указали, что оно уже защищено. - person lnafziger; 18.03.2012
comment
Еще один быстрый ответ, спасибо. По-прежнему появляется ошибка времени выполнения «1004», относящаяся к строке Range("M6").Locked = False. Я многому учусь, просто ища и пытаясь найти то, что ему не нравится, но это все еще не совсем хорошо. - person Iakovosian; 18.03.2012
comment
Точные слова Unable to set the Locked property of the Range class. Мне не удалось узнать больше о том, что на самом деле вызывает это. Доброй ночи! - person Iakovosian; 18.03.2012
comment
Хорошо, разобрался: поскольку ваши ячейки объединены, вы должны использовать полный диапазон, который включает все объединенные ячейки при блокировке и разблокировке. Итак, измените M6 на M6: M7 для обеих команд блокировки. - person lnafziger; 18.03.2012