• ベストアンサー

エクセルVBAへのwindowsAPIの組み込み

Excel2010を使用しています。 以下のページの最初に紹介されているマクロを実装・使用したいのですが、やり方がわかりません。 『excel_vbaでスクリーン上のpixelの色を拾いたい』 http://www.excel.studio-kazu.jp/kw/20060624174313.html APIを使ったマクロを書いたことがないので、Declare Function~Sub辺りの運用がわかりません。 詳しい方のご助力を願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8524/19373)
回答No.2

>APIを使ったマクロを書いたことがないので、Declare Function~Sub辺りの運用がわかりません。 Declare Functionで「使いたいAPI関数、そのAPI関数を収納しているDLL、関数の引数と戻り値などの仕様」を定義します。 例えば Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal nXPos As Long, ByVal nYPos As Long) As Long は GetPixelという関数が、gdi32.dllに収納されていて、第一引数hdcはLong、第二引数nXPosはLong、第三引数nYPosはLongで、関数の戻り値はLong を意味します。 これは「宣言」ですから、グローバル変数を宣言するのと同じように「Sub~End Sub」「Function~End Function」の外に書きます。 で、宣言したAPI関数を呼び出す時は Sub Macro1() 'ローカル変数を定義 Dim hdc As Long, Color As Long Dim pt As POINTAPI 'マウスカーソルの位置を変数ptに取得 Call GetCursorPos(pt) ’画面のデバイスコンテキストをhdcに得る hdc = GetDC(0) 'hdcで示した画面の、pt.X、pt.Yの位置のピクセルの色を拾う Color = GetPixel(hdc, pt.X, pt.Y) '使い終わったhdcを後始末する Call ReleaseDC(0, hdc) MsgBox "色は" & Color & "です。" End Sub のように、普通に呼び出します。

chiku_sho
質問者

お礼

早速のご回答ありがとうございます。 Declare~の部分はグローバル変数と同じような役割があるわけですね。 moduleの最上に書くことで解決できました。 今回は誠にありがとうございました。おかげで助かりました。

その他の回答 (1)

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは 何が分からないのでしょうか? 目的は、『excel_vbaでスクリーン上のpixelの色を拾いたい』ですか? はっきりとした具体的な目的は? OSは? 32ビット、64ビット?

chiku_sho
質問者

補足

作業環境は以下になります。 OS | Windows 10 64bit Soft | Excel2010 32bit 目的は「excel_vbaでスクリーン上のpixelの色を拾う」です。

関連するQ&A

  • Excel VBA でのAPI呼び出しが・・・

    マクロ初級です。 windowsXP(SP3) office2007 Excelのマクロで、APIのSetActiveWindowを使おうとしましたが、宣言のところで エラーがでました。  設定は、  Public Declare Function SetActiveWindow Lib "user32" (ByVal hWnd As Long) As Long  もしくは  Public Declare Function SetActiveWindow Lib "user32" (ByVal hWnd&) As Long  コンパイルエラー  定数、固定長文字列、配列、ユーザ定義型および Declare ステートメントは  オブジェクトモジュールのパブリックメンバとしては使用できません。 ウィンドウをアクティブな状態等に用いたいのですが、定義の仕方が悪いのでしょうか? 皆さま、ご教授下さい。

  • Excel VBA のコンパイルエラー

    Excel VBA で GDI32 にある API を declare するとメモリ不足のコンパイルエラー となってしまいます。 どなたか解決策を御教示下さい。 使用するAPI は GetTextExtentPoint32 です。 コンパイルエラーが起きるVBAコードは、MSのVBサンプルから拾ったものです。 private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" ( _ ByVal hdc As Long, _ ByVal lpsz As String, _ ByVal cbString As Long, _ ByRef lpSize As CSize) As Long Private Type CSize cx As Long cy As Long End Type 同じ GDI32 にある DeleteObject の declare 文はエラーが発生しません。 環境は以下の通りです。 Excel 2007 OSはVista 32bit メモリは 3G で約60%使用 宜しくお願いします。

  • excelでVBAの画面が開かない

    Windows2000上で、excel97を使用しているのですが、 昨日までVBAの編集画面が出ていたのに、今日は突然開かなくなってしまいました。 今まで使っていたexcelのマクロは開けますが、 新規でマクロを作ろうとすると、開こうとはするのですが、 すぐに閉じてしまいます。 リブートしても直りませんでした。 これはどのように対処すればよいでしょうか?

  • EXCELで改ページを1行ずつ連続で入れるには??

    『改ページが1行毎に設定されてしまう』(ぱぱ) http://www.excel.studio-kazu.jp/kw/20061130163202.html エクセル 改ページを設定する https://www.tipsfound.com/excel/07003 『400行くらいのリストを印刷』(nana) http://www.excel.studio-kazu.jp/kw/20031007195250.html Excelで全ての行単位で改ページ https://oshiete.goo.ne.jp/qa/2470107.html マクロつくってみました With ActiveSheet .ResetAllPageBreaks ' 範囲がわかっている場合 ' For Each c In Range("A2:A500") ' ' A列2行~データがはいっている行まで For Each c In Range("A2", Range("A65536").End(xlUp)) .HPageBreaks.Add Before:=c Next End With --------------------------------------------------------------- これで 2行目から500行目までガシガシ改ページが入る --------------------------------------------------------------- With ActiveSheet .ResetAllPageBreaks For Each c In Range("A2:A500") .HPageBreaks.Add Before:=c Next End With (`・ω・´) 上記のようなマクロを実行しなければ出来ませんか? 印刷範囲を縮小表示して1ページの記載内容を減らして1ページを減らし 1行ずつ表示する方法はできないでしょうか? アドバイスよろしくお願いします。

  • VBAにおける Option Explicitの役割

    VBAにおける Option Explicitの役割 VBAでゲームを作ることを勉強している初心者です。 本に従ってもっとも基本的なスロットゲームをためしました。 プログラム本体の前にある下記のOption Explicitを省くとコンパイルエラーになります。 VBAにおける Option Explicitはプログラム本体中にあるどのキーがどのスロットを止めるなどの指示を 具体的記述なしに有効にするなどの役目があるのでしょうか。 Option Explicit Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Declare Function GetTickCount Lib "kernel32" () As Long 'Windows起動後経過時間取得API どなたか教えていただけると助かります。 よろしくお願いいたします。

  • エクセルVBAではRounddown関数はつかえないのでしょうか?

    Excel2003SP2でVBAを使っています。 AAA = RoundDown(Range("A1"), 0) と入力してコンパイルすると 「コンパイルエラー SubまたはFunctionが定義されていません」 と表示されます。 エクセルVBAではRounddown関数は使用できないのでしょうか? それとも私の記述が何か間違っているのでしょうか

  • VBAマクロのオブジェクト名の最大の長さについて

    こんにちは。 現在、32bit版Vistaで、Excel2007のVBAマクロについて勉強しています。 添付しました画像のように、自分で作成した標準モジュールのオブジェクト名の所に 「Functionプロシージャを使用したマクロ」 と入力すると、 「オブジェクト名が不正です・・・」 というエラーが表示されます。 どうやら、文字数が多すぎたようで、 「Functionプロシージャの使用」 だと、エラーは出ません。 VBAマクロのオブジェクト名の最大の長さって、どうやって決まるのでしょうか? どこかで、255文字までと聞いた事がある気がするのですが、今回だと、40バイト程度でエラーが出ます。 これについて、何か知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。

  • VBAで ScreenToClient を使いたい

    Excel VBA で、ユーザーフォームをクリックしたときのポインタのクライアント座標を取得し、フォーム上のラベルに表示するというスクリプトを作ろうと思っています。 ウェブで探し当てたVBのソースなどを参考にして、スクリーン座標を取得するところまではうまくいきましたが、「ScreenToClient」関数の書式がVB のソースと同じでは動かないようで、「コンパイルエラー:メソッドまたはデータメンバがみつかりません」というエラー表示が出て止まってしまいます(「Me」を「UserForm1」に代えても結果は同じでした)。 以下は実際のVBAソースです。どのようにすれば動くようになるのか、ご教示頂けませんでしょうか。宜しくお願いします。 'カーソルの位置座標をスクリーン座標で取得するAPI関数 Private Declare Function GetCursorPos Lib "user32" _ (lpPoint As POINT) As Long 'カーソルの位置座標をスクリーン座標からクライアント座標へ変換するAPI関数 Private Declare Function ScreenToClient Lib "user32" _ (ByVal hWnd As Long, lpPoint As POINT) As Long 'カーソルの位置座標用変数 Private CuP As POINT '位置座標を受け取る構造体 Private Type POINT x As Long y As Long End Type Private Sub UserForm_Click() 'スクリーン座標を取得 GetCursorPos CuP Label1.Caption = "クリック位置のスクリーン座標 X=" & CuP.x & " Y=" & CuP.y '↑ここまではうまく動いています 'クライアント座標に変換 ret = ScreenToClient(Me.hWnd, CuP) Label2.Caption = "クリック位置のクライアント座標 X=" & CuP.x & " Y=" & CuP.y End Sub

  • Excel VBA 有効化しても無効化になる

    知っている方ご教授願います。 会社のVBAでデータベース.CSVをVlookで管理表のExcelシートへインポートするVBAを使用しています。 (オープンフォームから、ファイルを選択し起動ボタンを押す) 先日、今まで通りに同じようにインポートしようとしたところ、 「コンテンツの有効化」で有効にする⇒マクロを起動⇒「マクロが無効化されています。」となり、フォームが起動しなくなりました。 インターネットでしらべましたが、 原因不明です。以下のことはやってみました。 1.セキュリティセンターの設定で、「デジタル署名されたマクロを除き、すべてのマクロを無効にする」にしてます。 2.Excelをすべて閉じ、PC再起動しました。 3.以前に使えていた時の、ExcelVBAのモジュールをコピーしてみました。 以上です。 わかる方教えていただけませんでしょうか。 尚、他のVBAが組んであるExcelファイルは動きますので、今使っているインポートの管理表だけが使用できない状況です。

  • エクセルVBAでNumLockキーの状態を確認する

    エクセルVBAでNumLockキーの状態を確認することはできますでしょうか? 検索の結果 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1352157463 のページを見つけましたが、 Private Declare Sub GetKeyboardState Lib "user32" (pbKeyState As Byte) でエラーになってしまいます。 なぜかと検索してみると、どうやら私のWindows が64ビットだからのようです。 64ビットに対応し、EXCEL、 エクセルVBAでNumLockキーの状態を確認し、offだったらonにするということが出来るでしょうか。 勿論、VBAでSendKeysを連発するとNamLockキーがOffになってしまう時があるということや、APIのSendInput 、keybd_eventイベントもあると思いますが、何が適当なのか、64ビットに対応させるのはどうするのか、教えて頂けるとありがたいです。よろしくお願いします。

専門家に質問してみよう