« 2011年9月 | トップページ | 2011年12月 »

2011年10月

2011年10月 9日 (日)

一定時間だけ実行する

開始から10分だけ実行したい場合など
一定時間だけ実行したいとき、
Do Loop ステートメントや
IfステートメントとGotoステートメントの組み合わせを使います。

Do Loopを使うにしてもIfとGotoを使うにしても
開始直後に終了時刻を決定します。
下のコードでは変数EndTimeが終了時刻で、
TimeValue関数で実行する時間の長さを指定します。

そして1ループ、コードを実行したあとで
(Do Loop While は実行する前)
現在の時間と終了時刻を比較します。

現在の時間が終了時刻よりも小さいなら継続、
現在の時間が終了時刻より大きいなら終了します。

macro111009bとmacro111009cは最低でも
1回は処理を実行します。

macro111009aは、仮に終了時刻を
実行開始から0秒後にすると
一回も実行しないで終了します。
これは、繰り返したい処理のコードの前で時刻を評価しているためです。

下のコードは
実行している間だけイミディエイトに
"実行中"という文字列を出力します。
3つの方法を挙げます。

コードはこちら

一定時間だけ実行するコード:

Sub macro111009a()
'一定時間だけ実行する

    Dim EndTime As Date '終了時刻
    EndTime = Now + TimeValue("00:00:05")
   
    Do While Now() < EndTime
        '一定時間実行したい処理開始
        Debug.Print "実行中"
        '処理終わり
    Loop
   
    Debug.Print "終了"
   
End Sub

Sub macro111009b()
'一定時間だけ実行する

    Dim EndTime As Date '終了時刻
    EndTime = Now + TimeValue("00:00:05")
   
    Do
        '一定時間実行したい処理開始
        Debug.Print "実行中"
        '処理終わり
    Loop While Now() < EndTime
   
    Debug.Print "終了"
   
End Sub

Sub macro111009c()
'一定時間だけ実行する

    Dim EndTime As Date '終了時刻
    EndTime = Now + TimeValue("00:00:05")
   
Step100:

        '一定時間実行したい処理開始
        Debug.Print "実行中"
        '処理終わり
       
    If Now() < EndTime Then
        GoTo Step100
    End If
   
    Debug.Print "終了"
   
End Sub

macro111009aとmacro111009bは比較的行数の少ないコードに
macro111009cは行の多いコードに使っています。
長い入れ子は好みません。

ただGotoメソッドは複雑になるので
できるだけ使わない方がよいと
VBAヘルプに書いてあるのでそれも参考にしてください。

| | コメント (0) | トラックバック (0)

ブックが開いているか確認してから開く

開いているブックに変更を加えたあと
同じブックを開こうとすると次のような警告が出ます。
Vba20111008a

この警告はOpenメソッドの前に
次のコードを実行して表示させないようにできます。

Application.DisplayAlerts = False

この場合ブックに加えた変更は破棄されます。

開こうとしているブックを開いているか確認して
開いているなら新たに開かない、
開いていないなら開く、
ということをVBAでやります。

まずは現在開いているブックの名前を取得します。
これにはFor Eachステートメントを使います。

以前の記事にもあったシートの名前を取得する要領です。

MyFileにファイルへのフルパスを入れてください。
開こうとしているファイルが既に開いているのなら
flag = True になります。

flag = FalseのままFor Eachのループを終えると
ファイルは開いていないとIfステートメントで判断して
ファイルを開きます。

コードはこちら

ブックが開いているか確認してから開くコード:

Sub macro111008a()
'ブックが開いているか確認してから開く

    Dim flag As Boolean
    Dim wb As Workbook
    Dim MyFile As String
    MyFile = "ファイルのフルパス"
    flag = False
   
    For Each wb In Workbooks
        If wb.FullName = MyFile Then
            flag = True
            Debug.Print MyFile & "は既に開いています"
            Exit For
        End If
    Next wb
   
    If flag = False Then
        Debug.Print MyFile & "を開きます"
        Workbooks.Open MyFile
    End If
   
End Sub

データ型がWorkBooksとWorkBookの2つがあり、
はじめWorkBooksで変数を宣言していました。

すると、For Eachのところで

コンパイルエラー:
メソッドまたはデータメンバが見つかりません。

とダイアログが表示されエラーになりました。

類似のエラーはWorksheetとWorksheetsにも起きますので
こちらのエラーが出たらデータ型を見るといいかもしれません。

| | コメント (0) | トラックバック (0)

セルの枠線を非表示にする

たまたまVBAのヘルプで見つけました。

以前セルの枠線を非表示にしたくて
ヘルプを検索したとき見つからなかったので、
セルの塗りつぶしを白にして
枠線を見えないようにしていました。

VBAヘルプからの引用コードはこちら

セルの枠線を表示/非表示にするコード:

Sub macro111002a()
'セルの枠線を表示/非表示

    ActiveWindow.DisplayGridlines = _
        Not (ActiveWindow.DisplayGridlines)

End Sub

ここにNot演算子を再発見!

そうこんなのあった。
使い方は次のようになります。

Not(True) = False
Not(False) = True

Boolean型の変数に使うと
TrueならFalseに
FalseならTrueに値を変更します。

これ以前の記事で作った
昇順/降順ボタンに使えたなっと思いました。

静的変数にはもってこいの演算子です。

| | コメント (0) | トラックバック (0)

VBAでコマンドボタンを作成

手動でのボタンの作成については、
記事『ボタンを使ってマクロを実行する』を
参照してください。

コマンドボタン作成するところまでは
マクロ自動記録されますが、
プロパティの変更は記録されませんでした。

こんなときはVBAヘルプを一生懸命見ます。
相変わらず要素要素がバラバラでわかりにくい。

コマンドボタン作成からプロパティの設定まで
Withステートメントの中で実行します。

Addメソッド、各プロパティの詳細は
VBAヘルプにあります。

コマンドボタン作成用のテンプレートコードはこちら

コマンドボタンを作成するコード:

Sub macro11101a()
'VBAでコマンドボタンを作成

    With ActiveSheet.OLEObjects.Add( _
        ClassType:="Forms.CommandButton.1", _
        Link:=False, _
        DisplayAsIcon:=False, _
        Left:=100, _
        Top:=100, _
        Width:=30, _
        Height:=30)
       
        .Object.Caption = "表示文字 "
        .Object.ForeColor = RGB(0, 0, 0) '文字色
        .Object.BackColor = RGB(200, 200, 200) '背景色
       
        '画像を使用 する場合
        .Object.Picture = _
            LoadPicture ("画像ファイルへのパス")
        .Object.PicturePosition = 7 '既定値
            'PictureとCaptionの位置
        .Object.Caption = "" 'Caption なしでもよい
       
    End With

End Sub

ボタンに画像を使用する場合は
コメントの「画像を使用する場合」以下を使ってください。
使わない場合は削除してください。

コマンドボタンはCaptionなしでも使えます。
Caption = ""、つまりCaptionなしにすると
画像を完全に中央に配置されます。

PicturePositionの値をいろいろと変えてはみますが、
画像を完全に中央に配置したいときは
Captionなしの方が苦労しないと思います。

| | コメント (2) | トラックバック (0)

« 2011年9月 | トップページ | 2011年12月 »