• ベストアンサー

vbaで出来る事をわざわざAPIを使う理由・必要性

vbaで出来る事をわざわざAPIを使う理由・必要性は? 他人が作ったエクセルファイルを操作しているのですが ところどころにAPIが使われています。 しかし、「なぜvbaでできるのにAPIを使ってるのだろう?」と思う部分があります。 例えば、 時間を止め対場合、 vbaで Sub vba() Application.Wait Now + TimeSerial(0, 0, 2) End Sub とすればいいのに、 APIで Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub API() Sleep 2000 End Sub としています。 APIを使う事によって、どのようなメリットがあるのでしょうか?

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

  • ベストアンサー
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.3

APIについては・・・ 訳も分からず使用してアプリやOSを気絶させるのが得意ですが (*_*) Excel にはApplication.Wait メソッド がありますが Access にはこれに相当するモノがありませんので 止む無く API のSleep を使用せざるを得ません。 (Form のタイマーイベントでも出来なくはないけど使いづらい) そうすると、アプリケーションの壁を越えて使用できる Sleep を・・ となるのは自然な流れです。 また、Application.Wait は無駄に CPU を使用します。 タスクマネージャを立ち上げて、CPU使用率を比べてみてください。 いまは、マルチコアが当たり前の時代になっていますから あまり問題にはなりませんが、 昔はシングルコアだったので、長い待ち時間だと 他のアプリケーションが足を引っ張られてしまいます。 この辺も Sleep が選ばれる理由です。

JOZCNEYGQSEO
質問者

お礼

>Excel にはApplication.Wait メソッド がありますが Access にはこれに相当するモノがありませんので 止む無く API のSleep を使用せざるを得ません。 これは自分もよくやります。 時間を止める時は エクセル→Application.Wait メソッド アクセス→API にしています。 CPUの使用率にも違いがあるのですか。 気にしてませんでした。

その他の回答 (2)

回答No.2

TimeSerialとSleepの使い分けは、 時間制御を1秒単位でするか、0.001秒単位でするかの違いです。 2秒と2,000m秒は同値ですから、どちらでもOK 単なる趣味の問題です。

JOZCNEYGQSEO
質問者

お礼

APIを使う事に意味があったのですね。 そういう細かな部分も気にしてみます。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

> APIを使う事によって、どのようなメリットが 「おれはAPIも使えるんだぜ」アピール かな^^; と言うか、可読性を上げることを目的の一つに挙げるならば、 解る人であれば、メンテナンスや引継ぎが少々楽である、ってことが一番だと思います。 もう一つは、作った人が作った当時、 「これはAPIじゃないと出来ない」と思っていた可能性。 おそらく、コレが想定し得る一番の可能性じゃないでしょうか。 VBAのコード進行だけ見ていても、 「あれ?ココってもっと簡単に書けない?」 「ココはこうしたらもっと早いのに」 と思うことも多いですからね。 この辺りは、好みの問題でしょうけどね^^;

JOZCNEYGQSEO
質問者

お礼

>「おれはAPIも使えるんだぜ」アピール あー、わからなくもないですが笑 APIを使った方がメンテナンスが楽なのですか? 他人のコードを見るともっと楽な方法があるのに! と思う事がありますね。(自分も思われてるんでしょうけど)

関連するQ&A

  • 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でのカーソル移動とマウスクリック

    業務上の単純作業の自動化のため、VBAから他のアプリケーションを操作することが目的です。 以前、ブラウザ上での作業の時に使用した、下記2つのAPIでは今回はマウスカーソルが指定した座標に動いてくれません、、、 Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) この2つのAPI以外で、カーソル移動とマウスクリックを実現する方法は何かありますでしょうか? 色々な方法を教えていただけるとVBAの勉強にもなり幸いです。 ' // 標準モジュール Option Explicit Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Private Type POINTAPI     x As Long     y As Long End Type Private Sub クリックテスト() Call SetCursorPos(216, 421) Sleep 400 Call mouse_event(&H2, 0, 0, 0, 0) Call mouse_event(&H4, 0, 0, 0, 0) End Sub

  • エクセル2003VBAで時間稼ぎ(待機)をさせたいのですが、

    エクセル2003VBAで時間稼ぎ(待機)をさせたいのですが、 下記のSleepを使用すると、ときどきPCが固まってしまいます。 よい時間稼ぎ方法を御存じないでしょうか。 Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Do '開くボタンのハンドルを取得 hOpenButton = FindWindowExA(hwindow, 0, "ToolbarWindow32", vbNullString) Sleep 1000 Loop While hOpenButton = 0

  • excel vba 遅延のソースゴード

    excel vba で動作させたものを動作の遅延をさせたいのですが、本コーナーで教えて頂いた下記の コードをどの様に使えばいいのでしょうか。 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub Sample()   Range("A1") = 0   For i = 1 To 10     Sleep 500 '500msec(0.5秒)待機     Range("A1") = i   Next i End Sub ーーーーーーーーーーーーーーーーーー (bf38:bn38)を赤  (bo38:by38)を緑にします。この動作を赤から緑になるまでに少し遅延させたいのです。mt2008さんに教えて頂きましたが解決できませんでした。継続して再質問させていただきたかったのですが、方法がわかりませんでしたので、このような形になりましたお許し下さい。 Range("BF38:Bn38").Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 3 End With Range("Bo38:By38").Select With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 4 End With End Sub

  • 割り込み処理

    Application.OnTimeで一定時間後に処理をさせたいのですが For文のループ処理を完了してからApplication.OnTimeが実行されてしまいます。 ループ処理中にApplication.OnTimeを優先して実行させることって出来るのでしょうか? Option Explicit Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Private Sub CommandButton1_Click() Call M1 End Sub Private Sub M1() Dim i As Integer Application.OnTime Now() + TimeValue("00:00:03"), "Sheet1.M2" For i = 0 To 30 Range("A1") = i Sleep 1000 Next i End Sub Sub M2() MsgBox ("123") End Sub

  • GetWindowText、GetActiveWindowについて

    こんばんは。よろしくお願いします。 まずは以下をご覧ください。 Excel VBA です。 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub Sample() Dim rtn, rtn2 As Long Dim Name As String Dim Leng As Long Dim ReturnValue ReturnValue = Shell("CALC.EXE", 1) AppActivate ReturnValue Sleep 500 Name = String(250, Chr(0)) Leng = Len(Name) rtn = GetActiveWindow() rtn2 = GetWindowText(rtn, Name, Leng) Debug.Print Name End Sub これを実行しても、イミディエイトウインドウに「電卓」は出ません。 エラーもありません。 なぜなのでしょうか?

  • ExcelVBAでのkernel32(64bit)

    今までExcel2000のVBAから、以下のようなコードを使ってC++で作ったコマンドプロンプトで動くプログラムを動かすプログラムを作っていましたが、これを64bitのWindows7上で動いているExcel2010で使おうとしたらメッセージが出ました。いろいろ調べてみたところ、たぶんDeclareにPtrSafeを付ければ良いようなのですが、その際、他のコードはそのままで良いのでしょうか。特に、コード中のLongはそのままで良いのか気になるのですが...。ちなみに、下記コードの条件コンパイルはネットで調べて見よう見まねで付けたもので、Excel2000のときには付けていないものでした。ご存じの方がいらっしゃいましたらご教授ください。 '------------------------------------------------------------------------------ ' Win32 API関数・定数の宣言 '------------------------------------------------------------------------------ #If VBA7 And Win64 Then '64bit Declare PtrSafe Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _   ByVal dwMilliseconds As Long) As Long Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _   ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long #Else '32bit Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _   ByVal dwMilliseconds As Long) As Long Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _   ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long #End If Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF Private Const INFINITE As Long = &HFFFF '------------------------------------------------------------------------------ ' Run '------------------------------------------------------------------------------ Public Sub Run(ByVal project_name As String)   Dim program As String   Dim task_id As Long   Dim h_proc As Variant   program = mdlFunc.ProgramPath() & mdlFunc.ProgramOption(project_name) 'プログラム名   task_id = Shell(program, vbHide)   h_proc = OpenProcess(PROCESS_ALL_ACCESS, False, task_id)   If OpenProcess(PROCESS_ALL_ACCESS, False, task_id) <> vbNull Then     Call WaitForSingleObject(h_proc, INFINITE)     CloseHandle h_proc   End If End Sub

  • EXCEL VBA作成で行き詰りました。助けてください。

    今、EXCEL のVBAを作成していて行き詰ってしまいました。 エクセルのシート(sheet1)に10桁数字が列にいくつかあります(E5からE6,E7へと毎日更新していきます)。 その10桁の数字を1つ選択(セルの数字をクリックするイメージでいます)してあるインターネット上のページの検索欄に自動記入→検索させたいと思っています。 その記入から検索までのおおまかな物は完成したのですが、セルを選んでという所がよくわかりません。 わかりにくい説明ですが、どうぞよろしくお願いいたします。 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub kensaku() Set ie = CreateObject("InternetExplorer.application") ie.Visible = True ie.Navigate ("http://www.○○○○") i = 0 Do Until ie.busy = False Or i > 10 Sleep (1000) i = i + 1 Loop If i > 10 Then MsgBox ("タイムアウト") Exit Sub End If ie.document.all.Idno.Value = "ここに選択したセルの数字を入れたい" ie.document.all.Search.Click End Sub といった感じです。 私自身は、excel vba はかじった程度でここまでも色々と調べながらやっとたどりつきました。 どうぞ、初心者でもわかりますように、ご説明よろしくお願いいたします。

  • 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 ステートメントは  オブジェクトモジュールのパブリックメンバとしては使用できません。 ウィンドウをアクティブな状態等に用いたいのですが、定義の仕方が悪いのでしょうか? 皆さま、ご教授下さい。

  • 64ビットエクセルでのAPI宣言/PtrSafe

    エクセルのInputboxで、入力された文字列を自動的にアスタリスクで隠すようにする方法を探し http://okwave.jp/qa/q2371878.html の回答No1のコードがまさに最適なコードで、これまで非常に助かっていました。 ところが、64bitのエクセルでは動かないことがわかりました。 表示されたエラーメッセージの言葉から調べて、PtrSafeという言葉を入れなければならないようなのでAPI宣言を以下のようにしてみました。 #If VBA7 And Win64 Then '64ビット版 Private Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _ ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _ (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Private Declare PtrSafe Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As Long #Else '32ビット版 Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _ ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _ (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, _ ByVal dwThreadId As Long) As Long Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Private Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" _ (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _ ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long #End If ところが、回答No1のコードで Sub Report_Open() を実行すると Public Function InputBoxDK(Prompt, Optional Title, Optional Default, Optional XPos, _ Optional YPos, Optional HelpFile, Optional Context) As String のところがハイライトされてエラーになります。 どう直せば良いのでしょうか? 全文のコードを乗せると字数制限に引っかかりますので、申し訳ありませんが宣言以外の部分は http://okwave.jp/qa/q2371878.html の回答No1のコードを見てくださいますようお願いします。

専門家に質問してみよう