【问题标题】:How can I use VBA to format Symbols / Icons into cells without using conditional formatting如何在不使用条件格式的情况下使用 VBA 将符号/图标格式化为单元格
【发布时间】:2013-08-14 13:02:08
【问题描述】:

我正在使用 VBA 代码放置条件格式以覆盖大表中的值,我使用每个单元格的 2 个公式来确定要使用 3 个符号中的哪一个。我需要根据列用不同的单元格检查每个单元格的值,因此据我所知,我必须将条件格式规则分别放在每个单元格上,以确保每个单元格中的公式正确。这是因为条件格式不能采用相对地址,你必须给它每个单元格的确切地址......对吗?

大量的条件格式实例在很大程度上降低了我的计算机速度。

是否可以在不使用条件格式的情况下将条件格式使用的符号放入单元格中?

可能有点像图像,但同时保留下面的单元格值,这可以使用条件格式来完成。

下面我给出了用于放置条件格式的代码。非常感谢任何帮助!

    Dim AIs As Range
    Dim rng As Range
    Dim cl As Range

    Set AIs = ActiveSheet.Range("Table")
    For Each cl In AIs.Columns
        For Each rng In cl.Cells

        rng.FormatConditions.AddIconSetCondition
        rng.FormatConditions(rng.FormatConditions.Count).SetFirstPriority
        With rng.FormatConditions(1)
            .ReverseOrder = False
            .ShowIconOnly = True
            .IconSet = ActiveWorkbook.IconSets(xl3Symbols2)
        End With

         With rng.FormatConditions(1).IconCriteria(1)
            .Icon = xlIconYellowExclamationSymbol
        End With
        With rng.FormatConditions(1).IconCriteria(2)
            .Icon = xlIconRedCross

            .Type = xlConditionValueFormula
            .Value = "=IF(VALUE(LEFT(" & rng.Parent.Cells(5, rng.Column).Address & _
                  ";1)=0;1;6)"

            .Operator = 7
        End With
        With rng.FormatConditions(1).IconCriteria(3)
            .Icon = xlIconGreenCheck

            .Type = xlConditionValueFormula
            .Value = "=IF(VALUE(LEFT(" & rng.Address & ";1))<=VALUE(LEFT(" & _
                  rng.Parent.Cells(5, rng.Column).Address & ";1));1;6)"

            .Operator = 7
        End With
        Next rng
    Next cl

【问题讨论】:

    标签: excel vba symbols conditional-formatting performance


    【解决方案1】:

    直接向单元格添加形状:

    Dim cLeft As Single
    Dim cTop As Single
    
    cLeft = rng.Left
    cTop = rng.Top
    
    with AIs.Shapes.AddShape(msoShapeOval, cLeft, cTop, 12, 12)
        .ForeColor.RGB = RGB(255, 0, 0)
        'Other properties can be found at
        'http://msdn.microsoft.com/en-us/library/office/bb251480%28v=office.12%29.aspx
    end with
    

    您可能需要调整 cTop 和 cLeft 以及宽度/高度以根据需要定位圆

    【讨论】:

    • 错误 1004 对象失败,我试图手动将相对地址放入条件格式公式中,但我总是收到相同的消息,告诉我条件格式只能接受绝对地址。我相信这个错误 1004 的出现是因为我告诉 VBA 代码将一个相对地址放入一个条件格式公式中,然后它会吐回这个错误。最终结果是将图标放入单元格中,如代码code .icon = xlIconGreenCheck etc 中所示。
    • 感谢您的回答。也许它是条件格式中符号化操作的一个独特条件,我不能将相对地址放入其中。您是否知道这不起作用的任何其他原因,或者您之前是否在符号化条件格式的公式中使用过相对地址?
    • 对于符号公式,相对不是一个选项(谢谢,excel)。最好有一个包含公式结果的“帮助”列,然后根据单元格分配图标(例如,低于 1、红色、等于 1、琥珀色、高于 1、绿色(或者你想要图标),并使用选项隐藏单元格中的基础值(.ShowIconOnly = True
    • 我想我明白你的意思,因为在我的每个列旁边都有一个隐藏列来容纳公式的结果,然后要求条件格式来查看这个值。唯一的问题是,这还需要我在每个单元格中放置一个单独的条件格式规则,以便容纳一个公式,说查看“另一个单元格”这让我遇到了同样的问题,即有大约 10000 个条件格式规则实例在每个工作表上。 :) 感谢您的 uick 回复,但我认为它不起作用。
    • 您不知道有什么方法可以获取我想要的符号并直接使用 VBA 将它们放入单元格中,是吗?这样,我将在 VBA 中执行条件检查,然后将符号永久写入单元格。工作表不会被更改,并且在工作表之间移动时,旧的工作表会被删除和刷新,因此 VBA 可以进行任何可能需要的更新
    【解决方案2】:

    最终代码:

         Set AIs = ActiveSheet.Range("Table")
         For Each cl In AIs.Columns
            For Each rng In cl.Cells
    
                'Shapes  - GRADE MASK
    
    
                cLeft = rng.Left + 5 - (rng.ColumnWidth / 2)
                cTop = rng.Top + (rng.RowHeight / 2 - 5)
    
                If Not rng = "" And rng.ColumnWidth = 3 And rng.RowHeight > 12 Then
    
                If rng.Parent.Cells(5, rng.Column) = 0 Then
                    With wks.Shapes.AddShape(msoShapeOval, cLeft, cTop, 10, 10)
                        .Fill.ForeColor.RGB = RGB(255, 0, 0)
                    End With
                End If
                If CInt(Left(rng, 1)) >= CInt(Left(rng.Parent.Cells(5, rng.Column), 1)) And _
                 Not rng.Parent.Cells(5, rng.Column) = 0 Then
                    With wks.Shapes.AddShape(msoShapeOval, cLeft, cTop, 10, 10)
                        .Fill.ForeColor.RGB = RGB(0, 255, 0)
                    End With
                End If
                If CInt(Left(rng, 1)) < CInt(Left(rng.Parent.Cells(5, rng.Column), 1)) Then
                    With wks.Shapes.AddShape(msoShapeOval, cLeft, cTop, 10, 10)
                        .Fill.ForeColor.RGB = RGB(255, 204, 0)
                    End With
                End If
                End If
            Next rng
        Next cl
    
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _
           userinterfaceonly:=True
    

    然后每次调用宏时,我都会删除工作表上的所有形状,执行宏,然后再次调用它,在上面的 if 语句中会检查列宽和行高的大小以及仅当单元格“可见”时才插入形状

    在我的程序中,由于此子程序之外的其他原因,我无法隐藏行或列,而是将它们的高度或宽度减小到刚好足以显示单元格边框。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      相关资源
      最近更新 更多