FC2ブログ

Excelじゆうちょう

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

記事更新カレンダー

08 « 2018-09 « 10
- - - - - - 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プロパティ(重複なし)
スポンサーサイト

コメント

コメントの投稿

管理者にだけ表示を許可  

トラックバック

http://likep.blog63.fc2.com/tb.php/228-e86f1f3e

 | HOME | 

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