VBA在输入后不会自动更新
我已经为收集信息的工作创建了Excel工作簿。在这本工作簿中,我有一张表格,可以填写各种货币的详细信息。根据制备方的选择,单元格B5中的值将更改为美元或信用证。如果单元格B5中的值为美元,则应隐藏C列和E列。这里的问题是,此代码不会立即取消隐藏列。单击随机单元格后,列将隐藏。请让我知道是否有一个解决方案,可以在每次不点击随机单元格的情况下隐藏列。多谢各位VBA在输入后不会自动更新,vba,excel,Vba,Excel,我已经为收集信息的工作创建了Excel工作簿。在这本工作簿中,我有一张表格,可以填写各种货币的详细信息。根据制备方的选择,单元格B5中的值将更改为美元或信用证。如果单元格B5中的值为美元,则应隐藏C列和E列。这里的问题是,此代码不会立即取消隐藏列。单击随机单元格后,列将隐藏。请让我知道是否有一个解决方案,可以在每次不点击随机单元格的情况下隐藏列。多谢各位 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Ran
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Range("B5").Value = "USD" Then
Union(Columns("C"), Columns("E")).EntireColumn.Hidden = True
ElseIf Range("B5").Value = "LC" Then
Union(Columns("C"), Columns("E")).EntireColumn.Hidden = False
End If
End Sub
谢谢大家的评论。让我进一步阐述我的问题。原则上,我的VBA代码是有效的。唯一的问题是,在单元格B5更改为美元后,最初什么也没有发生。单击此工作表中的随机单元格后,VBA代码将起作用并隐藏列。同样适用于单元格B5中的值为LC的情况。然后,VBA代码也不能立即工作。单击工作表中的随机单元格后,将不考虑列
关于单元格B5的一个小更新。所以单元格B5包含一个链接到另一张表中列出的单元格的公式。从另一张表的列表中选择一个值后,单元格B5将通过IF函数确定B5中的值是LC还是USD
我现在担心,在制表人在列出的单元格中选择一个值后,它不会单击指定表格中的随机单元格,从而导致他或她看到错误的信息
如果您需要更多信息,请告诉我。多谢各位
另外,我不是很擅长创建VBA代码 您使用了错误的事件 选择其他单元格时,SelectionChange会触发,等等 更改在单元格内容更改后立即激发
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B5").Value = "USD" Then
Union(Columns("C"), Columns("E")).EntireColumn.Hidden = True
ElseIf Range("B5").Value = "LC" Then
Union(Columns("C"), Columns("E")).EntireColumn.Hidden = False
End If
End Sub
替代解决方案:
改编自@vityta's
更多信息:
MSDN:
MSDN:
对代码的一些更改:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$B$5" Then
If Range("B5").Value = "USD" Then
Union(Columns("C"), Columns("E")).EntireColumn.Hidden = True
Else
Union(Columns("C"), Columns("E")).EntireColumn.Hidden = False
End If
Application.Calculate
End If
End Sub
1:正确的事件是当工作表中的值更改时更改,而不是选择更改时更改
2:你的代码在我这边有效,所以我猜它在你这边不起作用,因为你有一些计算错误。我添加了行应用程序。Calculate,即使您的计算设置为手动,它也会刷新电子表格
3:我添加了一个If Target.Address条件,仅当更改的单元格是正确的单元格时才进行检查
4:我添加了ElseIf cell=LC,而不是ElseIf cell=LC,因为它更快,因为我认为如果用户完全删除货币的价值,那么在它是美元之前,没有人会取消隐藏C列和E列。保持简单
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rng As Range
Set rng = Range("B5")
If rng.Value = "USD" Then Columns("C:E").EntireColumn.Hidden = True
If rng.Value = "LC" Then Columns("C:E").EntireColumn.Hidden = False
End Sub
建议:如果可能的话,做一个简单的决定。如果B5=美元,则隐藏,如果不是,则取消隐藏。无需指定B5=LC。如果B5=USD,则隐藏Else取消隐藏。@QHarr是的,对不起,我打字速度快,格式不正确。让我来解决它什么不是立即取消隐藏意味着什么?目前,如果B5是美元,它将隐藏,如果是信用证,它将取消隐藏。似乎对我来说运行得很好。@QHarr好的,评论只能在前5分钟内编辑,我无法修复:O对此表示抱歉。亲爱的各位,我已经尝试了上述所有解决方案,但不幸的是,我的问题仍未解决。我已经包括了一些可能有帮助的进一步解释。非常感谢。或者您甚至可以使用这样的一个行程序:UnionColumnsC,ColumnsE.entireclumn.Hidden=cboolRangeB5.Value=USD在旁注上,虽然事件不是很好,但代码在我这边工作正常。它只是被触发的次数超过了必要的次数,但并不是因为选择的事件,OP才有问题——我想更多的是关于屏幕更新的问题。@vityta-smart!如果我把它添加到OP的答案中,你不会生气吧?如果工作表是动态添加的,那么你可以使用类似于工作簿\u SheetSelectionChange的东西,然后这将开始对所有工作表工作。此子项需要放在ThisWorkbook模块中。此外,您还可以在此子系统中编写一个if循环,以控制哪些工作表需要考虑,哪些不需要考虑。@ashleedawg-不,这很完美:谢谢您的详细解释。我尝试过这个VBA代码,但不幸的是它不起作用。我在最初的问题中作了进一步的解释。谢谢。我们假设范围5发生了物理变化。这将是工作表变更事件开始的唯一方式。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rng As Range
Set rng = Range("B5")
If rng.Value = "USD" Then Columns("C:E").EntireColumn.Hidden = True
If rng.Value = "LC" Then Columns("C:E").EntireColumn.Hidden = False
End Sub