如何在Excel中实现可重置,可重复使用的默认单元格值?

>>问题总结

我想在Excel中实现一个可重置的,可重复使用的默认单元格值。 我的意思是,当第二个单元更新时,有一个单元恢复到一个“默认”值,通过一个依赖于第二个单元的查找公式获得。 用户还可以select将不同的值写入原始单元格,直到第二个单元格被更新。


>>主体和细节

好的,这是情况。 此快照是多个工作表数据存储库的相关区域。 为了清晰起见,两个感兴趣的单元格为绿色突出显示,最高的可见行为第1行。

  • 项目search单元接受各种单词或短语input,并具有数据validation,以确保只有有效的input是可能的。 数据validation是从可能的input的字母表列表中获取的,单元格有一个下拉列表选项(因此右边是小箭头)。

  • 堆栈单元格使用下面的公式中的项目search单元格的input…

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

    …其中J6是项目search单元格,范围C3:F315是同一工作表上的查找表的相关部分。

    问题相关的Excel文件的快照描绘区域。 http://img29.imageshack.us/img29/4388/capturedhx.jpg

现在,这是我想在堆栈单元格中发生的…

  • 当前function:
    • 当在“ 物品search”单元格中input了无效的input时,会显示波浪符而不是数字。
    • input有效的input时,查找表中的相关编号显示在单元格中。 买入卖出单元格也以相同的方式更新。
  • 所需的附加function:
    • 首先,代字号不能被覆盖。
    • 在第二种情况下,可以通过向堆栈单元input另一个数字来覆盖“默认”号码。
    • 当input新的input(或再次input相同的input)到项目search单元中时,默认编号(或波形符号)再次显示。
  • 愿望清单(非必需):
    • 如果勾选了一个checkbox(或类似的,如在相邻单元格中的是/否input),则意味着堆栈单元中显示的号码不会被任何新的“默认值”改变/影响从查阅表读入。 该号码仍然可以通过手动input新号码进行修改。
    • Item Search单元格目前有一个下拉字母表,列出所有可能的有效数据input。 有没有办法使用这个相同的列表来添加一个自动完成function的单元格? 也许有点像谷歌的search引擎,下拉列表出现在您键入和填充该列表的项目不断限制到那些包含您已经input的(子)string。

注意:不pipe什么值显示在堆栈单元格必须是可读的其他单元格的公式; 即“ 买入”和“ 卖出”单元格,其值将成为当前单元格中显示的堆栈单元格查找值的比率。

这可能在任何程度上? 优选地(但不排除)不需要使用macros。 本工作手册旨在分发给其他人,其中大部分被locking和保护,以避免对核心数据进行任何更改。

先谢谢你。


目前发现的信息:

…但不完全解决我的问题。

  1. 我可能可以使用多个单元格来实现相同(或类似)的有效function(一个单元格保存默认值,另一个保存可能的用户input值,第三个单元格保存相关的输出值),但这不会看起来像对于最终用户来说也不是那么直观。 这本工作手册旨在分发给其他人,其中大部分被locking和保护。 – 这个答案是不可取的。

  2. 在提出这个问题之前,我在网上search了一些信息。 它说,如果我想恢复到默认值是自动的,那么在工作表变更事件例程中使用下面的代码:

     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. 有人问(可能)类似的问题,并提供这个答案使用自定义数字格式。 一个自定义的数字格式会接受一个公式,例如当前在Stack单元格中使用的公式吗?


file upload:

包括当前和期望的function,愿望清单项目还未到来。
物品(公共).xlsm – (MediaFire)
18-Mar-2012,07:40 UCT

当前和期望的function+“愿望清单1”。
物品(公共).xlsm – (Mediafire)
20-Mar-2012,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 (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”function,但其他方面工作正常。

非常感谢那些帮助过的人。

@SiddharthRout:我仍然会上传文件的当前副本供您阅读。 我的部分问题已经得到解答,但是我的“愿望清单”中还有两个项目可以完成! –

根据我以前的build议,你正在使用的当前代码应该写成

 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。

我正在查看其余的东西,并会尽快更新。

更新 :您的愿望清单中的请求都已完成。

您的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 ie 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 

对于你的第二愿望清单,我有两个select。 我继续第二个选项。

1)使用www.ozgrid.com中描述的方法

主题:在Excel数据validation列表中自动完成键入

链接 : http : //www.ozgrid.com/Excel/autocomplete-validation.htm

2)使用控件,而不是DV列表。 为此,我在列表中进行了这些更改

  • 删除单元格J6中的数据validation
  • 名称pipe理器给你的名单X3:X315“名字”。 我把它叫做“List”
  • 在单元格J6顶部放置一个combobox,并在devise模式中将.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将自动完成,只要您在框中键入任何东西。

快照

在这里输入图像说明

示例文件链接(此链接已激活7天)

示例文件

HTH

希德

我现在不在PC上,所以我不能testing这个,但是这是你需要做的:

尽pipe你说过你不需要macros,但你的“到目前为止发现的信息”中的第2个数字是正确的方向。

将您的公式的Stack单元移动到另一个未使用的单元格。 locking这个单元格,并设置背景和文字颜色是相同的(这样它就“隐藏”了)。 现在,让我们说这是在O6。 (或者只是把这个单元格放在另一个表单上,他们不能访问,我经常有一个隐藏表单)。

右键单击工作表选项卡,然后selectView Code 。 在新窗口中,双击您希望此代码运行的工作表名称。

Private Sub Worksheet_Change(ByVal Target As Range)应该是出现的默认function(它将是空的)。

将下面的代码放入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