[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『決まった行毎に選択コピー』(勉強中)
マクロ初心者です。 関数を使用して、A16:D16〜の6行ごとのデータを、F16:I16〜に抽出しています。 このままでも支障はないのですが、マクロの勉強をしたいです。 F16=OFFSET($A$16,(ROWS($F$16:F16)-1)*6,0) G16=OFFSET($B$16,(ROWS($G$16:G16)-1)*6,0) H16=OFFSET($C$16,(ROWS($H$16:H16)-1)*6,0) I16=OFFSET($D$16,(ROWS($I$16:I16)-1)*6,0)
ネットで調べてみたのですが、 思った通りにできないので、教えて頂けますか? 下記のままだと、D列までではなく、列が右まで全部選択されてしまいます。 最終行を自動で取得したい。 選択した6行毎のデータを、F16:I16を開始行にして貼付したい。
Option Explicit
Sub Macro1()
Dim i As Long Dim r As Range
Set r = Cells(16, 1) 'Range(Cells(16, 1), Cells(16, 4)).? For i = 16 To 2024 Step 6 Set r = Union(r, Cells(i, 1)) '(遠く離れた場所にあるセルなど連続していないものは、Unionメソッドで操作 することが可能です。)
Next i
r.EntireRow.Select '(Rangeオブジェクトを指定して行全体を選択します。)
End Sub
宜しくお願い致します。
EntireRowだと行全体を選択することになります。 Selectで終わっているのでよく分かっていません。 外しているかもしれませんが、以下のようなことでしょうか? Sub Akeome() Dim i As Long, ii As Long ii = 16 For i = 16 To 2024 Step 6 Range(ii, 5).Resize(, 4).Value = Range(i, 1).Resize(, 4).Value ii = ii + 1 Next End Sub (ROUGE)
有難うございます。 Range(ii, 5).Resize(, 4).Value = Range(i, 1).Resize(, 4).Valueで黄色くなってしまいます。 Selectで終わっているのでよく分かっていません。 マクロで作れなかったので、今、Selectで選択された部分を、コピーして、貼付ています。(勉強中)
あ・・・・「Range」の所が「Cells」ですネ。(2ヶ所) どうでしょう?
(HANA)
HANAさん久しぶり。 正月休みボケですね。。。 Cellsプロパティに変更をお願いします。 (ROUGE)
有難うございます。動きました。 下の様に、解釈したのですが、 最終行をTo 2024と決めずに、自動で取得するには、どうすれば良いでしょうか?
最終行を取得するマクロは、ネットで出てくるのですが、 どのように、ここに入れれば良いのか分かりませんでした。
MsgBox ActiveSheet.Range("$A$65536").End(xlUp).Row ' 最終セルを表示(ブランクがあった場合のため、後ろから探す)
Option Explicit
Sub データ抽出() Dim i As Long, ii As Long 'i=参照先 ii=抽出先 :Long(長整数型) ii = 16 '抽出先開始行 For i = 16 To 2024 Step 6 '参照先の、開始行〜最終行まで、6行ごとに抽出 Cells(ii, 6).Resize(, 4).Value = Cells(i, 1).Resize(, 4).Value 'Resizeプロパティ 現在参照しているセル範囲を、リサイズ(大きさを変更)したセル範囲の参照を得ることができる '抽出先Cells(ii, 6)=F16,Resize(, 4)=4列分(F,G,H,I)=参照先Cells(i, 1)=A1,Resize(, 4)=4列分(A,B,C,D) ii = ii + 1 '抽出先は、1行ずつ、増えていく
Next End Sub
A16のデータ 2010/12/15 が、F16に、12/15/2010 と抽出されてしまうのですが、何故でしょうか? 書式は、両方とも セルの書式設定で、日付 *2001/3/14で設定されています。
宜しくお願い致します。 (勉強中)
こんな感じにしてみるとどうでしょう? '------ Option Explicit Sub 最終行を取得してデータ抽出() Dim i As Long, ii As Long 'i=参照先 ii=抽出先 :Long(長整数型) Dim iii As Long 'iii=データ最終行 :Long(長整数型) ★追加
ii = 16 '抽出先開始行 iii = ActiveSheet.Range("$A$65536").End(xlUp).Row 'データ最終行 ★追加
For i = 16 To iii Step 6 '参照先の、開始行〜最終行まで、6行ごとに抽出 ' ~~~ ★変更 2024 → iii=データ最終行 Cells(ii, 6).Resize(, 4).Value2 = Cells(i, 1).Resize(, 4).Value2 ' ~~~~~~ ~~~~~~ ☆Value → Value2 に変更してみる。 'Resizeプロパティ 現在参照しているセル範囲を、リサイズ(大きさを変更)したセル範囲の参照を得ることができる '抽出先Cells(ii, 6)=F16,Resize(, 4)=4列分(F,G,H,I)=参照先Cells(i, 1)=A1,Resize(, 4)=4列分(A,B,C,D) ii = ii + 1 '抽出先は、1行ずつ、増えていく Next End Sub '------
>最終行をTo 2024と決めずに、自動で取得するには、どうすれば良いでしょうか? に関する追加・変更が ★(3行)
>A16のデータ 2010/12/15 が、F16に、12/15/2010 と抽出されてしまうのですが、 に関する変更が ☆(1行)
(HANA) ROUGEさん、ご無沙汰してます。
出来ました。HANAさん、初心者向けの解説を有難うございました。(勉強中)
前回教えて頂いたのですが、追加でお願いできますか? 左から2番目のシートの、A16:D(最終行)の6行ごとのデータを、 今度は、左から3番目のシートのA13:Dに貼り付けしたいです。
下のマクロは、前に教えて頂いたのを、変更して作ってみましたが、 Worksheets(2).Cells(i, 1).Resize(, 4).Value2.Copy で、オブジェクトが必要ですとなりました。
マクロが不慣れなので、全然違うかもしれませんが、 ご教授お願い致します。
Sub コピーして別のシートに貼り付ける() Dim i As Long Dim ii As Long Dim iii As Long
Worksheets(2).Activate iii = ActiveSheet.Range("$A$65536").End(xlUp).Row For i = 16 To iii Step 6 Worksheets(2).Cells(i, 1).Resize(, 4).Value2.Copy
Worksheets(3).Cells(ii, 1).Resize(, 4).Value2.PasteSpecial Paste:=xlPasteValues ii = 13 ii = ii + 1 Next
Application.CutCopyMode = False
End Sub
(勉強中)
お騒がせしました。 修正してできました。 Worksheets(3).Cells(ii, 1).Resize(, 4).Value2 = Worksheets(2).Cells(i, 1).Resize(, 4).Value2 (勉強中)
Option Explicit
Sub 最終行を取得してデータ抽出() Dim i As Long, ii As Long 'i=参照先 ii=抽出先 :Long(長整数型) Dim iii As Long 'iii=データ最終行 :Long(長整数型)
ii = 4 '抽出先開始行 iii = ActiveSheet.Range("$A$65536").End(xlUp).Row 'データ最終行
For i = 15 To iii Step 12 '参照先の、開始行〜最終行まで、12行ごとに抽出 Cells(ii, 7).Resize(, 4).Value2 = Cells(i, 1).Resize(, 4).Value2 ' 'Resizeプロパティ 現在参照しているセル範囲を、リサイズ(大きさを変更)したセル範囲の参照を得ることができる '抽出先Cells(ii, 7)=G4,Resize(, 4)=4列分(G,H,I,J):参照先Cells(i, 1)=A15,Resize(, 4)=4列分(A,B,C,D) ii = ii + 1 '抽出先は、1行ずつ、増えていく Next End Sub
前回教えて頂いたマクロで、A15:D15の12行ごとの値を、G4:J4に転記しています。 A列:日付、B列:時間、C列、D列数値で、今回、C15から12行ごと、D15から12行ごとの平均を、I4,J4に転記したいです。
今、関数で、 I4=AVERAGE(OFFSET(C$15,12*(ROW(A1)-1),0,12)) J4=AVERAGE(OFFSET(D$15,12*(ROW(B1)-1),0,12))として、算出しているのですが、 マクロでは、どのように記述すれば良いか、教えて頂けますでしょうか? 宜しくお願い致します。(勉強中)
>Cells(i, 1).Resize(, 4) これだと、A列のi行のセルから右に4セル分のセル範囲 i行の A:D列の範囲 もしも Cells(i, 1).Resize(12) と書けば、A列のi行のセルから下に12セル分のセル範囲 A列の i〜i+11行 の範囲(A列のi行目のセルを含め、下方向に12セル分) です。
ワークシート関数のAVERAGE関数はVBA上でも使えるので 結果を出すセル = Application.Average(セル範囲) で出来るのではないかと思います。
これだと、値に成ってしまうので 元の範囲のデータを変更しても反映されません。 反映させる必要が有る場合は、数式を埋め込んでおくのが良いかもしれません。
(HANA)
HANAさん アドバイス、有難うございます。 反映させる必要が有る場合は、数式を埋め込んでおくのが良いかもしれません。 了解です。
すみませんが、マクロを見て頂けますでしょうか? 12行ずつ、下に平均を出す方法がまだ分かりませんでした。 とりあえず、CD列の抽出だけ、別にしてみようと思ったのですが。 この関数もどこかに入れる必要があるのでしょうか? I4=AVERAGE(OFFSET(C$15,12*(ROW(A1)-1),0,12)) J4=AVERAGE(OFFSET(D$15,12*(ROW(B1)-1),0,12))
= Application.Average(セル範囲)の書き方が解りませんでした。 Rangeも使うのかな?と思ったり。。
For i = 15 To iii Step 12 '参照先の、開始行〜最終行まで、12行ごとに抽出 Cells(ii, 7).Resize(, 2).Value2 = Cells(i, 1).Resize(, 2).Value2 '日付と時間を12行ごとに抽出(A15,B15をG4,H4に抽出) Cells(ii, 9).Resize(, 1).Value = Application.Average.Range(Cells(i, 3), Resize(12)).Value '数値の抽出(C15をI4に抽出) Cells(ii, 10).Resize(, 1).Value = Application.Average.Range(Cells(i, 4), Resize(12)).Value '数値の抽出(D15をJ4に抽出)
何度もすみませんが、ご指導お願い致します。(勉強中)
>この関数もどこかに入れる必要があるのでしょうか? いいえ、マクロで結果の値だけを書き込むなら 関数を入れる必要は有りません。
お伺いしてみるのですが、例えば 結果を出すセル ・・・ Cells(ii, 9)・・・・・・・I4 平均を出す元に成るデータが有るセル範囲 ・・・ Cells(i, 3).Resize(12)・・C15:C26 と言う書き方をした時のセル範囲であっていますか?
でしたら 結果を出すセルの値 = Application.Average( セ ル 範 囲 ) Cells(ii, 9).Value = Application.Average(Cells(i, 3).Resize(12)) と言う事に成ると思いますが。。。
(HANA)
HANAさん 有難うございました。思っていた通りです。とても便利ですね。 いつもは関数でしていたのですが、大変勉強になりました。 関数とマクロを状況に応じて、使わせて頂きます。 お世話になりました。(勉強中)
マクロで数式を埋め込む場合 I4 = AVERAGE(C15:C26) i/~~ ~~\i + 11 なので Cells(ii, 9).Formula = "=AVERAGE(C" & i & ":C" & i + 11 & ")" (~~~~~~~ここは、Valueとしても同じ結果) の様に書けます。
また、Cells(i, 3).Resize(12).Address で、セルアドレスが 文字列として取得出来るので Cells(ii, 9).Formula = "=AVERAGE(" & Cells(i, 3).Resize(12).Address & ")" の様にも書けます。 これだと、=AVERAGE($C$15:$C$26) に成りますが。 $マークが気になる様なら Address(0, 0) にして下さい。
マクロが使えると、色々な事が簡単に出来るように成ったりしますので 状況に合わせて いずれも便利に使用して頂ければと思います。 事前にシートに数式を埋め込んでおくのが便利なのか マクロで数式を入れていくのが便利なのか マクロで計算結果だけを入れていくのが便利なのか
ちなみに、「12」と言う数字が数回出てくるので 抽出先開始行の様に 上の方で 変数に入れることにしておくと、後々便利かもしれません。
(HANA)
HANAさん 何度も、ご丁寧に、感謝します。 教えて頂いたとおり、全部のシートを対象にマクロを変更してみました。 おかげさまで、うまく動きました。 値だけじゃなく、数式を入れる方法もあるのですね。 これだと、私以外の人が見ても、何の数値か解りやすくて、親切ですね。 HANAさんの頭脳に関心するばかりです。
Sub test()
Dim ws As Worksheet For Each ws In Worksheets ws.Activate
Dim i As Long, ii As Long Dim iii As Long Dim iiii As Long
ii = 4 iii = ActiveSheet.Range("$A$65536").End(xlUp).Row iiii = 12
For i = 15 To iii Step iiii Cells(ii, 7).Resize(, 2).Value2 = Cells(i, 1).Resize(, 2).Value2 Cells(ii, 9).Formula = "=AVERAGE(C" & i & ":C" & i + 11 & ")" Cells(ii, 10).Formula = "=AVERAGE(D" & i & ":D" & i + 11 & ")"
ii = ii + 1
Next
Next ws
End Sub
有難うございました。(勉強中)
そんなに褒めて頂いても、何も出ませんよ。^^
おっと iiii = 12 を作ったなら Cells(ii, 9).Formula = "=AVERAGE(C" & i & ":C" & i + 11 & ")" ここも変数に成りますね。/~~
足したり引いたり長く成りますが。
それから、i と言う変数は、ループカウンターとして使用される事が多いです。 i,ii,iii,iiii では、何の変数なのか分からないので ご自身で分かる様な変数名にしておかれるのが良いと思います。
(HANA)
HANAさん 何から何まで、ご親切に、有難うございます。
Dim sn As Long, cs As Long Dim lg As Long Dim ng As Long
cs = 4 lg = ActiveSheet.Range("$A$65536").End(xlUp).Row ng = 12
For sn = 15 To lg Step ng Cells(cs, 7).Resize(, 2).Value2 = Cells(sn, 1).Resize(, 2).Value2 Cells(cs, 9).Formula = "=AVERAGE(C" & sn & ":C" & sn + ng - 1 & ")" Cells(cs, 10).Formula = "=AVERAGE(D" & sn & ":D" & sn + ng - 1 & ")"
cs = cs + 1
に変更してみました。確かに、i,iiとかは、自分で見ても解りにくいなと思っていました。 マクロを勉強し始めたばかりで、今後もお世話になる事があるかもしれませんが、 皆さんのアドバイス、とても勉強になります。今後とも宜しくお願いします。(勉強中)
そう言えば、数式を埋め込むなら (一辺に思いつかなくて済みません。。。) Cells(cs, 9).Resize(, 2).Formula = "=AVERAGE(C" & sn & ":C" & sn + ng - 1 & ")" と書いても大丈夫そうですね。
この1行で↓の結果になります。 I4=AVERAGE(C15:C26) J4=AVERAGE(D15:D26)
"=AVERAGE( C" & sn & ": C" & sn + ng - 1 & ")" ~ ~絶対参照にしていないので J4に入るときは、勝手に隣の列を参照した式になります。
(HANA)
HANAさん。 有難うございました。 この式だけ、見ていたら、何の事か理解できないレベルの私ですが、 丁寧に教えて頂いたので、よく分かりました。 Cells(cs, 7).Resize(, 2).Value2 = Cells(sn, 1).Resize(, 2).Value2 Cells(cs, 9).Resize(, 2).Formula = "=AVERAGE(C" & sn & ":C" & sn + ng - 1 & ")" これで使わせて頂きます。ご親切に有難うございました。(勉強中)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.