EDWARD
Lv 7
EDWARD 發問時間: 電腦與網際網路軟體 · 9 年前

請問EXCLE巨集中set和nothing函號的意思

小弟對excel VBA 巨集中SET和nothing使用有些疑問

小弟使用網站上的例子

當先尋找資料庫有無重複資料時插入一格新的資料,

如有重複重複增加時不做動作

1.請問一下程式中有無定義set 為何有差異呢

2.請問一下程式中nothing是什麼意思,通常使用在那兒

ex範例如下

http://www.FunP.Net/797607

Sub 資料庫有重複不增加如無重複增加_有set() x = InputBox(Key)Range("a1").SelectSet y = Cells.Find(What:=x)

If y Is Nothing Then

Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

ActiveCell.Value = x

End IfEnd Sub

Sub 資料庫有重複不增加如無重複增加no_set() x = InputBox(Key)Range("a1").Selecty = Cells.Find(What:=x)

If y Is Nothing Then

Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

ActiveCell.Value = xEnd IfEnd Sub

已更新項目:

謝謝您們,還是對SET 有點不太懂,慢慢學習中

2 個已更新項目:

先謝謝您百忙之中熱心回覆

有一個小小疑問

為何程式用 Set y = Cells.Find(What:=x) 這個巨集就可以執行,但程式中改用 y = Cells.Find(What:=x).Activate 或 y = Cells.Find(What:=x)

再次謝謝您

4 個解答

評分
  • 9 年前
    最佳解答

    1.請問一下程式中有無定義set 為何有差異呢

    如果當定義涉及物件 (object), 你便要用到 Set, 因為物件存在一連串相關值, 不能夠與普通文宇數宇值定義混淆。

    2.請問一下程式中nothing是什麼意思,通常使用在那兒

    Nothing 是某物件尚未指定或者取得, 即是空空如也, 如要進行 Find, 找不到目標就是 Nothing, 找到就取得 Cell.Address, Cell.Value 等等, Nothing 是配合 Object 使用的。

    2011-10-27 18:34:46 補充:

    你可以試 run (F8, Debug / Step Into) 這段公式, Activate 是動作, 跟在物件後可以不用配 Set, 但再下面的 Set 若拿走, 一執行便會 error, InputBox 按取消鍵令, 第二個 Find 會出 blank text, 第三個 Find 會出 Nothing, Nothing 之下執行 Cells.Address 會出 error。

    Cells.Find(what:=InputBox("Find what?")).Activate

    2011-10-27 18:35:54 補充:

    Dim x As Object

    MsgBox IIf(x Is Nothing, "Is nothing", "not nothing")

    MsgBox IIf(IsEmpty(y), "Is empty", "not empty")

    Set x = Cells.Find(what:=InputBox("Find what?"))

    MsgBox IIf(x Is Nothing Or x = "", "Nothing", "Not nothing")

    Set y = [A1].Find(what:=InputBox("Find what?"))

    2011-10-27 18:36:16 補充:

    MsgBox IIf(y Is Nothing, "Nothing", y.Address)

    2011-10-27 22:35:32 補充:

    Dim x 為物件之後而未作出單一配對前, x 是 Nothing; 而 y 例子, 未 Dim 同 Set 前是 Empty。

    2011-10-27 23:21:11 補充:

    Set 可以配合 database 用, Set connection = Nothing 可以終止連結, 在 VB 操作及表現上好重要, Set 對應 Range/Cells 只是謹謹其中一個範例。

    2011-10-27 23:21:42 補充:

    Set 可以配合 database 用, Set connection = Nothing 可以終止連結, 在 VB 操作及表現上好重要, Set 對應 Range/Cells 只是謹謹其中一個範例。

    參考資料: , 小Nick
  • Kubi
    Lv 5
    9 年前

    Set y = Cells.Find(What:=x)

    先別看等號的左邊,等號的右邊的式子如下:

    Cells.Find(What:=x)

    其意思是在整個工作表內找到符合x變數內的值所在的儲存格,

    這如同按功能表的 [編輯/尋找] 指令,找到後游標是停在被找到的儲存格(例如A5或是F4)。

    因此很清楚的了解等號的右邊是物件Range(非數字、日期、字串..變數),且是單一儲存格例如A5或是F4。

    若要驗證是否是儲存格,可於下一行再增加如下的式子做測試變知。

    MsgBox TypeName(Cells.Find(What:=x))

    答案是:Range

    2011-10-27 22:40:05 補充:

    因此要儲存物件變數(例如存入被找到的A5儲存格或F4儲存格),勢必變數(y)的左側須加上 Set。

    因此經過Set y = Cells.Find(What:=x)之後,

    y物件變數內儲存的是Range(例如A5或是F4)

    再看 y = Cells.Find(What:=x)

    右邊是範圍物件,左邊y是變數(非物件變數,因為前面沒有加 Set),這會造成錯誤的陳述(不對等)。

    除非說式子改為如下就成立:

    y = Cells.Find(What:=x).Row

    因為式子右邊並非指向物件,而是指向該儲存格所在的列數(Row),而列數(例如第5列或第7列)是屬數字變數,非物件變數而成立。

    2011-10-27 22:40:54 補充:

    當然您也可以再利用MsgBox TypeName(Cells.Find(What:=x).Row)去驗證。

    至於 Nothing,底下是官方版解說:

    在範圍內尋找特定資訊,並傳回 Range 物件,該物件代表所找到的第一個包含所尋找資訊的儲存格。如果未發現符合的儲存格,就傳回 Nothing

    因此 If y Is Nothing Then 的意思是:若沒有(找到)並指向某一儲存格而是空的(y=Nothing)的話,則執行底下至End If間的代碼。

    這就表示可用 Nothing 來檢測該物件(Range)是否有被找到。

    以上是個人淺見,請參考。

  • KK
    Lv 7
    9 年前

    淺見不知道對不對,參考就可

    我覺得程式有很多種寫法,但是要配套處理

    第一種:如 y = Cells.Find(What:=x) 有2種狀況(廢話)

    狀況1:找到傳回 x

    回傳的值x好像沒什麼用途,一般要位置比較有用(後面加 .address)

    狀況2:找不到產生錯誤停止執行

    需要用 On Error GoTo err1: 這些指令處理後續 ...

    當成 If y Is Nothing Then 的效果

    2011-10-27 11:58:39 補充:

    第二種:如 Set y = Cells.Find(What:=x) 有2種狀況(廢話)

    狀況1:找到傳回該儲存格之物件(裡面可包含身多資訊,如值、公式、顏色、位置...),好用

    狀況2:找不到不會產生錯誤停止執行,y 為 Nothing

    所以加判斷 If y Is Nothing Then 作後續處理

    我認為2種方式都可以處理,第二種當然比較方便

    講錯了請其他大大再指正

  • EDWARD
    Lv 7
    9 年前

    謝謝您們,還是對SET 有點不太懂,慢慢學習中

    2011-10-27 04:29:31 補充:

    先謝謝您百忙之中熱心回覆

    有一個小小疑問

    為何程式用 Set y = Cells.Find(What:=x) 這個巨集就可以執行,但程式中改用 y = Cells.Find(What:=x).Activate 或 y = Cells.Find(What:=x)

    再次謝謝您

還有問題?馬上發問,尋求解答。