Iak*_*ian 12 excel vba worksheet-function excel-vba excel-formula
我想在Excel中实现一个可重置的,可过度删除的默认单元格值.通过这个,我的意思是当第二个单元格更新时,有一个单元格恢复为"默认"值,该值由依赖于第二个单元格的查找公式获得.用户还可以选择将不同的值写入原始单元格,这将保留到下一次更新第二个单元格为止.
好的,所以情况就是这样; 此快照属于多个工作表数据存储库的相关区域.为清楚起见,两个感兴趣的细胞以绿色突出显示,最高可见行为第1行.
" 项目搜索"单元格接受各种单词或短语输入,并进行数据验证以确保只能进行有效输入.数据验证取自可能输入的字母表列表,单元格有一个下拉列表选项(因此右侧的小箭头).
该堆栈单元使用输入从项搜索以下公式单元格...
=IF(COUNTIF(C3:F315,J6),VLOOKUP(J6,C3:F315,4,FALSE),"~")
Run Code Online (Sandbox Code Playgroud)
...其中J6是项目搜索单元格,范围C3:F315是同一工作表上查找表格的相关部分.
描述与问题相关的Excel文档区域的快照.http://img29.imageshack.us/img29/4388/capturedhx.jpg
现在,这就是我想在Stack单元格中发生的事情......
注意:Stack单元格中显示的值必须可由其他单元格中的公式读取; 即买入和卖出单元格,其值将成为Stack单元格的查找值与当时在单元格中显示的值的比率.
这有可能在任何程度上吗?优选地(但不排他地)不需要使用宏.此工作簿旨在分发给其他人,其中大部分都被锁定和保护,以避免对核心数据进行任何更改.
先感谢您.
......但还没有完全解决我的问题.
我可以使用多个单元格来实现相同(或类似)的有效功能(一个单元格保存默认值,另一个单元格保存可能的用户输入值,第三个单元格保存相关的输出值),但这看起来不像对最终用户来说既不好也不直观.此工作簿旨在分发给其他人,其中大部分都被锁定和保护.- 这个答案是不可取的.
在提出这个问题之前,在我的网上搜索中,我发现了这一点信息.它说如果我想恢复默认值是自动的,那么在工作表更改事件例程中使用以下代码:
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是在另一个人的例子中使用的标称单元.
有人问一个(可能)类似的问题,并得到了这个答案做使用自定义数字格式.自定义数字格式是否会接受一个公式,例如Stack单元格中当前使用的公式?
包括当前和期望的功能,希望列出未来的项目.
Item-inary(public).xlsm - (MediaFire)
2012年3月18日,07:40 UCT
当前和期望的功能+"愿望清单1".
Item-inary(public).xlsm - (Mediafire)
20-Mar-2012,19:50 UCT
到目前为止,这是我的各个部分中的代码:
在 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"功能,但其他方式正常.
非常感谢那些帮助过的人.
@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列表.为此,我在列表中进行了这些更改
.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
希德