Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何在Excel中实现可重置、可覆盖的默认单元格值? >>问题摘要_Vba_Excel_Excel Formula_Worksheet Function - Fatal编程技术网

Vba 如何在Excel中实现可重置、可覆盖的默认单元格值? >>问题摘要

Vba 如何在Excel中实现可重置、可覆盖的默认单元格值? >>问题摘要,vba,excel,excel-formula,worksheet-function,Vba,Excel,Excel Formula,Worksheet Function,我想在Excel中实现一个可重置、可覆盖的默认单元格值。我的意思是,当第二个单元格更新时,该单元格将恢复为“默认”值,该值由依赖于第二个单元格的查找公式获得。用户还可以选择将不同的值写入原始单元格,该值将一直保留到第二个单元格下次更新为止 >>主体与细节 好的,情况是这样的;此快照是多工作表数据存储库的相关区域的快照。为清晰起见,两个相关单元格以绿色高亮显示,最高可见行为第1行 项目搜索单元格接受各种单词或短语输入,并进行数据验证,以确保只能进行有效输入。数据验证来自按字母顺序排列的可能输入

我想在Excel中实现一个可重置、可覆盖的默认单元格值。我的意思是,当第二个单元格更新时,该单元格将恢复为“默认”值,该值由依赖于第二个单元格的查找公式获得。用户还可以选择将不同的值写入原始单元格,该值将一直保留到第二个单元格下次更新为止


>>主体与细节 好的,情况是这样的;此快照是多工作表数据存储库的相关区域的快照。为清晰起见,两个相关单元格以绿色高亮显示,最高可见行为第1行

  • 项目搜索单元格接受各种单词或短语输入,并进行数据验证,以确保只能进行有效输入。数据验证来自按字母顺序排列的可能输入列表,单元格有一个下拉列表选项(因此右边有一个小箭头)

  • 堆栈单元格使用以下公式中的项目搜索单元格的输入

    =IF(COUNTIF(C3:F315,J6),VLOOKUP(J6,C3:F315,4,FALSE),"~")
    
    …其中J6是项搜索单元格,范围C3:F315是同一工作表上查找表的相关部分

现在,这就是我希望在堆栈中发生的事情

  • 当前功能:
    • 项目搜索单元格中输入无效输入时,将显示一个波浪号而不是数字
    • 输入有效输入后,单元格中将显示查找表中的相关数字。买入卖出单元格也以相同方式更新
  • 所需的附加功能:
    • 在第一种情况下,瓷砖不能被覆盖
    • 在第二种情况下,可以通过在堆栈中输入另一个数字来覆盖“默认”数字
    • 项目搜索单元格中输入新输入(或再次输入相同输入)时,将再次显示默认数字(或波浪号)
  • 愿望清单(非必要):
    • 如果勾选复选框(或类似复选框;如相邻单元格中的“是/否”输入),则表示从查找表中读入的任何新“默认值”不会更改/影响堆栈中显示的数字。仍然可以通过手动输入新号码来修改该号码
    • 项目搜索单元格当前有一个按字母顺序排列的下拉列表,列出所有可能的有效数据输入。有没有办法使用相同的列表向单元格添加自动完成功能?也许有点像谷歌搜索引擎,下拉列表在您键入时出现,填充该列表的项目持续地限制为包含您迄今为止键入的(子)字符串的项目
注意:堆栈单元格中显示的任何值必须能够被其他单元格中的公式读取;即买入卖出单元格,其值将成为堆栈单元格的查找值与当时显示在单元格中的值的比率

这在某种程度上是可能的吗?最好(但不是唯一)不需要使用宏。此工作簿旨在分发给其他人,其中大部分被锁定和保护,以避免对核心数据进行任何更改

先谢谢你


迄今发现的资料: …但还没有完全解决我的问题

  • 我可能会使用多个单元格来实现相同(或类似)的有效功能(一个单元格保存默认值,另一个单元格保存可能的用户输入值,第三个单元格保存相关的输出值),但这对最终用户来说既不好也不直观。此工作簿将分发给其他人,其中大部分内容将被锁定和保护。 --这个答案是不可取的

  • 在我问这个问题之前的网络搜索中,我找到了这一点信息。它说,如果我希望自动恢复到默认值,那么在工作表更改事件例程中使用以下代码:

    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是另一个人示例中使用的标称单元格

  • 有人问了一个(可能)类似的问题,并得到了与使用自定义数字格式有关的答案。自定义数字格式是否接受当前在堆栈中使用的公式


  • 文件上载: 包括当前和所需的功能,还未出现愿望列表项。
    -(MediaFire)
    2012年3月18日07:40 UCT

    当前和所需功能+“愿望列表1”。
    -(Mediafire)
    2012年3月20日19:50 UCT


    >>编辑#1: 这是我迄今为止在各个部分中的代码:

    本工作簿中

    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
    

    表1(价目表)

    此代码尚未包含任何“愿望列表2”功能,但在其他方面效果良好


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

    我现在不在电脑旁,所以我无法测试这一点,但以下是您需要做的:

    “迄今为止找到的信息”中的第二条是正确的方向,尽管您说过不需要宏

    堆栈
    单元格的公式移动到另一个未使用的单元格中。锁定此单元格,并将背景颜色和文本颜色设置为相同(以便“隐藏”)。现在,让我们假设这是在O6中。(或者将此单元格放在另一张他们无法访问的工作表上。我通常会为这些单元格设置一张隐藏的工作表。)

    右键单击工作表选项卡,然后选择查看代码
    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
    
    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
    
    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
    
    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
    
    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`