MW211 EXIT

devlog
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
ExcelVBA/引数の参照渡しと値渡し
2014年09月30日
なんと、VBAでは「参照渡し」がデフォルトなのだ。要注意。

【参照渡し(アドレス渡し)】(既定)
┌──────────────────────────────────────┐
│Sub 関数(引数)                                                              │
│    処理                                                                    │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Sub 関数(ByRef 引数)                                                        │
│    処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
→指定した引数が、関数内の処理により影響を受ける。(速度が速い)

【値渡し】
┌──────────────────────────────────────┐
│Sub 関数(ByVal 引数)                                                        │
│    処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
→指定した引数が、関数内の処理により影響を受けない。

ちなみに、以下のように実験してみたところ、結果は「参照渡し」が出力された。
つまり、既定(指定なし)は、参照渡しということが確認できる。
┌──────────────────────────────────────┐
│Sub 実験()                                                                  │
│    Dim 変数 As String                                                      │
│    変数 = "値渡し"                                                         │
│    Call サブ関数(変数)                                                     │
│    MsgBox 変数                                                             │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Sub サブ関数(変数 As String)                                                │
│    変数 = "参照渡し"                                                       │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/With句で自身を表すメタ文字はない?
2014年09月29日
┌──────────────────────────────────────┐
│Me.StartUpPosition = 2                                                      │
│Unload Me                                                                   │
└──────────────────────────────────────┘
例えば上記のような場合、下位のようにWith句でまとめたとする。
┌──────────────────────────────────────┐
│With Me                                                                     │
│    .StartUpPosition = 2                                                    │
│    Unload Me                                                               │
│End With                                                                    │
└──────────────────────────────────────┘
ただこれだと、まだ「Unload Me」の「Me」とWith句の「Me」が
かぶっているのでもう少し整理したい気がする(このままでも動くが)。
で、パス指定における「Unload .」的な感じにできないか?と思うのだが
そのようなものはないようだ。
ま、無理やりWith句にまとめんなという話だわな。
分類:ExcelVBA
ExcelVBA/フォームの表示位置指定
2014年09月28日
「UserForm_Initialize()」にて、フォームの初期表示位置を以下のように設定する。
┌───────────┬──────────────────────────┐
│Me.StartUpPosition = 0│任意                                                │
│       Me.Top  = Y座標│                                                    │
│       Me.Left = X座標│                                                    │
├───────────┼──────────────────────────┤
│Me.StartUpPosition = 1│フォームが属する項目の中央                          │
├───────────┼──────────────────────────┤
│Me.StartUpPosition = 2│画面全体の中央                                      │
├───────────┼──────────────────────────┤
│Me.StartUpPosition = 3│画面全体の左上                                      │
└───────────┴──────────────────────────┘

任意指定の場合、座標は以下のような感じで指定する。
┌──┬───────────────────────────────────┐
│縦上│Me.Top = Application.Top                                              │
│縦中│Me.Top = Application.Top + ((Application.Height - Me.Height) / 2)     │
│縦下│Me.Top = Application.Top - Application.Height - Me.Height             │
├──┼───────────────────────────────────┤
│横左│Me.Left = Application.Left                                            │
│横中│Me.Left = Application.Left + ((Application.Width - Me.Width) / 2)     │
│横右│Me.Left = Application.Left + Application.Width - Me.Width             │
└──┴───────────────────────────────────┘
もちろんダイレクトに座標を数値で代入しても可。
分類:ExcelVBA
ExcelVBA/シートの表示位置指定
2014年09月27日
左上に表示したいセルを以下のように指定する。
┌──────────────────────────────────────┐
│ActiveWindow.ScrollRow = セルのY座標                                        │
│ActiveWindow.ScrollColumn = セルのX座標                                     │
└──────────────────────────────────────┘

例えば、セルB2を左上に表示する場合には、以下のようになる。
┌──────────────────────────────────────┐
│ActiveWindow.ScrollRow = 2                                                  │
│ActiveWindow.ScrollColumn = 3                                               │
└──────────────────────────────────────┘
分類:ExcelVBA
前へ 1 … 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 … 156 次へ