MW211 EXIT

devlog
Windowsバッチ/set変数の削除
2015年07月21日
┌──────────────────────────────────────┐
│>set 変数 = 値                                                              │
└──────────────────────────────────────┘
うっかり意図しない変数を環境変数として設定してしまった場合…。
┌──────────────────────────────────────┐
│>set                                                                        │
│変数=値                                                                     │
└──────────────────────────────────────┘

削除するには、右辺が空の「set」コマンドを再度実行してやればよい。
┌──────────────────────────────────────┐
│>set 変数 =                                                                 │
└──────────────────────────────────────┘
分類:Windows
Excel/図形など
2015年07月20日
Excelにおける図形等の主な種類は以下の通り
┌──────────┬───────┬───────────────────┐
│図                  │図ツール      │単なる画像ファイル                    │
├──────────┼───────┼───────────────────┤
│図形(オートシェイプ)│描画ツール    │編集可能な図形                        │
├──────────┼───────┼───────────────────┤
│フォームコントロール│描画ツール(*1)│マクロを紐づけ可能なボタン等          │
├──────────┼───────┼───────────────────┤
│ActiveXコントロール │描画ツール    │イベント処理を設定可能なボタン等      │
└──────────┴───────┴───────────────────┘
  *1:設定した直後のみデザインモードで選択可
分類:Excel
ExcelVBA/選択中のシートを制御する
2015年07月19日
選択中のシート群は「ActiveWindow.SelectedSheets」で指定できる。
(おなじみの「ActiveWorkbook」ではないので注意)

以下のような感じでワークシート型に落とし込める。
┌──────────────────────────────────────┐
│Dim theSheet As Worksheet                                                   │
│For Each theSheet In ActiveWindow.SelectedSheets                            │
│    MsgBox theSheet.Name                                                    │
│Next theSheet                                                               │
└──────────────────────────────────────┘
件数は「ActiveWindow.SelectedSheets.Count」で取得できる。

なお、上記で「theSheet.Index」で取得できる値は、
あくまで当該ブック中のインデックス番号なので
「選択している中で何件目」という値とは一致しない。
(インデックス番号「2と3」を選択した場合は、「1と2」ではなく「2と3」となる)

何件目を取得するには、「theSheet」では既に個々のワークシートに
落とし込まれているので、そこから辿ることは不可能なようで
別途、カウンタでも横に置いて把握するしかないようだ。

一方、以下のようにダイレクトに配列として使用することもできる。
┌──────────────────────────────────────┐
│MsgBox ActiveWindow.SelectedSheets(1).Name                                  │
└──────────────────────────────────────┘
こちらは、「選択している中で何件目」を指定する。(1オリジン)
分類:ExcelVBA
TortoiseSVN/差分をログ出力
2015年07月14日
「trunk」と「branches」の両方に同じ改造を行う場合、
それが正しく反映されているか確認するには、それぞれの差分を出して
その差分同士でさらに差分をとればよい。

で、差分の出し方。
diffツールに出したのではその後が続かないので、ログ出力せねばならない。

以下は、リビジョン2における改造をクリップボードに吐き出した場合の例。
(リポジトリのURLは「file:///C:/SVN」の部分)
┌──────────────────────────────────────┐
│svn diff -r 1:2 file:///C:/SVN | clip                                       │
└──────────────────────────────────────┘

但し、シフトJISが既定値なのでUTF-8(の日本語文字)が混じっていると
文字化けしてしまう。(別途対応が必要)
分類:SVN
ExcelVBA/シートの範囲(全体)
2015年07月12日
シート全体の有効範囲を得る方法。

まず以下が考えられる。
┌──────────────────────────────────────┐
│With シート                                                                 │
│    xMax = .Range("A1").CurrentRegion.Columns.Count                         │
│    xMax = .Range("A1").CurrentRegion.Rows.Count                            │
│End With                                                                    │
└──────────────────────────────────────┘
でもこれだと、途中に空欄の境目があった場合、そこまでで途切れてしまう。

なので、「Ctrl+End」を再現して代用していた。
┌──────────────────────────────────────┐
│With シート                                                                 │
│    yMax = .UsedRange.Row  ' ダミー処理                                     │
│    xMax = .Cells(1, 1).SpecialCells(xlLastCell).Column                     │
│    yMax = .Cells(1, 1).SpecialCells(xlLastCell).Row                        │
│End With                                                                    │
└──────────────────────────────────────┘
但し、この場合は、末尾の空欄(かつて何か入力していて、それを削除した場合)も
拾ってしまっていたので、「.UsedRange.Row」というダミー処理も噛ましていた。

しかし、以下が正解だったようだ。
┌──────────────────────────────────────┐
│With シート                                                                 │
│    With .UsedRange                                                         │
│        xMax = .Columns(.Columns.Count).Column                              │
│        yMax = .Rows(.Rows.Count).Row                                       │
│    End With                                                                │
│End With                                                                    │
├──────────────────────────────────────┤
│With シート                                                                 │
│    xMax = .UsedRange.Columns(.UsedRange.Columns.Count).Column              │
│    yMax = .UsedRange.Rows(.UsedRange.Rows.Count).Row                       │
│End With                                                                    │
└──────────────────────────────────────┘
「.Rows.Count」だけだと、左上に空欄があった場合に
それを除外して算出してしまっていたが、
これを「.Rows(.Rows.Count).Row」とすることにより、絶対座標を得ることができた。

ちなみに、全て空欄の場合は「x=1,y=1」を返却する。
分類:ExcelVBA
ExcelVBA/「.Insert」メソッドの注意点
2015年07月11日
「.Insert」メソッドを使って、単純に行とかを挿入しようとしたら、
なぜかなんか値とか背景色とか挿入されてしまった。

「.Insert」メソッドは「挿入」ではなく「コピーしたセルの挿入」なのだ。

ということで、単純な「挿入」にするには、
直前でコピーバッファをクリアしてあげればよい。
で、その方法は以下の通り。
┌──────────────────────────────────────┐
│Application.CutCopyMode = False                                             │
└──────────────────────────────────────┘
分類:注意、ExcelVBA
MSSQL/ピボット表
2015年07月10日
こんな感じ。
┌──────────────────────────────────────┐
│SELECT ISNULL(CONVERT(varchar, [群]), '計') AS [群],                        │
│       ISNULL([縦]                  , '計') AS [縦],                        │
│       SUM([横1])   AS [横1],                                             │
│       SUM([横2])   AS [横2],                                             │
│       SUM([横3])   AS [横3],                                             │
│       SUM([計])  AS [計]                                                   │
│    FROM (                                                                  │
│        SELECT [群],                                                        │
│               [縦],                                                        │
│               [横1],                                                      │
│               [横2],                                                      │
│               [横3],                                                      │
│               ([横1] + [横2] + [横3]) AS [計]                           │
│            FROM [表]                                                       │
│                PIVOT (COUNT([ID])                                          │
│                           FOR [区分]                                       │
│                           IN ([横1],[横2],[横3])) AS [ピボット]         │
│        UNION ALL                                                           │
│        SELECT [群D].[群],                                                 │
│               [縦D].[縦],                                                 │
│               NULL                  AS [横1],                             │
│               NULL                  AS [横2],                             │
│               NULL                  AS [横3],                             │
│               NULL                  AS [計]                                │
│            FROM (                                                          │
│                SELECT DISTINCT [群]                                        │
│                    FROM [表]                                               │
│            ) AS [群D]                                                     │
│                CROSS JOIN (                                                │
│                    SELECT DISTINCT [縦]                                    │
│                        FROM [表]                                           │
│                ) AS [縦D]                                                 │
│    ) AS [ピボットD]                                                       │
│    GROUP BY GROUPING SETS (                                                │
│                 (),                                                        │
│                 ([縦]),                                                    │
│                 ([群]),                                                    │
│                 ([群],[縦])                                                │
│             )                                                              │
│    ORDER BY [群] ASC,                                                      │
│             [縦] ASC;                                                      │
└──────────────────────────────────────┘
こんな結果になる(はず)。
┌──┬──┬──┬──┬──┬──┐
│ 群 │ 縦 │横1│横2│横3│ 計 │
├──┼──┼──┼──┼──┼──┤
│    │    │    │    │    │    │
│    ├──┼──┼──┼──┼──┤
│    │    │    │    │    │    │
│    ├──┼──┼──┼──┼──┤
│    │ 計 │    │    │    │    │
├──┼──┼──┼──┼──┼──┤
│ 計 │ 計 │    │    │    │    │
└──┴──┴──┴──┴──┴──┘
分類:MSSQL
ExcelVBA/進捗表示
2015年07月09日
進捗状況を確認したい場合、いちいちメッセージダイアログを開くと
閉じる作業が必要になり、全然自動化じゃなくなってしまう。

そこで、ステータスバーに出しまくるという方法を使うと便利。
┌──────────────────────────────────────┐
│Application.StatusBar = "メッセージ"                                        │
└──────────────────────────────────────┘

上書しまくりOKで、最後にメッセージを消去したい場合には、以下の様にする。
┌──────────────────────────────────────┐
│Application.StatusBar = False                                               │
└──────────────────────────────────────┘

なお、処理が重くなると、表示も固まってしまいがちなので
こういった場合は「DoEvents」と併用した方がよいようだ。
┌──────────────────────────────────────┐
│DoEvents                                                                    │
│Application.StatusBar = "メッセージ"                                        │
└──────────────────────────────────────┘
分類:ExcelVBA
MSSQL/列間の部分一致検索
2015年07月07日
LIKE演算子による部分一致判定を、列間で実行する場合。

意外に単純、'%'を文字列として結合してあげればよい。

列大が列小を内包しているもののみ抽出(部分一致検索)
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE 列大 LIKE '%' + 列小 + '%';                                       │
└──────────────────────────────────────┘

列大が列小を内包しているもののみ抽出(前方部分一致検索)
┌──────────────────────────────────────┐
│SELECT *                                                                    │
│    FROM 表                                                                 │
│    WHERE 列大 LIKE 列小 + '%';                                             │
└──────────────────────────────────────┘
分類:MSSQL
SQL/末端階層の前詰(2)
2015年07月06日
親列と子列のある表で、子列を前詰で作成したい場合(前詰にしたい場合)
┌───┐  ┌───┐
│親  子│→│親  子│
│--  --│  │--  --│
│ 1   3│  │ 1   1│
│ 1   4│  │ 1   2│
│ 2   6│  │ 2   1│
│ 2   8│  │ 2   2│
└───┘  └───┘
┌──────────────────────────────────────┐
│UPDATE 表                                                                   │
│    SET 子列 = 入力D.新子列                                                │
│    FROM 表 AS 出力D                                                       │
│        INNER JOIN (                                                        │
│            SELECT 親列,                                                    │
│                   子列,                                                    │
│                   RANK() OVER(                                             │
│                       PARTITION BY 親列                                    │
│                       ORDER BY 子列 ASC                                    │
│                   ) AS 新子列                                              │
│                FROM 表                                                     │
│        ) AS 入力D                                                         │
│          ON  入力D.親列 = 出力D.親列                                     │
│          AND 入力D.子列 = 出力D.子列;                                    │
└──────────────────────────────────────┘
分類:SQL
前へ 1 2 3 次へ