MW211 EXIT

devlog
ExcelVBA/UsedRange
2014年10月10日
「.UsedRange」では値のある範囲(の境目まで)を調査することができる。
┌─┬─────────────────────────┬─┐┌─┬─┬─┬─┐
│左│UsedRange.Column                                  │①││  │  │  │  │
├─┼─────────────────────────┼─┤├─┌─┬─┐─┤
│右│UsedRange.Column + UsedRange.Columns.count - 1    │②││  │①│□│  │
├─┼─────────────────────────┼─┤├─├─┼─┤─┤
│上│UsedRange.Row                                     │①││  │□│②│  │
├─┼─────────────────────────┼─┤├─└─┴─┘─┤
│下│UsedRange.Row + UsedRange.Rows.count - 1          │②││  │  │  │  │
└─┴─────────────────────────┴─┘└─┴─┴─┴─┘

実際に試してみるには以下のような感じとなる。
┌──────────────────────────────────────┐
│With ActiveWorkbook.ActiveSheet.UsedRange                                   │
│    MsgBox "左上(" & .Column & "," & .Row & ")"                             │
│    MsgBox "右下(" & (.Column + .Columns.count - 1) & "," _                 │
│                & (.Row + .Rows.count - 1) & ")"                            │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/リストボックスによる入力
2014年10月09日
セルを選択した途端にリストボックスが表示され、
そこで選択した値がそのセルに格納するパターンを実現する方法。
┌──────────────────────────────────────┐
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    UserForm某.ListBox某.ControlSource = Target.Address                     │
│    UserForm某.Show                                                         │
│End Sub                                                                     │
└──────────────────────────────────────┘
「.ControlSource」ってとこに、そのセルのアドレスを指定すれば
後は、そのセルに出力してくれるっていう寸法。

でも、リストボックス側の処理でそのセルに代入するように実装した方が
使い勝手はよさそうだ。
┌──────────────────────────────────────┐
│Private Sub ListBox某_Click()                                               │
│    ActiveCell.Value = Me.ListBox某.Value                                   │
│    Unload Me                                                               │
│    ActiveCell.Offset(0, 1).Activate  ' 入力後そのセルを離れる              │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/クローズのお作法
2014年10月07日
ファイルやデータベースをオープンした後に、クローズするお作法。

エラー等でイレギュラーな終わり方をする場合でも、しっかりクローズしたいもの。

ということで、以下のような感じとなる。
┌──────────────────────────────────────┐
│    対象.Open                                                               │
├──────────────────────────────────────┤
│    GoTo l_終了                                                             │
├──────────────────────────────────────┤
│l_終了:                                                                     │
│    If 対象.State <> adStateClosed Then                                     │
│        対象.Close                                                          │
│    End If                                                                  │
│    Set 対象 = Nothing                                                      │
└──────────────────────────────────────┘
「<> adStateClosed」でクローズ済み(もしくは未オープンでないことを確認する)。
「Nothing」の代入の方は無条件で可。

できれば終了処理のところは関数化してしまった方が見栄えがいいかも。
分類:ExcelVBA
ExcelVBA/セルの移動の範囲
2014年10月06日
┌───┬───┐─┐
│◎■①│      │  │■◎①②③=データのあるところ
│■■■│      │  │④=過去にデータがあったが削除したところ
│②■■│      │  │
├───┘      │  │◎において
│        ┌──┤  │  「ctrl」+「→」  ⇒  ①  …(A)
│        │■■│  │  「ctrl」+「↓」  ⇒  ②  …(B)
│        │■③│  │  「ctrl」+「End」 ⇒  ④  …(C)
└────┴──┘  │
│                ④│#ファイルを読み込み直すと④が③に再計算される(*1)
└─────────┘

(A)起点セル.End(xlToRight).Select    ←→起点セル.End(xlToLeft).Select
(B)起点セル.End(xlDown).Select       ←→起点セル.End(xlUp).Select
(C)起点セル.SpecialCells(xlLastCell) ←→Range("A1").Select

*1:④を③に再計算させる手段としては…
    以下のように、値を使用して再計算させればよい。
┌──────────────────────────────────────┐
│変数 = シート.UsedRange.Row   ' 範囲見直しのためのダミー処理(範囲上端を取得)│
│変数 = シート.起点セル.SpecialCells(xlLastCell).Row                         │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ワークシートイベント
2014年10月05日
シートがアクティブになった場合
┌──────────────────────────────────────┐
│Private Sub Worksheet_Activate()                                            │
│    処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
値が変更になった場合
┌──────────────────────────────────────┐
│Private Sub Worksheet_Change(ByVal Target As Range)                         │
│    If Target.Row = 1 And Target.Column = 1 Then                            │
│        処理                                                                │
│    End If                                                                  │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub Worksheet_Change(ByVal Target As Range)                         │
│    If Target.Address() = "$A$1" Then                                       │
│        処理                                                                │
│    End If                                                                  │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub Worksheet_Change(ByVal Target As Range)                         │
│    If Not Intersect(Target, Range("A1")) Is Nothing Then                   │
│        処理                                                                │
│    End If                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
選択範囲が変更となった場合
┌──────────────────────────────────────┐
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    If Target.Row = 1 And Target.Column = 1 Then                            │
│        処理                                                                │
│    End If                                                                  │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    If Target.Address() = "$A$1" Then                                       │
│        処理                                                                │
│    End If                                                                  │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    If Not Intersect(Target, Range("A1")) Is Nothing Then                   │
│        処理                                                                │
│    End If                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ダブルクリックされた場合
┌──────────────────────────────────────┐
│Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _            │
│                                        Cancel As Boolean)                  │
│    If Target.Row = 1 And Target.Column = 1 Then                            │
│        処理                                                                │
│    End If                                                                  │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _            │
│                                        Cancel As Boolean)                  │
│    If Target.Address() = "$A$1" Then                                       │
│        処理                                                                │
│    End If                                                                  │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _            │
│                                        Cancel As Boolean)                  │
│    If Not Intersect(Target, Range("A1")) Is Nothing Then                   │
│        処理                                                                │
│    End If                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/区切文字で区切って値を取得する方法
2014年10月04日
例えば「前:後」の「前」のみを抽出する方法。
┌──────────────────────────────────────┐
│If InStr(値, ":") > 0 Then                                                  │
│    取得値 = Left(値, InStr(値, ":") - 1)                                   │
│Else                                                                        │
│    取得値 = 値                                                             │
│End If                                                                      │
└──────────────────────────────────────┘

これを配列にしてから抽出する方法に切り替えると以下の通り。
┌──────────────────────────────────────┐
│Dim 配列 As Variant                                                         │
│配列 = Split(値, ":")                                                      │
│If UBound(配列) > 0 Then                                                    │
│    取得値 = 配列(0)                                                        │
│Else                                                                        │
│    取得値 = 値                                                             │
│End If                                                                      │
└──────────────────────────────────────┘
「UBound(配列) > 0」の条件式は不要だが(*1)、
二番目以降で応用したい場合向けに記載してある(一番目なら本当に不要)
*1:区切文字の該当がない場合は、一つの配列に全て格納される
    よって、この場合「UBound(配列)」は「0」になり、
    「配列(0)」にもアクセスできる(エラーにはならない)
分類:ExcelVBA
ExcelVBA/文字列数値変換
2014年10月02日
基本的には「Val()」。変換できない文字列については「0」になってくれる。
┌──────────────────────────────────────┐
│数値 = Val(文字列)                                                          │
└──────────────────────────────────────┘

型変換を行うには以下の通り。
┌─────┬─────────┐
│Byte型    │数値 = CByte(数値)│
├─────┼─────────┤
│Integer型 │数値 = CInt(数値) │
├─────┼─────────┤
│Long型    │数値 = CLng(数値) │
├─────┼─────────┤
│Single型  │数値 = CSng(数値) │
├─────┼─────────┤
│Double型  │数値 = CDbl(数値) │
├─────┼─────────┤
│Currency型│数値 = CCur(数値) │
├─────┼─────────┤
│Decimal型 │数値 = CDec(数値) │
└─────┴─────────┘
但し、文字列などを変換しようとするとエラーとなってしまう。
よって、「IsNumeric()」で一旦判定する必要がある。
┌──────────────────────────────────────┐
│If IsNumeric(変換前) = True Then                                            │
│    変換後 = CInt(変換前)                                                   │
│End If                                                                      │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/「PERSONAL.XLS」のパス
2014年10月01日
イミディエイトウインドウで以下を入力すると
「PERSONAL.XLS」「PERSONAL.XLSB」のパスが確認できる
┌──────────────────────────────────────┐
│? Application.Workbooks("PERSONAL.XLS").Path                                │
├──────────────────────────────────────┤
│? Application.Workbooks("PERSONAL.XLSB").Path                               │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 2 3 次へ