• ベストアンサー

続質問 エクセルVBAで、行コピーを複数行にペーストする方法

先日した質問に追加があるのですが、 『A2:J100の範囲に顧客住所録データがあり、 それを別シートにペーストする時、 F列は、宛先シールの印刷枚数が入っているので、 Wordで差し込み印刷をする為のエクセルのデータを作る為 2行目のデータが3枚必要ならば、3行ペーストする方法。』 追加の質問: K列に『1/3、2/3、3/3』と、入れるにはどうしたら よいか、すみませんが御指導下さい。宜しく御願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.5

こんばんは。 #3です。 Cells(idx, 11) = "1" Cells(idx + 1, 11) = .Value Else Cells(idx, 11) = "1" の部分を追加されたのだと思いますが、前半の処理は複数の行に対して行わなければならないはずが、1行(とその次の行)にしか行っていませんし、代入している数字がご要望の「1/3」のような記述にもなっていませんね。 後半の部分は「複数でない場合」(=1行だけ)の場合なので、作成なさったように「1」と記述するか、他に合わせて「1/1」とするのかどちらでしょうか? さらに、エクセル特有のセルの書式というものも考慮しなければなりません。分数表記という書式がありますからそれを利用するか、文字列にするか・・・前者だと1/1という表記がうまくいかないですし、後者の場合、書式設定を文字列に指定しないでうっかり入れると、数字や日付として判断されちゃったりします。 とりあえず、その部分だけの例です。  For tmp = 1 To .Value '複製した行数回番号を入れる    '番号は "'"+順番+"/"+総数  (Str()は数字を文字化する関数です)   Cells(idx + tmp - 1, 11).Value = "'" & Str(tmp) & "/" & Str(.Value)  Next tmp Else  Cells(idx, 11).Value = "' 1/ 1"  '1枚の場合は固定値 *)1枚は1/1で表記するものとしています。また値は全て文字列で扱うことにしていますが、セルの書式を設定するのが面倒なので、'1/3のような文字列入力でまかなっています。 なお、tmpという変数が増えてしまいましたので、最初にDimで宣言しておく方が良いでしょう。(IntegerまたはLong)

NEWYORKERS
質問者

お礼

出来ました!思いどおりのものになりました!! 以前の質問のご回答のおかげで作業効率が大変良くなったのに 私の作った宛先シールを貼る部署の方から、 今回のような要望を受け、最悪自分が出来なければ また以前のようにコピペを繰り返すしかないと落胆していました。 これ以上要望がないかを確かめた後お礼を申し上げたいと思い、 お礼内容に時間がかかってしまってすみませんでした。 完璧に完成しました。 そして、コード内容が理解出来たことがなにより嬉しいです。 私が理解出来る様にして下さった事も含めて 本当に御指導どうもありがとうございました。

NEWYORKERS
質問者

補足

補足はありません。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

>2行目のデータが3枚必要ならば、3行ペーストする方法。』 どの列に3行とか、繰り返す回数は入っているのかな。 前の質問と関連すすなら、この質問にも、前の質問番号を書くこと。回答者に載せてもらって読者はわかるというのはおかしい。 ーー それに書式等が移らないが、初心者は特に、Copy方ではなく、1行ずつ上行からの代入処理の方法を勧める。 例データ A列  B列  C列(重複回数) a x 3 b y 2 c z 1 d u 4 C列に重複行数指定とする。 コード Sub test01() d = Range("A65536").End(xlUp).Row For i = d To 1 Step -1 '下行から処理がミソ k = Cells(i, "C") 'C列から重複回数取得 For l = i + 1 To i + 1 + k - 1 - 1 '重複回数-1回だけ繰り返し Rows(l).EntireRow.Insert '行挿入 For j = 1 To 2 'A-B列代入 Cells(l, j) = Cells(i, j) Next j Next l Next i End Sub ーーー 結果 a x 3 a x a x b y 2 b y c z 1 d u 4 d u d u d u

NEWYORKERS
質問者

お礼

前回の質問番号をNo.1の方に載せていただきまして、 有難う御座いました。(本来ならば、No.1の方のお礼内容に書くべき ところをすみません。)おっしゃるとおりで恥ずかしかったです。 そして、コードも教えて下さって有難う御座いました。

NEWYORKERS
質問者

補足

補足はありません。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

勉強中ということでしたので、ヒントのみです。  Rows(idx + 1).Resize(.Value - 1).Insert shift:=xlDown でF列の数字分(.Value)の行の挿入をしています。 (1行は最初にあるので、実際は.Value-1行を挿入している) この時に(この後に)、挿入された行のK列に  行数番号(1~.Value)+"/"+全体行数(.Value) という文字列を入れてゆけばよいでしょう。 (数字を+演算しても文字の連結になりませんのでご注意)

NEWYORKERS
質問者

お礼

御指導ありがとうございます。 早速取り組んでみたのですが、 いきづまってしまって出来ませんでした。 本当に恐縮ですが、解答を教えて頂きたく御願い申し上げます。 現状のコードを貼り付けてみました。どうぞ宜しくお願いします。 Sub Macro1() Dim idx As Integer ActiveSheet.Copy after:=ActiveSheet For idx = Range("A65536").End(xlUp).Row To 1 Step -1 With Cells(idx, "F") If IsNumeric(.Value) Then If .Value > 1 Then Rows(idx).Copy Rows(idx + 1).Resize(.Value - 1).Insert shift:=xlDown Cells(idx, 11) = "1" Cells(idx + 1, 11) = .Value Else Cells(idx, 11) = "1" End If End If End With Next idx Application.CutCopyMode = False End Sub

NEWYORKERS
質問者

補足

補足はありません。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

(1)、Sheet1のA2:J2を選択コピー (2)、Sheet2のA1:A3に貼り付け (3)、K1に、'1/ と入力 (4)、K3までフィルコピー(選択枠の右下角の■をドラッグする) (5)、選択状態のまま、「置換」で、/ を /3 に「すべて置換」 といった手順を「マクロの記録」すれば必要なサンプルコードが得られます。 得られたコードを基にして 貼り付け行数の取得と反映 貼り付け先の決定 コピー&ペーストの繰り返し処理 等を加味すれば良いと思います。

NEWYORKERS
質問者

お礼

すみません。やっぱりわかりませんでした。 しかし、どうやって取り組んでいくかを理解しました。 御指導有難う御座います。

NEWYORKERS
質問者

補足

補足はありません。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

>先日した質問 エクセルVBAで、行コピーを複数行にペーストする方法 http://okwave.jp/qa4373943.html >K列に『1/3、2/3、3/3』と 何に対して1/3とか2/3・3/3と決まっているのでしょう?

NEWYORKERS
質問者

お礼

質問を読んで下さってありがとうございます。

NEWYORKERS
質問者

補足

分母が総枚数で、分子がページ数とし、 ひとつの顧客に対して3枚(3行)なら、3を分母とする。 という感じです。変な書き方をしてすみません。

関連するQ&A