
(A列) (B列) (C列) ・・・・
(1行目) 参照Excel名 コード ・・・・・・・
(2行目) ①.xlsx 213423 ・・・・・・・
(3行目) 432153 ・・・・・・・
(4行目) 352582
(5行目) ②.xlsx 342213
(6行目) 482397
(7行目) ③.xlsx 584054
(8行目) ④.xlsx 482093
(9行目) 582857
(10行目) 582752
(11行目) 853875
~~~~~~~~~~~~~~~~~~~~~~~~
エクセルが上記の様な横長の表になっていて、
A列の”参照Excel名”が、A1セルに入力されています。
A2の”①.xlsx”をコピーして、その下のA3から次の値があるA5の一つ前(→A4)まで貼り付ける。
次の値のA5をコピーして、その下のA6から次の値があるA7の一つ前(→A6)まで貼り付ける。
次の値のA7をコピーして、その下に次の値があるのでコピーしない。
次の値のA8をコピーして、その下のA9から次の値の一つ前まで貼り付ける、但し、B列の最終行まで次の値がない場合は、B列の最終行と同じ行数まで貼り付ける。
というような流れでマクロを組みたいと思ったのですが、うまくいきません。
(空白の数は変動します。)
ちなみに、他の処理もありますが、以下のマクロを組んでいます。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub 原料の在庫表をコピー()
Dim frWB As Workbook 'コピーするブック用
Dim toWB As Workbook '貼り付け先のブック用
Dim r As Long '貼り付け先セルの行番号を取得用
Dim cnt As Long 'コピーするブックのデータ件数を取得用
Dim Filename As String '棚卸データの名前用
Dim myData As String '棚卸データのエクセル取得用
Set toWB = ThisWorkbook 'このブックを代入
'Dirでブックを検索してmyFileへ代入
myData = Dir(toWB.Path & "\原料棚卸在庫表\*.xls?")
'myDataが無くなるまで処理を繰り返す
Do While myData <> ""
'処理内容
'検索したエクセルを開く
Set frWB = Workbooks.Open(toWB.Path & "\原料棚卸在庫表\" & myData)
'ActiceWorkbookオブジェクトのName情報を取得し、変数「FileName」に格納する
Filename = ActiveWorkbook.Name
'このブックの先頭シートのB列の一番上のセルの1つ下のセルから一番下のセルの行数をrに代入
r = toWB.Worksheets(1).Range("B" & Rows.Count).End(xlUp).Offset(1).Row
'コピーするブックの必要データ部分の選択、コピー
With frWB.Worksheets(3).Cells(9, 2).CurrentRegion
cnt = .Rows.Count - 1
.Offset(1).Resize(cnt).Copy
'値で貼り付け
toWB.Worksheets(1).Cells(r, "B").PasteSpecial xlPasteValues
'棚卸データ名を貼り付け
toWB.Worksheets(1).Cells(r, "A") = Filename
'コピーモードの終了
Application.CutCopyMode = False
End With
frWB.Close
myData = Dir()
Loop
'合計の行を削除
Dim rng As Range, i As Long
Set rng = Range("A1").CurrentRegion '表全体を変数rngに代入
'表の一番下から1行ずつ確認して表の2行目でストップする
For i = rng.Rows.Count To 2 Step -1
'表のi行2列目に合計とある行があった場合
If rng.Cells(i, 2).Value = "合計" Then
'そのi行を削除し、下のセルを上にシフトする
rng.Rows(i).Delete Shift:=xlShiftUp
End If
Next
End Sub
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
できれば、中盤↓の棚卸データ名を貼り付けのところで、コピペできればいいのですが・・・
'棚卸データ名を貼り付け
toWB.Worksheets(1).Cells(r, "A") = Filename
説明が上手くできずに申し訳ありませんが、
どなたかご一考いただけると幸いです。
よろしくお願いいたします。
No.3
- 回答日時:
>実行時エラーに
誤解を与えてしまったかも知れませんので 追記すると
With frWB.Worksheets(3).Cells(9, 2).CurrentRegion
cnt = .Rows.Count - 1
.Offset(1).Resize(cnt).Copy
必ず見出し行などで(複数行)あるのであれば、
frWB.Worksheets(3).Cells(9, 2).CurrentRegion.Rows.Countは2以上になり、cnt = .Rows.Count - 1 の時のcntの値は1以上ですね。
これなら問題はありませんが、
もし、Cells(9, 2).CurrentRegionが1行しかなかったらcntは0となり
Resize(0)は 1004エラーになると言う事です。
.Offset(1)から推測するに
そのような表組にはなっていないようですので忘れてください。
Qchan1962様
ありがとうございます!!!
'棚卸データ名を貼り付け
toWB.Worksheets(1).Cells(r, "A").Resize(cnt).Value = Filename
このコードで、上手くいきました(>_<))
会社で「マクロを勉強して、こういうのを作って」と、無茶ぶりされて、
本を一冊買って作ってみたのですが、ここだけできなくて・・・
誰もマクロ分かる人がいなくて、困っていたのですが、
一日で解決できるなんて、とても助かりました( ;∀;)
ありがとうございました!!
No.1
- 回答日時:
こんにちは
ご質問自体が良く分からずなのですが、
示されているコードで なさりたい事が出来ていない部分
>次の値のA7をコピーして、その下に次の値があるのでコピーしない。
をどうすれば良いかと言う事でしょうか
この場合は、A7の行が要らないと言う事と思いますので
コピペせずに次のファイルに行けばよい事になりますね
コードを読むと・・実行時エラーにならないかな?あ、見出しがあるのですね
With frWB.Worksheets(3).Cells(9, 2).CurrentRegion
cnt = .Rows.Count - 1
.Offset(1).Resize(cnt).Copy
ここで③.xlsxの場合、cntは1ですね 1行の場合はいらない・・で良いのなら、
With frWB.Worksheets(3).Cells(9, 2).CurrentRegion
cnt = .Rows.Count - 1
If cnt > 1 Then
.Offset(1).Resize(cnt).Copy
'値で貼り付け
toWB.Worksheets(1).Cells(r, "B").PasteSpecial xlPasteValues
'棚卸データ名を貼り付け
toWB.Worksheets(1).Cells(r, "A") = Filename
'コピーモードの終了
Application.CutCopyMode = False
End If
End With
とすれば ③.xlsx は出力(コピペ)されないと思います。
、、、必ず、合計行もあるのかな?削除していると言う事は・・
必ずあるなら、If cnt > 2 Then かな、、
もっとも合計行が必ずあるなら、
cnt = .Rows.Count - 2
If cnt > 1 Then
でも良いのか・・
全然的外れでコードに関係なく新たに示されている表のコピー方法を知りたいのかな・・ペースト先無いから違うと思いますが、、、
良く分からずで未検証なのであくまで参考程度でね
早速のご回答ありがとうございます!!
このサイトを使うのが初めてで、勝手がわかっていませんが、
補足を入れさせていただきました。
お時間ございましたら、ご確認ください。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
VBAで繰り返しコピーしながら下へ移動させる方法
Excel(エクセル)
-
繰り返し1行~28行までを順順にコピーする方法
Visual Basic(VBA)
-
マクロで値がある列までコピー
Excel(エクセル)
-
4
一行おきにコピーするマクロが知りたい
Excel(エクセル)
-
5
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
6
VBA コピーを有効行までループをする方法
Excel(エクセル)
-
7
同じ作業を複数のシートに実行させるにはどうしたらいいのでしょうか
Visual Basic(VBA)
-
8
Excel で行を指定回数だけコピーしたい
Excel(エクセル)
-
9
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
-
10
Excel VBA、 別ブックの最終行セルへのコピー&値ペースト
Visual Basic(VBA)
-
11
マクロ 新しいシートにデータをコピペしてシートの名前を変更したい
Excel(エクセル)
-
12
excelで任意のセルを指定回数コピーペーストする方法を教えてください
Excel(エクセル)
-
13
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
14
エクセルVBAで、値が入っている最終行の、右隣の値をコピーして、別のセルに貼り付けるコード
Excel(エクセル)
-
15
【Excel VBA】指定行以降をクリアするには?
Visual Basic(VBA)
-
16
一行おきに貼り付ける 可能でしょうか
Visual Basic(VBA)
-
17
【VBA】特定列に文字が入っていたらそのセル行をコピーしてマスターブックの同じ行に貼り付けたい
その他(Microsoft Office)
-
18
【VB】セルが空になるまで処理を繰り返したい
Visual Basic(VBA)
-
19
複数行を繰り返しコピーする方法を教えて下さい
PowerPoint(パワーポイント)
-
20
WorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】
Excel(エクセル)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
VBAでWEB上の入力項目に値をい...
-
5
IP Address Controlから値を取...
-
6
ユーザーフォームのテキストボ...
-
7
RegisterClassExのエラー原因
-
8
代入したのに値が更新されない...
-
9
チェックした値を取得したい(C...
-
10
VBA コピーして次の値まで貼り...
-
11
マクロ 特定のセル値のみクリ...
-
12
OracleでRecordCountが正しくな...
-
13
ユーザーフォームの入力をシー...
-
14
シーケンサで最小値を保持する
-
15
コンボボックスの値がうまく取...
-
16
[VBA]選択範囲の下から上に処理...
-
17
DataGridView1のcellで計算
-
18
不定値の出力について
-
19
特定のセルが空白だったら、そ...
-
20
【Excel VBA】指定行以降をクリ...
おすすめ情報
公式facebook
公式twitter
投稿したら、一番上の表がズレてしまっていたので、サンプル画像を送ります。
分かりにくくて申し訳ありません。
一番上に入力した表は、無視してください。
マクロの流れは、
”原料棚卸在庫表”というフォルダの中に、いくつかExcelがあって、
そのExcelのシート3のデータ部分のみをコピーして、画像にあるExcelに貼り付け、
最終行が合計欄になっているので、一行削除し、
コピー元のExcelの名前をA列に表示する。
という工程を繰り返す。というような感じです。
このコードで不具合は起きていなくて、追加をしたいのです。
画像の方で、A2にエクセル名を入れるところまではできたのですが、
これを、A3~A14までA2と同じ名前が入るようにしたいのです。
(A3~A14)はデータ量によって、増えたり減ったりします。
Excelを一つずつコピペしているので、その段階で、A2に入力された
エクセル名を最終行までコピペするコードを入れられたら、
と思っています。お願いします