例えばこういうシートがあったとします
で、セルをクリアする。
Selectionはレイトバインディングですが、当然Rangeに解決されますので、結局は同じになるはず。
' Rangeを取得してクリア
Dim rs as Range
set rs = thisworkbook.WorkSheets(1).Range("A1,A2,A3")
rs.ClearContents ' エラー(実行エラー1004 結合されたセルの一部を変更することはできません)
'Selectでやってみる
rs.Select
Selection.ClearContents ' 正常終了
デバッガで確かめてみても同じ。なのになぜSelection使うとうまくいくのかが分からず軽く悩みました。
※ クリアするだけならClearContents使わずにrs.Value=""でもいいんですが。
結論としてはエラーメッセージ通り。
最初のは結合されたセルの一部を変更しようとしてたからNG。
次のは結合されたセルの全てを変更しようとしてたからOK。
つまり、rs.Selectの時、結合してるセルの全てを選択する処理が走るんですよ。
最初のrs.Addressは"$A$1,$A$2,$A$3"ですが、
次のSelection.Addressは"$A$1,$A$2,$A$3:$b$3"なんです。
そういや手入力で選択しても普通にそうなりますよね。
Selectionってほぼ使わないので頭から抜けてました。
ちなみにValue=""でうまくいくのは実際の値を保持してるのはA3で、
かつClearContentsと違いValue=""は変更とはみなさないからでしょう。
2.Cells.Count
Excel2007以降で、
なんらかのシート.Cells.Count
とすると、オーバーフローエラーになります。
代入しようがしまいが関係なく、Callしただけでエラー。
理由は縦横合計34bitあるのでlongに入らないからだそうですが、お茶吹きました。
31bit超えるセル用意しておいて内部ロジックほったらかしですか(笑)
MSって本当にもう過去遺産捨てたいんだなあとか思ったんですが、
CountLargeを代わりに使うそうです。
3.longlong
ついにVBAでもlonglongが使えるようになりました!
やり方
Dim v as Variant
v = Cells.CountLarge
'後はvに対して好きなように演算
そのまんまですね、すいません。
使える条件はVarType=20の値が存在すること。32bitOfficeでもOK。
longlongを返すなにかが存在すれば使えます。
まあDoubleなりCurrencyなりが代わりになるので
使い道は思いつかないんですが。