2013-07-26 31 views
1

我怕我誤解了VBA的Excel文件的文檔,我有這條線,這似乎是一個錯誤:當你應該使用Set [例如SpecialCells返回值]?

Range a = Selection.SpecialCells(xlCellTypeConstants, 23) 

但是這一次僅僅是罰款:

Set a = Selection.SpecialCells(xlCellTypeConstants, 23) 

的文件要求:

Returns a Range object that represents all the cells that match the specified type and value.

但它實際上返回一個對象byRef,這就是爲什麼我要使用Set

我在這裏錯過了什麼?

這裏是Excel Range.SpecialCells方法幫助:

enter image description here

回答

5
Range a = Selection.SpecialCells(xlCellTypeConstants, 23) 

這是無效的VBA,無論數據類型。您不像在C#中那樣在變量名前面聲明變量類型,也不像在VB.NET中那樣在聲明點初始化變量。

你可以這樣做:

Dim a As Range 
Set a = Selection.SpecialCells(xlCellTypeConstants, 23) 

這將會對單元格區域的引用保存到a

你也可以這樣做:

Dim a As Variant 
a = Selection.SpecialCells(xlCellTypeConstants, 23) 

這將在a保存在單元格範圍的值的二維數組。

Returns a Range object that represents all the cells that match the specified type and value.

But it actually returns a byRef object and that is why I have to use Set.

在VBA中沒有byval對象。所有的對象都是byref,當你想複製一個對象的引用時,你總是使用Set。你需要Set的原因是默認屬性。當僅提供對象名稱時,每個對象都可以有一個默認屬性。這造成了模糊性,因此當需要操作對象引用itselt時需要說Set,並且當需要對象的默認屬性時省略SetRange的默認屬性是Value

+0

我看到一些API函數使用BYVAL - 因此,有一個BYVAL PARAMS通過 '私人小組Workbook_SheetChange(BYVAL SH作爲對象,BYVAL目標作爲範圍) 結束Sub' – 0x90

+2

@的0x90傳遞對象'BYVAL '在VBA中意味着傳遞引用byval,而不是像在C++中那樣複製對象並傳遞副本byval。傳遞對象BYVAL確保被調用的函數將無法與完全另一個目的是取代傳遞的對象,但它仍然能夠與它擺弄。 – GSerg

+0

好了,所以我測試:默認是按地址PARAM傳球,除非有明確的按地址/ BYVAL聲明。 – 0x90

1

使用Set關鍵字分配對象變量。非對象變量(讓我們忽略現在變種)不使用Set關鍵字

dim a as int 
dim b as string 
dim c as boolean 

a = 1 
b = "hello" 
c = false 

dim a as Range 
dim b as Worksheet 
dim c as PivotTable 

set a = ActiveSheet.Range("a1") 
set b = ActiveSheet 
set c = ActiveSheet.PivotTables(1) 
1

enter image description here

Range.SpecialCells方法返回一個代表所有符合規定的類型和值的單元格區域對象。 set keyworkd用於指定對象的引用。

VBA中有兩種風格的賦值:一種用於普通變量,它使用Let,另一種用於使用Set的對象變量。

一個普通的(字符串,邏輯,數字)變量指向存儲變量的內存中的位置。

對象變量(你在對象下的語言參考找到的東西)是一個指向內存(V表)的結構,裏面包含了指向對象的屬性和方法。

參考http://www.excelforum.com/excel-programming-vba-macros/693357-when-to-use-the-keyword-set.html

0

不知道這個事情,但Value不是Range默認屬性。 Range的默認屬性是_Default

enter image description here

它被定義這樣 _Default([in, optional] VARIANT RowIndex, [in, optional] VARIANT ColumnIndex)和它代表的特定範圍內的值的數組。

Sub test() 

    Dim rng As Range 
    Set rng = ActiveSheet.Range("A1:C3") 

    ' all cells in range rng become value of 1 
    rng.Value = 1 

    ' all cells in range rng become now value of 2 
    rng.[_Default] = 2 

    ' first cell in range rng become value of 3 
    rng.[_Default](1, 1) = 3 

    ' nothing changes 
    rng.Value()(1, 1) = 4 

    Dim a1, a2 
    ' however both Value and _Default return same array of variants 
    a1 = rng.Value 
    a2 = rng.[_Default] 

End Sub 
相關問題