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 |

2016-09-18(Sun)

EXCEL VBAメモ - Rangeで指定した範囲のセルの値を配列変数に

範囲が広い場合にはセルを一つずつ操作するよりも、一旦配列コピーして操作したほうが速い(らしい)。

Sub sample()
    Dim r As Range, ra As Range
    Dim a As Variant
    Dim i As Long, col As Long, row As Long

    Set ra = Range("A1:D3")
    ' 初期値書き込み
    i = 1
        For Each r In ra
        r.Value = i
        i = i + 1
    Next

    ' セル範囲の値を配列変数へコピー
    a = ra
    ' 元の値を二乗する
    For row = 1 To UBound(a)
        For col = 1 To UBound(a, 2)
            a(row, col) = a(row, col) ^ 2
        Next
    Next
    ' 配列をセルに書き戻し
    ra = a
End Sub

2016-09-17(Sat)

EXCEL VBAメモ - 自作のクラスにイベントを追加する

MyClassオブジェクトのメンバ変数m_dataが5以上になるとOverflowイベントを発生する。

標準モジュールではイベント処理が記述できないので、シートモジュールかユーザーフォーム記述する。

MyClass(クラスモジュール)

Private m_data As Long

' Overflowイベント追加
Public Event Overflow(ByVal sender As Object)

Private Sub Class_Initialize()
    m_data = 0
End Sub

Private Sub Class_Terminate()
    'do_anything
End Sub

Public Property Get data() As Long
    data = m_data
End Property

Public Property Let data(d As Long)
    m_data = d
    If m_data >= 5 Then RaiseEvent Overflow(Me) 'イベント発生
End Property

Public Sub Increment()
    m_data = m_data + 1
    If m_data >= 5 Then RaiseEvent Overflow(Me) ' イベント発生
End Sub


シートモジュールまたはユーザーフォーム

Private WithEvents Obj As MyClass

' ObjのOverflowイベント処理
Private Sub Obj_Overflow(ByVal sender As Object)
    MsgBox "OverFlow" & vbCrLf & _
            "Sender : " & TypeName(sender)
End Sub

Sub Sample()
    Set Obj = New MyClass
    Obj.data = 4
    Obj.Increment 'm_dataが5になりイベント発生
End Sub

2016-09-10(Sat)

EXCEL VBAメモ - 他のブックのオープン・クローズの検出(Applicationイベント)

マクロが書かれているブックではないブック(エクセルファイル)のオープンやクローズをapplicationイベントとして検出する。クローズはWorkbooks("hoge").Closeだけでなくて、ウィンドウ右上の×クリックによるクローズも検出できる。

VBEクラスモジュールのメニューからmyEvent_****が他にもいろいろ選択可能

クラスモジュール(名前をAppEventにした)

Option Explicit
Public WithEvents myEvent As Application

Private Sub myEvent_WorkbookOpen(ByVal Wb As Workbook)
    ' do_something
End Sub

Private Sub myEvent_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
    ' do_something
End Sub

ThisWorkbookモジュール

Option Explicit
Dim varEvent As New AppEvent '定義したクラスを変数として生成

Private Sub Workbook_Open()
    Set varEvent.myEvent = Application
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Set varEvent = Nothing
End Sub