>>问题概述
我想在Excel中实现一个可重置、可覆盖、默认单元格值。我的意思是,当第二个单元格更新时,有一个单元格会恢复到由查找公式依赖的第二个单元格的“默认”值。用户还可以将不同的值写入原始单元格,直到下次更新第二个单元格为止。
>>主体和详细信息
好的,这里是情况;此快照是多个工作表数据存储库的相关区域。感兴趣的两个单元格以绿色突出显示,最高可见行为第1行。
项目搜索单元格接受各种单词或短语输入,并具有数据验证以确保只有有效输入是可能的。数据验证来自可能输入的按字母顺序排列的列表,并且该单元格具有下拉列表选项(因此右侧有小箭头)。
堆栈单元格使用以下公式进行项目搜索单元格的输入...
=IF(COUNTIF(C3:F315,J6),VLOOKUP(J6,C3:F315,4,FALSE),"~")
...其中J6是项目搜索单元格,范围C3:F315是同一工作表上一个查找表的相关部分。
现在,这是我想在 Stack 单元格中发生的事情...
- 当前功能:
- 当向项目搜索单元格中输入无效输入时,会显示波浪线而不是数字。
- 输入有效输入时,在单元格中显示来自查找表的相关数字。 购买和销售单元格也以相同的方式更新。
- 期望的附加功能:
- 在第一种情况下,不能覆盖波浪线。
- 在第二种情况下,“默认”数字可以被输入到 Stack 单元格中覆盖。
- 当输入新输入(或仅再次输入相同输入)到项目搜索单元格时,然后再次显示默认数字(或波浪线)。
- 愿望清单(非必需):
- 是否有复选框(或类似的东西;例如相邻单元格中的是/否输入),如果选中,则表示 Stack 单元格中显示的数字不会受到从查找表中读取的任何新“默认值”的影响/更改。该数字仍然可以通过手动输入新数字进行修改。
- 项目搜索单元格目前具有下拉字母排序列表,其中包含其所有可能的有效数据输入。是否有一种方法可以使用相同的列表将自动完成功能添加到单元格中?也许有点像Google搜索引擎,下拉列表会随着您键入而出现,并且填充该列表的项目将继续限制为包含您到目前为止键入的(子)字符串的项目。
注意:无论在 Stack 单元格中显示什么值,其他单元格的公式都必须能够读取;即其值将成为购买和销售单元格的比率,在该单元格中显示的值和 Stack 单元格的查找值之间。
这有任何程度的可能吗?最好(但不仅仅)不需要使用宏。该工作簿旨在分发给其他人,其中大部分被锁定和保护以避免对核心数据进行任何更改。
谢谢您的预先。
迄今为止找到的信息:
...但并没有完全解决我的问题。
我可能需要使用多个单元格来实现相同(或类似)的有效功能(一个单元格保存默认值,另一个单元格保存可能由用户输入的值,第三个单元格保存相关的输出值),但这样做看起来不太好看,也不够直观。这个工作簿旨在分发给其他人,其中大部分内容都被锁定和保护。 -此答案不理想。
在我提出这个问题之前,在我的互联网搜索中,我找到了这个小小的信息。它说如果我想要恢复到默认值是自动的,那么在工作表更改事件过程中使用以下代码:
有人提出了一个(可能)类似的问题,并且提供了此答案,涉及使用自定义数字格式。自定义数字格式是否接受当前在Stack单元格中使用的公式?
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是其他人示例中使用的名义单元。
文档上传:
目前包括所需功能和愿望清单项。
Item-inary(public).xlsm - (MediaFire)
2012年3月18日,07:40 UCT目前包括所需功能和愿望清单项“1”。
Item-inary(public).xlsm - (Mediafire)
2012年3月20日,19:50 UCT
>>编辑#1:
这是我的代码的各个部分:
在
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
Sheet1(价格表)
中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'的功能,但是其他方面都能够正常运行。
非常感谢那些提供帮助的人。
- 当前功能:
Worksheet_Change
时,一定要始终使用错误处理并将启用事件切换为False
,以避免可能的无限循环 :) - Siddharth Rout