>> 问题总结
我想在 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 是其他人示例中使用的标称单元格。
文件上传:
包括当前和所需的功能,愿望 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 就会自动完成。
快照
示例文件链接(此链接有效期为 7 天)
Sample File
HTH
锡德
关于vba - 如何在 Excel 中实现可重置、可覆盖的默认单元格值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9755881/