MW211 EXIT

devlog
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
DOSコマンド/ファイルがあるか?
2014年10月13日
複雑なツリー構造の残骸が残った場合、不要だから削除したいんだけど、
本当にその中にファイルが混じってないか不安な時がある。

そういう時にファイルを検索するコマンド。
┌──────────────────────────────────────┐
│>dir /b/s/a-d                                                               │
│ファイルが見つかりません                                                    │
└──────────────────────────────────────┘
分類:Windows
SQL/一意性制約とNULL
2014年10月12日
主キー(PRIMARY KEY)制約は、非ヌル(NOT NULL)制約と一意性(UNIQUE)制約を
組み合わせたもので、普段はこれを使っているかあまり意識しないかもしれないが
一意性制約のみの場合、NULLの扱いはどうなるのか?という話。

実はRDBMSにより違ってくる

(1) NULLは一意性制約の対象外とみなす方式(MySQL、PostgreSQLなど)
→NULL以外が重複しなければNULLはいくらでも重複できる

(2) NULLも一意性制約の対象内とみなす方式(MSSQLなど)
→NULLは認めるが、一つしか認めない(複数あれば重複とみなす)

NULLはNULLと一致しない(「= NULL」ではなく「IS NULL」で判定)ものの
重複という点では見解が異なるようだ

ちなみに(1)で複合キーの場合、NULLが含まれていれば全体的にNULLとみなされるので
重複が可能となる点にも注意。(例えば「1,NULL」と「1,NULL」は重複できる)
分類:SQL
Excel/セル番号非表示
2014年10月11日
Excel特有の上と左に表示される行列番号の表示をなくす方法。

Excel2010にて

Excelのオプション→詳細設定
┌──────────────────────────────────────┐
│次のシートで作業するときの表示設定  [シート名]                              │
│□行列番号を表示する                                                        │
└──────────────────────────────────────┘

Excelのオプションって、Excel共通化とおもったけど、
シート毎の設定もできるんだ。

これでExcelシートっぽさを消せてしまう。
というか、そういうのをつかまされた時の防衛策として覚えておいた方がよいかも。

ちなみにVBAマクロだとこんな感じになる。
┌──────────────────────────────────────┐
│ActiveWindow.DisplayHeadings = False                                        │
└──────────────────────────────────────┘
分類:Excel
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
前へ 1 … 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 … 156 次へ