Excel VBA質問箱 IV

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

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


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

【7911】標準モジュールをExcelから使えなくしたい 町奉行 03/9/23(火) 18:05 質問
【7912】Re:標準モジュールをExcelから使えなくしたい かみちゃん 03/9/23(火) 18:16 回答
【7913】Re:標準モジュールをExcelから使えなくしたい INA 03/9/23(火) 18:17 回答
【7916】Re:標準モジュールをExcelから使えなくしたい Asaki 03/9/23(火) 18:56 回答
【7921】Re:標準モジュールをExcelから使えなくしたい Asaki 03/9/23(火) 23:01 発言
【7922】Re:標準モジュールをExcelから使えなくし... 町奉行 03/9/23(火) 23:20 お礼
【7918】Re:標準モジュールをExcelから使えなくしたい ichinose 03/9/23(火) 20:15 発言
【7919】Re:標準モジュールをExcelから使えなくしたい bykin 03/9/23(火) 20:51 回答

【7911】標準モジュールをExcelから使えなくしたい
質問  町奉行  - 03/9/23(火) 18:05 -

引用なし
パスワード
   異なるモジュールから共通に利用したいので、
標準モジュールにPublic プロシージャを
書きました。

しかし、そうすると、Excelの[ツール]−[マクロ]
メニューからマクロのリストに現れてしまい、
実行できてしましまいます。

それらの、プロシージャはフォームからしか使用でき
ないようにしたいため、Excel上からはマクロとして
見えないか実行できないようにしたいのですが、
そのような方法はありますでしょうか。

また、標準モジュールに書いても、Privateにすると、
他のモジュールから参照できませんでした。

【7912】Re:標準モジュールをExcelから使えなくし...
回答  かみちゃん  - 03/9/23(火) 18:16 -

引用なし
パスワード
   こんにちは。

>異なるモジュールから共通に利用したいので、
>標準モジュールにPublic プロシージャを
>書きました。

Public Sub xxx()

Public Function xxx()
として、フォームから、
xxx()
を実行すればいかがですか?

【7913】Re:標準モジュールをExcelから使えなくし...
回答  INA  - 03/9/23(火) 18:17 -

引用なし
パスワード
   Function プロシージャ にしたら、いかがでしょう?

Public Function Sample()
  : 
End Function

【7916】Re:標準モジュールをExcelから使えなくし...
回答  Asaki  - 03/9/23(火) 18:56 -

引用なし
パスワード
   こんにちは。

ユーザーフォームからのみで、ユーザーフォームが1つなら、
そのユーザーフォームにPrivateで宣言するのはダメでしょうか?

または、
Functionにしても、セルから数式を入力するときの関数一覧に出てきてしまいますので、
標準モジュールの先頭に、
Option Private Module
と記述してみてください。

【7918】Re:標準モジュールをExcelから使えなくし...
発言  ichinose  - 03/9/23(火) 20:15 -

引用なし
パスワード
   皆さん、こんばんは。
>異なるモジュールから共通に利用したいので、
>標準モジュールにPublic プロシージャを
>書きました。
>しかし、そうすると、Excelの[ツール]−[マクロ]
>メニューからマクロのリストに現れてしまい、
>実行できてしましまいます。
>それらの、プロシージャはフォームからしか使用でき
>ないようにしたいため、Excel上からはマクロとして
>見えないか実行できないようにしたいのですが、
>そのような方法はありますでしょうか。
私は、↑の目的でそうしているのではありませんが、
汎用的なプロシジャーをクラスモジュールに作成しています。
例えば、クラスモジュール(クラス名は、BookIO)に以下のコードを入れたとします。
'================================================
Function bk_open(flname As String, bk As Workbook) As Long
  On Error Resume Next
  Set bk = Workbooks.Open(flname)
  bk_open = Err.Number
  On Error GoTo 0
End Function
'=========================================================
Sub bk_close(bk As Workbook)
  On Error Resume Next
  bk.Close
  On Error GoTo 0
End Sub

インスタンスを作成する場所は、マクロの内容によって異なると思いますが、
標準モジュールに

Public bkio As New BookIO

としておいて、

フォームモジュールでは(コマンドボタンのクリックイベントでの例で)、
'===============================================
Private Sub CommandButton1_Click()
  Dim ブック名 As String
  Dim 開いたブック As Workbook
  ブック名 = "d:\ワークシート.xls"
  If bkio.bk_open(ブック名, 開いたブック) = 0 Then
    MsgBox "ok"
    bkio.bk_close 開いたブック
  Else
    MsgBox "nogood"
    End If
End Sub
等としてはどうでしょうか?
マクロの実行メニューからも見えません。
オブジェクト名の記述分だけ面倒ですが、うまく利用すれば
わかりやすいコード記述にもなると思いますが・・・。

【7919】Re:標準モジュールをExcelから使えなくし...
回答  bykin  - 03/9/23(火) 20:51 -

引用なし
パスワード
   こんばんわ。

わてが普段使ってる方法でっけど・・・
Sub test(Optional ByVal Dummy As Boolean)
なんて具合に Optional のダミー引数を付けて宣言するとマクロの一覧には表示されまへん。
呼び出し側のコードを変更する必要もありまへん。
ま、それでもじかにマクロ名打ち込んだら実行できてまいますが、
普通に使うには十分やと思います。

完全に隠蔽するんやったら、Optionalを付けずにダミー引数を宣言して、
なおかつ呼び出し側のコードに引数を追加する必要があります。

試してみてな。
ほな。

【7921】Re:標準モジュールをExcelから使えなくし...
発言  Asaki  - 03/9/23(火) 23:01 -

引用なし
パスワード
   Option Private Module をつけても
bykin さんがおっしゃるように、
>じかにマクロ名打ち込んだら実行できてまいますが
です。

【7922】Re:標準モジュールをExcelから使えなくし...
お礼  町奉行  - 03/9/23(火) 23:20 -

引用なし
パスワード
   Asaki さんのいうように

>標準モジュールの先頭に、
>Option Private Module
>と記述してみてください。

とすると、Excelのマクロメニューに表示され
なくなりました。直接マクロ名を打つと起動するかも
分かりませんが、当面の目的は達成できました。

ichinoseさんのクラスモジュールを使う方法や、
bykinさんのテクニックは、今の私の知識を超えるも
のなので、今後の研究材料とさせていただきます。

皆さん、どうもありがとうございました。

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