Excel 2010中的Borders对象,通过引用传递?

时间:2013-12-17 18:37:01

标签: excel excel-vba vba

我一直在研究格式编码器,它抓取给定范围的格式,然后提供将该格式粘贴到另一个给定范围的能力(基本上模拟“粘贴格式”,但可存储)。我正在尝试设置范围的Borders对象(在set例程中),但似乎Borders对象是按值传递的,而不是引用?

我可以很好地获得Borders对象的当前值,但是如果我尝试设置任何值,它会被直接忽略(甚至没有“只读”错误)。 Follows是我的代码片段:

Sub SetBorders(sInput As String, ByRef Target As Borders)
Dim resultPart() As String
'Border indexes go from 5 to 12
For i = 5 To 12
    'Set resultPart
    resultPart = Split(Split(sInput, CharEOList)(i - 5), CharEORecord)
    If Len(resultPart(0)) > 0 Then
        Target(i).ColorIndex = CLng(resultPart(0))
...

我做错了什么?我应该使用更高的Range对象并向下钻取到其中的Borders对象吗?

2 个答案:

答案 0 :(得分:0)

显然,访问顺序对Borders对象非常重要。我一直在顶部设置.LineStyle,当它应该在底部时更多。首先设置LineStyle(即,设置为None),然后设置Color,将LineStyle恢复为Borders对象中的LineStyle。

该代码的完成部分:

Sub SetBorders(sInput As String, ByRef Target As Borders)
    Dim resultPart() As String
    'Border indexes go from 5 to 12
    For i = 5 To 12
        'Set resultPart
        resultPart = Split(Split(sInput, CharEOList)(i - 5), CharEORecord)
        'If index is empty, set that property to Variant/Null
        If Len(resultPart(0)) > 0 Then Target(i).ColorIndex = CLng(resultPart(0)) Else Target(i).ColorIndex = Null
        If Len(resultPart(1)) > 0 Then Target(i).color = CDbl(resultPart(1)) Else Target(i).color = Null
        If Len(resultPart(2)) > 0 Then Target(i).ThemeColor = CDbl(resultPart(2)) Else Target(i).ThemeColor = Null
        If Len(resultPart(3)) > 0 Then Target(i).TintAndShade = CDbl(resultPart(3)) Else Target(i).TintAndShade = Null
        'Weight and LineStyle seem to always be set
        Target(i).Weight = CLng(resultPart(4))
        Target(i).LineStyle = CLng(resultPart(5))
        On Error GoTo 0

    Next i

End Sub

Function GetBorders(b As Borders)
    Dim Result As String
    Result = ""
    Dim resultPart() As String
    'Border indexes go from 5 to 12
    For i = 5 To 12
        'Reset resultPart
        resultPart = Split(",,,,,", ",")
        'Skip errors. This will leave that index blank, which equates to a Null when using Borders
        On Error Resume Next
        resultPart(0) = b(i).ColorIndex
        resultPart(1) = b(i).color
        resultPart(2) = b(i).ThemeColor
        resultPart(3) = b(i).TintAndShade
        resultPart(4) = b(i).Weight
        resultPart(5) = b(i).LineStyle
        On Error GoTo 0
        Result = Result + Join(resultPart, CharEORecord) + CharEOList
    Next i
GetBorders = Result
End Function

答案 1 :(得分:0)

这对我有用(XL2010),因此您的代码肯定会出现其他问题。

编辑 - 我看到你想通了。

Sub tester()
    SetBorders Selection.Borders
End Sub


Sub SetBorders(obj As Borders)

    Dim arr, x

    arr = Array(xlEdgeBottom, xlEdgeLeft, xlEdgeRight, xlEdgeTop)

    For x = LBound(arr) To UBound(arr)
        With obj(arr(x))
            .LineStyle = xlContinuous
        End With
    Next x

End Sub