[[20170808212638]] 『セルの最終行まで繰り返すやり方を教えてください』(りりちゃん☆彡) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セルの最終行まで繰り返すやり方を教えてください。』(りりちゃん☆彡)

こんばんわ。
りりちゃん☆彡です。
いつもお世話になっております。

セルの最終行まで繰り返してもらうやり方を教えてください。

新しく仕事で作っているリストに、自動でF列と、G列の最後までに
関数を入れたいです。

βさんが書いてくれた素敵な♪コードを利用させていただいて、
りりが必要な所を追加して作りました。
リストの1行目、2行目には記入してもらえるようにはなったのですが、
2行目から下を繰り返して書いて欲しいのですが、
なんて書けばそうなるか分からなくて困ってしまっています。

どなたかお分かりになる方、すみませんが、教えてください。

☆**************βさんが書いてくれた素敵な♪コード**************☆

Sub ファイル名を追加()

    Dim mx As Long

    '表の見出し
     Range("F1").Value = "ファイル名1"        'F1にファイル名1と表示
     Range("G1").Value = "ファイル名2"        'G1にファイル名2と表示

    mx = Range("F" & Rows.Count).End(xlUp).Row  'F列データ最終行

    Cells(mx + 1, "F").Formula = "=I2&$H$1&$B$2&H$1&C2&$H$1&D2"     '最終行のセルの1つ下のセルに式をセット

    mx = Range("G" & Rows.Count).End(xlUp).Row  'G列データー最終行

    Cells(mx + 1, "G").Formula = "=J2&""_""&F2"      '最終行のセルの1つ下のセルに式をセット

End Sub

< 使用 Excel:Excel2010、使用 OS:Windows8 >


 >セルの最終行

 セルの最終行の基準がC列にあるなら、こんなので一気に書けますよ。

 Sub ファイル名を追加()
     Dim mx As Long

     mx = Range("C" & Rows.Count).End(xlUp).Row 'C列の最終行

     '表の見出し
      Range("F1").Value = "ファイル名1"        'F1にファイル名1と表示
      Range("G1").Value = "ファイル名2"        'G1にファイル名2と表示

      '最終行まで数式を埋める
      Range("F2:F" & mx).Formula = "=I2&$H$1&$B$2&H$1&C2&$H$1&D2"
      Range("G2:G" & mx).Formula = "=J2&""_""&F2"
 End Sub

(半平太) 2017/08/08(火) 23:15


半平太様

こんばんわっ。りりちゃん☆彡です。
この度も、お世話になりありがとうございましたっm(__)m

今日は今帰ってきたばかりです(涙)大雨の降る中やっといま帰ってきたぁ。。

という訳で。。誠に申し訳ございませんが明日ゆっくりと質問とお礼をさせていただきたく思います。

もう少々お待ちくださいませ。

雨こんこに濡れてしまって、寒くなってしまった。。
りりちゃん☆彡より。
(りりちゃん☆彡) 2017/08/09(水) 22:28


半平太様

こんばんわ(^^)/
りりちゃん☆彡です。
いつもお世話になっております。

コード書いてくださってありがとうございました!!
今日やってみたら、りりの希望どうりになってました(^^♪
本当に、本当にありがとうございましたっ(人''▽`)☆
とってもとっても助かりましたっ✨

今回教えていただいたコードと、βさんが書いてくれていたコードで、教えていただきたい
所があるので、申し訳ありませんがもうしばらくお付き合いいただけると嬉しいです。

りりの少ないVBA知識の中での質問なので、見当違いだったり、へんだったらごめんなさい(..)

質問1.りりが、こうやればできるかも!?と思っていたのではできないんでしょうか??

・βさんが書いてくれた素敵なコードで試してみていたコードで、もしも半平太様が
書いて下さったのと同じように、リストのずーと下まで書いてくれるようにするには、
For っていうのと、Loopっていうので作るとできるんでしょうか??

りりはまだ、自分でしたいことを書けないので。。。ちょっとづつでも、教えてもらったコードを
ちょびっと変えてコード書けるようになったらいいなって思いました('◇')ゞ

質問2.半平太さんが書いてくださったコードのほうで、「セルの最終行の基準がC列にあるなら」と書いてあるのはどうしてでしょうか??

・りり的に思ったのは。。。C列に入っているデーターの最終行を基準点(?)みたくして、F列、G列に数式を数式を入れるようにってエクセルに教えているのかな??
と思いました。

お忙しいところ申し訳ありませんが、ご指導の程どうぞよろしくお願い申し上げます。
(りりちゃん☆ミ) 2017/08/10(木) 23:31


 >ちょっとづつでも、教えてもらったコードを 
 >ちょびっと変えてコード書けるようになったらいいなって思いました('◇')ゞ 

 分かりました。その路線で行きましょう。

 まず、話の前提となるシートのレイアウトとサンプルデータを提示してください。

 例えば、下図の様なものです。※出来るだけ分かり易いサンプルにしてください。

 行 _B_ __C__ _D_ _E_ ___________F___________ ______________G______________ _H_ __I__ __J__
  1                                                                         HH1            
  2 bb  cc02  dd2                                  II002 jj-2 
  3     cc03  dd3                                                               II003 jj-3 
  4     cc04  dd4                                                               II004 jj-4 
  5     cc05  dd5                                                               II005 jj-5 

 そして、マクロ実行後に、どうなって欲しいのか。
 つまり、結果図も同じように図で示してください。

 (今日は遅いので、これまでとします)

(半平太) 2017/08/11(金) 00:15


半平太様

こんにちは。
りり☆彡ですいつもお世話になっております。

今回はりりのわがままなのに、お付き合いさせてしまって本当にごめんなさい。
下記場所にファイルをアップロード致しました。
お手すきの際にでもご覧いただければと思います。

http://firestorage.jp/download/6472c82a783809f40116b2ff1efff33d80fe4fe2w0d1oadqnt4froiosm8t
パスワードは、riri です。

りりより☆彡
(りりちゃん☆彡) 2017/08/11(金) 11:58


半平太様

こんにちわりりです。
いつもお世話になっております。

先ほど投稿いたしました、ファイルのアップ先のアドレスが違っておりました。
申訳ございません。

りりのやり方が悪かったようで、大変失礼いたしました。

今度はだいじょうぶだとおもうのですが。。
お忙しいところ申し訳ありませんがどうぞよろしくお願いいたします。

http://whitecats.dip.jp/up/download/1502428074.xlsm/attach

パスワードは、 riri です。
(りりちゃん☆彡) 2017/08/11(金) 13:43


 ちょっと、ネットからファイルをダウンロードするのは気が進みません。

 なので、私が掲示したサンプルで話を進めます。

 >βさんが書いてくれた素敵な♪コードを利用させていただいて、 
 >りりが必要な所を追加して作りました。

 そのコードを実行すると下図になります。

  行 _B_ __C__ __D__ _E_ ___________F___________ ______________G______________ _H_ __I__ __J__
   1                     ファイル名1             ファイル名2                   HH1            
   2 bb  cc02  dd2       II002HH1bbHH1cc02HH1dd2 jj-2_II002HH1bbHH1cc02HH1dd2      II002 jj-2 
   3     cc03  dd3                                                                 II003 jj-3 
   4     cc04  dd4                                                                 II004 jj-4 
   5     cc05  dd5                                                                 II005 jj-5 

 それじゃ、2行迄で終わっちゃうので、こうなるように希望しましたよね?
                  ↓
 >2行目から下を繰り返して書いて欲しい

 しかし、繰り返すためには、最後がどこまでか見極めなければならないです。
 単純に以下の4行をループさせれば、100万行でも書いちゃいます。

 >    mx = Range("F" & Rows.Count).End(xlUp).Row           'F列データ最終行
 >    Cells(mx + 1, "F").Formula = "=I2&$H$1&$B$2&H$1&C2&$H$1&D2"   '最終行のセルの1つ下のセルに式をセット
 >    mx = Range("G" & Rows.Count).End(xlUp).Row           'G列データー最終行
 >    Cells(mx + 1, "G").Formula = "=J2&""_""&F2"             '最終行のセルの1つ下のセルに式をセット

 何故なら、F列の最終データ行番号を取得しては、その下に数式を書くんですから、いつまでも続いちゃいます。

 では、どこでループを止めるか?

  やり方は一つじゃないです。肝心なのは、自分がどうロジックを組み立てるかです。
  例えば、C列が書かれている最終行まで、と考えたり出来ますね。そのロジックだと

   (ア) mx が 5 を超えたらやめるとする。(その為にはC列の最終行(5)を先に求めておく必要があります。)

  とか

   (イ) 今回書き込んだ行の次行 →「mx + 2」にある、C列の値が空白だったら止める
  
 と言うような作りにする。

 上記(イ)の方針で繰り返しをするなら、以下となる。

     Do
         mx = Range("F" & Rows.Count).End(xlUp).Row  'F列データ最終行

         Cells(mx + 1, "F").Formula = "=I2&$H$1&$B$2&H$1&C2&$H$1&D2"     '最終行のセルの1つ下のセルに式をセット

         mx = Range("G" & Rows.Count).End(xlUp).Row  'G列データー最終行

         Cells(mx + 1, "G").Formula = "=J2&""_""&F2"      '最終行のセルの1つ下のセルに式をセット

     Loop Until Range("C" & mx + 2).Value = ""

 しかし、上のコードには問題点が2つあります。

 (1)mxをF列、G列で計2回計算していること(無駄)

   多分、mxは同じ行番号になると思うので、2回目のmxを求めるステートメントは省くべき。

 (2)「Formula」プロパティがいつも同じ数式になっちゃうこと。
   つまり、全部同じ結果になっちゃいます。

  なので、「FormulaR1C1」プロパティにして、同じ数式文字でも、相対参照式にしてセットする必要があります。
  ※どんな相対参照式になるかは、マクロの記録で録れば直ぐ分かります。

 結局、以下のコードになります。

 Sub ファイル名を追加()
     Dim mx As Long

     '表の見出し
     Range("F1").Value = "ファイル名1"        'F1にファイル名1と表示
     Range("G1").Value = "ファイル名2"        'G1にファイル名2と表示

     Do
         mx = Range("F" & Rows.Count).End(xlUp).Row  'F列データ最終行
         Cells(mx + 1, "F").FormulaR1C1 = "=RC[3]&R1C8&R2C2&R1C[2]&RC[-3]&R1C8&RC[-2]"    '最終行のセルの1つ下のセルに式をセット
         Cells(mx + 1, "G").FormulaR1C1 = "=RC[3]&""_""&RC[-1]"                           '最終行のセルの1つ下のセルに式をセット
     Loop Until Range("C" & mx + 2).Value = ""     '今回書き込んだ行の次行のC列が空白になったらループを抜ける

 End Sub

 <結果図>
  行 _B_ __C__ _D_ _E_ ___________F___________ ______________G______________ _H_ __I__ __J__
   1                   ファイル名1             ファイル名2                   HH1            
   2 bb  cc02  dd2     II002HH1bbHH1cc02HH1dd2 jj-2_II002HH1bbHH1cc02HH1dd2      II002 jj-2 
   3     cc03  dd3     II003HH1bbHH1cc03HH1dd3 jj-3_II003HH1bbHH1cc03HH1dd3      II003 jj-3 
   4     cc04  dd4     II004HH1bbHH1cc04HH1dd4 jj-4_II004HH1bbHH1cc04HH1dd4      II004 jj-4 
   5     cc05  dd5     II005HH1bbHH1cc05HH1dd5 jj-5_II005HH1bbHH1cc05HH1dd5      II005 jj-5 

 注:このコードはF、G列 は、マクロ実行前は空白であることを前提にしています。

 >For っていうのと、Loopっていうので作るとできるんでしょうか?? 
 今回は、Do・・Loopでやりました。

 For でも出来ます。

 For i = 2 TO C列の最終行
  ここに、F列とG列に数式を埋めるコードを書く
 Next i 

 時間があったら、ご自分でトライしてみてください。

(半平太) 2017/08/11(金) 14:28


半平太様

こんばんわ。
りりちゃん☆彡です。
この度は色々とお忙しい中、教えてくださり本当にどうもありがとうございました。
本当に感謝、感謝です。
りりが質問させていただいたこととか、その時その状況(?)みたいなので
色々使い分ける必要があるんだーって事が良く分かりました。
それから、、本当にVBAって難しいなぁ。。ってつくづく思いました。

半平太様が教えてくれたこと、色々勉強になった事お伝えしたいと思います。

>しかし、繰り返すためには、最後がどこまでか見極めなければならないです。
> 単純に以下の4行をループさせれば、100万行でも書いちゃいます。

繰り返すためには、「最後」を入れないとずーとループしてしまうって事なんですね。
そうか。。本を見てひょっとして繰り返す→ループ(?)と思っていたけれど、ループには
最後を指定させておかないと大変なことになってしまうんだって思いました。
教えてくださってありがとうございました。

それと、りりが思っていたFor っていうのだと、まず最終行をしていして、指定した場所から指定した場所を繰り返すって事になるんですね。
そうなんだ。
りり、指定した場所から指定した場所までって書かなきゃだめってこと、全然気付いてなかったな。。
VBAの本を見て勉強はしている気がしていたけど、なんだか根本の所全然理解できていない見たい。。
少し悲しい気分。頑張ってるんだけどな〜(>_<)

でもでも。。「どこでループを止めるか」ってことが必要って事、半平太さんに教えていただいたから
覚えた(^^♪
あと、やり方の中で(ア)(イ)のやり方の解説、とても良く分かりました。
最初に半平太さんが書いて下さったコードは(ア)だったんですよね。
だから、りりが最初に質問した基準点(?)なのかなと思ったのは、
まんざらはずれでもなかったんですよね?
C列の最後を取得して、そこと同じ行でやめるように設定していたって事でいいんですよね??
そっか〜。
mxって言うのに、まずC列の最終行を変数として入れて覚えててもらって、
F2からしたのF列と、mx(さっき指定したC列の最終行と同じ場所っていうかFの最終行になる)
に関数を張り付けしてくださいってエクセルさんにお願いした事になるんだ〜。
> Range("F2:F" & mx).Formula = "=I2&$H$1&$B$2&H$1&C2&$H$1&D2"
なんか少し分かってきた気もする。。
本当に色々教えてくださってどうもありがとうございました。

Doっていうで書いて下さったのも、全く同じ結果になっていました。
コードだけ見ると、全然違う風に見えているのに、同じ結果になるんだもん。
スゴイね〜。
そしていくつものやり方を知っているって半平太さんって凄いですね。。。
本当にりりの勝手な事情なのに、お付き合いさせてしまってごめんなさい。。

Forって言うの頑張ってできるのかしら??という気がしてますが。。
お仕事もお休みに入りましたので頑張ってみようかなと思います。
今回ご相談したものだけでも、今より少し理解できるようにしたいなって。

本当にどうもありがとうございました(*´▽`*)
また是非色々教えていただけたら嬉しいです。
ps.またこの件で質問とかしちゃダメですよね?(..)
(りりちゃん☆彡) 2017/08/11(金) 21:45


 >ps.またこの件で質問とかしちゃダメですよね?(..)

 普通は「許してー」となるんですが、りりちゃんの文体で読まさ
 れると「いいけどー」ってなりますね。

 上でDoを使ったのを書きましたが、
 それは、そちらからリクエスト「End(xlup)を使え」があったので、
 そんな仕上がりになったのですが、普通、そうは書かないです。

 一回数式を書いた後、「またその列の最終行は何行目か調べて」その下の行に数式を書いて行くって無駄なんです。

 だって、2回目以降は、「前回、何行目に書いたかは既に知っている」のですから、
 調べるまでもなく、単に前回の下とか、行をプラス1とかすればいいですよね?

 Forを使うと、それがはっきりします。(もう、ループの中で End(xlup)は使いません)

 Sub ファイル名を追加2()
     Dim mx As Long
     Dim RW As Long  '書き込むべき行番号

     '表の見出し
     Range("F1").Value = "ファイル名1"        'F1にファイル名1と表示
     Range("G1").Value = "ファイル名2"        'G1にファイル名2と表示

     mx = Range("C" & Rows.Count).End(xlUp).Row  'C列データ最終行をメモる。一回だけEnd(xlup)を使って調べる。

     For RW = 2 To mx
         Cells(RW, "F").FormulaR1C1 = "=RC[3]&R1C8&R2C2&R1C[2]&RC[-3]&R1C8&RC[-2]"    '順次書込み
         Cells(RW, "G").FormulaR1C1 = "=RC[3]&""_""&RC[-1]"                           '同上
     Next RW                                                                          '次へカウントアップ
 End Sub

 ただし、これにも無駄があります。毎回セルに書き込むって、エクセルにとって「しんどい」ことなんです。
 (まぁ、データが大量になければ問題視されることではないですけどね・・)

 なので、一気に書ける方法があるなら、ループしないで書きたい・・・書きたくなりませんか?
 それが、初めの回答で提示したものです。しかも、一気書きなら数式もRC方式でなく、普通にA1方式が使えます。

(半平太) 2017/08/11(金) 23:15


半平太様

こんばんわ。りりちゃん☆彡です。
いつもお世話になっております。
質問のご承諾をいただき、本当に本当にありがとうございます(*´▽`*)

Forって言うの迄書いて下さったんですね。。
本当にどうもありがとうございます。
りりのためにいっぱい時間を費やしてもらってしまって、本当に申し訳なく思います。

せっかく半平太さんが教えてくださったから、りり今日頑張って勉強しましたっ(*^^)v
それで分かったことをご報告させていただきますっ(`・ω・´)ゞ

今回りりは半平太さんに3つのコードを教えていただきました。
1番最初のC列の最終行を調べてやるコード、2番目に教わったDoのコード、3番目に教わったForのコードです。
それぞれを今日、F8で一個づつやってみました。
それで、なぜ1番目のやつが1番目だったか分かったの。あと「無駄がある」って言っていたのが、どうゆうことなのかがりり分かったの!

Doっていうのも、Forって言うのも、ひとつづつ書きこみしているからなんだね。
1みたいにいっぺんに表示っていうか、ぱってやれるのに、この二つは一つ一つ見て書きこみしては次
っていうのを繰り返してやって居るからそこを無駄って言ってたんだ〜。
いっこつづ黄色くしてみてようやく分かった〜!!

半平太さんは、データーが少なければ、いっこづつでもいいけど、何千件ってなったらって事を最初から頭に入れてコード書いてたんだ〜。スゴイねぇ〜(*´▽`*)尊敬〜♪

あと、分かったのはもう一つForって言うのです。
これだけFormulaって言う所が、FormulaR1C1ってなってたからどうしてだろう(?_?)って思って、
他の皆とおんなじようにFormulaって言うのでやってみたら、皆同じ答えになってた。
りりやってみて分かったよ。
だから文面にRC方式を〜って書いてあったんですね〜。なるほど〜。
そうだったんだ。さすがだな〜って本気で思いました。

Forって言うのを自分で頑張るって思ったけど、全然りりじゃできなかったと思う。。
間違いなく、挫折してたと思う。。
気を使って書いて下さってありがとうございました。

今回同じ事をエクセルさんにやってもらうっていう3つのコードを半平太さんが
教えてくださったおかげで、ループさせるときはどこで止めるかを必ず書かなきゃダメな事、Forって言うので書くときは、どこまでですよって最初に教えなきゃダメな事、コードを書くときにまずどんな風に書いていくかって組み立てる事などなどちょびっとは理解が深まったかなって気がしています。

これまでにも、本でもきっと見たり例題にあったりしているんだと思うの。
でもいつも、ふ〜んって読み進めてた気がするの。なんて言うか心底分かっていないって言うかね。
でも今回半平太さんに教わって、なんでそうなのかとかイロイロ分かった気がする。
だからちょびっとは前進できたんじゃないかなって思います。

お忙しい中、りりの事なのに色々とお付き合いくださり、すごくすごく、感謝しています。
色々教えてくれて本当にどうも(人''▽`)ありがとう☆

今後も、またここでご相談させていただくこともあると思います。
またりりの名前を見かけたら、ご指導いただけたら嬉しいです。
初心者のひよひよ過ぎて、めんどくさいからな〜とか思ってしまったかもしれませんが。。
今後ともどうぞよろしくお願い致します。
(りりちゃん☆彡) 2017/08/12(土) 22:55


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.