2011年06月08日

ExcelVBAで選択範囲に対する処理実行

Excelで選択した範囲の各セルに対して処理を行いたいと思った.

今回は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



posted by maplewine at 19:00| Comment(0) | TrackBack(0) | VB | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック