Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5517 / 13646 ツリー ←次へ | 前へ→

【50323】Class毎にenumを管理したい りった 07/7/19(木) 16:24 質問[未読]
【50325】Re:Class毎にenumを管理したい neptune 07/7/19(木) 17:39 回答[未読]
【50353】Re:Class毎にenumを管理したい りった 07/7/20(金) 17:17 質問[未読]
【50354】Re:Class毎にenumを管理したい neptune 07/7/20(金) 18:01 発言[未読]
【50355】Re:Class毎にenumを管理したい りった 07/7/20(金) 18:20 お礼[未読]

【50323】Class毎にenumを管理したい
質問  りった  - 07/7/19(木) 16:24 -

引用なし
パスワード
   enumが多くなりそうなのでClass毎に管理したいのですが可能でしょうか?

使うときにこんな感じに書きたいです。
(「.」を入力したときに表示される選択肢を利用したい)
myObj._action( myObj.eAct.eInit )

Classモジュールのイメージ
# やりたいことを伝える為のコードです。
# コンパイルエラーです。
Public Enum eAct
 eInit
 eStart
 eStop
 ePause
 eRestart
End Enum

Public function _action( byVal arg as eAct)
{
 処理
}

【50325】Re:Class毎にenumを管理したい
回答  neptune  - 07/7/19(木) 17:39 -

引用なし
パスワード
   ▼りった さん:
こんにちは

># コンパイルエラーです。
{
は、まぁ手がCと間違えて迷ったと言う事で。
_action
は関数名の最初の1文字目は文字でなければ駄目ですから、そのように
Func_act
にでもすれば

>Public function _action( byVal arg as eAct)
>{
> 処理
>}

書式に問題はないと思いますが。。。

少なくとも下記でコンパイルエラーは出ませんでしたよ。
Public Enum eAct
 eInit
 eStart
 eStop
 ePause
 eRestart
End Enum

Public Function F_action(ByVal arg As eAct)
'処理
End Function

ついでに書くと、戻り値のデータ型も明記した方がいいですよね。

【50353】Re:Class毎にenumを管理したい
質問  りった  - 07/7/20(金) 17:17 -

引用なし
パスワード
   回答ありがとうございます。

>_action
>は関数名の最初の1文字目は文字でなければ駄目ですから、そのように
>Func_act
>にでもすれば

ごもっともです。お手数をおかけしました。

>少なくとも下記でコンパイルエラーは出ませんでしたよ。

関数名を直したところこちらでもコンパイル通りました。
しかしながら、
誤:o.F_action (o.eAct.eInit)
誤:o.F_action (Class1.eAct.eInit)
正:o.F_action (Class1.eAct.eInit)
のようですので、eInitの部分をプログラム全体でユニークにつける必要がありいまいちすっきりしなさそうです。VBAの限界ですかね。

>ついでに書くと、戻り値のデータ型も明記した方がいいですよね。

何も返さない場合はどのように書くのでしょうか?

【50354】Re:Class毎にenumを管理したい
発言  neptune  - 07/7/20(金) 18:01 -

引用なし
パスワード
   ▼りった さん:
こんにちは

>しかしながら、
>誤:o.F_action (o.eAct.eInit)
>誤:o.F_action (Class1.eAct.eInit)
>正:o.F_action (Class1.eAct.eInit)
>のようですので、eInitの部分をプログラム全体でユニークにつける必要があり
>いまいちすっきりしなさそうです。VBAの限界ですかね。
Public Enum eAct
の宣言ですね。別のClassでも使いたいと、でも使えない。。。
これは仕様ですからね。限界といえば限界なんですかね?

>何も返さない場合はどのように書くのでしょうか?
このあたりは人によって違うでしょうが、私の場合を書くと
「何も返さない場合もある。」
というなら必ず何かを返すようにしてます。処理の成功をbooleanで返すとか。
Public Function F_action(ByVal arg As eAct) As Variant

「何も返さない」
のなら、Funcitonではなく、sub として記述します。
Public sub F_action(ByVal arg As eAct)

私はこんな感じで使う事が多いです。
'//////////////Classモジュール。Class1////////
Public Enum eAct
 eInit
 eStart
 eStop
 ePause
 eRestart
End Enum

Public Function F_action(ByVal arg As eAct) As Variant
'処理
  MsgBox "引数は:" & arg
  F_action = arg * 2
End Function

'////////////標準モジュール/////////////
'広範囲で使うことが多いのでモジュールレベルの
'スコープを持たせることが多い。
Private cls As Class1

Sub test()
Dim ret As Long
  'インスタンス作成
  Set cls = New Class1
  '/////////何も返さない場合/////////
  cls.F_action eInit
'  '又は
'  Call cls.F_action(eInit)
  '/////////返す場合//////////////////
  ret = cls.F_action(eInit)
  MsgBox "戻ってきたのは" & ret
  '開放
  Set cls = Nothing
End Sub

【50355】Re:Class毎にenumを管理したい
お礼  りった  - 07/7/20(金) 18:20 -

引用なし
パスワード
   回答ありがとうございます。

すみません自分の記述に誤記がありました。

>>誤:o.F_action (o.eAct.eInit)
>>誤:o.F_action (Class1.eAct.eInit)
>>正:o.F_action (Class1.eAct.eInit)
         ^^^^^^^^^^^^^^^^^
では無く

>>誤:o.F_action (o.eAct.eInit)
>>誤:o.F_action (Class1.eAct.eInit)
>>正:o.F_action (eInit)
         ^^^^^
です。


>「何も返さない」
>のなら、Funcitonではなく、sub として記述します。

ごもっともです。
Public Function F_action(ByVal arg As eAct) As Nothing
Public Function F_action(ByVal arg As eAct) As void
はダメでした。

5517 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free