|
▼チューリップ さん:
> >If StrPtr(msg1) = 0& Then Exit Sub
> この0の後についている&は何ですか?
& は「型宣言文字」と呼ばれるもので、このばあい
数値0のデータ型は 整数(Integer)% でなく、長整数型
であることを明示しています。
単に
If StrPtr(msg1) = 0 Then Exit Sub
で何ら問題はないのですが、細かいこというと、
VBE は 0 をみて 数値0を格納できる最小の型すなわち
Integer型の0% と解釈し、それとStrPtr(msg1)の戻り値とを
比較するために、0を長整数型&に 一度変換(型キャスト)して
から判断をしています。なので、最初から 0&と0の型を明示して
比較するコードを書いておけば、その分無駄な型変換をしなくて
済み、効率的というわけです。
>>Intersect(.Columns(2), .Offset(1)).Value = msg2
>Intersectは、共有しているセルを返すメソッドですよね。
はい。
>columns(2)はシートの2列目、すなわちB列だと思うんですが、
いいえ。.Columns(2) とColumns(2)のまえにドットが付いて
いますから、Worksheets("Sheet1")の
.Range("A2").CurrentRegion という範囲の 2列目範囲の
ことです。シートの2列目はWorksheets("Sheet1").Columns(2)
です。
>offset(1)というのがよくわかりません。
>どの行に対してオフセットしているのでしょうか?
全体で何をしようとしているのかというと、
まず、AutoFilter.Range全体から、その2列目だけを取り出したい
という要求があり、AutoFilter範囲.Columns(2) で実現しています。
もうひとつ、範囲の1行目は列見出しなので、この先頭行を除外
したいという要求があり、そのため Offsetプロパティを使って
範囲を「1行下へシフト」しています。
[A1:F1000]がAutoFilter.Rangeだとすると、
[A1:F1000].Offset(1) が参照する範囲は [A2:F1001]です。
先ほど.Columns(2)プロパティで 範囲の2列目だけ取り出しました。
[A1:F1000].Columns(2) が参照する範囲は [B1:B1000] です。
Intersect([A1:F1000].Columns(2), [A1:F1000].Offset(1))
は、
Intersect([B1:B1000], [A2:F1001])
という範囲のことで、最終的に
[B2:B1000] という
2列目の 先頭見出しをカットしたセル範囲がえられています。
この範囲[B2:B1000] に 文字列msg2 を代入すると、Excelの
仕様で、[B2:B1000]の「可視セル」だけに値が代入されます。
ループで1行づつ可視行かどうかを調べていく必要はありません。
IntersectとOffsetプロパティの合わせ技は便利なので、
たとえば 表から 行見出し、列見出しを除いたデータ範囲を
取り出すのに使ったりします。
たとえば、下表のばあい、
A B C D E
1 1月 2月 3月 4月
2 ああ 10 35 55 20
3 ええ 20 30 45 25
4 おお 35 45 55 35
そのデータ範囲は
With [A1:E4]
Set 範囲 = Intersect(.Cells, .Offset(1,1))
End With
すなわち、[A1:E4]範囲と,それを右下方向に1セルづつShiftした
範囲とのIntersectする範囲となります。
|
|