FC2ブログ

Excelじゆうちょう

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

記事更新カレンダー

11 « 2018-12 « 01
- - - - - - 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 31 - - - - -

やたらに多いカテゴリ

比較的新しい記事

新しいコメント

ありがたいブログ拍手

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

さみしいトラックバック

申し訳ないプロフィール

申し訳ない

管理人  [ 申し訳ない ]

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

RSSってなんぞ?

広告は消せないらしい

FC2Ad

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

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

        2009-10-01       二次元配列のセル

前回、「要素数を超えた一次元配列でも、そこにせるがあれば参照できる」ということを検証しました。
とすると、次のような仮定が考えられます。

要素数を超えた二次元配列でも、そこにセルがあれば参照できる

実際に見てみましょう。
この前のマクロにちょいと手を加えて…


'【コードウインドウ】
Private Sub testRng()
Dim For_r As Long, For_c As Long
On Error Resume Next 'エラー無視、ここから
For For_r = -20 To 20 '行繰り返し
  For For_c = -20 To 20 '列繰り返し
    Cells(Selection(For_r, For_c).Row, Selection(For_r, For_c).Column) _
      = "Rng(" & For_r & ", " & For_c & ")"

  Next For_c
Next For_r
On Error GoTo 0 'エラー無視、ここまで
End Sub


↓3行3列にて実験↓
Selection二次元

予想通りでした。
こうなるともう選択範囲の大きさは関係ありません、完全にOffsetの代わりとして使えます。

最後にもうひとつ、Selectionプロパティで引数が有効なのなら、ActiveCellプロパティでも同様にいけそうですね。

その通り!

動作は一次元配列、二次元配列ともに、単一セルのSelectionと同じです。
興味のある方は試してみてください。
スポンサーサイト

        2009-09-29       一次元配列のセル(追記)

一次元配列でのセル参照、続きます。

前回、Cellsプロパティ、Range変数でセルを参照できることを確認しました。
今回はもうひとつ、Selectionプロパティでも同じことが言えます。
Selection(1)だと、選択範囲の左上セルが該当します。
※複数の範囲を選択している場合、最初に選択したセル範囲のみが対象になります

さて、これらの方法を使って実験をしてみましょう。

対象のセル範囲を超える引数を与えた場合、どのような結果が返ってくるでしょうか?

具体例をあげるなら、3行3列の配列は[1、2、3…7、8、9]となりますので、[…-1、-2、-3、10、11、12…]を検証してみることになります。
これには、以下のマクロを使用します。


'【コードウインドウ】
Private Sub testRng()
Dim For_cnt As Long
On Error Resume Next 'エラー無視、ここから
For For_cnt = -20 To 20
  Cells(Selection(For_cnt).Row, Selection(For_cnt).Column) = "Rng(" & For_cnt & ")"
Next For_cnt
On Error GoTo 0 'エラー無視、ここまで
End Sub


↓3行1列(左)、1行3列(右)にて実験↓
Selection一次元

おもしろい結果が得られました。
範囲を超えても、セルの参照は可能のようです。
配列を上回れば列幅を固定して下へ進み、下回れば左上セルを軸として上下左右反転した形で進んでいきます。
ちなみに、参照先にセルがなければ当然ながらエラーとなります。

0以下を指定して上下左右反転させる方法、どうにかして使ってみたいですね。
さらにOffsetとか組み合わせたら意外といけるかもしれません。

        2009-09-27       一次元配列のセル(使い方)

前回、セルが一次元配列で参照できるということを紹介しました。
こんな、Excelのバージョンによって参照先の変わる方法なんて使い道なんてないように見えます。

いいえ、そんなことはありません。
少なくとも、ふたつの条件さえそろえば十分実用に足る方法なのです。

まず、ひとつ目の条件は「セルがRange変数に代入されている場合」です。

Range変数とは何ぞや? という方がいるかもしれませんが、申し訳ないです、ここで解説していると長くなってしまいますので割愛させてもらいます。
簡単に説明するなら、「特定のセル範囲を変数に代入することで、変数からセルを操作できるようになる」のがRange変数です。

ここに、Range(Cells(3, 3), Cells(6, 5))が代入されたRange変数「Rng As Range」があるとします。
Range変数は、どこの番地を参照しているかに関わらず、範囲の左上のセルがRng(1, 1)になります。
つまり、Rng(1)と同じです。
とすれば、Rng(2, 1)はRng(4)、Rng(4, 3)はRng(12)となります。

↓一覧にするとこう↓
Renge変数一、二次元

次に、ふたつ目の条件は「セルを一次元配列と同期させる場合」です。

一次元配列に同期させるには一次元配列が望ましい、言われれば当然ですね。
ここからは、私が実際に活用した事例で説明します。

■経過1
ユーザーフォームにて、20×15のパネル(トグルボタン)を用いたパズルゲームを作ることになりました。

■経過2
各パネルのステータスは、同じく2015列の対応するセルから取得しています。

■経過3
パネルの数は固定でしたので、コードの簡素化と読みやすさを重視して、フォーム上にパネルを配置しておくことにしました。

↓配置しました↓
20×15パネル

■経過4
パネルをセルに同期させるには、パネルの名前にセルの配列に対応した連番を振る必要がありました。
  一次元なら、Panel_1、Panel_2、Panel_3…Panel_299、Panel_300
  二次元なら、Panel_1_1、Panel_1_2…Panel_2_1、Panel_2_2…Panel_20_15
こんな感じ。

■経過5
合計300ものパネルの名前を変更するのは、めんどくさい!!

■経過6
幸いにも、デフォルトの名前は自動的に連番が振られる(トグルボタンなら、ToggleButton1、ToggleButton2…)

■経過7
これはもう、一次元配列を採用するしかない。

■結果
【一次元配列を採用した利点】
初期化(Initialize)、終了化(Terminate)、パネルのステータスチェックなど、一括処理が楽になった。
【一次元配列を採用した欠点】
個々のパネル処理(Click)で行番号、列番号を計算しなければならなくなった。



私の場合は個々のパネル処理が少なかったのでうまくいきましたが、すべての場合で効率がよくなるとは限りません。
やり方はひとつだけじゃないということを理解して、その時々で使い分けていただければと思います。

        2009-09-26       一次元配列のセル

セルは行と列の二次元配列です。
また、セルは一次元配列でもあるのです。

とりあえず、↓を見てください。


【イミディエイトウインドウ】
■検証1
?Cells(1, 1).Row & "行、" & Cells(1, 1).Column & "列目"
1行、1列目
?Cells(1).Row & "行、" & Cells(1).Column & "列目"
1行、1列目

■検証2
?Cells(1, 2).Row & "行、" & Cells(1, 2).Column & "列目"
1行、2列目
?Cells(2).Row & "行、" & Cells(2).Column & "列目"
1行、2列目

■検証3(Excel2003以前のバージョン)
?Cells(2,1).Row & "行、" & Cells(2,1).Column & "列目"
2行、1列目
?Cells(257).Row & "行、" & Cells(257).Column & "列目"
2行、1列目

■検証4(Excel2007のバージョン)
?Cells(2,1).Row & "行、" & Cells(2,1).Column & "列目"
2行、1列目
?Cells(16385).Row & "行、" & Cells(13685).Column & "列目"
2行、1列目


各検証の上側が二次元配列、下側が一次元配列を使用してセルを参照しています。
注目すべきは、検証3と4で同じ結果を得るための引数が、Excelのバージンによって変わっている点です。
カンのいい方ならピンときたかもしれません。

Excel2003以前では列の最大数は256でしたが、Excel2007からは最大数が64倍の16384に増えました。(ちなみに、行数は65536の16倍の1048576に増えました)

つまり、Cells(1)、Cells(2)、Cells(3)…と順番に右へセルを参照していき、最後の列に達すると1行下の1列目を参照するようになります。
ですのでExcel2003では、Cells(800)は800/256=3あまり32と計算でき、3に1を足してCells(4, 32)となります。
一番右下のセルは(65536 - 1) * 256 + 256と計算でき、Cells(16777216)となります。

引数がひとつだけでもセルを参照できることがわかりました。
ですが、いまひとつ使い勝手がよさそうにありません。
セルを端から順番に、行列を無視して使うなら話は別かもしれませんが、それではExcelのよさが生かされません。
何より、Excelのバージョンによって参照先が変わってしまいます。

さて、本当に不便なだけなのでしょうか。
次回は、一次元配列でセルを参照する方法の利点について考えてみます。

 | HOME | 

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