我一直在研究格式编码器,它抓取给定范围的格式,然后提供将该格式粘贴到另一个给定范围的能力(基本上模拟“粘贴格式”,但可存储)。我正在尝试设置范围的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对象吗?
答案 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