MW211 EXIT

devlog
ExcelVBA/ダブルクォーテーション
2015年08月09日
ダブルクォーテーションをダブルクォーテーションとして使用したい場合。

┌──────────────────────────────────────┐
│""                                                                          │
└──────────────────────────────────────┘
二つ並べる。

しかし、長文になると混乱しがちなので、
┌──────────────────────────────────────┐
│Chr(34)                                                                     │
└──────────────────────────────────────┘
と、文字コード指定としてしまった方がわかりやすいだろう。
分類:ExcelVBA
ExcelVBA/セル範囲の個別収集
2015年08月03日
セルを個別に指定追加して、グルーピングしていく方法。

【1】Range変数を使用する方法
┌──────────────────────────────────────┐
│Dim セルたち As Range                                                       │
│Set セルたち = Range("A1")                                                  │
│Set セルたち = Union(セルたち, Range("B2"))                                 │
│Set セルたち = Union(セルたち, Range("C3"), Range("D4"))                    │
└──────────────────────────────────────┘
「セルたち = Range("A1")」だと「セルたち.Value = Range("A1").Value」の
省略形と解釈されるので注意。

【2】名前定義セルを使用する方法
┌──────────────────────────────────────┐
│Range("A1").Name = "範囲"                                                   │
│Union(Range("範囲"), Range("B2")).Name = "範囲"                             │
│Union(Range("範囲"), Range("C3"), Range("D4")).Name = "範囲"                │
└──────────────────────────────────────┘
「Range("範囲") = Union(Range("範囲"), Range("B2"))」みたいに
右辺に新たな範囲を指定するのではない点に注意。
ちなみに上記だと、前述の「.Value」の省略形として解釈されてしまう。
分類:ExcelVBA
ExcelVBA/名前定義セルの効用
2015年08月02日
名前定義セルを使用すると、関数間のセル範囲の引き渡しが
グローバル変数的にできるとともに、記憶もされる。
┌──────────────────────────────────────┐
│Sub 関数A()                                                                 │
│    Union(Range("A1"), Range("B2")).Name = "範囲"                           │
│End Sub                                                                     │
├──────────────────────────────────────┤
│Sub 関数B()                                                                 │
│    Range("範囲").Interior.Color = vbYellow                                 │
│End Sub                                                                     │
└──────────────────────────────────────┘
上記の場合、「関数A()」で範囲を変更すれば
「関数B()」には引数やグローバル変数なしで伝達することができる。
分類:ExcelVBA
ExcelVBA/名前定義セル
2015年08月01日
以下のような感じで、セルに名前をつける。(.Nameプロパティに値を設定する)
┌──────────────────────────────────────┐
│Range("A1").Name = "範囲"                                                   │
│Range("範囲").Interior.Color = vbYellow                                     │
└──────────────────────────────────────┘

以下のように、Union()(やRange())とも併用できる。
┌──────────────────────────────────────┐
│Union(Range("A1"), Range("B2")).Name = "範囲"                               │
└──────────────────────────────────────┘
分類:ExcelVBA
ExcelVBA/ブックを閉じる
2015年07月27日
基本は以下。
┌──────────────────────────────────────┐
│ブック.Close                                                                │
└──────────────────────────────────────┘

但し、保存しますか?とかクリップボードをクリアしますか?とか
メッセージが出てしまうので、そういうので止めないで、自動化したい場合には、
その区間のメッセージを抑止する。
┌──────────────────────────────────────┐
│Application.DisplayAlerts = False                                           │
│ブック.Close                                                                │
│Application.DisplayAlerts = True                                            │
└──────────────────────────────────────┘

基本的に保存しないで閉じる(破棄みたいなもの)なのだが
保存したい場合は、事前にセーブしてから閉じればよい。
┌──────────────────────────────────────┐
│Application.DisplayAlerts = False                                           │
│ブック.Close                                                                │
│ブック.Save                                                                 │
│Application.DisplayAlerts = True                                            │
└──────────────────────────────────────┘
この場合、保存しますか?メッセージは抑止されるが、
クリップボードをクリアしますか?が出る場合があるので、
上記同様にメッセージを抑止するのが妥当か。
分類:ExcelVBA
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
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
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 … 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 … 27 次へ