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

エクセルのマクロでプリンタ名を取得しています
エクセルの32ビット版と64ビット版で共用できるように下記の記述をしたのですが
32ビット版は問題ないのですが、64版ではエラーが発生します
エラーの原因がわかれば教えて下さい


Option Explicit

'このEnumprintersとMoveMemoryがWin32 API の宣言です。
#If VBA7 And Win64 Then
Type PRINTER_INFO_1
flags As LongPtr
pPDescription As LongPtr
pName As LongPtr
pComment As LongPtr

#Else
Type PRINTER_INFO_1
flags As Long
pPDescription As Long
pName As Long
pComment As Long
End Type
#End If


Private Const PRINTER_ENUM_LOCAL = &H2

#If VBA7 And Win64 Then
Private Declare PtrSafe Function Enumprinters Lib "WINSPOOL.DRV" Alias "EnumPrintersA" _
(ByVal flags As LongPtr, ByVal Name As String, ByVal Level As LongPtr, pPrinterEnum As Any, _
ByVal cdBuf As LongPtr, pcbNeeded As LongPtr, pcReturned As LongPtr) As Long

Private Declare PtrSafe Sub MoveMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
(Dest As Any, Source As Any, ByVal length&)
#Else
Private Declare Function Enumprinters Lib "WINSPOOL.DRV" Alias "EnumPrintersA" _
(ByVal flags As Long, ByVal Name As String, ByVal Level As Long, pPrinterEnum As Any, _
ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long

Private Declare Sub MoveMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
(Dest As Any, Source As Any, ByVal length&)
#End If

A 回答 (1件)

こんにちは。


どちらもコンパイルエラーということで宜しいでしょうか?
とりあえずTypeステートメントの方は、
' ' ///
#If VBA7 And Win64 Then
Type PRINTER_INFO_1
flags As LongPtr
pPDescription As LongPtr
pName As LongPtr
pComment As LongPtr
End Type
#Else
Type PRINTER_INFO_1
flags As Long
pPDescription As Long
pName As Long
pComment As Long
End Type
#End If
' ' ///
End Typeが漏れているという単純なミス。
64ビットVBA7(Office2010)/64ビットWin7環境では
正しくコンパイルされることを確認しました。

Declareの方は
64ビットVBA7ではPtrSafeキーワード抜きでDeclare文を記述するだけで、
条件付きかどうかを問わず、問答無用でコンパイルエラーとなります。
対策があるかどうかは残念ながら存じ上げません。
ただ、32ビット用のDeclare分だけをコメントブロックすれば、
条件付きのDeclareがコンパイルされていることは確認できました。

従って問題点は、32ビット用のDeclareを
64ビットVBA7で如何にして条件付きコンパイルに組み込むか
の一点に整理されます。
私はこれまで出来ないものと思い込んでいましたし、
これといって情報も持ってないのですが、
何かの情報をお持ちで、それを元に着手した、ということなら、
そこら辺を紹介なさったら、識者のコメントが付く可能性は高まるかと思います。

私はプリンターの扱いも不得手なので、例えば、
代替え案を提示するにも至りません。
お役に立てず、すみません。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
End Typeを追加することで、コンパイルエラーは解消されました。(単純なミスなのに気が付きませんでした)
プリンタ選択VBAとしてはまだエラー箇所があり、完成までには程遠いのですがまた相談させて頂きます

お礼日時:2013/04/09 21:30

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