[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セル参照式のまとめ方』(えま)
いつもお世話になっています。
アクティブシートに"data_sheet"のセルを参照したいです。
数が多いのでマクロを使いたいと思い、途中まで作りましたが、
ものすごく長いのでまとめたいです。
それに加え、下に書いた式は1ブロック分です。
この後左辺は8行下から始まり列はそのまま、右辺は1行下から始まり列はそのまま、
これを200回繰り返したいです。
Sub セルの参照()
Dim DS As Worksheet
Set DS = ThisWorkbook.Worksheets("data_sheet")
Dim r As Long
With DS
For r = 3 To 10
Cells(r, 2) = .Cells(5, 2)
Cells(r, 6) = .Cells(5, 7)
Cells(r, 7) = .Cells(5, 8)
Next
Cells(3, 13) = .Cells(5, 17)
Cells(4, 13) = .Cells(5, 25)
Cells(5, 13) = .Cells(5, 33)
Cells(6, 13) = .Cells(5, 41)
Cells(7, 13) = .Cells(5, 49)
Cells(8, 13) = .Cells(5, 57)
Cells(9, 13) = .Cells(5, 65)
Cells(10, 13) = .Cells(5, 73)
Cells(3, 14) = .Cells(5, 18)
Cells(4, 14) = .Cells(5, 26)
Cells(5, 14) = .Cells(5, 34)
Cells(6, 14) = .Cells(5, 42)
Cells(7, 14) = .Cells(5, 50)
Cells(8, 14) = .Cells(5, 58)
Cells(9, 14) = .Cells(5, 66)
Cells(10, 14) = .Cells(5, 74)
Cells(3, 15) = .Cells(5, 19)
Cells(4, 15) = .Cells(5, 27)
Cells(5, 15) = .Cells(5, 35)
Cells(6, 15) = .Cells(5, 43)
Cells(7, 15) = .Cells(5, 51)
Cells(8, 15) = .Cells(5, 59)
Cells(9, 15) = .Cells(5, 67)
Cells(10, 15) = .Cells(5, 75)
Cells(3, 17) = .Cells(5, 81)
Cells(4, 17) = .Cells(5, 89)
Cells(5, 17) = .Cells(5, 97)
Cells(6, 17) = .Cells(5, 105)
Cells(7, 17) = .Cells(5, 113)
Cells(8, 17) = .Cells(5, 121)
Cells(9, 17) = .Cells(5, 129)
Cells(10, 17) = .Cells(5, 137)
Cells(3, 18) = .Cells(5, 82)
Cells(4, 18) = .Cells(5, 90)
Cells(5, 18) = .Cells(5, 98)
Cells(6, 18) = .Cells(5, 106)
Cells(7, 18) = .Cells(5, 114)
Cells(8, 18) = .Cells(5, 122)
Cells(9, 18) = .Cells(5, 130)
Cells(10, 18) = .Cells(5, 138)
Cells(3, 19) = .Cells(5, 83)
Cells(4, 19) = .Cells(5, 91)
Cells(5, 19) = .Cells(5, 99)
Cells(6, 19) = .Cells(5, 107)
Cells(7, 19) = .Cells(5, 115)
Cells(8, 19) = .Cells(5, 123)
Cells(9, 19) = .Cells(5, 131)
Cells(10, 19) = .Cells(5, 139)
これが1ブロックで、次は左辺は8行下、
For r = 11 To 18になります。
左辺のCellsの()内の行が11〜18、列は同じです。
右辺の.Cellsの()内の行が1行下の6、列は同じです。
その次は左辺が16行下、
For r = 19 To 26
左辺の()内の行が19〜26、列は同じです。
右辺の.Cellsの()内の行が2行下の7、列は同じです。
この1ブロックずつの左辺が8行下、右辺が1行下、という式を
200回繰り返したいです。
上の式にはパターンがあるので、何か代入できないかと考えました。
左辺のCellsの()内は、行にrを入れ、列は13。
右辺の.Cellsの()内は行は5、列は17列目から8列置きに8回参照します。
下の式にしてみました。
Sub セルの参照2()
Dim DS As Worksheet
Set DS = ThisWorkbook.Worksheets("data_sheet")
Dim r As Long
Dim Col As Long
With DS
For r = 3 To 10
Cells(r, 2) = .Cells(5, 2)
Cells(r, 6) = .Cells(5, 7)
Cells(r, 7) = .Cells(5, 8)
For Col = 17 To 17 * (8 - 1) + 1 Step 8
Cells(r, 13) = .Cells(5, Col)
Next
Next
End With
End Sub
Cells(r,13)には同じ数字が入りました。
どこを参照しているのかと("data_sheet")でCtrl+Fで探しましたが、
文字列の検索のためか見つかりませんでした。
オートフィルタをかけてありそうな場所を探しましたが、やはり見つかりませんでした。
参照先の範囲が"A1:EK147"と大きいため見落としたかもしれません。
参照式のまとめ方をご教授いただけるとうれしいです。
どう祖、よろしくお願いします。
Excell2007
Windows Vista
試して無いけど、こんなのでは? まちがったらごめん
Sub セルの参照()
Dim DS As Worksheet
Dim r As Long
Dim i As Long
Dim j As Long
Set DS = ThisWorkbook.Worksheets("data_sheet")
With DS
For r = 3 To 10
Cells(r, 2).Value = .Cells(5, 2).Value
Cells(r, 6).Value = .Cells(5, 7).Value
Cells(r, 7).Value = .Cells(5, 8).Value
Next r
For i = 0 To 199
For j = 0 To 7
Cells((3 + j) + 8 * i, 13).Resize(, 3).Value _
= .Cells(5 + i, 17 + 8 * j).Resize(, 3).Value
Cells((3 + j) + 8 * i, 17).Resize(, 3).Value _
= .Cells(5 + i, 81 + 8 * j).Resize(, 3).Value
Next j
Next i
End With
End Sub
(Bun)
For r = 3 To 10
Cells(r, 2).Value = .Cells(5, 2).Value
Cells(r, 6).Value = .Cells(5, 7).Value
Cells(r, 7).Value = .Cells(5, 8).Value
Next r
此れも200回に含めるなら、こんなかな?
位置計算を変数に格納して
Sub セルの参照_2()
Dim DS As Worksheet
Dim i As Long
Dim j As Long
Dim lngCol As Long
Dim lngRowR As Long
Dim lngRowL As Long
Set DS = ThisWorkbook.Worksheets("data_sheet")
With DS
For i = 0 To 199
For j = 0 To 7
lngRowL = 3 + j + 8 * i
lngRowR = 5 + i
lngCol = 8 * j
Cells(lngRowL, 2).Value = .Cells(lngRowR, 2).Value
Cells(lngRowL, 6).Value = .Cells(lngRowR, 7).Value
Cells(lngRowL, 7).Value = .Cells(lngRowR, 8).Value
Cells(lngRowL, 13).Resize(, 3).Value = .Cells(lngRowR, 17 + lngCol).Resize(, 3).Value
Cells(lngRowL, 17).Resize(, 3).Value = .Cells(lngRowR, 81 + lngCol).Resize(, 3).Value
Next j
Next i
End With
End Sub
(Bun)
(えま)
これで上手く行きましたか? 善かったですね? 一応、纏め方に就いて書いて起きます
質問で、コードの先頭のループの以降の部分は、以下の様に書き換える事が出来ます
Cells(3, 13) = .Cells(5, 17)
Cells(3, 14) = .Cells(5, 18)
Cells(3, 15) = .Cells(5, 19)
Cells(4, 13) = .Cells(5, 25)
Cells(4, 14) = .Cells(5, 26)
Cells(4, 15) = .Cells(5, 27)
Cells(5, 13) = .Cells(5, 33)
Cells(5, 14) = .Cells(5, 34)
Cells(5, 15) = .Cells(5, 35)
Cells(6, 13) = .Cells(5, 41)
Cells(6, 14) = .Cells(5, 42)
Cells(6, 15) = .Cells(5, 43)
Cells(7, 13) = .Cells(5, 49)
Cells(7, 14) = .Cells(5, 50)
Cells(7, 15) = .Cells(5, 51)
Cells(8, 13) = .Cells(5, 57)
Cells(8, 14) = .Cells(5, 58)
Cells(8, 15) = .Cells(5, 59)
Cells(9, 13) = .Cells(5, 65)
Cells(9, 14) = .Cells(5, 66)
Cells(9, 15) = .Cells(5, 67)
Cells(10, 13) = .Cells(5, 73)
Cells(10, 14) = .Cells(5, 74)
Cells(10, 15) = .Cells(5, 75)
'★
Cells(3, 17) = .Cells(5, 81)
Cells(3, 18) = .Cells(5, 82)
Cells(3, 19) = .Cells(5, 83)
Cells(4, 17) = .Cells(5, 89)
Cells(4, 18) = .Cells(5, 90)
Cells(4, 19) = .Cells(5, 91)
Cells(5, 17) = .Cells(5, 97)
Cells(5, 18) = .Cells(5, 98)
Cells(5, 19) = .Cells(5, 99)
Cells(6, 17) = .Cells(5, 105)
Cells(6, 18) = .Cells(5, 106)
Cells(6, 19) = .Cells(5, 107)
Cells(7, 17) = .Cells(5, 113)
Cells(7, 18) = .Cells(5, 114)
Cells(7, 19) = .Cells(5, 115)
Cells(8, 17) = .Cells(5, 121)
Cells(8, 18) = .Cells(5, 122)
Cells(8, 19) = .Cells(5, 123)
Cells(9, 17) = .Cells(5, 129)
Cells(9, 18) = .Cells(5, 130)
Cells(9, 19) = .Cells(5, 131)
Cells(10, 17) = .Cells(5, 137)
Cells(10, 18) = .Cells(5, 138)
Cells(10, 19) = .Cells(5, 139)
この様に並べ帰ると解ると思いますが、★印以前と以降では、セルの位置が関連無く代わるので 一つこコードをループで回すには無理な様な気がします、因って此処で二つに分けて考えます 前半部の
Cells(3, 13) = .Cells(5, 17)
Cells(3, 14) = .Cells(5, 18)
Cells(3, 15) = .Cells(5, 19)
は、連続した1行3列の範囲の値を1行3列の範囲に代入と考えられますので
Range(Cells(3, 13), Cells(3, 15)).Value = .Range(.Cells(5, 17), .Cells(5, 19)).Value
若しくは
Cells(3, 13).Resize(, 3).Value = .Cells(5, 17).Resize(, 3).Value
と書けます(ResizeはHelpで調べて下さい)、因って
Cells(3, 13).Resize(, 3).Value = .Cells(5, 17).Resize(, 3).Value Cells(4, 13).Resize(, 3).Value = .Cells(5, 25).Resize(, 3).Value ・ Cells(10, 13).Resize(, 3).Value = .Cells(5, 17).Resize(, 73).Value
と成りますので、此れをループにすると
For j = 0 To 7
Cells(3 + j, 13).Resize(, 3).Value = .Cells(5, 17 + 8 * j).Resize(, 3).Value
Next j
カウンタjが0〜7に変化するなら 左辺は、行の基数3に対して変化すjの値を加算しています また右辺は列が8列づつ変化すれば善いのですから列の基数17にjの値×8を加算して行きます
同様に★印以降は
Cells(3, 17).Resize(, 3).Value = .Cells(5, 81).Resize(, 3).Value ・ Cells(10, 17).Resize(, 3).Value = .Cells(5, 137).Resize(, 3).Value
と書けますので
For j = 0 To 7
Cells(3 + j, 17).Resize(, 3).Value = .Cells(5, 81 + 8 * j).Resize(, 3).Value
Next j
と成ります、上のループと一緒にして
For j = 0 To 7
Cells(3 + j, 13).Resize(, 3).Value = .Cells(5, 17 + 8 * j).Resize(, 3).Value
Cells(3 + j, 17).Resize(, 3).Value = .Cells(5, 81 + 8 * j).Resize(, 3).Value
Next j
此れで1ブロックが転記出来ます(For r = 3 To 10のループ部は除いて)
次に、此れを200回回すので「For j =」の外側に「For i = 0 To 199」のループを付けます この時、一回回る度に、左辺は8行下に、右辺は1行右に移動させるので
For i = 0 To 199
For j = 0 To 7
Cells((3 + j) + 8 * i, 13).Resize(, 3).Value = .Cells(5 + i, 17 + 8 * j).Resize(, 3).Value
Cells((3 + j) + 8 * i, 17).Resize(, 3).Value = .Cells(5 + i, 81 + 8 * j).Resize(, 3).Value
Next j
Next i
と成ります、此れに「For r = 3 To 10」のループ部を組み込み、同じ計算を何度も書かない様に 計算結果を変数に入れて使っているのが「Sub セルの参照_2()」と成ります
(Bun)
ところで、0ってすごいですね。
足してよし、掛けてよし、1からではなく0から始まるのはこういう理由かと感心しました。
昨日何とか理解できた気がする、というときにこれに似たような別の仕事が来たので、
やってみたのですが、難しい方(Resizeが入っている方)はできたのに、
簡単な方(数値は違いますが)
For r = 3 To 10
Cells(r, 2) = .Cells(5, 2)
Cells(r, 6) = .Cells(5, 7)
Cells(r, 7) = .Cells(5, 8)
は一塊りしか入りませんでした。
どういうこと???と思った時点で終業時間がきたので、今日の朝一でリベンジです。
別のパターンでもできました、と報告できないのが残念ですが
基本は理解できたと思います。
本当にありがとうございました。
(えま)
>ところで、0ってすごいですね。 >足してよし、掛けてよし、1からではなく0から始まるのはこういう理由かと感心しました。
確かに、0の発見ですね(私も、0偉いと思います?)
>昨日何とか理解できた気がする、というときにこれに似たような別の仕事が来たので、 >やってみたのですが、難しい方(Resizeが入っている方)はできたのに、 >簡単な方(数値は違いますが) >For r = 3 To 10 > > Cells(r, 2) = .Cells(5, 2) > Cells(r, 6) = .Cells(5, 7) > Cells(r, 7) = .Cells(5, 8) > >は一塊りしか入りませんでした。 >どういうこと???と思った時点で終業時間がきたので、今日の朝一でリベンジです。 >別のパターンでもできました、と報告できないのが残念ですが >基本は理解できたと思います。
こう言うのは、何がどういう法則で変化しているのかを見つけられるのかが肝心な所です この為には人に教えられる因り、自分で試して納得するしか無い様な気がします ですので、えまさんも頑張って試して下さい
後、今回の質問と離れるかもしれませんが、一列のデータを方形に変換する方法等も有りますので 暇が在ったら試して見ると面白いかも?
(Bun)
ところで、
For i = 0 To 199
For j = 0 To 7
のうち、j を入れなくても出来たような気がします。
またもや時間切れで元のデータとの突き合わせができなかったので
ぱっと見だけの印象ですが。
明日もう一度試してみます。
本当にありがとうございました。
(えま)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.