dポイントプレゼントキャンペーン実施中!

始めて質問させていただきます.

タイトルの件ですが,以下のコード(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

A 回答 (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
「AddressOf と同じ機能を持ったコ」の回答画像2
    • good
    • 0
この回答へのお礼

回答ありがとうございます.

DialogSheetで実施するやり方で元々目的としていたことが実現できました.ありがとうございました.

>これは、そのとおりです。そういう私も、昔、そんな技法を教わったことはあるのですが、イレギュラーです。コードを見るだけで気分が悪くなりそうな内容です。理由は、マクロウィルスの書き方そのものだからです。
>ふつうは、アドインにしますね。
なるほど,悪用すると最悪ということですね.今回は頂いたダイアログの案で実施しますが,今後はアドインで実施するやり方も検討してみたいと思います.

お忙しい中ありがとうございました.

お礼日時:2017/12/17 22:59

本体のコード自体は、標準モジュールで、Public キーワードを入れておいて、


単に、InputBoxDK をシートモジュールで使えばよいだけのはずです。
そのためのユーザー定義関数だと思います。

If InputBoxDK("パスワードを入力して下さい") <> "abcd" Then
  MsgBox "パスワードが違います。"
End If

>そもそもなぜ標準モジュールが使えないかという理由は割愛しております.
標準モジュールが使えない、ということが、機能的に使えないということなら、もはやシステムとしては意味をなさないのでは?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ですが、標準モジュールに書かずに記載する方法が知りたかったのです。

標準モジュールが使えない理由ですが、サーバークライアント環境で利用するシステムからサーバー側にあるマクロを起動してクライアント側へマクロを送付しようとしているのですが、サーバー側の仕様のせいかサーバー側にあるマクロで標準モジュールをコピーしてクライアント側に送付できませんでした。
シートならコピーできるのでシートにすべてのコードを記載して送付しようとしています。

やはり標準モジュールをコピーする方法を探すしかないでしょうか?
調べてすぐ出てくる以下の設定はすでに実施しています。
・VBA プロジェクト オブジェクト モデルへのアクセスを信頼する
・Microsoft Visual Basic for Applications Extensibilityを参照設定

お礼日時:2017/12/16 02:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています