MW211 EXIT

devlog
ExcelVBA/xlLastCellとxlCellTypeLastCell
2018年11月22日
セルの末尾を表す以下の二つ、いずれも値は「11」で同じである
・「xlLastCell」
・「xlCellTypeLastCell」
分類:ExcelVBA
ExcelVBA/印刷範囲参照でエラーの克服方法
2018年11月21日
印刷範囲「シート.HPageBreaks」を参照した場合に
「実行時エラー'9' インデックスが有効範囲にありません」という
エラーが発生する場合がある。

主に印刷範囲が広い時に発生するようだ。

これはExcelのバグのようなものらしい。

解決策としては、参照前に
  (a) 当該セルの末尾(右下)に移動する
  (b) それを描画する
という二つの条件を満たせばいいとのこと

つまり、こんな感じにすればよい。
┌──────────────────────────────────────┐
│Application.ScreenUpdating = True                                     ' 描画│
│Application.GoTo シート.Cells(1, 1).SpecialCells(xlCellTypeLastCell)  ' 移動│
│' そして、シート.HPageBreaksを参照                                          │
└──────────────────────────────────────┘
分類:ExcelVBA
MSSQL/入力データの順番を出力データに反映させる方法
2018年11月20日
┌──────────────────┬┬──────────────────┐
│            ×ダメな例×            ││             ○いい例○             │
├──────────────────┼┼──────────────────┤
│INSERT INTO [出力D] (              ││INSERT INTO [出力D] (              │
│        [出力ID],                   ││        [出力ID],                   │
│        [データ]                    ││        [データ]                    │
│    )                               ││    )                               │
│    SELECT ISNULL(                  ││    SELECT ROW_NUMBER() OVER(       │
│               (SELECT MAX([出力ID])││               ORDER BY [出力ID] ASC│
│                    FROM [出力]),   ││           ) AS [出力ID]            │
│               0                    ││                                    │
│           ) + 1 AS [出力ID],       ││                                    │
│           [データ]                 ││           [データ]                 │
│        FROM [入力D]               ││        FROM [入力D];              │
│        ORDER BY [入力ID] ASC;      ││                                    │
└──────────────────┴┴──────────────────┘
  左記の例は、一件ずつやる分に問題ない(トリガなどで)。
  だが、まとめてとなると「SELECT MAX([出力ID]) FROM [出力]」は
  初期の値が全件に対して(二件目以降も)適用される。
  なので、「ROW_NUMBER()」を用いる必要がある。

  なお、出力データに既存のレコードがある場合には、複合した以下となる。
┌──────────────────────────────────────┐
│INSERT INTO [出力D] (                                                      │
│        [出力ID],                                                           │
│        [データ]                                                            │
│    )                                                                       │
│    SELECT ISNULL((SELECT MAX([出力ID]) FROM [出力]), 0)                    │
│             + ROW_NUMBER() OVER(ORDER BY [出力ID] ASC) AS [出力ID]         │
│           [データ]                                                         │
│        FROM [入力D];                                                      │
└──────────────────────────────────────┘
分類:MSSQL
ExcelVBA/印刷範囲内をループ
2018年11月13日
範囲内をただループするだけなら以下。
┌──────────────────────────────────────┐
│Dim y As Long                                                               │
│With シート                                                                 │
│    With Range(.PageSetup.PrintArea)                                        │
│        For y = 1 To .Rows.Count                                            │
│            .Cells(y, 1).Interior.Color = RGB(255, 255, 0)                  │
│        Next y                                                              │
│    End With                                                                │
│End With                                                                    │
└──────────────────────────────────────┘

セル座標から制御する場合には以下。
┌──────────────────────────────────────┐
│Dim y As Long                                                               │
│Dim 開始行 As Long, 終了行 As Long                                          │
│With シート                                                                 │
│    With Range(.PageSetup.PrintArea)                                        │
│        開始行 = .Rows.Row                                                  │
│        終了行 = 開始行 + .Rows.Count - 1                                   │
│    End With                                                                │
│    For y = 開始行 To 終了行                                                │
│        .Cells(y, 1).Interior.Color = RGB(255, 255, 0)                      │
│    Next y                                                                  │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/Application.Goto
2018年11月12日
【1】任意のシートに飛ぶ
┌──────────────────────────────────────┐
│Application.Goto Reference:=シート.Cells(1, 1)                              │
├──────────────────────────────────────┤
│Application.Goto シート.Cells(1, 1)                                         │
└──────────────────────────────────────┘
  任意のシートの任意のセルへ飛ぶ。
  飛んだ後の画面表示としては、当該セルが表示される(が末尾に表示される)

【2】任意のシートに飛び左上に位置付ける
┌──────────────────────────────────────┐
│Application.Goto Reference:=シート.Cells(1, 1), Scroll:=True                │
├──────────────────────────────────────┤
│Application.Goto シート.Cells(1, 1), True                                   │
└──────────────────────────────────────┘
  任意のシートの任意のセルへ飛ぶ。
  飛んだ後の画面表示としては、当該セルが左上に位置付く(そこまでスクロールする)。

【3】ソースコードを表示する
┌──────────────────────────────────────┐
│Application.Goto Reference:="関数名"                                        │
├──────────────────────────────────────┤
│Application.Goto "関数名"                                                   │
└──────────────────────────────────────┘
  VBE(Visual Basic Editor)を起動し、当該関数のソースコードを表示する。
分類:ExcelVBA
Excel/参照先シートの並び替えに連動させたい
2018年11月09日
Sheet2が以下の場合…
┌─┬─┐
│  │A │
├─┼─┤
│ 1│ a│
├─┼─┤
│ 2│ b│
└─┴─┘
Sheet1なんかに以下のような数式を設定する。
┌─┬─────┐  ┌─┬─┐
│  │    A     │  │  │A │
├─┼─────┤  ├─┼─┤
│ 1│=Sheet2!A1│→│ 1│ a│
├─┼─────┤  ├─┼─┤
│ 2│=Sheet2!A2│  │ 2│ b│
└─┴─────┘  └─┴─┘
そこで、Sheet2を並び替える。
┌─┬─┐
│  │A │
├─┼─┤
│ 1│ b│
├─┼─┤
│ 2│ a│
└─┴─┘
すると、Sheet1も連動して並び替えて欲しいところが
律儀に参照先を維持してくれるので数式が書き替わって結果的に並び替えが効かない。
┌─┬─────┐  ┌─┬─┐
│  │    A     │  │  │A │
├─┼─────┤  ├─┼─┤
│ 1│=Sheet2!A2│→│ 1│ a│
├─┼─────┤  ├─┼─┤
│ 2│=Sheet2!A1│  │ 2│ b│
└─┴─────┘  └─┴─┘
ではどうやって並び替えを反映させるか?
絶対参照の「$」は効かない(同じ結果になる)。

INDIRECT()関数を使えばよい。
┌─┬───────────┐  ┌─┬─┐
│  │          A           │  │  │A │
├─┼───────────┤  ├─┼─┤
│ 1│=INDIRECT("Sheet2!A1")│→│ 1│ a│
├─┼───────────┤  ├─┼─┤
│ 2│=INDIRECT("Sheet2!A2")│  │ 2│ b│
└─┴───────────┘  └─┴─┘
これならSheet2がどうなろうが(並び替えしようが)、参照先は固定される。

なお、「=INDIRECT(Sheet2!A1)」みたいに引数に参照先を直接指定してはダメ。
「"」で囲んで文字列扱いとして指定する必要がある。
分類:Excel
ExcelVBA/列幅自動調整
2018年11月06日
以下のように列幅を自動調整することができる。
┌──────────────────────────────────────┐
│With シート                                                                 │
│    With .Range(.Columns(1), .Columns(9))                                   │
│        .AutoFit                                                            │
│    End With                                                                │
│End With                                                                    │
└──────────────────────────────────────┘

但し、非表示の列があった場合には、表示になってしまう。
そこでそれを考慮した場合には以下のようになる。
┌──────────────────────────────────────┐
│Dim x As Long                                                               │
│With シート                                                                 │
│    For x = 1 To 9                                                          │
│        With .Columns(x)                                                    │
│            If .Hidden = False Then                                         │
│                .AutoFit                                                    │
│            End If                                                          │
│        End With                                                            │
│    Next x                                                                  │
│End With                                                                    │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/For Each文で値は変更できない
2018年11月03日
┌──────────────────────────────────────┐
│Dim 配列 As Variant, 要素 As Variant                                        │
│For Each 要素 In 配列                                                       │
│   MsgBox 要素                                                              │
│Next 要素                                                                   │
└──────────────────────────────────────┘
For Each文は上記のように値を参照できるのだが、
以下のように値を代入したりはできない。
┌──────────────────────────────────────┐
│Dim 配列 As Variant, 要素 As Variant                                        │
│For Each 要素 In 配列                                                       │
│   要素 = "値を変更"                                                        │
│Next 要素                                                                   │
│For Each 要素 In 配列                                                       │
│   MsgBox 要素                                                              │
│Next 要素                                                                   │
└──────────────────────────────────────┘
上記における変数「要素」は一時変数のようなもので、
次から次へと配列の要素が上書されるので、値を変えても効果はない。

PHPではアドレス参照にする方法もあるが、ExcelVBAではそれがないので
もしも値を変えたい場合には、スカラ配列ならばFor文でループする。
┌──────────────────────────────────────┐
│Dim 配列 As Variant, 要素 As Variant                                        │
│Dim i As Long                                                               │
│For i = LBound(配列) To UBound(配列)                                        │
│   配列(i) = "z"                                                            │
│Next i                                                                      │
│For Each 要素 In 配列                                                       │
│   MsgBox 要素                                                              │
│Next 要素                                                                   │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/枠線を消すマクロ
2018年11月02日
リボンメニュー「表示」の(「表示」の部にある)「■枠線」のチェックをはずすと
枠線が消えるがそれをマクロで実行する方法。

以下のようにすればチェックがはずれる。
┌──────────────────────────────────────┐
│ActiveWindow.DisplayGridlines = False                                       │
└──────────────────────────────────────┘

しかしながら、これはシートを指定しての実行はできない。
┌──────────────────────────────────────┐
│シート.DisplayGridlines = False                                             │
└──────────────────────────────────────┘

任意のシートにて実行したい場合には、以下のようにそのシートへ移動してから
実行するしかないようだ。
┌──────────────────────────────────────┐
│Application.GoTo シート.Cells(1, 1)                                         │
│ActiveWindow.DisplayGridlines = False                                       │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/フィルタリングと非表示
2018年11月01日
┌──────────────────────────────────────┐
│Dim yMax As Long, y As Long                                                 │
│With ActiveSheet                                                            │
│    yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row                       │
│    MsgBox yMax                                                             │
│    For y = 2 To yMax                                                       │
│        MsgBox .Cells(y, 1).Value                                           │
│    Next y                                                                  │
│End With                                                                    │
└──────────────────────────────────────┘
  上記のようなシートを走査する処理にて、
  実際のシート(の行)が非表示でも影響は受けない。

  フィルタリングによる非表示も、非表示化による非表示も同じ(影響なし)。
分類:ExcelVBA
前へ 1 … 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 … 156 次へ