首页 > 解决方案 > 基于单元格值显示的 Excel 图像

问题描述

我在 excel 上有 2 张工作表,一张叫做 Raw,一张叫做 Graphs。我想要做的是在 Raw 中有一些单元格,它们 =TRUE 然后我想要一个形状出现在 Graphs 页面上。

我对 VBA 很陌生,所以我没有尝试太多:(

Private Sub Worksheet_Calculate()
    With Worksheets("Graph")
        If Me.Range("FK45").Value = True Then
            .Shapes("Test1").Visible = True
            Exit Sub
        ElseIf Me.Range("FK45").Value = False Then
            .Shapes("Test1").Visible = False
            Exit Sub
        End If
    End With
End Sub

我可以让它工作,所以如果 FK45 为 TRUE,图像会显示,但如果 FK45 为 FALSE,它不会,但我想要做的是添加更多,例如

Private Sub Worksheet_Calculate()
    With Worksheets("Graph")
        If Me.Range("FK45").Value = True Then
            .Shapes("Test1").Visible = True
            Exit Sub
        ElseIf Me.Range("FK45").Value = False Then
            .Shapes("Test1").Visible = False
            Exit Sub
        End If
    End With
    With Worksheets("Graph")
        If Me.Range("FK46").Value = True Then
            .Shapes("Test2").Visible = True
            Exit Sub
        ElseIf Me.Range("FK46").Value = False Then
            .Shapes("Test2").Visible = False
            Exit Sub
        End If
    End With
End Sub

我希望它们都相互独立,并在必要时能够添加更多

如果 FK45 为 TRUE Image1 显示 如果 FK45 为 FALSE Image1 不显示和/或如果 FK46 为 TRUE Image2 显示 如果 FK46 为 FALSE Image2 不显示和/或如果 FK47 为 TRUE Image3 显示 如果 FK47 为 FALSE Image3 不显示节目

等等...

标签: excelvba

解决方案


我会这样做

在 VB 编辑器中找到您的WorksheetShape对象,并在各自的属性窗口中将它们的系统名称重命名为直观的名称。

工作表对象属性窗口

这样您就可以摆脱With Worksheets("Graph")构造,而是可以通过系统名称来调用它们,例如With Graph. 如果您希望重命名工作表或形状,这也会派上用场。

请注意,Exit Sub在每次单元格检查后,您的程序会在第一个单元格之后停止,并且不会继续进行。

我建议使用Worksheet.Change而不是Worksheet.Calculate事件。这样你就可以一个一个地遍历你的单元格。

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rngCell As Range
    Dim shpImage As Shape

    For Each rngCell In Target.Cells
        ' check if change was made in "FK"
        If Not Intersect(rngCell, Me.Columns("FK")) Is Nothing Then
            Select Case rngCell.Row
                Case 45: Set shpImage = Graph.MyImage_1
                Case 46: Set shpImage = Graph.MyImage_2
            End Select
            ' if only boolean values present, no need for IF construction
            shpImage.Visible = rngCell.Value : Set shpImage = Nothing
        End If
    Next

End Sub

如果您有单独的图像名称列,那会容易得多,您可以像这样检查(例如,形状名称位于“FL”​​列中​​)

Graph.Shapes(rngCell.Offset(0, 1).Value).Visible = rngCell.Value

推荐阅读