输入

时间:2018-04-04 10:52:32

标签: excel vba excel-vba

我为我的工作创建了一个Excel工作簿,用于收集信息。在本工作簿中,我有一张表格,其中可以填写各种货币的详细信息。根据编制者的选择,单元格B5中的值将更改为USD或LC。如果单元格B5中的值为USD,则应隐藏C列和E列。这里的问题是这段代码不会立即取消隐藏列。单击随机单元格后,将隐藏列。如果有针对此问题的解决方案,请告诉我,每次都隐藏列而不点击随机单元格。谢谢。

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。

我现在担心在准备者在列出的单元格中选择一个值后,它不会点击指定表格中的随机单元格,导致他或她将看到错误的信息。

如果您需要更多信息,请与我们联系。谢谢。

PS。我在创建VBA代码方面不是很强大。

3 个答案:

答案 0 :(得分:1)

您使用的是错误的活动。

当您选择其他单元格时会发出

SelectionChange

在单元格内容发生变化后,

Change会立即触发。

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

替代解决方案:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target = Range("B5") Then Union(Columns("C"), Columns("E")).EntireColumn.Hidden = (Target.Value = "USD")
End Sub

(改编自@ Vityata的comment below

更多信息:

答案 1 :(得分:0)

对您的代码进行一些更改:

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:正确的事件是Change(当工作表中的值发生变化时),而不是SelectionChange(选择更改时)。

2:你的代码在我这边工作,所以我猜它不适合你,因为你有一些计算。我已经添加了行Application.Calculate,即使您的计算设置为手动,也会刷新电子表格。

3:我已添加If Target.Address条件,仅在更改的单元格是正确的单元格时进行检查。

4:我已添加Else而不是ElseIf cell = "LC",因为它更快,因为我觉得它更清晰(如果用户完全删除了价值)在货币和美元之前,没有人会取消隐藏C和E列。

答案 2 :(得分:0)

保持简单,

    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