MW211 EXIT

devlog
ExcelVBA/続・ファイル(ブック)の保存
2015年07月25日
ファイル保存のダイアログでキャンセルボタンを押された場合対策。

キャンセルを押された場合には、戻り値が「False」になるので

戻り値を取得できるよう変数を用意し
┌──────────────────────────────────────┐
│Dim 選択 As Boolean                                                         │
└──────────────────────────────────────┘

代入する。
┌──────────────────────────────────────┐
│選択 = ActiveWorkbook.SaveAs(fileName:="出力ファイル.xls", _                │
│                             FileFormat:=XlFileFormat.xlExcel8)             │
├──────────────────────────────────────┤
│選択 = ActiveWorkbook.SaveAs(fileName:="出力ファイル.xlsx", _               │
│                             FileFormat:=XlFileFormat.xlOpenXMLWorkbook)    │
├──────────────────────────────────────┤
│選択 = Application.Dialogs(xlDialogSaveAs).Show(arg1:="出力ファイル.xls", _ │
│                                                arg2:=XlFileFormat.xlExcel8)│
├──────────────────────────────────────┤
│選択 = Application.Dialogs(xlDialogSaveAs).Show(arg1:="出力ファイル.xlsx", _│
│                                       arg2:=XlFileFormat.xlOpenXMLWorkbook)│
└──────────────────────────────────────┘

そして、それを判定して強制終了させるなどすればよい。
┌──────────────────────────────────────┐
│If Not 選択 Then                                                            │
│    ActiveWorkbook.Close SaveChanges:=False                                 │
│    Exit Sub                                                                │
│End If                                                                      │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ボタンの全削除
2015年07月24日
フォームコントロールのボタンを全削除する方法。
┌──────────────────────────────────────┐
│ActiveSheet.Buttons.Delete                                                  │
└──────────────────────────────────────┘

ActiveXコントロールのボタンを全削除する方法。(チェックボックスとかも削除される)
┌──────────────────────────────────────┐
│Dim ボタン As OLEObject                                                     │
│For Each ボタン In ActiveSheet.OLEObjects                                   │
│    ボタン.Delete                                                           │
│Next ボタン                                                                 │
└──────────────────────────────────────┘
分類:ExcelVBA
Windowsコマンド/dirの結果を抽出
2015年07月23日
dirコマンドの結果をサンプルに、どうやれば抽出できるのか試行錯誤してみた

一行目を抽出する方法を試行錯誤した結果がこれ。
┌──────────────────────────────────────┐
│for /f "delims=" %a in ('dir') do (@echo %a> t.txt && exit /B)              │
├──────────────────────────────────────┤
│for /f "usebackq delims=" %a in (`dir`) do (@echo %a> t.txt && exit /B)     │
└──────────────────────────────────────┘

「"delims="」をつけないと、スペースで区切って終わってしまうので注意。

「exit /B」でもコマンドプロンプトから実行するとコマンドは閉じてしまう。
バッチファイルの場合は、「goto break」「:break」みたいな感じで
goto文も使えるのだが、一行コードでは厳しいようだ。

なお、バッチファイルに記述する場合には「%a」を「%%a」と変換する必要あり。


二行目を抽出する場合は、「skip=」で先頭の一行をスキップしてあげればよい
┌──────────────────────────────────────┐
│for /f "delims= skip=1" %a in ('dir') do (@echo %a> t.txt && exit /B)       │
├──────────────────────────────────────┤
│for /f "usebackq delims= skip=1" %a in (`dir`)                              │
│                                             do (@echo %a> t.txt && exit /B)│
└──────────────────────────────────────┘

末尾の一行を抽出するには、とにかくループを回してしまうのが手っ取り早いかも。
┌──────────────────────────────────────┐
│for /f "delims= skip=1" %a in ('dir') do (@echo %a> t.txt)                  │
├──────────────────────────────────────┤
│for /f "usebackq delims= skip=1" %a in (`dir`) do (@echo %a> t.txt)         │
└──────────────────────────────────────┘


行番号を出力して、それを元に抽出するという案もあるのだが
出力した行番号を削除する方法がわからない。
┌──────────────────────────────────────┐
│dir|findstr /n /r "." | findstr /r "^1:"                                    │
└──────────────────────────────────────┘
分類:Windows
MSSQL/sqlcmdによるCSV出力
2015年07月22日
SELECT結果をCSV出力する方法。

一番オーソドックスなのは以下の形。
┌──────────────────────────────────────┐
│sqlcmd -S . -Q "SET NOCOUNT ON SELECT * FROM [表];" -h -1 -s, -W            │
│                                                         -o 出力ファイル.csv│
└──────────────────────────────────────┘

上記だと、ヘッダ表が出力されないので自前で出力する場合は以下の通り。
┌──────────────────────────────────────┐
│echo ヘッダ1,ヘッダ2,ヘッダ3> 出力ファイル.csv                              │
│sqlcmd -S . -Q "SET NOCOUNT ON SELECT * FROM [表];" -h -1 -s, -W            │
│                                                         >> 出力ファイル.csv│
└──────────────────────────────────────┘

ヘッダ出力を自動化するのなら、以下のような感じか。
┌──────────────────────────────────────┐
│sqlcmd -S . -Q "SET NOCOUNT ON SELECT * FROM [表] WHERE 1 <> 1;"            │
│                                 -h1 -s, -W | find /V "--"> 出力ファイル.csv│
│sqlcmd -S . -Q "SET NOCOUNT ON SELECT * FROM [表];" -h -1 -s, -W            │
│                                                         >> 出力ファイル.csv│
└──────────────────────────────────────┘
出力結果の最初の一行目のみ抽出もしくは最後の一行目のみ削除ってのを
Windowsコマンド上でできればいいのだが、難しいので断念。
分類:MSSQL
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
前へ 1 … 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 … 156 次へ