FC2ブログ

Excelじゆうちょう

Excelのお絵描きツール『りっぷ2(りっぷつぅ)』のサポートページ、まずは「はじめに」をご覧ください。 [NewEntry] [Admin]

記事更新カレンダー

10 « 2018-11 « 12
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

やたらに多いカテゴリ

比較的新しい記事

新しいコメント

ありがたいブログ拍手

拍手コメント一覧(拍手はしない)

さみしいトラックバック

申し訳ないプロフィール

申し訳ない

管理人  [ 申し訳ない ]

pxivもやってます
リンクの一番上からのぞきに来てください
※閲覧にはユーザー登録が必要です

RSSってなんぞ?

広告は消せないらしい

FC2Ad

        --------       スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

        2011-08-09       選択範囲を重複せずに処理

複数のセルの選択範囲を操作する方法について、ようやく3回目。
遅くなってしまいましたが、とりあえずこのカテゴリの区切りとします。

選択範囲を順番に処理していく方法は 前回前々回 の通りです。
今回は、選択範囲が複数あるが故の注意点についてまとめます。
複数の範囲があるということは、それらが重なり合う可能性があるということです。
つまり、重なっている部分は多重に処理がされてしまうのです。

セルを違う色での塗りつぶしをすれば最後の色しか反映されず、同じ色でも塗りつぶしても結果は同じですが無駄な処理には変わりありません。
最悪、セルの値に1を加算するなどの場合は重ねるたびに値が変更されてしまいます。

さて、どうしましょうか?

これが、簡単そうでなかなか厄介なのです。
選択範囲それぞれのアドレスを比較して重なりがあるかを調べればなんとかなりそうですが、選択範囲の数が多ければ多いほど組み合わせの数が膨大になってしまいます。

選択範囲に重なりがある、セルが同じである、同じものを受け付けない仕組み必要です。
ここで活躍するのが、Collectionオブジェクトです。
セルの塗りつぶし、色数を数える の記事でもちょこっと登場してますが、ここでも詳しい説明はよしときます。
だって、これだけでひとつの記事のカテゴリできてしまいますもの。

でもまあ、雰囲気だけ。
Collectionオブジェクトは底なしの配列変数のようなものです。
(厳密にはいろいろ語弊がありますけど、雰囲気だけですからね)
配列変数のようにあらかじめサイズを決めておく必要はなく、値を格納するたびにCollectionオブジェクトは大きくなっていきます。
格納できる値はVariant型で、配列変数のように特定の型に固定することができません。
どんな変数の型でも、(システム的な限界はありますけど通常の使用なら)いくつでも格納してしまうので底なしです。

で、Collectionオブジェクトの機能のひとつとして、格納する値にキーという一意な名前を付けることができます。
一意ですから、値を取り出す時にただひとつを特定して取り出すことが可能となります。
一意ですから、同じ名前を付けて値を格納することはできません。
この一意の機能を利用すれば、同じセルを受け付けない処理が可能になりますよね。
説明はこれくらいで切り上げて、コードを見てみましょう。


'【コードウインドウ】
Public Sub testEachRangeRange()
Dim Clc_obj As Collection 'Collectionオブジェクト
Dim For_areas As Range, For_rng As Range 'カウンタ
If TypeName(Selection) = "Range" Then 'セルが選択されていれば
  Selection.Clear '選択範囲をいったんクリア
  Set Clc_obj = New Collection 'Collectionオブジェクト生成
  On Error Resume Next 'エラー無視、ここから
  For Each For_areas In Selection.Areas '選択範囲の数だけ繰り返し
    For Each For_rng In For_areas '各選択範囲の中のセルごとに繰り返し
      'Collectionオブジェクトからキーを指定してアイテム取り出し(キーなければエラー)
      If IsError(Clc_obj.Item(For_rng.Address)) Then '2回目以降の追加でなければ
        Clc_obj.Add True, For_rng.Address 'アイテムを追加
        For_rng = For_rng + 1 '1を加算(重複なし)
      End If
    Next For_rng
  Next For_areas
  On Error GoTo 0 'エラー無視、ここまで
  Set Clc_obj = Nothing 'Collectionオブジェクト解放
Else
  MsgBox "セルが選択されていません"
End If
End Sub


一意なキーには、セルのアドレスを使用します。
既にあるキーを追加しようとするとエラーが発生しますので、エラーを無視するようにしています。
Collectionオブジェクトにないキーの値を取り出そうとすると、エラーが返ります。

結果、重複が排除されてただ一度だけ1が加算され、選択されたセルには1が入力されます。

↓別に1じゃなくてもいいんですけどね↓
Areasプロパティ(重複なし)
スポンサーサイト

        2011-07-02       Areasプロパティの応用

この前 は、Areasプロパティで複数のセルの選択範囲を個別に操作できることを説明しました。
今回は、それをちょっとだけ応用してみようと思います。
さっそくコードだけ、少し長くなっていますが、やってることはそんなに違いません。


'【コードウインドウ】
Public Sub testEachAreas()
Dim Color_no As Long '色番号
Dim For_Areas As Range 'カウンタ
If TypeName(Selection) = "Range" Then 'セルが選択されていれば
  Color_no = 41
  Selection.Clear '選択範囲をいったんクリア
  For Each For_Areas In Selection.Areas '選択範囲の数だけ繰り返し
    For_Areas(1) = "R" & For_Areas.Row & "C" & For_Areas.Column '左上セルのアドレス
    For_Areas.Interior.ColorIndex = Color_no '選択範囲の番号の色で塗りつぶし

    Color_no = Color_no + 1
  Next For_Areas
Else
  MsgBox "セルが選択されていません"
End If
End Sub


↓R2C1のところの色がColorIndexの41↓
Areasプロパティあり(For Each1)

ポイントは以下の3点。

(1)TypeName(Selection)で、現在の選択範囲の種類を調べています
場合によってはオートシェイプやワードアートが選択されているかもしれません。
そんなのをセルと同じように扱えばエラーが出ること必死です。
せっかくのプログラムでもエラーで止まってしまっては元も子もありませんからね、こういったちょっとした気遣い心遣いが大切なのです。

(2)For Eachループで、各選択範囲をループしています
ループのたび、Range変数のFor_rngに第1選択範囲から順番に代入されます。
これなら、いちいちSelection.Areas.Countで選択範囲の数を調べておく必要はありません。
逆を言うと、選択範囲の数が必要ならSelection.Areas.Countが必要なんですけど。

(3)For_rngはセルと同じように操作できます
For_rng(1)はその選択範囲の左上セルを指します。
ちょっと特殊な方法ですが、For_rng(1, 1)と同じです。
詳しくは、カテゴリ 一次元、二次元配列でのセル操作 を参照ください。

最後にもうひとつだけ紹介。
上のコードでループしたFor_Areasは、セル範囲そのものです。
ですから、それをまたFor Eachループにしてやればセルごとに処理を行えます。
各セルに、自分のセルのアドレスを入力させてみました。


'【コードウインドウ】
Public Sub testEachAreasRange()
Dim Color_no As Long '色番号
Dim For_Areas As Range, For_rng As Range 'カウンタ
If TypeName(Selection) = "Range" Then 'セルが選択されていれば
  Color_no = 41
  Selection.Clear '選択範囲をいったんクリア
  For Each For_Areas In Selection.Areas '選択範囲の数だけ繰り返し
    For Each For_rng In For_Areas '各選択範囲の中のセルごとに繰り返し
      For_rng = For_rng.Address '各セルのアドレス
    Next For_rng

    For_Areas.Interior.ColorIndex = Color_no '選択範囲の番号の色で塗りつぶし
    Color_no = Color_no + 1
  Next For_Areas
Else
  MsgBox "セルが選択されていません"
End If
End Sub


↓セルにアドレスを入力するなんてあんまし有益な操作じゃないけど↓
Areasプロパティあり(For Each2)

        2011-06-06       複数の選択範囲を個別操作

久しぶりにExcelのお話。
またひとつカテゴリを増やしてみたいと思います。

セルの選択範囲(Selectionプロパティ)を操作するうえで知っておきたいテクニック。
全3回予定、よろしくお願いいたします。



こんなふうに複数のセル範囲を選択して、例えば塗りつぶしをすることができます。

↓カラーインデックス3は赤↓
Areasプロパティなし


'【コードウインドウ】
Public Sub paintColorIndex()
Selection.Interior.ColorIndex = 3 'デフォルトで3は赤
End Sub


じゃあ、セルの選択範囲はそのままでこんなのはどうでしょう?


'【コードウインドウ】
Public Sub printColorIndex()
MsgBox Selection.Row & " 行から " & Selection.Rows.Count & " 行まで"
End Sub


↓この行範囲↓
Areasプロパティなし(行番号)

ん、ちょっと値が違う?
いいえ、これは第1選択範囲の値で正しいものです。
それでは、第2選択範囲以降の値を得るにはどうすればいいのでしょうか。
…ということをずっと悩んでいて、最近ようやく方法を知りました。(完全に勉強不足だとかは触れないで)

Areasプロパティを使います。
上のコードに適応させてみましょう。


'【コードウインドウ】
Public Sub printAreasRow()
MsgBox "第1選択範囲から順番に" & Chr(10) _
  & Selection.Areas(1).Row & " 行目から " & Selection.Areas(1).Rows.Count & " 行分" & Chr(10) _
  & Selection.Areas(2).Row & " 行目から " & Selection.Areas(2).Rows.Count & " 行分" & Chr(10) _
  & Selection.Areas(3).Row & " 行目から " & Selection.Areas(3).Rows.Count & " 行分" & Chr(10) _
  & Selection.Areas(4).Row & " 行目から " & Selection.Areas(4).Rows.Count & " 行分"
End Sub


↓これらの行範囲↓
Areasプロパティあり(行番号)

選択範囲はよっつだけですから、Selection.Areas(5)とすればエラーになってしまいます。
もちろん、Selection.Areas(0)もいけません。
このAreasプロパティを使えば、複数の選択範囲を別々の色に塗りつぶすことも可能です。


'【コードウインドウ】
Public Sub testAreas()
Dim For_cnt As Long 'カウンタ
For For_cnt = 1 To Selection.Areas.Count '1~選択範囲の数だけ繰り返し
  Selection.Areas(For_cnt) = For_cnt '各選択範囲に番号を入力
  Selection.Areas(For_cnt).Interior.ColorIndex = For_cnt '選択範囲の番号の色で塗りつぶし
Next For_cnt
End Sub


↓1は黒、2は白、3は赤、4は緑↓
Areasプロパティあり

Selection.Areas.Countで選択範囲の数を調べることができます。
これをForループの終わりに指定しておけば、先のAreas(5)のようなエラーを回避できます。

色分けするとわかりやすいですね、左上、右下、中央、右上の順で選択していました。
色がくすんでいるのは選択されているからです、アクティブセルのセル(2,5)だけ鮮やかです。

さて、この次以降も今回使ったセルの選択範囲を例にして進めます。
覚えといてもらったら嬉しいな。

 | HOME | 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。