始めて質問させていただきます.
タイトルの件ですが,以下のコード(Daniel KlannさんのInputBoxでパスワードをマスクするコードの一部)をシートモジュールで記載したのですが,エラーになり調べたらAddressOfが標準モジュールのみでしか使えないとありました.
以下の内容をシートモジュールで記載する方法を教えていただけますでしょうか?
そもそもなぜ標準モジュールが使えないかという理由は割愛しております.
お忙しいところ申し訳ありませんが詳しい方よろしくお願い致します.
Public Function NewProc(ByVal lngCode As LongPtr, ByVal wParam As LongPtr, _
ByVal lParam As LongPtr) As LongPtr
Dim RetVal
Dim strClassName As String, lngBuffer As Long
If lngCode < HC_ACTION Then
NewProc = CallNextHookEx(hHook, lngCode, wParam, lParam)
Exit Function
End If
strClassName = String$(256, " ")
lngBuffer = 255
If lngCode = HCBT_ACTIVATE Then
RetVal = GetClassName(wParam, strClassName, lngBuffer)
Debug.Print Left$(strClassName, RetVal)
If Left$(strClassName, RetVal) = "#32770" Then
SendDlgItemMessage wParam, &H1324, EM_SETPASSWORDCHAR, Asc("*"), &H0
End If
End If
CallNextHookEx hHook, lngCode, wParam, lParam
End Function
Public Function InputBoxDK(Prompt, Optional Title, Optional Default, Optional XPos, _
Optional YPos, Optional HelpFile, Optional Context) As String
Dim lngModHwnd As LongPtr, lngThreadID As LongPtr
lngThreadID = GetCurrentThreadId
lngModHwnd = GetModuleHandle(vbNullString)
hHook = SetWindowsHookEx(WH_CBT, AddressOf NewProc, lngModHwnd, lngThreadID)
InputBoxDK = InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context)
UnhookWindowsHookEx hHook
End Function
No.2ベストアンサー
- 回答日時:
>サーバークライアント環境で利用するシステムからサーバー側にあるマクロを起動してクライアント側へマクロを送付しようとしているのです
何か、私は読み違えていたような気がします。事情が飲み込めませんが、マクロそのものを送るのでしたら、コードのエクスポートの.BAS形式にして、テキストで相手に送るという方法があります。
>・VBA プロジェクト オブジェクト モデルへのアクセスを信頼する
>・Microsoft Visual Basic for Applications Extensibilityを参照設定
これは、そのとおりです。そういう私も、昔、そんな技法を教わったことはあるのですが、イレギュラーです。コードを見るだけで気分が悪くなりそうな内容です。理由は、マクロウィルスの書き方そのものだからです。
ふつうは、アドインにしますね。
なお、InputBox のPassword のマスクに関しては、あちこち調べましたが、私が考えた方法はどこにも出ていませんでしたので、ご紹介します。UserForm のTxtbox を使わないでも、DialogSheet 側の EditBox があります。これは、シートと付随していますから、ステルスにすると、まるでInputBox だけがセットでついてきたようなものになります。マクロコードをみれば分かってしまいますが、表面的には、一切、DialogSheet は出てきません。
DialogSheet に EditBox を加え、そのプロパティにパスワードの編集にチェックを入れさえすれば、アスタリスクで隠れます。
'//
Dim cnt As Long '(プロシージャ外)
Sub DLButton_Click()
Const PWD As String = "ABC"
With DialogSheets(1)
If .EditBoxes(1).Text <> PWD Then
cnt = cnt + 1
MsgBox "パスワードが違います。 " & cnt, vbCritical
Else
MsgBox "OK"
cnt = 0
End If
End With
Exit Sub
End Sub
回答ありがとうございます.
DialogSheetで実施するやり方で元々目的としていたことが実現できました.ありがとうございました.
>これは、そのとおりです。そういう私も、昔、そんな技法を教わったことはあるのですが、イレギュラーです。コードを見るだけで気分が悪くなりそうな内容です。理由は、マクロウィルスの書き方そのものだからです。
>ふつうは、アドインにしますね。
なるほど,悪用すると最悪ということですね.今回は頂いたダイアログの案で実施しますが,今後はアドインで実施するやり方も検討してみたいと思います.
お忙しい中ありがとうございました.
No.1
- 回答日時:
本体のコード自体は、標準モジュールで、Public キーワードを入れておいて、
単に、InputBoxDK をシートモジュールで使えばよいだけのはずです。
そのためのユーザー定義関数だと思います。
If InputBoxDK("パスワードを入力して下さい") <> "abcd" Then
MsgBox "パスワードが違います。"
End If
>そもそもなぜ標準モジュールが使えないかという理由は割愛しております.
標準モジュールが使えない、ということが、機能的に使えないということなら、もはやシステムとしては意味をなさないのでは?
回答ありがとうございます。
ですが、標準モジュールに書かずに記載する方法が知りたかったのです。
標準モジュールが使えない理由ですが、サーバークライアント環境で利用するシステムからサーバー側にあるマクロを起動してクライアント側へマクロを送付しようとしているのですが、サーバー側の仕様のせいかサーバー側にあるマクロで標準モジュールをコピーしてクライアント側に送付できませんでした。
シートならコピーできるのでシートにすべてのコードを記載して送付しようとしています。
やはり標準モジュールをコピーする方法を探すしかないでしょうか?
調べてすぐ出てくる以下の設定はすでに実施しています。
・VBA プロジェクト オブジェクト モデルへのアクセスを信頼する
・Microsoft Visual Basic for Applications Extensibilityを参照設定
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
64ビットエクセルでのAPI宣言/PtrSafe
Excel(エクセル)
-
VB6でAddressOfを使った良いサンプル
Visual Basic(VBA)
-
VBAでの Replace関数で、ワイルドカードは使えないのでしょうか?
Visual Basic(VBA)
-
-
4
プロセスIDの取得方法について
Visual Basic(VBA)
-
5
メッセージボックスの選択ボタンのテキストを変更したい
Visual Basic(VBA)
-
6
Excel 1セル当りの文字数が255文字を超える場合のADOからの取
その他(プログラミング・Web制作)
-
7
エクセルVBAで、MsgBox やInputBox は、画面の中央以外に表示させたい。
Excel(エクセル)
-
8
vba 時間の引き算 例えば 15:00から16:15の間の時間は1時間15分ですが、vbaのコード
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel VBA 定義されたプロージ...
-
標準モジュールを削除したい。(...
-
Perlでモジュールをインストー...
-
VBAProjectのモジュ...
-
VB2005ーDataGridViewの選択さ...
-
VBA This Workbookモジュール...
-
VBAのモジュールについて教えて...
-
グラフのX,Y座標を取得したい
-
モジュールの最大数はいくつな...
-
ftpのアクティブモード対応モジ...
-
VBAで旧字体を異字体に一括で変...
-
vba 標準モジュールインポート...
-
pythonでファイル移動できません。
-
偶数/奇数の判定
-
エクセルVBAでシートモジュール...
-
シャープ製品JH-WB1821 と BCG...
-
acwzlibとは?
-
【Excel VBA】標準モジュールに...
-
エクセルのシート上に配置され...
-
Perlで単純にミリ秒を求めるこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
VBAで別モジュールへの変数の受...
-
VBでグローバル変数を宣言するには
-
エクセルVBAでシートモジュール...
-
'Range'メソッドは失敗しました
-
グラフのX,Y座標を取得したい
-
VBA This Workbookモジュール...
-
Excel VBA 『Call』で呼び出す...
-
【vba】フォームに書いてあ...
-
VBAで旧字体を異字体に一括で変...
-
Excel VBAで、ユーザーフォーム...
-
モジュールとクラスの違いって...
-
Excelで時刻になったら知らせて...
-
Access VBA標準モジュールにつ...
-
Excel VBA 定義されたプロージ...
-
標準モジュールを削除したい。(...
-
モジュールとは何ですか
-
ベースモジュールって?
-
モジュールの最大数はいくつな...
おすすめ情報