Excel VBA質問箱 IV

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

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


1804 / 13645 ツリー ←次へ | 前へ→

【71737】Ptrsafeについて 亜矢 12/4/4(水) 19:51 質問[未読]
【71738】Re:Ptrsafeについて とおりすぎ 12/4/4(水) 22:35 回答[未読]
【71739】Re:Ptrsafeについて 亜矢 12/4/5(木) 4:36 質問[未読]
【71740】Re:Ptrsafeについて UO3 12/4/5(木) 5:42 発言[未読]
【71741】Re:Ptrsafeについて 亜矢 12/4/5(木) 8:09 質問[未読]
【71742】Re:Ptrsafeについて とおりすぎ 12/4/5(木) 9:11 回答[未読]
【71745】Re:Ptrsafeについて UO3 12/4/5(木) 13:27 発言[未読]
【71748】Re:Ptrsafeについて 亜矢 12/4/5(木) 15:42 お礼[未読]
【71815】Re:Ptrsafeについて 亜矢 12/4/11(水) 17:17 お礼[未読]

【71737】Ptrsafeについて
質問  亜矢  - 12/4/4(水) 19:51 -

引用なし
パスワード
   よろしくお願いします。
 エクセル2007(32ビット)でつくったファイルを
 エクセル2010(64ビット)を読もうとしたときにエラーが
 発生しました。
 調べてみると、Declareの後にPtrsafeを入れるといいと書いてありました。
 Ptrsafeを入れると32ビット版と64ビット版両方につかえるとなって
 いましたが、うまくいきませんでした。
 32ビット用 Private Declare Function・・・
 64ビット用 Private Declare Ptrsafe Function・・・とかいてもエラーに
 なってしまいます。
  どのように書いたら両方に使用可能でしょうか。
  
  
 

【71738】Re:Ptrsafeについて
回答  とおりすぎ  - 12/4/4(水) 22:35 -

引用なし
パスワード
   条件付きコンパイルでVBAが6が7かで分ける。

64bitだと引数の型が変わっているのも有る。

【71739】Re:Ptrsafeについて
質問  亜矢  - 12/4/5(木) 4:36 -

引用なし
パスワード
   ▼とおりすぎ さん:
>条件付きコンパイルでVBAが6が7かで分ける。
>
>64bitだと引数の型が変わっているのも有る。
早速ありがとうございます。
 条件付きコンパイルの意味が理解できませんでした。
 もうすこし具体的な方法を教えて頂きたいと思います。
 よろしくお願いします。

【71740】Re:Ptrsafeについて
発言  UO3  - 12/4/5(木) 5:42 -

引用なし
パスワード
   ▼亜矢 さん:

おはようございます

条件付きコンパイルで検索しますと、たくさんの説明ページがありますが
VBAに限らず、様々な言語での一般論も多く、混乱されるかもしれません。

まず、我々が書いたVBAコードはコンパイラーというもので実行前に
実際に実行できるコードに変換しています。
コードに明らかな間違いがあったときに、その入力時にエラー表示されることがありますね。
コードが赤くなったり、メッセージがでたり。実行前なのに。
これは、コンパイラーが実行可能なコードに変換しようとして、
おかしいよと我々に教えてくれています。

以下の例、最初は亜矢さんも、よくご存じのコードですね。
条件を判定しながら「実行」が分岐されますね。
で、実際にコードも4行生成されます。

If ○○○ Then
   ○○○の処理コード ★1
Else
   □□□の処理コード ★2
End If

よくにていますが、以下では If なんかの前に # がついています。

#If Win64 Then
   64ビット版のコード ★3
#Else
   32ビット版のコード ★4
#End If

こうしますと、目でみると、4行のコードですが、実は、実行前にVBAコンパイラーが
実行用のコードを生成する際に、64ビット版PCなら★3 だけを
32ビット版PCなら★4だけを生成してくれます。
つまり実際に生成されるコードは いずれかの 1行だけになります。

つまり、同じマクロブックを32ビット版PCでも64ビット版PCでも
いずれでも使えるということになります。

Win64 というのは 64ビット環境という意味を持つ定数です。

以下では、本件に関するAPIの記述に関して、わりあい、わかりやすく、書かれています。
www.ka-net.org/office/of30.html

【71741】Re:Ptrsafeについて
質問  亜矢  - 12/4/5(木) 8:09 -

引用なし
パスワード
   ▼UO3 さん:
>▼亜矢 さん:

#If Win64 Then
   Private Declare Ptrsafe Function・・・
#Else
  Private Declare Function・・・
#End If
上記の用に書きましたが、Ptrsafeを入れた瞬間に赤文字(エラー)
 になっています。そのままの状態で問題はありませんか。
 このプログラムエクセル2007で書いてあります。
 他方別のパソコンはエクセル2010の64ビットです。
 よろしくお願いします。

【71742】Re:Ptrsafeについて
回答  とおりすぎ  - 12/4/5(木) 9:11 -

引用なし
パスワード
   >上記の用に書きましたが、Ptrsafeを入れた瞬間に赤文字(エラー)
> になっています。そのままの状態で問題はありませんか。

動くなら問題無いのだろう。

【71745】Re:Ptrsafeについて
発言  UO3  - 12/4/5(木) 13:27 -

引用なし
パスワード
   ▼亜矢 さん:

私は64ビットではないので、実際に確かめるスベはないのですが
赤く光ったものは
Private Declare Ptrsafe Function・・・
ですよね。

で、この PtrSafe というキーワードは、64ビットPCには定義されているわけですが
32ビットPCには定義されていないのでは?

ですけど、とおりすぎさんがおっしゃるとおりなんですよ。
このコードを打ち込んだ32ビットマシーンで実行する時には、赤く光った
コードは、実際には生成されませんから。

実際に生成される Private Declare Function・・・のほうで実行されますので問題はありません。
ただし、もし実行されるなら ということですよ。
Private Declare Function・・・そのものに間違いがあれば別。

手元の32ビットPCで以下のコードを書いてみました。
当然、コードは赤く光るのですが、そのコードは実行時には生成されていませんので
実行すれば、ちゃんとメッセージが表示されます。

Sub Test()
#If Win32 Then
  MsgBox "Goos Day!"
#Else
  Declare PtrSafe Function ありえないAPI()
#End If
End Sub

【71748】Re:Ptrsafeについて
お礼  亜矢  - 12/4/5(木) 15:42 -

引用なし
パスワード
   ▼UO3 さん:
>▼亜矢 さん:
>
>私は64ビットではないので、実際に確かめるスベはないのですが
>赤く光ったものは
>Private Declare Ptrsafe Function・・・
>ですよね。
>
>で、この PtrSafe というキーワードは、64ビットPCには定義されているわけですが
>32ビットPCには定義されていないのでは?
>
>ですけど、とおりすぎさんがおっしゃるとおりなんですよ。
>このコードを打ち込んだ32ビットマシーンで実行する時には、赤く光った
>コードは、実際には生成されませんから。
>
>実際に生成される Private Declare Function・・・のほうで実行されますので問題はありません。
>ただし、もし実行されるなら ということですよ。
>Private Declare Function・・・そのものに間違いがあれば別。
>
>手元の32ビットPCで以下のコードを書いてみました。
>当然、コードは赤く光るのですが、そのコードは実行時には生成されていませんので
>実行すれば、ちゃんとメッセージが表示されます。
>
>Sub Test()
>#If Win32 Then
>  MsgBox "Goos Day!"
>#Else
>  Declare PtrSafe Function ありえないAPI()
>#End If
>End Sub
ありがとうございました。来週会社へ行って確認します。
問題があれば再度質問させて頂きます。
 お手数をお掛けしました。

【71815】Re:Ptrsafeについて
お礼  亜矢  - 12/4/11(水) 17:17 -

引用なし
パスワード
   ▼UO3 さん:
>▼亜矢 さん:
>
>私は64ビットではないので、実際に確かめるスベはないのですが
>赤く光ったものは
>Private Declare Ptrsafe Function・・・
>ですよね。
>
>で、この PtrSafe というキーワードは、64ビットPCには定義されているわけですが
>32ビットPCには定義されていないのでは?
>
>ですけど、とおりすぎさんがおっしゃるとおりなんですよ。
>このコードを打ち込んだ32ビットマシーンで実行する時には、赤く光った
>コードは、実際には生成されませんから。
>
>実際に生成される Private Declare Function・・・のほうで実行されますので問題はありません。
>ただし、もし実行されるなら ということですよ。
>Private Declare Function・・・そのものに間違いがあれば別。
>
>手元の32ビットPCで以下のコードを書いてみました。
>当然、コードは赤く光るのですが、そのコードは実行時には生成されていませんので
>実行すれば、ちゃんとメッセージが表示されます。
>
>Sub Test()
>#If Win32 Then
>  MsgBox "Goos Day!"
>#Else
>  Declare PtrSafe Function ありえないAPI()
>#End If
>End Sub
本日(11日)会社にて上記を参考にプログラムを変更したら、32ビット、および64ビットで問題なく開くことができました。
 お手数をお掛けしました。本当にありがとうございました。
 

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