2009-08-31 65 views
2

我在設計這個我正在製作的小報告時遇到了麻煩。是否可以在Excel VBA中爲Range對象創建一個變量,用於將格式應用於另一個Range?這是我的例子:作爲對象存儲範圍屬性?

我創建從Microsoft腳本運行時庫的字典:

Dim d as Scripting.Dictionary 

有了這個我添加標籤,值和(嘗試添加)的範圍。

Dim rng as Range  

rng.Font.Bold = True 
d.Add 1, Field("test1", 12345, rng) 
rng.Font.Bold = False 
d.Add 2, Field("TestTwo", "Testing field", rng) 
rng.HorizontalAlignment = xlCenter 
d.Add 3, Field("threeeee", 128937912, rng) 

Dim key As Variant 

For Each key In d.keys 
    Range("A" & key).value = d(key).Label 
    Set Range("B" & key).value = d(key).rng 

Next key 

這裏是我的現場功能:

Private Function Field(Label As String, val As Variant, rng As Range) As cField 

    Dim f As New cField 
    f.Label = Label 
    f.val = val 
    Set f.rng = rng 
    Set Field = f 

End Function 

這裏是我的cField類:

Option Explicit 

Dim mVarValue As Variant 
Dim mStrLabel As String 
Dim mRng As Range 

Property Let val(ByVal val As Variant) 
    mVarValue = val 
End Property 

Property Get val() As Variant 
    val = mVarValue 
End Property 

Property Let Label(ByVal val As String) 
    mStrLabel = val 
End Property 

Property Get Label() As String 
    Label = mStrLabel 
End Property 

Property Let rng(ByVal val As Range) 
    Set mRng = val 
End Property 

Property Get rng() As Range 
    Dim a As Range 
    a.value = mVarValue 
    Set rng = a 
End Property 

的想法是,在字典中的關鍵將是該行的位置爲領域。這樣,如果需要對我製作的報告進行更改,唯一需要更改的是字典中特定值的關鍵字。我已經成功地存儲了標籤的價值和價值本身,但我也想存儲該範圍的格式(粗體,理由,邊框等...)。

我得到一個'運行時錯誤'91':對象變量或塊變量未設置'錯誤緊接在rng聲明之後的行上。我想知道如果它不可能有一個通用的範圍,沒有在工作表上的位置,或者如果不知何故我的語法關閉。

任何幫助將不勝感激! :)

回答

1

是否有可能建立在Excel VBA的Range對象的變量,用於 應用 格式到另一種範圍的目的是什麼?

我想知道如果它不可能有沒有 在紙張上的位置的通用範圍...

簡短的答案是否定的。

快速回答是...我建議創建一個「格式」工作表,它可以隱藏或非常隱藏,包含範圍或命名範圍,以及所需的格式。這允許你範圍.Copy「格式化」的範圍,然後使用範圍.PasteSpecial xlPasteFormats

我不喜歡覆蓋用戶的剪貼板,但很難以編程方式將一個範圍的格式複製到另一個範圍。我在衆多解決方案中使用這種方法,因爲它靈活,可維護,可重用,並且不依賴於複雜的代碼。此外,我可以直觀地更改格式而不用觸摸代碼。

+0

哦,夥計,這是一個偉大的答案,我唯一的問題是我通過Access VBA所以我outputing報告不能嵌入像這樣的隱藏表格。 – mandroid 2009-08-31 19:00:53

1

好問題!不幸的是,我不認爲你可以將尚未初始化的範圍存儲在工作表上的現有單元格範圍內。我能想到幾個選項:

  1. 使用隱藏的工作表手動存儲的範圍信息
  2. 商店的範圍內的信息,在成員變量的少數

選項1可能是最簡單的方式,儘管事實上聽起來像是多餘的紙張踢來踢去。我正在描繪一個專門爲此目的定義的隱藏工作表。

如果您只需要跟蹤一些範圍屬性(例如邊框和顏色),則可能會簡化選項2。

1

你是對的 - 不可能有一個通用的Range對象。您必須將範圍變量設置爲某個實際範圍才能讀取和寫入其屬性。

但是,如果你是「讓」你的rng財產,那麼你應該已經有一個範圍的參考。爲什麼你有一個Property讓rng如果你不打算在Get語句中使用該屬性。

1

這個解決方案如何?

創建一個類

  • 範圍內的地址爲文本,即。 "$A$3:$A$11,$A$18:$A$24,$D$29"

  • 保存範圍作爲格式文本的格式。

然後,你可以通過創建Range(RangeAdressAsText)的範圍內,並使用類似以下

Private Sub ApplyFormatting(r As Range, ByVal f As String) 
On Error GoTo ErrHandler: 

f = UCase$(f) 
Dim IterateRange As Range 
Dim Formatarray() As String 
Formatarray = Split(f, " ") 
Dim i As Integer 

With r 
    For i = LBound(Formatarray) To UBound(Formatarray) 
     Select Case Formatarray(i) 
      Case "BOLD" 
       .Font.Bold = True 
      Case "ITALIC" 
       .Font.Italic = True 
      Case "TOP" 
       .VerticalAlignment = xlTop 
      Case "BOTTOM" 
       .VerticalAlignment = xlBottom 
      Case "UNDERLINE" 
       .Font.Underline = True 
     End Select 
    Next i 
End With 

Erase Formatarray 

Exit Sub 
ErrHandler: 
    LogInformation Format(Now, "yyyy-mm-dd hh:mm:ss") & " - " & ": @ ApplyFormatting in xlPrinter " & " - " & Err.Number & " - " & Err.Description & " - " & Err.Source & " - " & Err.LastDllError 

End Sub