プロが教える店舗&オフィスのセキュリティ対策術

以前質問をしたのですが、結局解決しないままとなっています。
再度VBAがとまったときの画面を添付して再度おたずねします。
Declareのスペルがまちがっていました。

いままで問題なく動いていたVBAが標記のようなメッセージをだして動かなくなりました。
ネットで調べるとDelcareにPtrSateを付加すれば良いとのことです。
ところがソースにはDlecareステートメントはありません。
私自身、初心者ですので「Dlecare」というステートメントを初めて知りました。

どうすればよろしいでしょうか、ご教示ください。
なお、職場のものですので、Officeの再インストールはできません。
職場に行くのが不定期ですので、お礼が遅れますことご容赦下さい。

なお赤字で
Declare Function BeepAPI Lib "kernel32.dll" Alias "Beep" _
(ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
というメッセージもエディタに表示されています。

OSは windows10Pro64ビット
Excelは Microsoft 365 mosです。
なお、家のHome64ビットでは問題なく動きます。

「「DeclareステートメントにPtrS」の質問画像

質問者からの補足コメント

  • エラーメッセージが写真では見にくいのでタイプします。

    コンパイルエラー

    このプロジェクトのコードは64ビットシステムで使用するために更新する必要があります。Delcareステートメントの確認及び更新を行い、次にDelcareステートメントにPtrSafe属性を設定して下さい。

      補足日時:2021/03/03 18:49
  • ご多忙にもかかわらず、皆様ご教示ありがとうございます。
    明日、職場に行きますので、ご指摘のあった部分をやってみます。

      補足日時:2021/03/04 06:57
  • 北ウィングさま、お手数をおかけしています。
    メッセージのとまった状態の画像をアップします。

    「「DeclareステートメントにPtrS」の補足画像3
      補足日時:2021/03/05 11:49
  • 皆様、ありがとうございました。
    ネットにも情報が掲載されておらず途方にくれていたところです。

    この質問を通じてあらたな知識も得ることができました。
    ご教示いただいた皆様がたに感謝申し上げます。

    また、困ったときはご教示いただければ幸いです。

      補足日時:2021/03/06 15:56

A 回答 (7件)

北ウイングです。


条件付きコンパイルの表示色について補足します。
エクセル64bit版では、#Else から下にある 32bit用の Declareステートメントは赤く表示されますが、64bit版では実行されない行なので赤いままでも問題ありません。
また、エクセル32bit版でも #Else から上にある 64bit用の Declareステートメントが赤く表示されますが、32bit版では実行されない行なので赤いままでも問題ありません。
    • good
    • 0
この回答へのお礼

北ウィングさんのご指摘のコードをいれたら、無事うごきました。月曜日には名簿をきちんと出力しなければならなかったのですが、おかげさまで間にあいました。

本当に、前回の質問から丁重にご指導いただきありがとうございました。

お礼日時:2021/03/06 15:53

No.3回答の補足>どうソースを修正すればよいのかがわかりません。



北ウイングさんの回答どおりに、API宣言を64ビット対応修正するのが手っ取り早いかと。
上記対応が難しければ、Declare消して、代わりに同様な関数を定義してあげるとか。

試してないけど、こんな感じ:
Public Function BeepAPI(ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
BeepAPI=0
Beep
End Function
    • good
    • 0

北ウイングです。


画像の始めの文字が余り読めないのですが、Win64定数が反転している様子が確認できるのと「プロシージャの外では無効です」のエラーメッセージから、#(シャープ文字) が抜けている可能性が考えられます。
If , Else, End If の頭に # は入っていますか?
    • good
    • 0
この回答へのお礼

何度もすみません、シャープはとっていました。
明日職場にでかけて再度つけてやってみます。
度重なるご教示ありがとうございます。

お礼日時:2021/03/05 16:26

画像の貼り付け、ありがとうございます。

お待ちしておりました。
まず先に回答します。画像から判断した結果、赤字の箇所
Declare Function BeepAPI Lib "kernel32.dll" Alias "Beep" _
(ByVal dwFreq As Long, ByVal dwDuration As Long) As Long


#If Win64 Then
    Declare PtrSafe Function BeepAPI Lib "kernel32" Alias "Beep" _
    (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#Else
    Declare Function BeepAPI Lib "kernel32" Alias "Beep" _
    (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#End If

に書き換えれば、会社の64ビット版でも、ご自宅の32ビット版でも走ります。これは「条件付きコンパイル」と呼ばれている記述方法です。
#If Win64 Then ~ #End If までをコピーアンドペーストして使ってください。
なお、If ステートメントの条件になっている条件定数「Win64」は【エクセルが64ビット版だったら】という意味です。勘違いし易い名称になっていますので使う時には注意が必要です。


> なお、家のHome64ビットでは問題なく動きます。
という事は、ご自宅のエクセルは32ビット版だと思われます。
[Windows API] という分野を扱うには、OSアーキテクチャーの違いでは無く、エクセル自体が32ビット版のエクセルなのか、64ビット版のエクセルなのかが決め手になってきます。
[Windows API] は [Win32 API] とも呼ばれ、32ビットでしか動作しません。[Windows API] を 64bitエクセルで呼び出した場合は、必ず SysWow64フォルダー(System Windows 32-bit On Windows 64-bit の略)内の32bitエミュレーター用DLLを参照します。
[Windows API] が読み書き可能なデーター型の大きさは32bit分しかないので、呼び出し元のエクセルで64bit分の大きさに変換する必要性が出てきます。それを行う記述が PtrSafe 属性なのです。

> ところがソースにはDlecareステートメントはありません。
Declare Function BeepAPI Lib "kernel32.dll" Alias "Beep" _
(ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
もソースなんです。そのソースの記述が文法的に間違っているからこそ、訂正すべき箇所が反転表示されて、且つ、コンパイル出来ない行を赤く表示させています。

初心者の方がプロシージャーの外はソースコードではないと誤解してしまうのは仕方ないとも思いますが、モジュールに記述されている文字列はコメント以外すべてソースコードと解釈されます。これは Visual Basic Editor の仕様です。

最後に、私の過去の回答が修正の参考になればと思い、リンクを載せておきます。
https://detail.chiebukuro.yahoo.co.jp/qa/questio …
    • good
    • 0
この回答へのお礼

丁重なご教示ありがとうございます。
赤色のメッセージがでているところにはりつけましたが、

コンパイルエラー

プロシージャの外では無効です、とのメッセージがでています。

お礼日時:2021/03/05 11:46

satoumasaruさんがネットで調べたとおり、ソースを修正する必要があります。



あと、単に注意音を鳴らしてるだけだとしたら、APIコールしなくても、BEEPステートメントが使えるので、そっちに直すという手も。
    • good
    • 0
この回答へのお礼

ご教示ありがとうございます。

どうソースを修正すればよいのかがわかりません。

お礼日時:2021/03/05 12:06

No.1です。



OSではなくExcelがそれぞれ何Bitかを調べてみました?
    • good
    • 0
この回答へのお礼

ご教示ありがとうございます。

めぐみんさんのご指摘のようにOSではなくExcel64ビットで問題が生じます。

お礼日時:2021/03/05 12:05

問題なく動いていたってのはエラーが出た時に何も環境を変えていないのにって事ですか?



Excel には、[32ビット版]と[64ビット版]が存在する?
https://www.cellnets.co.jp/column/excel64bit_err …
    • good
    • 0

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