Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2018 | 02 | 03 | 04 | 05 |

2016-02-07(Sun)

EXCEL VBAメモ - エラー処理

Option Explicit

Sub test()
    On Error GoTo ErrHandler 'エラー発生時のジャンプ先
    Dim a As Long
    
    a = 1 / 0  ' エラー発生
    MsgBox "エラー発生行の次へジャンプしました。"
    On Error GoTo 0 ' エラー処理の無効化
    Exit Sub

Label1:
    MsgBox "Label1へジャンプしました。"
    On Error GoTo 0 ' エラー処理の無効化
    Exit Sub
    

' エラー処理を行う。
ErrHandler:
    ' Errオブジェクトからエラー情報が得られる。
    MsgBox Err.Number & vbCrLf & Err.Description '=> 11(改行)0で除算しました。
    
'   Resume        ' エラー発生行へ戻る(このサンプルでは無限ループになる)
'   Resume Label1 ' Label1へジャンプ
    Resume Next   ' エラー発生行の次行へジャンプ

End Sub

2016-02-06(Sat)

EXCEL VBAメモ - タイマー処理

Option Explicit

Sub testTimer()
    Dim sec As Long: sec = 10 ' タイマー時間
    Dim targetTime As Date

    ' 現在時刻 + タイマー時間
    targetTime = DateAdd("s", sec, Time)

    Do
        ' セルに残り秒数を表示
        Range("A1").Value = DateDiff("s", Time, targetTime)
        
        DoEvents
    Loop While (Range("A1").Value <> 0)
    MsgBox "時間です。"
End Sub

EXCEL VBAメモ - クラスの定義と使用

メンバ変数へのアクセスプロパティで行う。コンストラクタ引数でメンバ変数へ値を設定することはできない。検索すると裏技で対応方法がいろいろ公開されているが、後々意味が分からなくなりそうなので使用せずプロパティで行うこと。

引数の無いプロシージャはカッコ不要

引数はByValを使用する?


クラス定義

クラスモジュールに作成する。

Option Explicit

' メンバ変数
Private mVal As Long

' コンストラクタ
Private Sub Class_Initialize()
    MsgBox "コンストラクタが実行されました。"
End Sub

' デストラクタ
Private Sub Class_Terminate()
    MsgBox "デストラクタが実行されました。"
End Sub

' プロパティ(Getter)
Public Property Get Val() As Long
    Val = mVal
End Property

' プロパティ(Setter)
Public Property Let Val(ByVal newVal As Long)
    mVal = newVal
End Property

Public Sub Inc()
    mVal = mVal + 1
End Sub

Public Sub Add(ByVal addVal As Long)
    mVal = mVal + addVal
End Sub

Public Function Equal(ByVal eqVal As Long) As Boolean
    If mVal = eqVal Then
        Equal = True
    Else
        Equal = False
    End If
End Function

呼び出し側

Sub foo()
    Dim a As MyClass
    Set a = New MyClass ' コンストラクタ実行
    
    a.Val = 100 ' 引数の形でなく、代入で値を設定する。
    MsgBox a.Val '=> 100
    a.Inc ' カッコを付けない
    MsgBox a.Val '=> 101
    a.Add (10)
    MsgBox a.Val ' => 111
    MsgBox a.Equal(111) '=> True

    Set a = Nothing ' デストラクタ実行
End Sub

2016-02-05(Fri)

EXCEL VBAメモ - 構造体の定義と使用

Option Explicit

Type MyStruct
    val As Long
    str As String
End Type

Sub foo()
    Dim a As MyStruct
    
    a.val = 10
    a.str = "abcd"
    MsgBox a.val & a.str
End Sub

2016-02-04(Thu)

EXCEL VBAメモ - 連想配列 Dictionary

    Dim dic As Object
    Dim d As Variant   ' Objectではダメ
    
    Set dic = CreateObject("Scripting.Dictionary")
    dic("a") = "A"       ' データ追加
    dic.Add "b", "B"     ' データ追加、キーが存在した場合はエラー
    If Not dic.Exists("c") Then ' キーの存在確認
        dic.Add "c", "C"
    End If
    MsgBox dic.Count     ' データ数
    MsgBox dic.Item("a") ' キーに対応するItem表示
    
    
    For Each d In dic.Keys ' 全キー表示
        MsgBox d
    Next
    For Each d In dic.Items ' 全Item表示
        MsgBox d
    Next
    dic.Remove ("a") ' データ削除
    For Each d In dic.Items ' 確認
        MsgBox d
    Next
    dic.RemoveAll ' 全データ削除

    Set dic = Nothing