在vba工程里添加了類模塊cable,然后想在sheet物件中參考。
在sheet物件的通用部分Dim c As cable沒有問題
但是改成Public c As cable就會報如下錯誤:
私有物件模塊在公共物件模塊中不能作為引數或公共程序的回傳型別、公共資料成員、或公共用戶定義型別的欄位。
如果我在sheet物件中定義個public sub傳入形參為cable型別,也會報如上錯誤。
請問,為什么cable會被認為私有物件,如何解決?
uj5u.com熱心網友回復:
將某個Dim改為PublicDim 陳述句
宣告變數并分配存盤空間。
語法
Dim [WithEvents] varname[([subscripts])] [As [New] type] [, [WithEvents] varname[([subscripts])] [As [New] type]] . . .
Dim 陳述句的語法包含下面部分:
部分 描述
WithEvents 可選的。關鍵字,說明 varname 是一個用來回應由 ActiveX 物件觸發的事件的物件變數。只有在類模塊中才是合法的。使用 WithEvents,可以宣告任意個所需的單變數,但不能使用 WithEvents 創建陣列。New 和 WithEvents 不能一起使用。
varname 必需的。變數的名稱;遵循標準的變數命名約定。
subscripts 可選的。陣列變數的維數;最多可以定義 60 維的多維陣列。subscripts 引數使用下面的語法:
[lower To] upper [, [lower To] upper] . . .
如果不顯式指定 lower,則陣列的下界由 Option Base 陳述句控制。如果沒有使用 Option Base 陳述句,則下界為 0。
New 可選的。可隱式地創建物件的關鍵字。如果使用 New 來宣告物件變數,則在第一次參考該變數時將新建該物件的實體,因此不必使用 Set 陳述句來給該物件參考賦值。New 關鍵字不能宣告任何內部資料型別的變數,以及從屬物件的實體,也不能與 WithEvents 一起使用。
type 可選的。變數的資料型別;可以是 Byte、布爾、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(對變長的字串)、String * length (對定長的字串)、Object、Variant、用戶定義型別、或物件型別。所宣告的每個變數都要一個單獨的 As type 子句。
說明
在模塊級別中用 Dim 宣告的變數,對該模塊中的所有程序都是可用的。在程序級別中宣告的變數,只在程序內是可用的。
可以使用 Dim 陳述句在模塊級或程序級中宣告變數的資料型別。例如,下面的陳述句宣告了 Integer 型別的變數。
Dim NumberOfEmployees As Integer
也可以使用 Dim 陳述句來宣告變數的物件型別。下面的陳述句為作業表的新建實體宣告了一個變數。
Dim X As New Worksheet
如果定義物件變數時沒有使用 New 關鍵字,則在使用該變數之前,必須使用 Set 陳述句將該參考物件的變數賦值為一個已有物件。在該變數被賦值之前,所宣告的物件變數有一個特定值 Nothing,這個值表示該變數沒有指向任一個物件實體。
也可以使用帶空圓括號的 Dim 陳述句來定義動態陣列。在定義動態陣列后,可以在程序內使用 ReDim 陳述句來定義該陣列的維數和元素。如果試圖在 Private,Public 或 Dim 陳述句中重新定義一個已顯式定義了大小的陣列的維數時,就會發生錯誤。
如果不指定資料型別或物件型別,且在模塊中沒有 Deftype 陳述句,則該變數按預設設定是 Variant 型別。
當初始化變數時,數值變數被初始化為 0,變長的字串被初始化為一個零長度的字串 (""),而定長的字串則用 0 填充。Variant 變數被初始化為 Empty。用戶自定義型別的變數的每個元素作為各自獨立的變數進行初始化。
注意 當在程序中使用 Dim 陳述句時,通常將 Dim 陳述句放在程序的開始處。
Public 陳述句
在模塊級別中使用,用于宣告公用變數和分配存盤空間。
語法
Public [WithEvents] varname[([subscripts])] [As [New] type] [,[WithEvents] varname[([subscripts])] [As [New] type]] . . .
Public 陳述句的語法包含下面部分:
部分 描述
WithEvents 可選的。關鍵字,說明 varname 是用來回應由 ActiveX 物件觸發的事件的物件變數。只有在類模塊中才是合法的。使用 WithEvents,可以定義任意個所需的單個變數,但不能用 WithEvents 創建陣列。New 和 WithEvents 不能一起使用。
varname 必需的。變數的名稱;遵循標準的變數命名約定。
subscripts 可選的。陣列變數的維數;最多可以定義 60 維的多維陣列。subscripts 引數使用下面的語法:
[lower To] upper [,[lower To] upper] . . .
如果不顯式指定 lower,則陣列的下界由 Option Base 陳述句控制。如果沒有 Option Base 陳述句則下界為 0。
New 可選的。用它可以隱式地創建物件的關鍵字。如果使用 New 宣告物件變數,則在第一次參考該變數時創建該物件的新實體,因此不必使用 Set 陳述句來對該物件參考賦值。New 關鍵字不能用來宣告任何內部資料型別的變數以及從屬物件的實體,也不能與 WithEvents 一起使用。
type 可選的。變數的資料型別;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(對變長的字串)、String * length(對定長的字串)、Object或 Variant,用戶定義型別,或物件型別。所宣告的每個變數都要有一個單獨的 As type 子句。
說明
Public 陳述句宣告的變數在所有應用程式的所有沒有使用 Option Private Module 的模塊的任何程序中都是可用的;若該模塊使用了 Option Private Module,則該變數只是在其所屬工程中是公用的。
小心 不能在類模塊中使用 Public 陳述句來宣告一個定長的字串變數。
使用 Public 陳述句可以宣告變數的資料型別。例如,下面的陳述句宣告了一個 Integer 型別的變數。
Public NumberOfEmployees As Integer
也可以使用 Public 陳述句來宣告變數的物件型別。下面的陳述句為作業表的新實體宣告了一個變數。
Public X As New Worksheet
如果在定義物件變數時沒有使用 New 關鍵字,則在使用該變數之前,必須使用 Set 陳述句將一個已有的物件賦給這個參考物件的變數。在被賦值之前,所宣告的這個物件變數有一個特定值 Nothing,這個值表示該變數沒有指向任何物件的實體。
可以用帶空圓括號的 Public 陳述句來宣告動態陣列。在宣告了動態陣列之后,可以在程序內用 ReDim 陳述句來定義該陣列的維數和元素。如果試圖在 Private、Public 或 Dim 陳述句中重定義一個已被顯式定義了大小的陣列的維數,就會發生錯誤。
如果不指定資料型別或物件型別,且在模塊中沒有使用 Deftype 陳述句,則按預設情況該變數為 Variant 型別。
當初始化變數時,數值變數被初始化為 0,變長的字串被初始化為一個零長度的字串 (""),而定長的字串則用 0 填充。Variant 變數被初始化為 Empty。用戶自定義型別的變數的每個元素都作為各自獨立的變數進行初始化。
uj5u.com熱心網友回復:
Private 陳述句
在模塊級別中使用,用于宣告私有變數及分配存盤空間。
語法
Private [WithEvents] varname[([subscripts])] [As [New] type] [,[WithEvents] varname[([subscripts])] [As [New] type]] . . .
Private 陳述句的語法包含下面部分:
部分 描述
WithEvents 可選的。關鍵字,說明 varname 是用來回應由 ActiveX 物件所觸發的事件的物件變數。只有在類模塊中才是合法的。使用 WithEvents,可以定義任意個所需的單變數,但不能用 WithEvents 創建陣列。New 和 WithEvents 不能一起使用。
varname 必需的。變數的名稱;遵循標準的變數命名約定。
subscripts 可選的。陣列變數的維數;最多可以定義 60 維的多維陣列。subscripts 引數的使用語法如下:
[lower To] upper [,[lower To] upper] . . .
如果不顯式指定 lower,則陣列的下界由 Option Base 陳述句控制。如果沒有 Option Base 陳述句則下界為 0。
New 可選的。使其可以隱式地創建物件的關鍵字。如果使用 New 宣告物件變數,則在第一次參考該變數時創建該物件的新實體,因此不必使用 Set 陳述句來對該物件參考賦值。New 關鍵字不能宣告任何內部資料型別的變數以及從屬物件的實體,也不能與 WithEvents 一起使用。
type 可選的。變數的資料型別;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(對可變長的字串)、String * length(對定長的字串)、Object、Variant、用戶定義型別或物件型別。所宣告的每個變數都要一個單獨的 As type 子句。
說明
Private 變數只能在包含其宣告的模塊中使用。
可以使用 Private 陳述句宣告變數的資料型別。例如,下面的陳述句宣告了一個 Integer 型別的變數。
Private NumberOfEmployees As Integer
也可以使用 Private 陳述句來宣告變數的物件型別。下面的陳述句為作業表的新實體宣告了一個變數。
Private X As New Worksheet
如果在定義物件變數時沒有使用 New 關鍵字,則在使用該變數之前,必須使用 Set 陳述句將一個已有的物件賦給該參考物件的變數。在賦值之前,所宣告的這個物件變數有一個特定值 Nothing,這個值表示該變數沒有指向任何物件的實體。
如果不指定資料型別或物件型別,且在模塊中沒有使用 Deftype 陳述句,則按預設情況該變數為 Variant 型別。
可以用帶空圓括號的 Private 陳述句來宣告動態陣列,然后可以在程序內用 ReDim 陳述句來定義該陣列的維數和元素。如果試圖在 Private,Public 或 Dim 陳述句中重新定義一個已顯式定義了大小的陣列的維數,就會發生錯誤。
當初始化變數時,數值變數被初始化為 0,變長的字串被初始化為一個零長度的字串 (""),而定長的字串則用 0 填充。Variant 變數被初始化為 Empty。用戶自定義型別的變數的每個元素作為各自獨立的變數進行初始化。
注意 當在程序中使用 Private 陳述句時,通常將 Private 陳述句放在程序的開始。
uj5u.com熱心網友回復:
我的做法沒有違反這些規則吧
uj5u.com熱心網友回復:
我懷疑你應該寫Public的地方寫成Private或Dim了。你自己仔細檢查一下。
uj5u.com熱心網友回復:
它的提示資訊,不是已經說得很明白了嗎!
你新建一個類模塊,它默認是“私有”的。
你“打開”那個類模塊,試試改一下這個屬性吧:
uj5u.com熱心網友回復:
趙4回貼機居然能“一本正經”的胡說八道,真是難得啊…………
uj5u.com熱心網友回復:
確實是這里的問題,不知道VB還有這個屬性。其他語言都是宣告時候指定訪問權限就行了,VB卻是類模塊默認私有,那這樣給誰用呢?
uj5u.com熱心網友回復:
浮躁的世人!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/54330.html
標籤:VBA
