修改sub中的字体颜色依赖于单元格值

时间:2017-04-06 01:44:06

标签: excel-vba for-loop vba excel

我试图创建一个副本来复制和粘贴一系列数据,并修改第二个范围格式的某些方面。

我想让颜色依赖于数字是奇数还是偶数 - 这是我到目前为止写的:

sub copy_paste_format()
Dim c As Variant
Dim SECONDARY()
Dim i As Integer
Dim n As Integer



ActiveCell.Offset(0, -5).Range("A1:E5").Select
ActiveWorkbook.Names.Add Name:="PRIMARY", RefersToR1C1:= _
    "=Sheet2!R1C1:R5C5"
Selection.Copy
ActiveCell.Offset(0, 5).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Range("A1:E5").Select
Application.CutCopyMode = False
ActiveWorkbook.Names.Add Name:="SECONDARY", RefersToR1C1:= _
    "=Sheet2!R1C6:R5C10"
Selection.Font.Bold = True
With Selection.Font
    .Name = "Calibri"
    .Size = 14
 End With
n = SECONDARY.Count

For i = 1 To n
If Cells.Value Mod 2 = 0 Then
Cells.Font.Color = vbRed
Else: Cells.Font.Color = vblue
End If
Next i

End Sub

我遇到问题的部分是颜色格式。目前我收到了#34;无效限定符"的编译错误。但是在for循环中使用SECONDARY.count并没有产生更好的结果。

有没有人有任何建议?

1 个答案:

答案 0 :(得分:1)

要使用其名称引用Range,请使用以下内容:

n = Range("SECONDARY").Count

要遍历您范围内的每个单元格,您最好做一些类似的事情:

Dim rng As Range
For Each rng In Range("SECONDARY").Cells
    If rng.Value Mod 2 = 0 Then
        rng.Font.Color = vbRed
    Else
        rng.Font.Color = vbBlue
    End If
Next

我无法解决您在代码的第一部分中要执行的操作,但我建议您阅读how to avoid Select and Activate,因为我认为它不会按照您的要求执行正在做。

是啊 - 我想我已经解决了它的作用。例如,假设活动单元格为Sheet1!G12,则代码正在复制单元格Sheet1!B12:F16并将其粘贴到Sheet1!G12:K16中。然后,它会将单元格Sheet1!G12:K16中的字体更改为粗体,Calibri,大小为14.混合使用此代码,会为Sheet2!A1:E5Sheet2!F1:J5创建两个范围名称。

我猜你正在尝试用你的代码做的是:

Sub copy_paste_format()
    Dim c As Range
    With Worksheets("Sheet2")
        .Range("A1:E5").Name = "PRIMARY"
        .Range("F1:J5").Name = "SECONDARY"
        .Range("PRIMARY").Copy .Range("SECONDARY")
        With .Range("SECONDARY").Font
            .Bold = True
            .Name = "Calibri"
            .Size = 14
        End With
        For Each c In .Range("SECONDARY").Cells
            If c.Value Mod 2 = 0 Then
                c.Font.Color = vbRed
            Else
                c.Font.Color = vbBlue
            End If
        Next
    End With
End Sub

注意:我不确定您是否因为您认为必须分配范围名称,或者您是否需要它们用于其他目的,所以我将它们留在代码中。