すみません。若輩者でどなたか教えてください。
エクセルvbaを使用して下記表がから I列 の数値を参照して、
数値分の行コピー追加したいです。
行NO A列 B列 C列 D列 E列 F列 G列 H列 I列
1 1 名前1 名前2 100 200 300 400 500 2
2 2 名前1 名前2 10 20 30 40 50 5
2 2 名前1 名前2 -80 -160 -240 -320 -400 8
4 4 名前1 名前2 -170 -340 -510 -680 -850 1
5 5 名前1 名前2 200 300 400 500 600 4
6 6 名前1 名前2 400 500 600 700 800 6
上記 I列 の値を参照し、その値分の行数を 直ぐ下へ追加ペーストしたいです。
先日こちらで回答をいただいたのですが、行の挿入を上から順に処理したく再投稿しました。
お力添えを宜しくお願い致します。
No.7ベストアンサー
- 回答日時:
こんばんは!
横からお邪魔します。
https://oshiete.goo.ne.jp/qa/10637862.html
↑
のサイトの続きですね。
今回の場合行挿入の操作が必要になりますので、
他の方がおっしゃっているように行挿入(行削除)などは最終行から遡った方が間違いが少なく簡単です。
どうしても上からの操作にしたい!という場合は
別シートに表示する方法はどうでしょうか?
元データはSheet1にあり、Sheet2にコピー&ペーストするようにしてみました。
標準モジュールです。
Sub Sample3()
Dim i As Long, cnt As Long
Dim myRow As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
wS.Range("A:H").ClearContents
With Worksheets("Sheet1")
For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
If .Cells(i, "I") > 0 Then
Do Until cnt = .Cells(i, "I")
cnt = cnt + 1
myRow = myRow + 1
.Cells(i, "A").Resize(, 8).Copy wS.Cells(myRow, "A")
Loop
End If
cnt = 0
Next i
End With
End Sub
※ A~H列までをコピー&ペーストしています。m(_ _)m
No.6
- 回答日時:
取り敢ず上(I1)からですけど、エラー処理などありませんのでダメなら・・・・・
Sub megu()
Dim r As Range
Set r = Range("I1") '開始セル
Do Until r.Value = ""
r.EntireRow.Copy
r.Offset(1).Resize(r.Value).EntireRow.Insert Shift:=xlDown
Application.CutCopyMode = False
Set r = r.Offset(r.Value + 1)
Loop
Set r = Nothing
End Sub
No.5
- 回答日時:
こんにちは
>行の挿入を上から順に処理したく再投稿しました
通常この手の処理は下側(行番号の大きな方)から処理するのが常道です。
(VBAをご存知のようなので、理由は考えてみてください)
上から順に処理することも不可能ではありませんが、面倒なだけです。
マクロを実行すれば、結果が出るまでは一瞬なので、結果が同じならば問題ないはずと思いますが?
それとも、処理の状況が画面上でちらっと見えるけれど、下から処理しているのが気にくわないということでしょうか?
その場合は、処理速度の向上も兼ねて、ScreenUpdatingをFalseにすれば画面のちらつきは見えなくなりますし、処理速度も速くなります。。
https://msdn.microsoft.com/ja-jp/vba/excel-vba/a …
どうしても上から処理したいのであれば、ヒントとして・・・
1)最初の処理すべき行数を把握(=残りの処理対象行数)
2)処理対象の行番号のポインタを1にセット
3)ポインタの示す行の1行分の処理を行う
(下側に必要な行数を挿入して記入)
4)次の処理する対象行番号(ポインタ)を「ポインタ+挿入行数+1」とし、
残り処理対象行数を1減ずる
5)3)、4)を残り処理対象行数が0になるまで繰り返す
という流れに変えれば可能と思います。
(この面倒を避けるために、下から処理した方が簡単というわけです)
No.3
- 回答日時:
Public Sub Test()
Application.ScreenUpdating = False
Dim currentRow As Integer
currentRow = 0
Do While True
currentRow = currentRow + 1
Dim copyLines As Integer
copyLines = ActiveSheet.Range("I" & CStr(currentRow)).Value
' コピー行数を取得できない場合は処理終了
If copyLines = 0 Then
Exit Do
End If
' 行をコピー
currentRow = CopyRow(currentRow, copyLines)
Loop
Application.ScreenUpdating = True
End Sub
Private Function CopyRow(row As Integer, copyLines As Integer) As Integer
Dim r As range
' コピー行数が1未満の場合は処理しない
If copyLines < 1 Then
CopyRow = row
Exit Function
End If
Set r = ActiveSheet.Rows(CStr(row) & ":" & CStr(row))
' 行をコピー分追加
Dim i As Integer
For i = 1 To copyLines
r.Offset(1).Insert Shift:=xlDown
Next
' 元の行をペースト
Dim resultRow As Integer
resultRow = row + copyLines
r.Copy Destination:=ActiveSheet.Rows(CStr(row + 1) & ":" & CStr(resultRow))
CopyRow = resultRow
End Function
No.2
- 回答日時:
こんな感じ?
1行目のデータは、2行挿入されて3行のデータになります。
もし1行多い様でしたら、
cnt = base.Offset(0, 8).Value - 1
として下さい。
Sub test()
Dim base As Range
Dim cnt As Long
Set base = Range("A1")
Application.ScreenUpdating = False
Do While base.Value <> ""
cnt = base.Offset(0, 8).Value
Do While cnt > 0
Range(base, base.Offset(0, 8)).Copy
base.Insert shift:=xlDown
cnt = cnt - 1
Loop
Set base = base.Offset(1, 0)
Loop
Application.ScreenUpdating = True
End Sub
No.1
- 回答日時:
これは、下から順に処理したほうが楽ですよ。
上から順に処理することもできなくはないが、処理が複雑になります。
おなじ結果が得られるなら、下から順に処理したほうが良いと思いますが、上から順に処理したい理由はなぜでしょうか。
確認ですけど、1番目のデータの例なら I列の値は2なので
1 1 名前1 名前2 100 200 300 400 500 2・・・元のデータ
1 1 名前1 名前2 100 200 300 400 500 2・・・コピーしたデータ
1 1 名前1 名前2 100 200 300 400 500 2・・・コピーしたデータ
のようになれば、良いのでしょうか。
tatsu99さん
お知らせありがとうございます。
下から処理を見た時に、n行の数が合わない時が発生しておりまして。。
上から増やすと参照する行にズレが無いのかな、、、、と思いまして再掲載しました。。。
何か誤った認識でしょうか。。。すみません。おしえてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どう増強すべきか
-
シグナル 6(SIGABRT)とは?
-
擬似言語にて
-
エクセルVBAでロックをかけたい
-
n88 Basic に関して(ループ)
-
vbaのエラー対応(実行時エラー...
-
Word VBA。各マクロの間に待ち...
-
特定の名前のオートシェイプの...
-
ExcelのVBAで、選択したファイ...
-
VBAの進捗状況をリアルタイ...
-
IF文に時間(何時から何時ま...
-
途中で処理を中断させたい (ア...
-
エクセル画面のちらつきなくす...
-
¥マークを含むパスの処理につ...
-
C# Webブラウザコントロールの...
-
マクロで、次のコードへ行く前...
-
エクセル VBAで複数セル選択時...
-
複数個のTextBoxでいずれかの内...
-
シェルスクリプトでファイル内...
-
Functionで戻り値を複数返す方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
IF文に時間(何時から何時ま...
-
private subモジュールを他のモ...
-
vbaのエラー対応(実行時エラー...
-
シグナル 6(SIGABRT)とは?
-
マクロで、次のコードへ行く前...
-
どう増強すべきか
-
Excel VBA セルの名前があるか...
-
特定の名前のオートシェイプの...
-
どうやってもFor文を抜けてしま...
-
特定のファイルを他のプロセス...
-
ExcelのVBAで、選択したファイ...
-
VB6にてネットワーク上にある共...
-
VBA 複数の行を高速で削除する...
-
Word VBA。各マクロの間に待ち...
-
フォルダのアクセス権確認について
-
エクセル VBAで複数セル選択時...
-
VBA For Each 〜 複数条件について
-
【C#】Page_Loadさせない方法に...
-
StatusStripの表示が更新されな...
おすすめ情報
tatsu99さん
お知らせありがとうございます。
下から処理を見た時に、n行の数が合わない時が発生しておりまして。。
上から増やすと参照する行にズレが無いのかな、、、、と思いまして再掲載しました。。。
何か誤った認識でしょうか。。。すみません。おしえてください。