vba - 如何在 Excel 中实现可重置、可覆盖的默认单元格值?

标签 vba excel excel-formula worksheet-function

>> 问题总结

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

>> 主体及细节

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

  • 商品搜索 cell 接受各种单词或短语输入,并具有数据验证以确保只有有效的输入是可能的。数据验证取自按字母顺序排列的可能输入列表,并且单元格有一个下拉列表选项(因此右侧的小箭头)。
  • 堆栈 单元格使用来自 的输入商品搜索 以下公式中的单元格...
    =IF(COUNTIF(C3:F315,J6),VLOOKUP(J6,C3:F315,4,FALSE),"~")
    

    ...其中 J6 是 商品搜索 单元格,范围 C3:F315 是同一工作表上查找表的相关部分。

    Snapshot depicting area of Excel document relevant to question.

  • 现在,这就是我希望在 中发生的事情。堆栈 细胞...
  • 当前功能:
  • 当在 中输入无效输入时商品搜索 单元格中,会显示波浪号而不是数字。
  • 输入有效输入后,查找表中的相关数字将显示在单元格中。 购买 单元格也以相同的方式更新。
  • 所需的附加功能:
  • 首先,波浪号不能被覆盖。
  • 在第二种情况下,可以通过在 中输入另一个数字来覆盖“默认”数字。堆栈 细胞。
  • 当在 中输入新输入(或再次输入相同的输入)时商品搜索 单元格,然后再次显示默认数字(或波浪号)。
  • 愿望 list (非必要):
  • 有一个复选框(或类似的;例如在相邻单元格中输入是/否),如果勾选,则表示 中显示的数字堆栈 从查找表中读取的任何新“默认值”不会更改/影响单元格。该号码仍可通过手动输入新号码进行修改。
  • 商品搜索 单元格当前具有所有可能的有效数据输入的按字母顺序排列的下拉列表。有没有办法使用相同的列表向单元格添加自动完成功能?可能有点像 Google 搜索引擎,下拉列表会在您键入时出现,并且填充该列表的项目一直限于包含您迄今为止键入的(子)字符串的项目。

  • 注意:在 中显示任何值堆栈 单元格必须可由其他单元格中的公式读取;即 购买 单元格,其值将成为 的比率堆栈 单元格的查找值以及当时在单元格中显示的值。

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

    提前谢谢你。

    目前查到的资料:

    ...但还没有完全解决我的问题。
  • 我可能会使用多个单元格来实现相同(或相似)的有效功能(一个单元格保存默认值,另一个保存可能的用户输入值,第三个保存相关输出值),但这看起来不像对最终用户来说也很好也不是很直观。该工作簿旨在分发给其他人,其中大部分内容已被锁定和保护。
    ——这个答案不可取。
  • 在我提出这个问题之前的互联网搜索中,我发现了这一点信息。它说如果我希望自动恢复到默认值,那么在工作表更改事件例程中使用以下代码:
    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 是其他人示例中使用的标称单元格。
  • 有人问了一个(可能)类似的问题,并提供了 this答案与使用自定义数字格式有关。自定义数字格式是否接受诸如当前在 中使用的公式?堆栈 细胞?


  • 文件上传:

    包括当前和所需的功能,愿望 list 项目尚未到来。
    Item-inary (public).xlsm - (MediaFire)
    2012 年 3 月 18 日,UCT 07:40

    当前和所需的功能 +“愿望 list 1”。
    Item-inary (public).xlsm - (媒体火)
    2012 年 3 月 20 日,美国东部时间 19:50

    >> 编辑 #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
    

    此代码尚不包含任何“愿望 list 2”功能,但其他方面工作正常。

    非常感谢那些提供帮助的人。

    最佳答案

    @SiddharthRout: I will still upload a current copy of the file for your perusal. Parts of my question have been answered, but there are still the two items from my 'Wish list' to be done with yet! –




    根据我之前的建议,您当前使用的代码应该写成
    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 的使用。

    我现在正在看其余的东西,很快就会更新。

    更新 :您在愿望 list 中的两个请求都已完成。

    您的 Worksheet_Change事件现在变成了包含愿望 list 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
    

    对于您的第二个愿望 list ,我有两个选择。我继续第二个选项。

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

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

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



    2) 使用控件而不是 DV 列表。为此,我在列表中进行了这些更改
  • 删除单元格 J6 中的数据验证
  • 为您的列表 X3:X315 命名“名称”名称管理员 .我称之为“列表”
  • 在 Cell J6 顶部放置一个 ComboBox 并设置 .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 就会自动完成。

    快照

    enter image description here

    示例文件链接(此链接有效期为 7 天)

    Sample File

    HTH

    锡德

    关于vba - 如何在 Excel 中实现可重置、可覆盖的默认单元格值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9755881/

    相关文章:

    excel - 在 VBA : Run-time error ‘462’ : The remote server machine does not exist or is unavialiable 中打开 Excel 文件

    excel - 使用来自固定列引用但来自当前事件行的内容动态更新单个单元格

    VBA:将excel数据读入word

    excel - 不要在单元格中显示公式

    python - 将 Python 输出打印到 Excel 工作表

    excel - #值(value)!写公式时出错

    excel - 为什么我得到这个公式有问题?

    excel - 找到最后一个匹配后,如何使循环停止

    从列表中随机选择

    c# - 工作表.CustomProperites OpenXML