ここから本文です

解説をお願いします。

eqf********さん

2012/3/1414:15:45

解説をお願いします。

ExcelVBAを、ただ今勉強中なので
以下の構文の解説をお願いできませんか?


Dim c
Dim r As Range

For Each r In Range("A3", Cells(Rows.Count, 1).End(xlUp))

If InStr(r.Value, "集計") Then c = 6 Else c = 0

r.Resize(, 11).Interior.ColorIndex = c





※Dim r As Range ← これはわかります。というか、As Range が省略できるんですね、、、
初めて知りました(汗)

わからないのは・・・
①「For Each 変数 In グループ」 が繰り返しのステートメントって事はわかったのですが
グループとして扱われている Range("A3", Cells(Rows.Count, 1).End(xlUp)) の部分が
よくわかりません。
単純に最終行を見つけるって事で良いのでしょうか?

②「InStr(String1, String2) 」でString1の文字列の中から、String2の文字を探し出すって事はわかりました。
そのあとに続く c = 6 Else c = 0 がわかりません。

③ r.Resize(, 11).Interior.ColorIndex = c
この部分に関しては、実行結果から
11列目まで色を塗るって事なんだろうな~って感じです。
どう読むのが正しいですか?

よろしくお願いします。

補足ものすごくわかりやすく解説して下さってありがとうございます。
変数の省略のところは、そういう事だったんですね~。
ってことは・・・・この Dim c のデータ型は Long で良いのですか?

閲覧数:
356
回答数:
2
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

tss********さん

編集あり2012/3/1416:41:37

>※Dim r As Range ← これはわかります。というか、As Range が省略できるんですね、、、

型を省略すると「Variant型」になってしまいます。
型は省略しないのが基本ですよ。

>Range("A3", Cells(Rows.Count, 1).End(xlUp))

①の所

Cells(Rows.Count, 1).End(xlUp)) の部分で

A列の最終行のセル番地を取得しています。

ですので、

セルA3~A列最終行のセルまで
となっております。

これを For Each の変数に入れているのです。
したがってこのループで
セルA3から下方向に1セルづつ最終行の所までループさせる状態になっています。


②の所

①のループでセルを上から順番に検索して行き
検索する文字列があったら変数cに6を入れてなかったら0を入れています。
この数値は③のInterior.ColorIndex の色番号の指定に使用します。


rはループ中の今検索しているセルってことはわかっていますでしょうか?
ってことなので
今検索しているセルから11列目までを
Interior.ColorIndex で色を付けるようになっています。

Resizeプロパティは、範囲を変更する時に使用します。
Resize(RowSize, ColumnSize) となっていますので
RowSize=行方向
ColumnSize=列方向

今回の

r.Resize(, 11)
ですが、こちらは、

ループで使用している変数rが仮にA3だとすると

A3を指定している所に.Resize(, 11)
している
すなわち
A3からK3までの範囲を指定していることになります。

カンマより前が下方向に増える
カンマより後が右方向に増えるって感じですかね。

ですので11列目まで色を塗るって感じより、
自分のいるセルから自分を含めて右に11セル分塗りつぶすって感じですかね。

長文になってしまいましたが、
わからない点がありましたら補足してください。

【追記】

変数の宣言の所でもう一つ
Excel VBAで、たまに、

Dim i, j, k As Long

みたいな感じで宣言している人がたまにいますが、
一見こちらは、i,j,k 全てが 「Long」型になっているように感じますが、
「Long」型になっているのは、k のみです。
後の、i,j の二つは、「Variant」型になってしまいますので
注意が必要になります。

【補足の回答】

>Dim c のデータ型は Long で良いのですか?

Longでも処理できますが、
今回の場合はcの変数の中に0か6しか入れていないので、
Integer が良いと思います。

数値に使用するものとして
Integer
Long

Single
Double

と4つありますが、
整数を扱う数値で使用する場合は

Integer
Long

少数点以下の数値を使用する時は、

Single
Double

を使用します。

それぞれ何が違うのかと言いますと
それぞれ変数に入れる数が違います。
簡単に言うと小さい箱、大きい箱みたいな感じです。

絶対に整数で数も大きくないって時は

Integer

を使用し、わかんない場合は

Long を使用します。

さらに、小数点以下を含む数値もあるかもってなると

Single を使用し、

数が大きくなりそうってなると

Double を使用します。

Integer や Single を宣言して、
変数の中に大きな数が入ってきたら「オーバーフローしました。」というエラーが出ます。
この時は、Long や Double に変更すればエラーの回避ができます。

整数/少数ってどうなる?

整数型の Integer で宣言している時に変数の中に 1.2 という数値が
入ってきたとします。すると変数に入れられる数値は「1」となり.2の部分は
省略されてしまいます。

となり、数値を扱う時には、Double を使用すると
変なエラーが出なくて安心!

と思ってしまいますが、
変数に入る数値に確実性が全くなくいろいろなケースが想定される場合は、

Double を使用しますが、

そうでない場合(規則性がある場合)は、
その規則にあった型をえらんであげる必要があります。

なんで?なんでも入れられるならDoubleでいいじゃん
ってことになると思いますが、

先ほども話しましたが、小さい箱、大きい箱(イメージです)
ですので、小さい箱で足りる時に大きい箱を用意すると処理に影響する場合も出てきます。

イメージとしては同じ物を小さい箱、大きい箱それぞれに入れて
持ち歩いてみてください。

同じ物を運んでいるだけなのに、大きい箱で持ち歩くと大変!
ってなると思います。

ですので、基準がしっかりある場合は、その基準にあった型を選ぶように
した方が良いです。

最初の方の回答で、「Variant型」になってしまいます。
と回答しましたが、この「Variant型」は、
数値に限らずなんでもありの型ですので基本は
あまり使用しない方が良いです。
どうしても使用するケースはありますが。。。

こんな感じですかね。
変数の事をもっと詳しく知りたいようでしたら、
「VBA 変数一覧」等でネット検索するといろいろ出てくると思いますので
いろいろ探してみると面白いと思いますよ。

またまた、長くなりましたがこの辺で。。。

質問した人からのコメント

2012/3/21 08:48:51

丁寧にわかりやすく回答して頂きありがとうございました。もっと頑張っていろいろと勉強しようと思っています。

ベストアンサー以外の回答

1〜1件/1件中

lar********さん

編集あり2012/3/1500:24:21

回答します。

①「Range("A3", Cells(Rows.Count, 1).End(xlUp)) 」
■Rangeプロパティについて
・・・「Range("A3")」の場合、A3セルを指します。
・・・「Range("A3", "A10")」の場合、A3~A10の範囲を指します。
■「Cells(Rows.Count, 1).End(xlUp)」について
・・・「Rows.Count」はセルの最終行を取得します。
・・・「1」はA列を指します。
・・・「End(xlUp)」は(A65536から)上に向かって値が設定されているセルを指します。
詳しく説明しますと、以下のセルに値が設定されているとします。
A3:あいうえお
A4:かきくけこ
A5:さしすせそ
A6:たちつてと
A7:なにぬねの
A8:
A9:まみむめも
「Cells(Rows.Count, 1).End(xlUp)」を実行した場合、A65536から上方向(A1)に向かって値が存在するセルを探し出します。
結果は、A10~A65536まで値が設定されていませんので、『A9』セルとなります。
ですので、決して最終行のセルまでということではありません。

②「c = 6 Else c = 0」
これは③で設定するための値(ColorIndex)になります。
背景色については、以下のサイトをご参照ください。
http://www.happy2-island.com/excelsmile/smile03/capter00602.shtml

③r.Resize(, 11).Interior.ColorIndex = c
そのとおりです。
rのセルが「A6」である場合、A6~K6まで背景色が設定されます。

補足「Dim c のデータ型はLongで良いのですか?」について
Long型ではありません。
Long型とVariant型とでは、扱える最大値(サイズ)が違います。
詳しくは以下のサイトをご参照ください。
http://www.geocities.jp/cbc_vbnet/kisuhen/hensuu.html

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる