|
▼初心者さっち さん:
>▼kanabun様
>>上の4行は、こういう風にも考えられませんか?
>考えられます!!
>
>>[R11]を基点として【A1:H1】,【J1:Q1】,【S1:Z1】
>> 【A5:H5】,【J5:Q5】,【S5:Z5】、
>>
>>[R19]を基点として【A1:H1】,【J1:Q1】,【S1:Z1】
>> 【A5:H5】,【J5:Q5】,【S5:Z5】、
>>
>>Sub Try1()
>> Dim r As Range
>> Dim c As Range
>>
>> Set r = Worksheets(1).[R11] '最初のCopyブロック基点セル
>> Set c = Worksheets(2).[C5] '最初のPaste先セル
> 'なぜ[]←を使用するのですか?基点にするセルを指定する時は、[]を使用するの ですか?()ではだめなのですか?
Worksheets(1).[R11] は
Worksheets(1).Range("R11") の簡略表現です。
.[R11] を使うと、処理スピードは .Range("R11") と書くより遅くなりますが、
範囲が分かりやすいので、処理手順を考えるときはよくこれを使います。
実用化するときは、.Range("R11") に直しておいてくださいね。(^^
> '基点の考えかたはすごく勉強になります。応用がききそうですね。
>
>> Do
>> BlockCopy r, c
>>
>> Set r = r.Offset(8) 'つぎのブロック先頭へ
> 'ヘルプを見てもいまいちイメージできなかったのですが、
> 列と行の指定ができるとおもうのですが、省略している場合は、
> 横方向へ8ってことになるのですか?
Range.Offset(RowOffset, ColumnOffset)
ですから、
Set r = r.Offset(8)
は、
Set r = r.Offset(8,0) のことで、
現在の r から「行方向に+8」オフセットする、ということです。
もし、
c.Offset(,4)
とあったら、 ★カンマの前が省略されている 訳だから、
現在のc から 「列方向」に +4列右 ということになります。
>> Loop Until r.Row > 1207
> r行が、1207行になるまで、BlockCopyしなさいってことですか。
正確には 1207行を超えるまで、ですね?
>>Private Sub BlockCopy(ByVal r As Range, ByVal c As Range)
>'ByValって、sub Try()のr,cをこっちでも使うってことですか。
ここは、ちがいます。
「r」とか 「c」とかは「引数(パラメータ)」と呼ばれるもので、読みやすく
するために、たまたま 呼び出し側で使っている変数名と同じにしましたが、
別に名前は何でもかまいません。
パラメータの前に修飾してある ByVal というのは
(ちょっと難しくなりますが)呼び出し側から情報をどのように渡すかを
指定しているものです。「どのように」に2つあり、
ひとつが ByVal で もうひとつが ByRef です。
Helpの Subプロシージャの解説を読むと
ByVal その引数が、値渡しで渡されることを示します。
ByRef その引数が、参照渡しで渡されることを示します。Visual Basic では、既定値は ByRef です。
とあります。これだけではよく分からないのですが、
たとえば、呼び出し側から渡される引数を E-メールに例えると、
・ByValのほうは メールのコピーが渡される、
・ByRefのほうは サーバーに置いてあるメールの在りかが渡される、
(あるいは、郵便物として呼び出し側で書いたメール本文が届けられる)
というようなちがいです。
どういうことかというと、ByVal渡しされたものはメールのコピーですから、
あなたが受け取ったメールの内容を改竄(ざん)しても、送信元のオリジナル
メール内容はなんら変更されません。
いっぽう、byRefで送ると、受け取り側がメールの置いてあるサーバーに
アクセスして内容を削除してしまったり、送られた手紙のうえにコーヒー
をこぼしてしまったりすると、そのメールや手紙に対する変更は、送り手
のオリジナルの変更にもなります。
こういう違いがあります。まぁ、Rangeなどのオブジェクトを渡すときは
深く考えないで、いつも byVal スタイルで渡すことになっている、とだけ
記憶しておいてください。
>> With r
>> .Range("A1:H1").Copy
>> c.Range("A1").PasteSpecial xlValues, Transpose:=True
> '基点にしたセルrから、("A1:H1")分をコピー
> '基点にしたセルCから、"A1"分の所に貼付ける
> Transposeがtrueなら。Transposeが解りません。ヘルプがでてきませ
> んでした。ううう。
一般機能で、 r.[A1:H1] をCopyして、
別シートのc セルを指定して、「形式を選択して貼り付け」メニュ-から
・値のみ
・行列を入れ替える
にチェックを入れて貼り付ける操作をマクロ記録してみてください。
>--------------------------------------------------------------
Sheet1 の
A1 B1 C1
A2 B2 C2
A3【B3 C3】
Sheet1.[B3:C3] は
Sheet1.[A3]を基点として表現するなら
Sheet1.Range("A3").Range("B1:C1") ということですし、
Sheet1.Cells(3,1).Range("B1:C1") でもおなじ。
Sheet1.Range("A3").Offset(,1).Resize(,2) とも表現できます。
ちなみに、
Sheet1の【B3 C3】セルを基点とすれば、そのOffset(-2)は
Sheet1の [B1:C1]セル範囲のことですし、
【B3 C3】セルから .Offset(-2,-1).Resize(1,1) したセルは[A1]セルの
ことです。
Sheet1の[A1]セルは Sheet1.Cells(1,1) または Sheet1.Cells(1)
すなわち、 Sheet1.Range("A1").Item(1,1) のことですが、
Sheet1.Range("B3").Item(1,2) といったら、 sheet1.[C3] のこと、
Sheet1.Range("B3").Item(-1,0) といったら、 sheet1.[A1] のこと
になります♪
|
|