如何在Excel中实现可重置,可过度删除的默认单元格值?

Iak*_*ian 12 excel vba worksheet-function excel-vba excel-formula

>>问题摘要

我想在Excel中实现一个可重置的,可过度删除的默认单元格值.通过这个,我的意思是当第二个单元格更新时,有一个单元格恢复为"默认"值,该值由依赖于第二个单元格的查找公式获得.用户还可以选择将不同的值写入原始单元格,这将保留到下一次更新第二个单元格为止.


>>主体和细节

好的,所以情况就是这样; 此快照属于多个工作表数据存储库的相关区域.为清楚起见,两个感兴趣的细胞以绿色突出显示,最高可见行为第1行.

现在,这就是我想在Stack单元格中发生的事情......

  • 目前的功能:
    • 当在项目搜索单元格中输入无效输入时,将显示波形符号而不是数字.
    • 输入有效输入后,查找表中的相关数字将显示在单元格中.在购买销售的细胞也被更新以同样的方式.
  • 所需的附加功能:
    • 在第一种情况下,波形符号不能被覆盖.
    • 在第二个实例中,可以通过在Stack单元格中输入另一个数字来覆盖"默认"数字.
    • 当在项目搜索单元格中输入新输入(或仅重新输入相同的输入)时,将再次显示默认编号(或波形符号).
  • 愿望清单(非必要):
    • 要有一个复选框(或类似的;例如相邻单元格中的是/否输入),如果勾选,则意味着堆栈单元格中显示的数字不会被任何新的"默认值"更改/影响从查找表中读入.仍然可以通过手动输入新号码来修改该号码.
    • 项搜索电池目前拥有其所有可能的有效数据输入的下拉列表alphabetised.有没有办法使用同一个列表为单元格添加自动完成功能?也许有点像谷歌搜索引擎,下拉列表会在您键入时出现,填充该列表的项目将持续限制为包含您目前键入的(子)字符串的项目.

注意:Stack单元格中显示的值必须可由其他单元格中的公式读取; 即买入卖出单元格,其值将成为Stack单元格的查找值与当时在单元格中显示的值的比率.

这有可能在任何程度上吗?优选地(但不排他地)不需要使用宏.此工作簿旨在分发给其他人,其中大部分都被锁定和保护,以避免对核心数据进行任何更改.

先感谢您.


迄今找到的信息:

......但还没有完全解决我的问题.

  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
    
    Run Code Online (Sandbox Code Playgroud)

    但是,我并不完全清楚这是什么意思,也不知道怎么做.
    - C2是在另一个人的例子中使用的标称单元.

  3. 有人问一个(可能)类似的问题,并得到了这个答案做使用自定义数字格式.自定义数字格式是否会接受一个公式,例如Stack单元格中当前使用的公式?


文件上传:

包括当前和期望的功能,希望列出未来的项目.
Item-inary(public).xlsm - (MediaFire)
2012年3月18日,07:40 UCT

当前和期望的功能+"愿望清单1".
Item-inary(public).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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

此代码尚未包含任何"愿望清单2"功能,但其他方式正常.

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

Sid*_*out 7

@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
Run Code Online (Sandbox Code Playgroud)

这也抵消了额外单元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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

2)使用控件代替DV列表.为此,我在列表中进行了这些更改

  • 在单元格J6中删除数据验证
  • 名称管理器的 X3:X315列表中输入"名称" .我叫它"名单"
  • 在Cell J6顶部放置一个ComboBox,并.ListFillRange在设计模式下将其设置为上面的"List"
  • 将以下代码添加到工作表代码区域

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`
Run Code Online (Sandbox Code Playgroud)

现在只要您在框中输入任何内容,您的ComboBox就会自动完成.

快照

在此输入图像描述

样本文件链接(此链接有效7天)

示例文件

HTH

希德