何か時間のかかる処理が終わったとき、ユーザーに処理が終わったことをビープ音で知らせたいと思います。1回だと気付きにくいので3回「ピッピッピッ」と鳴らしたいのですが、Beep を3回記述しても鳴りません。苦し紛れに下記の関数を作って間に合わせているのですが、間隔を1秒とっているのでちょっと間延びした感じです。もっとリズミカルに鳴らしたいのですが、いい方法があったらどなたか教えてください。
--------------------------------------------------------------------
Public Function beep3()
  Dim i As Integer
  Dim dend As Double

  For i = 1 To 3
    dend = Timer + 1
    Beep
    Do
      If Timer > dend Then
        Exit Do
      End If
      DoEvents
    Loop
  Next i
End Function

このQ&Aに関連する最新のQ&A

doevents」に関するQ&A: DoEventsは意味ない?

A 回答 (4件)

再びmaruru01です。



間にSleepを入れないと出来ない(条件によっては3回に聞こえることもあるけど)ですよ。
っていうか、BeepとSleepで私の環境では出来ましたけど。(VB6.0SP5、Windows2000SP2)
あっそうだ、Beepの引数はWindows95、98では無視されます。
では。
    • good
    • 0
この回答へのお礼

ありがとうございました。
自宅のパソコンは98なので、うまく動きませんでした。
仕事先では2000で、2000上で動かすアプリで使用したかったので大助かりです。

お礼日時:2002/04/09 21:12

こんにちは。

maruru01です。

WindowsAPIにも、「Beep」という関数があります。
APIのBeepは周波数(Hz)と秒数(ms)の2つの引数を持ってるので、音色(周波数)と鳴らす間隔(秒数)を調節出来ます。
各Beep間のインターバルはNo.2の方の通り、APIのSleepを使って調節出来ます。
どちらの関数も、MSDNライブラリーで詳細を参照して下さい。
関数の宣言はAPIビューアで取得して下さい。
では。

この回答への補足

ありがとうございます。
が、うまくいきません。
timer関数と同じで1回しか鳴りません。
周波数と間隔をいろいろと変えてやってみたのですが、3回Beepを記述しても1回しか鳴りません。

補足日時:2002/04/08 23:11
    • good
    • 0

こんにちは、honiyonです。



  確か Sleepという関数があったと思います。

  Sleep(1000) で 1秒待ちという意味になります。

  Beep
Sleep(1000)
Beep
Sleep(1000)
Beep

  でいかがですか?

  参考になれば幸いです(..

この回答への補足

ありがとうございます。
が、うまくいきません。
timer関数と同じで1回しか鳴りません。

補足日時:2002/04/08 23:09
    • good
    • 0

あまりお役に立てないかも知れませんが timer は 小数点以下も利用できるはずです。

 timer + 1 を timer + 0.3ぐらいにしてみては いかがでしょうか

この回答への補足

はい、1秒以下でも試しましたが、そうするとうまく3回鳴りません。
0.9以下でだめでした。ハードの周波数の問題とか聞きましたが、それをどうクリアしたらいいのか分かりません。

補足日時:2002/04/08 07:59
    • good
    • 0

このQ&Aに関連する人気のQ&A

doevents」に関するQ&A: DoEvents関数って何?

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qビープ音鳴らし続けたい。

Beepと記述すると一回だけビープ音が鳴りますが、
ある処理をしている最中、ビープ音を鳴らすことは出来ますでしょうか?

Aベストアンサー

System.Console.Beep

http://www.atmarkit.co.jp/fdotnet/dotnettips/440systemsounds/systemsounds.html

QVBA で警告音

VBAで警告音を鳴らす際にBeepを使っています。
このたび、3種類の警告音が必要なったのですが、VBAのBEEPの場合
「一般の警告」がなるだけなので、数種類の警告音が出来ません。
何か良い方法はありませんか?

Aベストアンサー

警告音(「メッセージ (警告)」や「メッセージ (情報)」)を直接出すのでしたら、既出の質問で回答されて
いる、APIを使用します:
http://oshiete1.goo.ne.jp/qa747208.html


なお、APIに慣れていなくて敷居が高く感じられるようでしたら、SendKeys関数とMsgBoxで擬似的に
やってしまうというのもひとつの手だと思います。
試しに、現在の「Beep」の記述を、以下のコード(コメントを除けば実質2行)に置き換えてみて下さい:

 '「Enter」キーの信号(?)を送信します
 SendKeys "{Enter}", False
 '「システム エラー」の音を出します
 '(MsgBox自体は、上でのEnterで自動的に閉じられます:たまに残ることがありますが(汗))
 MsgBox "", vbCritical


・・・以上です。
なお、MsgBox関数の「vbCritical」を、「vbInformation」にすれば「メッセージ (情報)」の音に、
「vbExclamation」にすれば「メッセージ (警告)」の音に、それぞれ変えることができます。
(実際に鳴る音は、Windows側の設定に依存するので注意:
 コントロールパネルの「サウンドとオーディオデバイス」等で「システム エラー」時の音を変えると、
 Access側で鳴る音も変わります)

本来ならMsgBoxに表示するアイコンの切替用の引数ですし、SendKeysは時に予想外の
動作をすることがあるということで、あまりお勧めはできませんが、こんな方法もあるという
ことで、ご参考まで。

警告音(「メッセージ (警告)」や「メッセージ (情報)」)を直接出すのでしたら、既出の質問で回答されて
いる、APIを使用します:
http://oshiete1.goo.ne.jp/qa747208.html


なお、APIに慣れていなくて敷居が高く感じられるようでしたら、SendKeys関数とMsgBoxで擬似的に
やってしまうというのもひとつの手だと思います。
試しに、現在の「Beep」の記述を、以下のコード(コメントを除けば実質2行)に置き換えてみて下さい:

 '「Enter」キーの信号(?)を送信します
 SendKeys "{Enter}", False
 '「...続きを読む

Q【vba】Beep音が鳴らない

Beep音を鳴らしたいのですが
Sub Macro()
Beep
End Sub
では鳴りません。

でもデバッグしても何も起こりません。
音楽は聴けるのでスピーカーは正常です。

何がいけないのでしょうか?
よろしくお願いします。

Aベストアンサー

>まず「音量」というのが探せませんでした 
Window のVersion は?
#1さんの手順は、どこまで行きましたか?

音楽を聴いたりした後に、ミュートをクリックしたままにすると、音がならないことがあります。

QBeep音を出すには?

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'Beep音を出す
Dim I As Integer
For I = 1 To 100 ' Loop 100 times.
Beep() ' Sound a tone.
Next I

End Sub
上記のコードでBeep音を出したいのですが、鳴りません。
(Beepコードは、VBのサンプルコードです。)
OS:WinXP SP3
VB.NET Ver2003です。

フォームにコマンドボタンを一つ貼り付け、
コマンドボタンのクリックイベントで
Beep音を鳴らしたいです。

PCのデバイスマネージャ設定は、
Beep音が有効になっています。
他の音(Win立上音他)は、デフォルトのままです。

詳しい方、教えて下さい。

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'Beep音を出す
Dim I As Integer
For I = 1 To 100 ' Loop 100 times.
Beep() ' Sound a tone.
Next I

End Sub
上記のコードでBeep音を出したいのですが、鳴りません。
(Beepコードは、VBのサンプルコードです。)
OS:WinXP SP3
VB.NET Ver2003です。

フォームにコマンドボタンを一つ貼り付け、
コマンド...続きを読む

Aベストアンサー

Windows APIを使う方法

Enum MessageBeepType
SimpleBeep = -1
MB_OK = &H0
MB_ICONHAND = &H10
MB_ICONQUESTION = &H20
MB_ICONEXCLAMATION = &H30
MB_ICONASTERISK = &H40
End Enum

<System.Runtime.InteropServices.DllImport("user32.dll")> _
Shared Function MessageBeep(ByVal uType As MessageBeepType) As System.Boolean
End Function

で、Beep()のところを、MessageBeep(MessageBeepType.SimpleBeep)にします。

QエクセルVBAでBeep音は?

エクセル2000、Win2000です。
VBAで音を出そうと、下記のマクロを記述しました。
ところが、「MsgBox i & "回実行しました。」の部分を、コメントブロックしたら一回しか鳴りません。ビー、ビー、ビーと三回鳴ると思ったのですが、どうしてでしょうか?

Sub sound()
Dim i As Integer
For i = 1 To 3
Beep
'MsgBox i & "回実行しました。"
Next i
End Sub

Aベストアンサー

こんにちは。maruru01です。

間隔が短すぎるからでは?

適当にWaitをかけてはどうですか?
以下では1秒間を空けて鳴らします。


Sub sound()

  Dim i As Integer
  Dim StartTime As Single

  For i = 1 To 3
    StartTime = Timer
    Do While Timer < StartTime + 1
      DoEvents
    Loop
    Beep
    'MsgBox i & "回実行しました。"
  Next i

End Sub

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

Qフォントの大きさ

Msg_box 関数 でメッセージを出力しているのですが
マーク(注意、警告 etc)を用いての表現の方法しかないのでしょうか?
 例えば メッセージのフォントのサイズを各々メッセージによって
     変えれないのでしょうか?
初歩的なご質問で申し訳御座いません
宜しくお願いします

Aベストアンサー

一応サンプルを作りました。
やってみて面白かったけど、やはりオリジナルを作ったほうがかなり楽だということを実感しました。

注意:
ここの掲示板は文字がずれるので、図形が壊れます。以下の文章をメモ帳などのテキストエディタにコピって読んでください。

・・・さて本題・・・


※メッセージボックスの構造
┏━━━━━━━━━━━━━━━━┓
┣━━━━━━━━━━━━━━━━┫
┃                ┃
┃ ┏━┓ ┏━━━━━━━━┓ ┃
┃ ┃I┃ ┃MSG_AREA┃ ┃
┃ ┗━┛ ┗━━━━━━━━┛ ┃
┃                ┃
┃   ┏━━┓  ┏━━┓   ┃
┃   ┃B1┃  ┃B2┃   ┃
┃   ┗━━┛  ┗━━┛   ┃
┗━━━━━━━━━━━━━━━━┛
[I]・・・アイコン(クラス名:Static)
[MSG_AREA]・・・メッセージ表示領域(クラス名:Static)
[B1/B2]・・・ボタン(クラス名:Button)
という構造になっています

メッセージボックスは指定のスタイルによりアイコンの有無・ボタンの数が変化します。
また、メッセージ文字数により、メッセージの表示領域が変更され、ダイアログのサイズも算出されます。
しかもこの大きさの計算は、ダイアログオブジェクトが創生される前に行われるため、フォントを指定したあと、独自で再配置をしなければなりません。この計算ロジックは非常にややこしいものです。


※VBのMsgBox関数(またはAPIMassegeBox関数)内部で行われていると思われる手順(フックしてSpyで調べました)
1.MSGの文字数/ボタンの数/アイコンの有無により、ダイアログの大きさの算出・各オブジェクトの配置位置の算出
2.ダイアログ本体を創生
3.ボタンをダイアログ内部に創生(複数のボタンが存在するとき、左側のボタンから創生)
4.アイコンがあるならアイコンを創生
5.メッセージを創生
6.ボタンにフォーカスをセット
7.画面に表示する(サンプルではここで操作しています)
という順序のようです。


サンプルは、画面に表示する直前にフォントを指定しています。上記で述べたとおり、各オブジェクトはすでにできあがってしまっているので、再配置が必要になります。(サンプル内のsetResize関数を作りこんでください)


以下を標準モジュールに貼り付けて、Sub Mainから実行するようにしてください。
[myMsgBox関数]がオリジナルMsgBoxを呼ぶための関数です。



Option Explicit

Public Const WH_CBT = 5

'太文字([400/700]にしているけど、フォントによって違うかも?)
Public Enum MY_BOLD
  MYB_FLASE = 400
  MYB_TRUE = 700
End Enum
'斜体
Public Enum MY_ITALIC
  MYI_FLASE = 0
  MYI_TRUE = 1
End Enum
'下線
Public Enum MY_UNDERLINE
  MYU_FLASE = 0
  MYU_TRUE = 1
End Enum
'取消し線
Public Enum MY_STRINKEOUT
  MYS_FLASE = 0
  MYS_TRUE = 1
End Enum


Public Const HCBT_ACTIVATE = 5 ' ウィンドウがこれからアクティブになる通知メッセージ

Public Const WM_SETFONT = &H30 'フォントを指定
Public Const WM_GETFONT = &H31 'テキストボックス、ラベル等が現在使っているフォントのハンドル

Public Const LF_FACESIZE = &H20
Public Const POINT_PER_INCH = 72
Public Const LOGPIXELSY = 90 '縦方向の1論理インチあたりのピクセル数

Public Const HWND_TOP = 0
Public Const HWND_BOTTOM = 1
Public Const HWND_TOPMOST = (-1)
Public Const HWND_NOTOPMOST = (-2)
Public Const SWP_NOSIZE = &H1&
Public Const SWP_NOMOVE = &H2&
Public Const SWP_NOZORDER = &H4&
Public Const SWP_NOREDRAW = &H8&
Public Const SWP_NOACTIVATE = &H10&
Public Const SWP_FRAMECHANGED = &H20&
Public Const SWP_SHOWWINDOW = &H40&
Public Const SWP_HIDEWINDOW = &H80&
Public Const SWP_NOCOPYBITS = &H100&
Public Const SWP_NOOWNERZORDER = &H200&
Public Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Public Const SWP_NOREPOSITION = SWP_NOOWNERZORDER


Public Type LOGFONT
 lfHeight     As Long 'キャラクタの高さ
 lfWidth      As Long 'キャラクタの幅(0 で標準的プロポーション)
 lfEscapement   As Long '相対的出力角度(単位:1/10度)
 lfOrientation   As Long '回転角度(単位:1/10度)
 lfWeight     As Long 'キャラクタの線幅(FW_BOLD, FW_NORMAL)
 lfItalic     As Byte 'イタリックの時 Chr$(1)、通常 Chr$(0)
 lfUnderline    As Byte 'アンダーライン付きの時 1
 lfStrikeOut    As Byte '横線付きの時 1
 lfCharSet     As Byte 'キャラクタセットの指定
 lfOutPrecision  As Byte '常に OUT_DEFAULT_PRECIS = 0
 lfClipPrecision  As Byte ' 同上
 lfQuality     As Byte 'DEFAULT_QUALITY, DRAFT_QUALITY, PROOF_QUALITY
 lfPitchAndFamily As Byte 'DEFAULT_PITCH,FIXED_PITCH, VAIABLE_PITCH
 lfFaceName    As String * LF_FACESIZE 'タイプフェース名
End Type

Public Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, ByRef wParam As Long, ByRef lParam As Any) As Long
Public Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Public Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

Public Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hMod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long


Private mHookProcWnd  As Long 'フックプロセスハンドル
Private mFontHandle   As Long '作成したフォントハンドル

Public Sub Main()
  Call myMsgBox("鈴木 宗○", vbOKCancel Or vbQuestion)
End Sub

'メッセージボックスの初期設定
Public Function myMsgBox( _
        inPrompt As String _
        , Optional inButtons As VbMsgBoxStyle = vbOKOnly _
        , Optional inTitle As String = "vs 辻本 清○" _
        , Optional inHelpFile _
        , Optional inContext _
        ) As VbMsgBoxResult
  'フック
  mHookProcWnd = SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc, App.hInstance, App.ThreadID)
  
  'メッセージボックスを呼ぶ
  myMsgBox = MsgBox(inPrompt, inButtons, inTitle, inHelpFile, inContext)
  
  'メッセージボックスで作成されたフォントを削除する
  Call delFont
End Function

'フック関数
Private Function MsgBoxHookProc _
    (ByVal nCode As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long
  
  Static staFlg  As Boolean 'ワーキングフラグ
  
  'システムがウィンドウをアクティブ化しようとしている
  If nCode = HCBT_ACTIVATE Then
    If staFlg Then
      Exit Function
    End If
    staFlg = True
    
    'フォントを設定する
    Call setFont(wParam, 30, MYB_TRUE, MYI_TRUE, MYU_TRUE, MYS_TRUE)
    
    'オブジェクトのリサイズ
    Call setResize(wParam)
    
    Call UnhookWindowsHookEx(mHookProcWnd)
    staFlg = False
  End If
  ' フック関数の継続を中止
  MsgBoxHookProc = False
End Function

Private Sub setFont( _
    inOwnerWnd As Long, _
    Optional ByVal inFontSize As Single = -1, _
    Optional ByVal inBold As MY_BOLD = MYB_FLASE, _
    Optional ByVal inItalic As MY_ITALIC = MYI_FLASE, _
    Optional ByVal inUnderLine As MY_UNDERLINE = MYU_FLASE, _
    Optional ByVal inStrikeOut As MY_STRINKEOUT = MYS_FLASE _
    )

  Dim udtLOGFONT As LOGFONT
  Dim lngDC    As Long
  Dim lngWk    As Long
  Dim lngMsgWnd  As Long 'メッセージボックスのメッセージ部分のハンドル
  
  
  'すでに作成済みのフォントを削除
  Call delFont
  
  'メッセージボックスの中の、メッセージ部分のハンドルを得る
  lngMsgWnd = getWndMsg(inOwnerWnd)
  
  'デバイスコンテキストを得る
  lngDC = GetDC(lngMsgWnd)
  
  '現在のフォントのハンドルを取得
  lngWk = SendMessage(lngMsgWnd, WM_GETFONT, 0, 0&) And &HFFFF&
  
  ' フォント属性を取得
  Call GetObject(lngWk, Len(udtLOGFONT), udtLOGFONT)
  
  '新しい設定を行う
  With udtLOGFONT
    'フォントサイズ/太字/斜体/下線/取消し線
    If inFontSize > 0 Then
      .lfHeight = inFontSize * (GetDeviceCaps(GetDC(inOwnerWnd), LOGPIXELSY) / POINT_PER_INCH) * (udtLOGFONT.lfHeight / Abs(udtLOGFONT.lfHeight))
    End If
    .lfWeight = inBold
    .lfItalic = inItalic
    .lfUnderline = inUnderLine
    .lfStrikeOut = inStrikeOut
  End With
  
  '論理フォントの作成
  mFontHandle = CreateFontIndirect(udtLOGFONT)
  'DCへの関連付け
  Call SelectObject(lngDC, mFontHandle)
  'フォントを指定
  Call SendMessage(ByVal lngMsgWnd, ByVal WM_SETFONT, ByVal mFontHandle, 0&)

End Sub

'フォントオブジェクトの削除
Private Sub delFont()
  If mFontHandle <> 0& Then
    Call DeleteObject(mFontHandle)
    mFontHandle = 0
  End If
End Sub

'メッセージボックスの中の、メッセージ部分のハンドルを得る
Private Function getWndMsg(inWnd As Long) As Long
  Dim lngWnd1 As Long
  Dim lngWnd2 As Long
  
  'メッセージボックスには「Static」クラスを持つオブジェクトが1個か2個ある
  '1個の時は メッセージ
  '2個の時は 最初のStaticはアイコン/次にメッセージ
  
  lngWnd1 = FindWindowEx(inWnd, 0&, "Static" & vbNullChar, vbNullString)
  lngWnd2 = FindWindowEx(inWnd, lngWnd1, "Static" & vbNullChar, vbNullString)
  
  '2個目が存在していたら2個目、そうじゃなけりゃ1個目のハンドルを返す
  getWndMsg = IIf(lngWnd2 <> 0&, lngWnd2, lngWnd1)
End Function

'オブジェクトのリサイズ
'(ここは作りこまないといけない。計算ロジック大変そう・・・・)
Private Function setResize(inWnd As Long)
  Dim lngWidth  As Long
  Dim lngHeight  As Long
  Dim lngWnd1   As Long
  Dim lngWnd2   As Long
  
  '本当はここで再配置ロジックを行う(ボタン/アイコン/メッセージ)の各ハンドルを得て、サイズを変更
  'ここに載っているのは、あくまでサンプルです
  'ボタン数が2個限定ですのでお間違いないように!!!!!!!!!!!!!!
  
  '画面サイズを取得
  lngWidth = (Screen.Width \ Screen.TwipsPerPixelX)
  lngHeight = (Screen.Height \ Screen.TwipsPerPixelY)
  
  'メッセージボックスを座標(0,0)へ表示/メッセージボックスを画面サイズに表示
  Call SetWindowPos(inWnd, 0, 0, 0, lngWidth, lngHeight, _
           SWP_NOZORDER Or SWP_NOACTIVATE)
  
  'メッセージ
  Call SetWindowPos(getWndMsg(inWnd), 0, 0, 0, lngWidth \ 2, lngHeight \ 2, _
           SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_NOMOVE)
          
  'ボタン1(大きさそのまま/配置変更)
  lngWnd1 = FindWindowEx(inWnd, 0&, "Button" & vbNullChar, vbNullString)
  Call SetWindowPos(lngWnd1, 0, 0, lngHeight - 50, 0, 0, _
           SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_NOSIZE)
  
  'ボタン2(大きさ変更/配置変更)
  lngWnd2 = FindWindowEx(inWnd, lngWnd1, "Button" & vbNullChar, vbNullString)
  Call SetWindowPos(lngWnd2, 0, lngWidth - 400, lngHeight - 500, 300, 300, _
           SWP_NOZORDER Or SWP_NOACTIVATE)
End Function

一応サンプルを作りました。
やってみて面白かったけど、やはりオリジナルを作ったほうがかなり楽だということを実感しました。

注意:
ここの掲示板は文字がずれるので、図形が壊れます。以下の文章をメモ帳などのテキストエディタにコピって読んでください。

・・・さて本題・・・


※メッセージボックスの構造
┏━━━━━━━━━━━━━━━━┓
┣━━━━━━━━━━━━━━━━┫
┃                ┃
┃ ┏━┓ ┏━━━━━━━━┓ ┃
┃ ┃I┃ ┃MSG_AREA┃ ┃
┃ ┗━┛ ┗━━━━━━━━┛ ┃
┃         ...続きを読む

Qエクセルで定期的(30分おき)にマクロを実行させる方法は?

エクセルにて刻一刻変る外部データ(株価)を表示させています。それを自動で30分置きにデータ蓄積させる方法はありませんか?

現在は自分で作ったキーボードマクロで 時計を見ながらボタンを押し、データを取り込ん出る始末です。

その簡単マクロに「30分置きに実行させる」と云う記述を付け足す程度で自動実行させる事は可能でしょうか? 
当方キーボードマクロでの自動書き込みしか出来ない素人ですが、少々複雑な物であっても頑張ってみるつもりですので、どなたかご教授下さい。

Aベストアンサー

えーー。。実際に使うなら、zap35 さんのように、OnTime で実行したマクロ
の中で再度 OnTime を登録する方が良いと思います。

この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。

今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。

コードのままだと、午前10時~午後6時まで30分間隔で Macro1 を実行します。
変更点は、

 ・ブッククローズをトラップした
 ・進捗状況をステータスバーに表示するようにした
 ・その他しょうもないこと

です。

このままコピペで使えると思いますが、試される場合は、MACRO1 はご自分の
用途に合わせて適切に修正して下さい。


Option Explicit

Dim mcolTask As Collection

Sub 実行予約()

  Dim i      As Date
  Dim strProcName As String
  Dim datBigin  As Date
  Dim datEnd   As Date
  Dim datInterval As Date
  Dim datTimeout As Date
  Dim blnJustTime As Boolean

  ' Setting-------------------------------------------------------

  datBigin = TimeValue("10:00:00")  ' 開始時刻
  datEnd = TimeValue("18:00:00")   ' 終了時刻
  datInterval = TimeValue("00:30:00") ' 実行間隔(少なくとも数秒以上で)
  datTimeout = TimeValue("00:02:00") ' 実行待機タイムアウト
  blnJustTime = True         ' datInterval で丸めるか
  strProcName = "MACRO1"       ' 実行するマクロ名

  '---------------------------------------------------------------

  ' 既に実行予約されているか確認
  If mcolTask Is Nothing Then

    ' 日付シリアル値を加算
    datBigin = datBigin + Date
    datEnd = datEnd + Date
    ' 終了時刻が開始時刻より小さければ日をまたぐので補正
    If datEnd < datBigin Then datEnd = datEnd + 1
    ' 現在時刻が既に終了時刻を過ぎている場合
    If datEnd < Now() Then
      MsgBox "終了時刻を過ぎているため予約できません。", vbCritical, "終了"
      Exit Sub
    End If
    ' 現在時刻が開始時刻を過ぎていれば補正
    If datBigin < Now() Then
      ' 開始時刻を datInterval で指定された値で丸めるか
      If blnJustTime Then
        datBigin = Application.Floor(Now() + datInterval, datInterval)
      Else
        datBigin = Now() + datInterval
      End If
    End If

    ' 初期化
    Set mcolTask = New Collection

    ' メイン部分
    For i = datBigin To datEnd Step datInterval
      ' 後から取り消せるようにコレクションに退避
      mcolTask.Add CStr(i) & "," & strProcName
      ' Application.Ontime で実行予約を行う
      Application.OnTime EarliestTime:=i, _
                Procedure:=strProcName, _
                LatestTime:=i + datTimeout, _
                Schedule:=True
    Next i
  Else
    MsgBox "既に実行中です", vbInformation
  End If

End Sub

Sub 未実行予約強制解除()
 
  Dim i  As Long
  Dim vntS As Variant
 
  On Error Resume Next
  Application.StatusBar = "タスク破棄中... "
  For i = 1 To mcolTask.Count
    vntS = Split(mcolTask.Item(i), ",")
    Application.OnTime CDate(vntS(0)), CStr(vntS(1)), Schedule:=False
  Next i
  Application.StatusBar = ""
  Set mcolTask = Nothing

End Sub

' タスク管理用
Private Sub RemoveTask()
  
  On Error Resume Next
  mcolTask.Remove (1)
  Application.StatusBar = "待機中のタスク... " & mcolTask.Count
  DoEvents
  Beep
  If mcolTask.Count = 0 Then
    Application.StatusBar = ""
    Set mcolTask = Nothing
  End If

End Sub

Sub Auto_Close()

  Dim intRes As Integer
  If Not mcolTask Is Nothing Then
    intRes = MsgBox( _
        Prompt:="待機中のタスクが " & mcolTask.Count & " 件あります。" & vbLf _
           & "破棄して終了しますか?", _
        Buttons:=vbOKCancel + vbDefaultButton2 + vbExclamation, _
        Title:="問い合わせ")
    If intRes = vbOK Then
      Call 未実行予約強制解除
    Else
      ' ブッククローズをキャンセル
      Application.ExecuteExcel4Macro ("Halt(True)")
    End If
  End If

End Sub

' 呼び出すマクロ--> Application.Ontime のマクロ名と一致させて下さい
Sub MACRO1()

  Dim lngRow As Long
  With ThisWorkbook.Sheets("Sheet1")
    lngRow = .Range("V65536").End(xlUp).Offset(1).Row
    .Cells(lngRow, "V").Resize(1, 3).Value = .Range("Q12:S12").Value
    .Cells(lngRow, "Y").Value = Now()
  End With

  ' ご自分のマクロの最後に次の一行を追加しておいて下さい
  Call RemoveTask

End Sub

えーー。。実際に使うなら、zap35 さんのように、OnTime で実行したマクロ
の中で再度 OnTime を登録する方が良いと思います。

この方式だと、OnTime で登録されるのは常に一つだから管理し易いです。
これに未実行の予約を破棄できる仕組みを組み込めばベストだと思います。

今更こんな事言うのは、#6 の大げさなコードを見て、「また、やっちまった...」
と反省しているからです。が、#6 をアップしてしまった以上、それなりに
まとめておきました。こちらは、一括登録方式です。

コードのままだと...続きを読む

Q条件付きコンパイル: #IF 1 Then と #IF 0 Then

条件付コンパイルで、
『#If 1 Then』と『#If 0 Then』の条件の違いを教えてください。


『#If ○○○=1 Then』などの場合はわかるのですが、
単に『#If 1 Then』の場合は何をもって真となるのでしょうか?

よろしくお願いいたします。

Aベストアンサー

条件式は、強制的に「True」又は「False」に解釈されます。

で、「数値」を「True」又は「False」に解釈する場合、
「0」は「False」、「0以外」は「True」になります。
(http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/vsfctcbool.asp)

つまり、
『#If 1 Then』は、「必ずTrue」=常に有効
『#If 0 Then』は、「必ずFalse」=常に無効
に成ります。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報