2013-12-17 72 views
0

我一直在研究抓取給定範圍的格式的格式編碼器,然後提供將該格式粘貼到另一個給定範圍(基本上模擬「粘貼格式」,但可存儲)的功能。我試圖設置一個範圍的邊界對象(在設置例程中),但似乎邊界對象是通過值傳遞的,而不是引用?Excel 2010中的邊框對象,通過引用傳遞?

我可以得到Borders對象的當前值,但是如果我嘗試爲它設置任何值,它會被忽略(甚至沒有「只讀」錯誤)。下面是我的代碼片段:

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

是的,傳遞Range對象而不是嘗試傳遞邊框會更簡單。也許你可以更新你的問題,包括你目前如何調用這個子? –

+0

它是一個較大例程的內部函數,這就是爲什麼參數以這種方式傳遞的原因。它被這樣調用: Sub SetCellFormat(sh As Worksheet,the Range As Range,format As String) ...如果UBound(s)> = 3那麼如果Len(s(3))> 0那麼SetBorders s( 3),theRange.Borders – Tsaukpaetra

回答

0

顯然,訪問順序對邊界對象非常重要。我一直把.LineStyle設置在頂部,當它應該在底部。首先設置LineStyle(即,設置爲None),然後設置Color,將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 
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 
+0

是的,如果你只做一件事情,Excel試圖變得非常有幫助,但是試圖集中事物變得相當棘手,因爲它在每一步都「修復」了事物。 – Tsaukpaetra

相關問題