![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
エクセルのマクロでプリンタ名を取得しています
エクセルの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
No.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で如何にして条件付きコンパイルに組み込むか
の一点に整理されます。
私はこれまで出来ないものと思い込んでいましたし、
これといって情報も持ってないのですが、
何かの情報をお持ちで、それを元に着手した、ということなら、
そこら辺を紹介なさったら、識者のコメントが付く可能性は高まるかと思います。
私はプリンターの扱いも不得手なので、例えば、
代替え案を提示するにも至りません。
お役に立てず、すみません。
回答ありがとうございました。
End Typeを追加することで、コンパイルエラーは解消されました。(単純なミスなのに気が付きませんでした)
プリンタ選択VBAとしてはまだエラー箇所があり、完成までには程遠いのですがまた相談させて頂きます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) VBA リボンののリカバリーでオーバーフローエラーになります 2 2023/07/04 19:07
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
ILSpyで、デコンパイルできない。
-
C言語でヘッダファイルにグロー...
-
” OS ビルド ” の意味が分か...
-
1 つ以上の複数回定義されてい...
-
Makefile作成時の拡張子.oとは?
-
「fatal error C1189」を回避す...
-
エクセルVBAではRound...
-
ビルドとリビルドの違いを教え...
-
<math.h>があるのにsqrtが・...
-
Emacsでのgccのインクルードパ...
-
プログラムのファイルの保存
-
セミコロンについて
-
[c++] <pthread.h>がinclude で...
-
MFCのエラーについて
-
COBOL85での実行ファイルの作成...
-
不要な #include
-
asp.net
-
gcc で シフトJISを通す方法を...
-
visual C++
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
” OS ビルド ” の意味が分か...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
ILSpyで、デコンパイルできない。
-
Makefile作成時の拡張子.oとは?
-
エクセルVBAではRound...
-
C言語でヘッダファイルにグロー...
-
外部シンボル "_main"は未解決です
-
セミコロンについて
-
マクロ コンパイルがグレーバック
-
戻り値について
-
C言語でmからnまでの合計を求め...
-
C++コンパイル時に『 C1083: in...
-
コンパイルエラー:ユーザ定義...
-
クリティカルエラー Expressio...
-
PRO*C コンパイルエラー
-
【VC++6.0(MFC)】警告「LINK : ...
-
[c++] <pthread.h>がinclude で...
おすすめ情報