MW211 EXIT

devlog
VC#/textBoxの縦幅を拡大する
2018年07月06日
既定では一行なので、複数行OKに変更すればよい。
┌──────────┐
│動作                │
│┌─────┬───┤
││Multiline │True  │(←False)
└┴─────┴───┘
分類:VC#
SQL/親子表と外部キーの関係
2018年07月05日
以下の関係になる。
┌ 子表 ────────┐┌ 親表 ──┐
│┌───┐┌────┐││┌───┐│
││主キー││外部キー├──┤主キー││
│└───┘└────┘││└───┘│
│                      │└─────┘
│                      │┌ 親表 ──┐
│          ┌────┐││┌───┐│
│          │外部キー├──┤主キー││
│          └────┘││└───┘│
└───────────┘└─────┘
分類:SQL
Oracle/プレースホルダのもう一つの利点
2018年07月04日
プレースホルダを使用する利点はSQLインジェクション対策以外に
SQL文の画一化により解析を共有できるという点もあるよ。

以下は別ものとして解析されてしまうが…
・「SELECT * FRON 表 WHERE 列 = 1」
・「SELECT * FRON 表 WHERE 列 = 2」

以下にすれば、一つとして解析されて実績も増えるよということ。
・「SELECT * FRON 表 WHERE 列 = %」
分類:Oracle
ExcelVBA/続・セル選択イベントを一つのセルで
2018年07月03日
┌──────────────────────────────────────┐
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    If Target.CountLarge <> 1 Then                                          │
│        Exit Sub                                                            │
│    End If                                                                  │
│    If Target.Column = 対象列番号 Then                                      │
│        Call イベント                                                       │
│    End If                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
だと、セル結合された一塊を選択した場合にはじかれてしまう。

上記を克服したものは以下である。
┌──────────────────────────────────────┐
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    If Target.CountLarge <> Target(1).MergeArea.Count Then                  │
│        Exit Sub                                                            │
│    End If                                                                  │
│    If Target.Column = 対象列番号 Then                                      │
│        Call イベント                                                       │
│    End If                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
全体の選択数と左上のセル結合数が一致した場合にのみイベント発動としている。
セル結合がないひとつのセルを選択した場合には「1=1」でイベントう発動。
分類:ExcelVBA
ExcelVBA/セル選択イベントを一つのセルで
2018年07月02日
セル選択に伴いイベントを駆動するには以下のような形になる。
┌──────────────────────────────────────┐
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    If Target.Column = 対象列番号 Then                                      │
│        Call イベント                                                       │
│    End If                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘

但し「Target」はセル範囲なので、一つのセルとは限らない。

セルが一つの場合に限定するには、「.CountLarge」の値を見る。
┌──────────────────────────────────────┐
│Private Sub Worksheet_SelectionChange(ByVal Target As Range)                │
│    If Target.CountLarge <> 1 Then                                          │
│        Exit Sub                                                            │
│    End If                                                                  │
│    If Target.Column = 対象列番号 Then                                      │
│        Call イベント                                                       │
│    End If                                                                  │
│End Sub                                                                     │
└──────────────────────────────────────┘
なお、旧バージョン(.xls)では「.Count」というのがあったが
新バージョン(.xlsm)対応の「.CountLarge」を使った方がよい。
(さもないとず~っと右端のセルを選択した場合にはオーバフローでエラーとなる)
分類:ExcelVBA
ExcelVBA/二次元配列の行抽出
2018年07月01日
セル範囲を二次元配列に格納して、特定の列の特定の値の行のみ抽出する関数。
もっとスマートな方法がありそうだが。
┌──────────────────────────────────────┐
│Private Function 二次元配列行抽出(ByVal 入力配列 As Variant, _              │
│                                  ByVal x抽出 As Long, _                    │
│                                  ByVal 値 As String) As Variant            │
│    Dim 出力配列 As Variant                                                 │
│    Dim y出力 As Long, y入力 As Long, x As Long                             │
│    ' 該当件数調査                                                          │
│    y出力 = 0                                                               │
│    For y入力 = LBound(入力配列, 1) To UBound(入力配列, 1)                  │
│        If 入力配列(y入力, x抽出) = 値 Then                                 │
│            y出力 = y出力 + 1                                               │
│        End If                                                              │
│    Next y入力                                                              │
│    ' 該当なしの場合は空の一行を返却                                        │
│    If y出力 = 0 Then                                                       │
│        ReDim 出力配列(1, 1 To UBound(入力配列, 2))                         │
│        二次元配列行抽出 = 出力配列                                         │
│        Exit Function                                                       │
│    End If                                                                  │
│    ' 抽出                                                                  │
│    ReDim 出力配列(1 To y出力, 1 To UBound(入力配列, 2))                    │
│    y出力 = 0                                                               │
│    For y入力 = LBound(入力配列, 1) To UBound(入力配列, 1)                  │
│        If 入力配列(y入力, x抽出) = 値 Then                                 │
│            y出力 = y出力 + 1                                               │
│            For x = LBound(入力配列, 2) To UBound(入力配列, 2)              │
│                出力配列(y出力, x) = 入力配列(y入力, x)                     │
│            Next x                                                          │
│        End If                                                              │
│    Next y入力                                                              │
│    二次元配列行抽出 = 出力配列                                             │
│End Function                                                                │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/配列とOption Base
2018年06月30日
┌──────────────────────────────────────┐
│Dim 配列(2)    '=配列(0 To 2)  =配列(0)と配列(1)と配列(2)  ※配列数3      │
└──────────────────────────────────────┘
VBAの配列定義はくせがあって上記のように配列定義と配列数が一致しない。

┌──────────────────────────────────────┐
│Option Base 0  ' 既定                                                       │
│Dim 配列(2)    '=配列(0 To 2)  =配列(0)と配列(1)と配列(2)                 │
├──────────────────────────────────────┤
│Option Base 1                                                               │
│Dim 配列(2)    '=配列(1 To 2)  =配列(1)と配列(2)                          │
└──────────────────────────────────────┘
「Option Base 1」を最初に宣言すると、1オリジンで、
配列定義=配列数=最大配列添字とすることができる。

なお、セル範囲を配列化した場合は1オリジンなのでこちらと同じになる。

いずれにせよ、C系定義と違いがあるので注意。
分類:ExcelVBA
ExcelVBA/セル範囲と二次元配列
2018年06月29日
特定のセル範囲を配列に格納し、それを特定のセルを左上として貼り付ける処理。
┌──────────────────────────────────────┐
│Dim 配列 As Variant                                                         │
│配列 = セル範囲                                                             │
│セル.Resize(UBound(配列, 1), UBound(配列, 2)) = 配列                        │
└──────────────────────────────────────┘
UBound()の第二引数は次元数を指し、
この場合一次元目がY座標、二次元目がX座標となる。

あっ、だからCells()の引数が(一般的なものと反対の)Y→Xの順なんだろうか。
分類:ExcelVBA
ExcelVBA/ActiveXコントロールのイベント抑止
2018年06月28日
イベント自体の抑止はできないようなので(「Enabled=False」とかでも発生)、
イベント内でフラグ等で制御する他ないようだ。

まず、肝心のシートイベントにて、以下のように設定する。
┌──────────────────────────────────────┐
│Public mIsイベント抑止 As Boolean                                           │
├──────────────────────────────────────┤
│Private Sub ComboBox表示行数_Change()                                       │
│    If mIsイベント抑止 Then                                                 │
│        Exit Sub                                                            │
│    End If                                                                  │
│    Call 処理実行                                                           │
│End Sub                                                                     │
└──────────────────────────────────────┘
グローバル変数でも構わないが、せっかくなのでシートのメンバ変数で制御する。

初期化については、コンストラクタ的なものの記載を試みてもよいかもしれないが
ブックイベントがあるので「ThisWorkbook.cls」の初期化処理にて行う。
┌──────────────────────────────────────┐
│Private Sub Workbook_Open()                                                 │
│    シート.mIsイベント抑止 = False                                          │
│End Sub                                                                     │
└──────────────────────────────────────┘

後は、マクロ処理にて、事前にイベント抑止を宣言してから値を変更してあげればよい。
┌──────────────────────────────────────┐
│    With シート                                                             │
│        .mIsイベント抑止 = True                                             │
│        .ComboBox表示行数.ListIndex = インデックス                          │
│        Call 処理実行                                                       │
│        .mIsイベント抑止 = False                                            │
│    End With                                                                │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/列挙型と関数の名前の衝突
2018年06月27日
列挙型と関数では名前が衝突してしまう。
以下のようなエラーが出る。
┌────────────────┐
│コンパイルエラー:               │
│名前が適切ではありません: テスト│
└────────────────┘
以下のような場合にエラーとなるのだ。
┌──────────────────────────────────────┐
│Enum 列挙型                                                                 │
│    テスト                                                                  │
│End Enum                                                                    │
├──────────────────────────────────────┤
│Sub テスト()                                                                │
│    ' 実行するとエラーが出る                                                │
│End Sub                                                                     │
└──────────────────────────────────────┘
一方がPublicなら他方がPrivateでも衝突。
Private同士でも同じスコープに同居したら衝突となる。

但し、シートに関数を記述した場合には大丈夫。
→シート配下の関数となるので衝突が回避できる。

同じくフォームに関数を記述した場合でも大丈夫。
→フォーム配下の関数となるので衝突が回避できる。

もちろんクラス配下のメソッドの場合でも大丈夫。
→クラス(インスタンス)配下の関数となるので衝突が回避できる。

つまり、「.bas」にある関数との衝突に気をつければよい。
分類:ExcelVBA
前へ 1 … 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 … 156 次へ