如果某行上的活动单元格,则Excel VBA会添加边框

时间:2012-05-23 08:20:15

标签: excel vba border cells

我正在为甘特图电子表格写一些VBA。

我在第5行有3个月的日期,我可以通过在更新整个工作表的单元格中输入日期来设置开始日期。

我的图表L6有一系列单元格:CZ42。对于此范围,如果第5行中的单元格是该月的第1个,则该列中的每个单元格都将具有灰色虚线左边框,而右侧没有任何内容。这就是我想要的方式。

问题是它在单元格的顶部和底部添加了一个灰色边框,对于第7行到第41行是可以的,但是对于第6行,我想要一个黑色的顶部边框,对于第42行,我想要一个黑色的底部边框。

我添加了这部分代码试图对此问题进行排序,但语法错误,检查是否在第6行

' If this is the first row (6) in the range then
' add a black continuous border to the top
If Cells(6, i) Then
    With .Borders(xlEdgeTop)
        .ColorIndex = 1
        .Weight = xlThin
        .LineStyle = xlContinuos
    End With
End If

这是我的全部代码

Sub Worksheet_Change(ByVal Target As Range)

Dim i As Long
Dim CuDate As Date


For i = 12 To 104
CuDate = Cells(5, i).Value

' Are we on the 1st day of the month
If Day(CuDate) = 1 Then
    With Range(Cells(6, i), Cells(42, i))
        ' If this is the first row (6) in the range then
        ' add a black continuous border to the top
        If Cells(6, i) Then
            With .Borders(xlEdgeTop)
                .ColorIndex = 1
                .Weight = xlThin
                .LineStyle = xlContinuos
            End With
        End If

        With .Borders(xlEdgeLeft)
            .ColorIndex = 15
            .Weight = xlThin
            .LineStyle = xlDot
        End With
        With .Borders(xlEdgeRight)
            .LineStyle = xlLineStyleNone
        End With
    End With
Else
    With Range(Cells(6, i), Cells(42, i))
        ' If this is the last row (42) in the range then
        ' add a black continuous border to the bottom
        If Cells(42, i) Then
            With .Borders(xlEdgeBottom)
                .ColorIndex = 1
                .Weight = xlThin
                .LineStyle = xlContinuos
            End With
        End If

        With .Borders(xlEdgeLeft)
            .LineStyle = xlLineStyleNone
        End With
        With .Borders(xlEdgeRight)
            .LineStyle = xlLineStyleNone
        End With
    End With
End If

Next
End Sub

2 个答案:

答案 0 :(得分:6)

此行不符合您的预期:If Cells(6, i) Then

相当于说:If Cells(6, i).Value = True Then,即“如果第6行和列i上的单元格内容在隐式强制转换为布尔值时评估为True,则”,显然不是你想要的。相反,尝试:

If ActiveCell.Row = 6 Then

您的代码中If Cells(42, i) Then的原因也相同。

答案 1 :(得分:2)

[更新: Jean-FrançoisCorbett更正了您的代码逻辑:检查活动单元格是否在第6行。但是由于输入错误,代码不会产生顶部和底部边框。 ]

您的代码无法编译。请考虑在代码模块顶部使用Option Explicit。我可以复制您的问题的唯一方法是删除Option Explicit。我设置了VBA编辑器,因此它会自动将Option Explicit放在新模块的顶部。

LineStyle属性必须是XlLineStyle常量之一:

  • xlContinuous
  • xlDash
  • xlDashDot
  • xlDashDotDot
  • xlDot
  • xlDouble
  • xlSlantDashDot
  • xlLineStyleNone

在您的代码中,您编写了 xlContinuos 而非 xlContinuous 。一旦你进行了这个修正,代码应该可行。

此外,这是一个小问题,但从技术上讲,Worksheet_Change事件应声明如下:

Private Sub Worksheet_Change(ByVal Target As Range)

我建议您利用VBA编辑器的内置功能以及帮助文档吗?