Excel VBA質問箱 IV

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

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


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

【73267】繰り返し処理について ひまこ 12/12/16(日) 0:33 質問[未読]
【73271】Re:繰り返し処理について UO3 12/12/16(日) 7:11 発言[未読]
【73272】Re:繰り返し処理について ひまこ 12/12/16(日) 10:12 発言[未読]
【73273】Re:繰り返し処理について UO3 12/12/16(日) 10:56 発言[未読]
【73275】Re:繰り返し処理について ひまこ 12/12/16(日) 21:38 質問[未読]
【73277】Re:繰り返し処理について UO3 12/12/16(日) 22:36 発言[未読]
【73278】Re:繰り返し処理について UO3 12/12/16(日) 22:40 発言[未読]
【73282】Re:繰り返し処理について ひまこ 12/12/17(月) 6:23 お礼[未読]
【73287】Re:繰り返し処理について ひまこ 12/12/17(月) 22:00 お礼[未読]
【73286】Re:繰り返し処理について 12/12/17(月) 21:49 発言[未読]
【73288】Re:繰り返し処理について ひまこ 12/12/17(月) 22:04 質問[未読]
【73291】Re:繰り返し処理について 12/12/18(火) 6:32 発言[未読]
【73301】Re:繰り返し処理について ひまこ 12/12/18(火) 21:17 お礼[未読]
【73276】Re:繰り返し処理について 12/12/16(日) 21:59 回答[未読]
【73281】Re:繰り返し処理について ひまこ 12/12/17(月) 6:21 お礼[未読]
【73289】Re:繰り返し処理について ひまこ 12/12/17(月) 23:24 質問[未読]
【73292】Re:繰り返し処理について 12/12/18(火) 6:34 回答[未読]
【73302】Re:繰り返し処理について ひまこ 12/12/18(火) 21:19 お礼[未読]
【73311】Re:繰り返し処理について 12/12/19(水) 18:48 回答[未読]
【73298】Re:繰り返し処理について UO3 12/12/18(火) 12:42 発言[未読]
【73303】Re:繰り返し処理について ひまこ 12/12/18(火) 21:29 お礼[未読]

【73267】繰り返し処理について
質問  ひまこ  - 12/12/16(日) 0:33 -

引用なし
パスワード
   初心者です。

12段あるエクセルの表を下の段に12回繰り返して転記したいです。

転記する際、
1行ずつコピーしないセルを増やしていき、12回繰り返したいと思っています。

For Nextかなと思ったのですが
コピーしない行をどのようにしたら良いのか分かりません。

アドバイスやヒントなどあればお願いします。

【73271】Re:繰り返し処理について
発言  UO3  - 12/12/16(日) 7:11 -

引用なし
パスワード
   ▼ひまこ さん:

おはようございます
基本的には For/Next で Step を使うことになると思いますが
実際のレイアウトを説明いただけませんか?
そして、その中で、どの行をどこにコピーしたいのか。

>1行ずつコピーしないセルを増やしていき、12回繰り返したいと思っています。

ここが気になります。
1行おきに処理すると言うことではなく、○行おきとう、○が増えていくということですか?

【73272】Re:繰り返し処理について
発言  ひまこ  - 12/12/16(日) 10:12 -

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

さっそくありがとうございます。

こういった場で説明するのが初めてのため分かりにくい質問ですみません・・。

ちょっとやり方を変ようと思うので、
質問の訂正とともにレイアウトを説明させていただきますので
よろしくお願いします。

>>1行ずつコピーしないセルを増やしていき、12回繰り返したいと思っています。
ここの部分を、1行ずつ、コピーするセルを増やしてゆきたいに変更します。


レイアウトはA列〜J列まで13段の表となっています。

その13段10列の表を下に30段ずつ空けて12個作りたいと思っています。

12個表を作るのは、1行ずつ記載を増やして12枚作って印刷したいためです。30段ずつあけるのは、表を下に増やした場合、30段空けると用紙が次ページになってちょうど12枚続けて印刷できるからです。


1行目がタイトルで、そこは12個すべてコピーします。


A列〜D列までも12回すべてコピーします。

E列からJ列までについてコピーを1段ずつ増やしてゆきたいのです。

1回目のコピーはA1:J2までとA3:D13まで
2回目のコピーはA1:J3までとA4:D13まで
3回目のコピーはA1:J4までとA5:D13まで
以下続く

出来上がりは、1行目のタイトルとA2からD13までは12枚すべての表に記載する。

表ひとつづつ、見ていくと、EからJまでの列が
1行ずつ増えていく、という感じです。


分かりますでしょうか…。

初めの13段10列の表と同じものが
12回目に最終的に出来上がります。
コピーの1回目は元表からE3:J13を消した表
コピーの2回目は元表からE4:J13を消した表
以下続く、、という感じです。
(最初の質問はこの形でした)


もっと良い方法がある場合も含めて
考え方をアドバイス頂けると助かります。

どうぞよろしくお願いいたします。

【73273】Re:繰り返し処理について
発言  UO3  - 12/12/16(日) 10:56 -

引用なし
パスワード
   ▼ひまこ さん:


了解です。

>初めの13段10列の表と同じものが
>12回目に最終的に出来上がります。
>コピーの1回目は元表からE3:J13を消した表
>コピーの2回目は元表からE4:J13を消した表
>以下続く、、という感じです。
>(最初の質問はこの形でした)
>
>
>もっと良い方法がある場合も含めて
>考え方をアドバイス頂けると助かります。

この考え方がシンプルでよろしいかと思います。
以下、コード案です。

Sub Sample()
  Dim i As Long
  Dim x As Long
  Dim n As Long
  Dim myR As Range
  
  '処理中の画面の動きを隠す
  Application.ScreenUpdating = False
  
  Set myR = Range("A1:J13") 'コピー領域
  '処理前に転記領域をクリア
  Range("A1", ActiveSheet.UsedRange).Offset(43).ClearContents
  
  For x = 1 To 12 '処理回数
    i = x * 43 + 1 '転記行番号
    myR.Copy Cells(i, "A")   'コピペ
    n = x + 1        'J列までの値がコピーされるべき行数
    If 13 - n > 0 Then
      'D列までの値でいい領域につぃて、E〜J列の値をクリア
      Cells(i, "A").Offset(n, 4).Resize(13 - n, 6).ClearContents
    End If
  Next
  
  Application.ScreenUpdating = True
  MsgBox "転記終了です"
  
End Sub

【73275】Re:繰り返し処理について
質問  ひまこ  - 12/12/16(日) 21:38 -

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

どうもありがとうございます。

offset、Resizeの使い方、
変数からマイナスして繰り返す方法
とても勉強になりました!

すっきりとしていて
私が悩んでいたコードって野暮ったいなと思ってしまいました。。。

これを印刷したいのですが、
1ページ目は1月、
2ページ目は2月となっています。
メッセージボックスから指定して印刷する方法はありますでしょうか。

後からの続けての質問で申し訳ございません。

もし分かりましたらよろしくお願い申し上げます。

>▼ひまこ さん:
>
>
>了解です。
>
>>初めの13段10列の表と同じものが
>>12回目に最終的に出来上がります。
>>コピーの1回目は元表からE3:J13を消した表
>>コピーの2回目は元表からE4:J13を消した表
>>以下続く、、という感じです。
>>(最初の質問はこの形でした)
>>
>>
>>もっと良い方法がある場合も含めて
>>考え方をアドバイス頂けると助かります。
>
>この考え方がシンプルでよろしいかと思います。
>以下、コード案です。
>
>Sub Sample()
>  Dim i As Long
>  Dim x As Long
>  Dim n As Long
>  Dim myR As Range
>  
>  '処理中の画面の動きを隠す
>  Application.ScreenUpdating = False
>  
>  Set myR = Range("A1:J13") 'コピー領域
>  '処理前に転記領域をクリア
>  Range("A1", ActiveSheet.UsedRange).Offset(43).ClearContents
>  
>  For x = 1 To 12 '処理回数
>    i = x * 43 + 1 '転記行番号
>    myR.Copy Cells(i, "A")   'コピペ
>    n = x + 1        'J列までの値がコピーされるべき行数
>    If 13 - n > 0 Then
>      'D列までの値でいい領域につぃて、E〜J列の値をクリア
>      Cells(i, "A").Offset(n, 4).Resize(13 - n, 6).ClearContents
>    End If
>  Next
>  
>  Application.ScreenUpdating = True
>  MsgBox "転記終了です"
>  
>End Sub

【73276】Re:繰り返し処理について
回答    - 12/12/16(日) 21:59 -

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

>1回目のコピーはA1:J2までとA3:D13まで
>2回目のコピーはA1:J3までとA4:D13まで
>3回目のコピーはA1:J4までとA5:D13まで
>以下続く

この部分ですが、わたしだったらこうします。
1回目のコピーはA1:D13までとE1:J2まで
2回目のコピーはA1:D13までとE1:J3まで
3回目のコピーはA1:D13までとE1:J4まで
以下続く

こうすると、ひとつ目のコピー範囲が毎回同じで、ふたつめのコピー範囲も
列数が違うだけでそれ以外は同じになります。

ということは、単純に四角い範囲をループしてコピペするコードが書けるなら
今回のコードも、ほんの少し工夫を考えれば自分で書ける、はず
というか、「書けるはず」と言える形に持ち込んだわけです ^^
工夫してみて下さい

【73277】Re:繰り返し処理について
発言  UO3  - 12/12/16(日) 22:36 -

引用なし
パスワード
   ▼ひまこ さん:

こんばんは

印刷の件。
1ページ目(たぶん、コピペした最初のブロック、つまり44行目からということですよね)
というのは、シートの印刷上は2ページ目ですよね。
で、1月なら2ページ目、3月なら4ページ目と考えましょう。

たとえばできあがったシートで5ページ目を印刷する操作をマクロ記録しますと

Sub Macro1()
'
' Macro1 Macro
'

'
  ActiveWindow.SelectedSheets.PrintOut From:=5, To:=5, Copies:=1, Collate _
    :=True, IgnorePrintAreas:=False
End Sub

こんなコードが生成されます。
このコードのFrom:=5, To:=5 の 5 がページ番号。
ですから、まずInputBox関数やInputBoxメソッド(後者がおすすめです)で、月の数字を
入力させます。で、その入力された月の+1 が印刷すべきページということになります。
この入力結果を変数で受けておいて

From:=その変数, To:=その変数 としてやれば、目的のページが印刷されます。
ご自分でトライできそうですね。
がんばってください。もし、壁にぶつかったらSOSを出してください。

【73278】Re:繰り返し処理について
発言  UO3  - 12/12/16(日) 22:40 -

引用なし
パスワード
   ▼ひまこ さん:

念のために追記です。
入力された月の数+1を印刷ページとして指定します。
ですから ↑でいった 【その変数】は 入力された数+1 です。

【73281】Re:繰り返し処理について
お礼  ひまこ  - 12/12/17(月) 6:21 -

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

ありがとうございます。

頑張ってみます。

【73282】Re:繰り返し処理について
お礼  ひまこ  - 12/12/17(月) 6:23 -

引用なし
パスワード
   ▼UO3 さん:
ありがとうございます。

やってみます。

【73286】Re:繰り返し処理について
発言    - 12/12/17(月) 21:49 -

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

違っていたらすみませんが、もし特定のページを印刷するのだけが目的
なら、12回もコピペをする必要はありません。
下記のようにすれば用は足ります。

1) 何月分のデータを印刷するかを インプットボックスから受け取る
2) 対応するデータを2ページ目にコピペ
3) 2ページ目を印刷
4) 印刷が済んだら2ページ目を消す

【73287】Re:繰り返し処理について
お礼  ひまこ  - 12/12/17(月) 22:00 -

引用なし
パスワード
   >▼UO3 さん:

色々とありがとうございました。

おかげ様で希望通りに出来ました。

今回、初めての質問でしたが
初心者にもわかりやすく解説して頂いて
とても勉強になりました。

どうもありがとうございました。

【73288】Re:繰り返し処理について
質問  ひまこ  - 12/12/17(月) 22:04 -

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

色々とありがとうございます。

今回は12枚コピーが必要なのですが
必要な分だけ書く、なるほどそうですね。

この場合、繰り返し処理ではなく
if文でしょうか?

だとすると12パターン書くのでしょうか?

すみません、もう少し詳しくお願いします…。

【73289】Re:繰り返し処理について
質問  ひまこ  - 12/12/17(月) 23:24 -

引用なし
パスワード
   ▼佳 さん:
すみません、教えてください。

出来ません。

【73291】Re:繰り返し処理について
発言    - 12/12/18(火) 6:32 -

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

>この場合、繰り返し処理ではなく
>if文でしょうか?
はい。そうです。
VBAはとにかく動くものを自分で書くのが基本のき、と私は考えていますので。
(動かないものを自分で書くのも基本のきです。じつはこちらのほうが大切です。)
ひまこさんが if文かな と思われたなら if文で書いて、うまくいったり
いかなかったりするのがまず最初の正解です。


まあ、それとは別に。せっかく提案したことですし。
いまお手許にあるコードはこういう形になっていると思います。
for i = 1 to 12
 i を使った複雑な作業
next i

これをこのように変形します。(仮に5つめを印刷する場合)
i = 5
i を使った複雑な作業


▼ひまこ さん:
>▼佳 さん:
>
>色々とありがとうございます。
>
>今回は12枚コピーが必要なのですが
>必要な分だけ書く、なるほどそうですね。
>
>この場合、繰り返し処理ではなく
>if文でしょうか?
>
>だとすると12パターン書くのでしょうか?
>
>すみません、もう少し詳しくお願いします…。

【73292】Re:繰り返し処理について
回答    - 12/12/18(火) 6:34 -

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

この回答のキモは、難しすぎて手も足も出ないような問題は
自分で対応できるかたちに変形しましょう、ってところです。
(分割したり 単純化したり 順番を変えたり 共通項で括ったりばらしたり などなど)
わたしはこれを「問題を自分に引き寄せる」と呼んでいます。

コードが書けないとしたら、わたしの提案では問題の引き寄せ方が足りないのでしょう。
ひまこさんご自身で問題を引き寄せてみて下さいな。

【73298】Re:繰り返し処理について
発言  UO3  - 12/12/18(火) 12:42 -

引用なし
パスワード
   ▼ひまこ さん:

こんにちは
佳さんのアドバイスがヒントになって、ふと思ったことがあります。
まぁ、現状通り、データとしては1月から12月まで作ってしまうとしましょう。
現在の形は1〜13行目までの基本データを、同じシートの下のほうに等間隔に
各月分のマトリックスを配置する方式ですね。

これって、たとえば10月分を見ようとしたら、あるいは、そこに何か書き込もうとしたら
ずずずっとしたにスクロールして10月のマトリックスまで移動させなきゃいけませんよね。
かつ、後からのテーマのように、その月の部分だけ印刷させようとすれば、なにがしかの
マクロを組みたくなる。

これを考え方をかえて、元シートとは別に1月、2月、・・・、12月 までのシートを用意。
最初のテーマでの各月分のマトリックスは、同じシートの下のほうではなく、
それぞれの月のシートの【同じ場所、つまり1行目から】に作成する。

こうしておけば、見たい月のシートタブをクリックするだけで、すぐに、その月のデータを見ることができますし
追加記入なども操作しやすいと思いますね。

で、印刷時も、マクロなんか使わずとも、印刷したいシートを(1つでも複数でも)選択して
エクセルの機能で印刷すればよろしいですし、
たとえば、マトリックスの構成がどうなっているかはわかりませんが、ある特定の位置にある
ものを分析したい場合にも【串刺し集計】などで、関数をつかって情報を取得する弾力性が増しますね。

【73301】Re:繰り返し処理について
お礼  ひまこ  - 12/12/18(火) 21:17 -

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

度々ありがとうございます。

出来ました!

嬉しいです〜。

一人では同じ思考回路で
どうしても新しい考えが浮かばず
ここで質問させていただきました。

ヒントを頂けて助かりました。

どうもありがとうございました。

【73302】Re:繰り返し処理について
お礼  ひまこ  - 12/12/18(火) 21:19 -

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

自分で対応できる形を散々考えてみたのですが
どうしてもわからず相談させていただきました。

色々とありがとうございました。

【73303】Re:繰り返し処理について
お礼  ひまこ  - 12/12/18(火) 21:29 -

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

度々ありがとうございます。

質問を簡単な形にしてしまい申し訳ございません。
一つのシートだけのマクロではなく
いくつも同じようなシートがあり
横にシートを増やすとシートごと纏めていたものを
ブックを別にしなくてはややこしくなりそうで、
今回は本当にコピーのみの作業が全てのシートにありましたので
このような相談の形にしてみました。

確かにシートを横に広げてゆくと
エクセルならではの機能を使って
もっと応用の利くものが出来たかもしれないですね。

ベテランの方々の発想、とても勉強になります。
次回に役立ちそうです。

どうもありがとうございました。

【73311】Re:繰り返し処理について
回答    - 12/12/19(水) 18:48 -

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

相談されて、学ばれたこともたくさんあると思います。
それらを使って 問題を自分に引き寄せることはできませんか?

どうしても無理ならわたしの提案に沿って回答することもできますが
>色々とありがとうございました。
あきらめた、ということでしょうかね。


▼ひまこ さん:
>▼佳 さん:
>
>自分で対応できる形を散々考えてみたのですが
>どうしてもわからず相談させていただきました。
>
>色々とありがとうございました。

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