Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1689 / 13645 ツリー ←次へ | 前へ→

【72597】転記のコード yui 12/8/27(月) 21:59 質問[未読]
【72604】Re:転記のコード ドカ 12/8/28(火) 10:11 回答[未読]
【72616】Re:転記のコード yui 12/8/28(火) 22:17 お礼[未読]
【72615】Re:転記のコード ichinose 12/8/28(火) 21:49 発言[未読]
【72617】Re:転記のコード yui 12/8/28(火) 22:35 お礼[未読]

【72597】転記のコード
質問  yui  - 12/8/27(月) 21:59 -

引用なし
パスワード
   転記したい場合のコードの記入方法を教えてください。

VBA初心者です。エクセル2003を使用しています。
今会社で本を見ながらVBAのコードを記載しているのですが、
なかなかうまくいきません。
単純に転記のコードを書いてみましたが、下記のようですと動きますが効率も悪いし見栄えもよくないです。
また、今後データが増えた時に対応出来ないように思います。

転記の記入など基本的なことだと思いますが、
教えていただけませんでしょうか?
ちなみに、コピペですと表の行が結合されているので出来ないので、
転記という形にしたいです。

やりたいこと
1.表シートのC列にシート2のA列を転記。
C列は上にタイトルなど含めて4行記載しない部分があるので、C5セルから始まっています。
表はC5とC6の2行が結合し、C7とC8が結合というように2行づつ結合しています。
データシートのA列は一行タイトル行が入っています。A2から連続してデータが入ってA46まで入っています。
最終行はとりあえず、データシートのA46セルを表のC93へ転記ですが、データ範囲が変わるかもしれないので対応出来るようなコードにしたいです。

2.上記のデータシートはA列以外もB列からAF列までデータが入っています。
そのデータを表シートのO列からAI列へ順に転記したいのです。
こちらも上記と同様、表シートは2行ごとに結合されています。

これら1.、2.をデータシートが入っている最終行まで転記できるようにするには、どうやってコードを記載したらいいでしょうか?
長々とコードを書きましたが、これではダメだと思い助けて頂きたいです。

宜しくお願い致します。


記載しているコード
1.worksheets("表").Range("C5").Value=worksheets("データー").Range("A2")
 worksheets("表").Range("C7").Value=worksheets("データー").Range("A3")
 worksheets("表").Range("C9").Value=worksheets("データー").Range("A4")
以下続く
 worksheets("表").Range("C91").Value=worksheets("データー").Range("A45")
 worksheets("表").Range("C93").Value=worksheets("データー").Range("A46")

2.worksheets("表").Range("O5:AI5").Value=worksheets("データー").Range("B2:AF2")
 worksheets("表").Range("O7:AI7").Value=worksheets("データー").Range("B3:AF3")
 worksheets("表").Range("O9:AI9").Value=worksheets("データー").Range("B4:AF4")
以下続く
 worksheets("表").Range("O91:AI91").Value=worksheets("データー").Range("B45:AF45")
 worksheets("表").Range("O93:AI93").Value=worksheets("データー").Range("B46:AF46")

【72604】Re:転記のコード
回答  ドカ  - 12/8/28(火) 10:11 -

引用なし
パスワード
   ▼yui さん

For i = 5 To 49
  Worksheets("表").Range("C" & 5 + (i - 5) * 2).Value = Worksheets("データー").Range("A" & i - 3)
Next

【72615】Re:転記のコード
発言  ichinose  - 12/8/28(火) 21:49 -

引用なし
パスワード
   こんばんは。

>転記したい場合のコードの記入方法を教えてください。
>VBA初心者です。エクセル2003を使用しています。

プログラミングの要でもある繰り返しを司るステートメントを
調べてください。

Do 〜 Loop 文 と
For 〜 Next文  があります。

今回は、繰り返し処理の理解が目的ですから、

Do〜Loop文を取り上げます。


>記載しているコード
>1.worksheets("表").Range("C5").Value=worksheets("データー").Range("A2")
> worksheets("表").Range("C7").Value=worksheets("データー").Range("A3")
> worksheets("表").Range("C9").Value=worksheets("データー").Range("A4")
>以下続く
> worksheets("表").Range("C91").Value=worksheets("データー").Range("A45")
> worksheets("表").Range("C93").Value=worksheets("データー").Range("A46")
>
>2.worksheets("表").Range("O5:AI5").Value=worksheets("データー").Range("B2:AF2")
> worksheets("表").Range("O7:AI7").Value=worksheets("データー").Range("B3:AF3")
> worksheets("表").Range("O9:AI9").Value=worksheets("データー").Range("B4:AF4")
>以下続く
> worksheets("表").Range("O91:AI91").Value=worksheets("データー").Range("B45:AF45")
> worksheets("表").Range("O93:AI93").Value=worksheets("データー").Range("B46:AF46")

上記のコード1,2を見ると、シート「データー」の各セルの行とシート「表」のセルの行が違っていること以外は、各コードは同じですよね?
そうすると、行番号を規則に従い変化させれば、繰り返し処理が使えそうなのです。

  worksheets("表").Range("C5").Value=worksheets("データー").Range("A2")
 worksheets("表").Range("C7").Value=worksheets("データー").Range("A3")
データーのA列行番号が1ずつ増え、表のC列行番号が2ずつ増えている。
この規則が利用できないか? を考えます。
今、シート「データー」のA列の行を変数gyoを使って変化させることを考えます。

標準モジュールに


Sub test1()
  Dim gyo As Long
  gyo = 2 'データーのA列行の始まりは、2 ですよね?
  Do
    Range("A1").Value = gyo
  Loop
End Sub


今、変数gyoの内容がわかりやすいようにアクティブなシートのA1に表示するようにしています。


test1を実行してください。

セルA1 は、2が表示されっぱなしでカーソルは、砂時計状態、プログラムは、終わる気配がありません。
Do 〜 Loopは、この間に書かれたプログラムを延々繰り返します。

gyoという変数は、最初に2が設定されただけで、

セルA1にその値をいれる を繰り返してるだけです。

これでは、繰り返し処理をさせる意味がありません。

ESCキーを押してプログラムを強制終了させてください。
中断したという趣旨のメッセージが表示されますから、「終了」をクリックしてください。


Do〜Loop

内でgyoと言う変数を変化させなければなりません。
ここでは、

gyo=gyo+1というコードを入れてgyoという変数を1ずつ増やしてみます。


Sub test2()
  Dim gyo As Long
  gyo = 2
  Do
    Range("A1").Value = gyo
    gyo = gyo + 1
  Loop
End Sub


test2を実行してみてください。

変数gyoの中身を示すセルA1は、どんどん増えていますね?
でも、おいおい増えすぎだよ!!
データーのA列データは46行まででいいんだよ!!
ダメダどんどん増えていってしまう。

仕方がないですね、また、

ESCキーを押してプログラムを強制終了させてください。
中断したという趣旨のメッセージが表示されますから、「終了」をクリックしてください。

繰り返し処理を抜ける条件が必要ですね!!
繰り返すのは、gyoが46まででよいのですよね!!


Sub test3()
  Dim gyo As Long
  gyo = 2
  Do While gyo <= 46
    Range("a1").Value = gyo
    Application.Wait [now()] + [timevalue("00:00:00.30")]
    gyo = gyo + 1
  Loop
End Sub

このように Do の後に繰り返しの条件を記述できます。

Do While gyo <= 46

変数gyoが、46以下の場合、繰り返し処理を続ける、46を越えたら、繰り返し処理を
抜ける という意味です。

尚、Application.Wait [now()] + [timevalue("00:00:00.30")]は、
処理速度を遅くし、セルA1の値の変化を分かりやすくするために
入れています。本来は,速い方が良いのですから、要りませんね!!

これで シート「データー」のA列の行変化は、Do〜Loopを使って実現できました。


今度は、シート「データー」のA列の行と シート「表」のC列の行との間に
ある規則性を考えます、


 データーのA列の行       表のC列の行
    2              5
    3              7
    4              9
    5             11


  (シート「データー」のA列の行)×2+1=シート「表」のC列の行
 という規則性が見えてきませんか?

これを関係を利用すると


Sub test4()
  Dim gyo As Long
  gyo = 2
  Do While gyo <= 46
    Range("a1").Value = gyo
    Range("b1").Value = gyo * 2 + 1
    Application.Wait [now()] + [timevalue("00:00:00.30")]
    gyo = gyo + 1
  Loop
End Sub
        
セルA1にシート「データー」のA列の行
セルB1にシート「表」のC列の行

が順次、表示されます。


変数gyo(シート「データー」のA列の行)から、シート「表」のC列の行まで
求められますから、これを使えば、 Do〜Loopを使った
繰り返し処理が実現できると思います。

【72616】Re:転記のコード
お礼  yui  - 12/8/28(火) 22:17 -

引用なし
パスワード
   ドカ さん

回答をありがとうございました!
いただいたコードをヒントにもう一件も考えてみます。

【72617】Re:転記のコード
お礼  yui  - 12/8/28(火) 22:35 -

引用なし
パスワード
   ichinose さん

こんばんは!
とても丁寧な解説をありがとうございました。

考え方まで細かく書いていただいて本当に感謝です。
なるほど、規則性を考えて当てはめていくんですね。

最初から完全なコードが出来なくても、少しづつ改良していけばいいんですね。

どうやって考えていくのかわからなかったので丁寧な解説に助けていただきました。ありがとうございます。
頑張ってコード考えますね!

1689 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free