今回はVBAマクロを使う.
a. 選択しているものがセルではなく,グラフなどのオブジェクト
b. 選択している範囲が列や行全体,またはシート全体など無限大
となった場合にはエラーにしたいと思ったのでその方法をメモ.
選択範囲を知るには,Selection を使えば良い.
a. については,オブジェクトの名前を得ることができるので,
TypeName(Selection) <> "Range"
を判定すれば良い.
b. については,少し手こずった.理由は以下の式,
Dim cnt as Integer
cnt = Selection.Cells.Count
としたときに,例えば列全体を選択していると,オーバーフローを起こしてエラーになる.
なんなの,Excel.
if Selection.Cells.Count > 100 Then
MsgBox "選択範囲広すぎるぜ"
End If
うまくいった.あれ,いきなり全体数みるんじゃなくて,100まで見て,それ以上数値があればエラーにするなんて賢いことしてるのかなとなんて,ちょっと感心しかけたけど,そんなことはしておらず,エラーだった原因は,cnt がInteger 型にしていたので格納先がオーバーフローしてただけっぽい.
まぁできたからいいやと喜んだのもつかの間,シート全体を選択すると,上記if文でもエラーになる.
そこで何か他に判定できるメンバがないかなと考える.
Selectionの持っているメンバが分からなかったので以下のように変数に代入して除いてみる.
Dim hoge As Range
Set hoge = Selection
見てみると,height/width あたりが巨大な数値だったら弾くようにすればいいのかなと思う.
ただ,一つの列/行をやたら長くすることも出来るわけでそれだと選択セル数は少ないのに救えないかもしれない.
よくよく眺めていると,CountLargeなる変数が.これはシート全体を選択したときにもきちんと値が入ってる.
実際,
行全体を選択したとき: 16384
列全体を選択したとき: 1048576
シート全体を選択したとき: 17179869184
ちなみにExcel2007です.この行と列の値は,Excelが追加できる列・行の最大値だと思う.試さないし,調べないけど.
行×列が,シート全体の数値になってる.
バージョンによってここの上限は変わるかもね.
MsgBoxの改行,知らなかったのでこのサイトに感謝.
-----------------------------------------------
http://www.accessclub.jp/bbs/0005/beginers2424.html
Msgboxの改行は可能ですよ。
Msgbox"!注意!" & vbCrLf & "気をつけてください!"
で行けると思います。
-----------------------------------------------
以下は今回作ったソースコード.
-----------------------------------------------
Sub RoundSelection()
Dim cnt As Variant
'セル数を取得
cnt = Selection.Cells.CountLarge
If cnt > 1000000 Then
MsgBox ("選択範囲が広いんでないかい?" & vbCrLf & _
"処理に時間かかるからやらないよ.")
ElseIf TypeName(Selection) <> "Range" And cnt < 1 Then
MsgBox ("正しい範囲を選択してね♪" & vbCrLf & _
"グラフとか選択してるかも.")
Else
Dim objRANGE As Range
For Each objRANGE In Selection.Cells
'MsgBox objRANGE.Value
objRANGE.Value = SubRoundFunc(objRANGE.Value)
Next
End If
End Sub
'渡されたセルの中にある数値の小数点以下をカット.
Function SubRoundFunc(ByVal val As Double) As Integer
SubRoundFunc = Round(val, 0)
End Function