MW211 EXIT

devlog
ExcelVBA/数値変換
2014年10月30日
┌──────────────────────────────────────┐
│数値か否か = IsNumber(変数)                                                 │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│数値 = Val(変数)                                                            │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ADODBの空セル
2014年10月29日
設定にもよるのだろうが、ADODBで値を代入する場合、
空のセルについて、「""」(空文字列)になるかと思いきや
「NULL(厳密にはEmpty)」になってしまう。
┌──────────────────────────────────────┐
│Private テーブル As New ADODB.Recordset                                     │
├──────────────────────────────────────┤
│テーブル.Fields("項目名").Value = Cells(y, x).Value                         │
└──────────────────────────────────────┘

これだと、NOT NULL属性の場合、エラーとなるのでその対策を考えた
「IsEmpty(Cells(y, x).Value, "")」とかで、Emptyの時に変換できたり
したらスマートなのだけど、残念ながら「IsEmpty()」はEmptyか否かの
結果を返すだけのBoolean関数なのだ。
かといって、いちいちIf文にするのもかっこ悪いし、
じゃユーザ関数作るかって考えたけど、いい案が浮かんだ。
┌──────────────────────────────────────┐
│テーブル.Fields("項目名").Value = Cells(y, x).Value & ""                    │
└──────────────────────────────────────┘
「Empty & "" = ""」なんだね。

なお、数値項目の場合は、以下でOK。
┌──────────────────────────────────────┐
│テーブル.Fields("項目名").Value = Cells(y, x).Value + 0                     │
└──────────────────────────────────────┘
「Empty + 0 = 0」なんだね。

【追記】
  文字列の場合、変数を間にかませば、NULLにはならないようだ。
┌──────────────────────────────────────┐
│Dim 変数 As String                                                          │
│変数 = Cells(y, x).Value                                                    │
│テーブル.Fields("項目名").Value = 変数                                      │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/入力イベントはマクロからのも反応します
2014年10月27日
セルのフォーカスが変わった時に
(というよりは特定のセルにフォーカスがあたった時に)
イベントを起こす、シートの関数に以下のようなものがある。
┌──────────────────────────────────────┐
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    …                                                                      │
│End Sub                                                                     │
└──────────────────────────────────────┘

これ、実は、マクロによってシートのフォーカスが変わったりした場合にも
起動してしまう。

基本手入力の捕捉なので、なんとかして欲しいものだと思う。

で、その回避方法。
「Application.EnableEvents」を無効にして、本関数自体が呼ばれないようにする。

イメージとしては以下のような感じ。
┌──────────────────────────────────────┐
│Application.EnableEvents = False                                            │
├──────────────────────────────────────┤
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    …                                                                      │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Application.EnableEvents = True                                             │
└──────────────────────────────────────┘
あくまでイメージ
┌──────────────────────────────────────┐
│Application.EnableEvents = False                                            │
│Call Worksheet_SelectionChange()                                            │
│Application.EnableEvents = True                                             │
└──────────────────────────────────────┘
上記とかだったらわかりやすいのだが、いかんせん「Worksheet_SelectionChange」は
どのタイミングで呼ばれるか未確定なのだ。

ということで、イベントが起きそうな前後で、「Application.EnableEvents」を
切り替えてあげればよい。
→なお、最後に有効にしないと手入力イベントも捕捉できなくなるので注意
分類:ExcelVBA
Excel/マクロショートカットの状況
2014年10月25日
Excelマクロのオプションでショートカットキーを割り当てたものの
何を割り当てたか忘れてしまった場合。

ソースコードを出力すると、ショートカットキーの割り当て状況がわかる。

例えば以下のようなマクロに「Ctrl+q」を割り当てた場合…。
┌──────────────────────────────────────┐
│Sub マクロ名()                                                              │
│    処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘

以下のように、関数の先頭に一行追加されるのだ。
┌──────────────────────────────────────┐
│Sub マクロ名()                                                              │
│Attribute マクロ名.VB_ProcData.VB_Invoke_Func = "q\n14"                 ←これ
│    処理                                                                    │
│End Sub                                                                     │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/With句で自分を指したい場合
2014年10月14日
Q.With句で、パスにおける「.」みたいに自分を指す記号的なものはないか?
A.「.Offset(0, 0)」。
    以下は同じとなる。
┌──────────────────────────────────────┐
│With Selection.Cells(1, 1)                                                  │
│    .Offset(0, 0).Value = "値"                                              │
│End With                                                                    │
├──────────────────────────────────────┤
│With Selection.Cells(1, 1)                                                  │
│    .Value = "値"                                                           │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
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
前へ 1 … 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 次へ