質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

2949閲覧

VBA データが増えた分だけコピーし、対象シートに貼り付けたい

qqkf

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/09/28 16:32

編集2020/09/30 12:20

■実現したいことは以下になります。
・画像③のデータが増えた分だけ画像2に貼り付けたい(動的に)。
但し、複数シートありで対象の列のみコピーし貼り付けたい。

■現状
・予め、余分に行を増やしたコードで記述をしました。
これだと、コピーしたときにシートとシートの間に空白分も貼り付いてしまう。
対象の列に関しては、無理やり対象の列をコピーしたコードを記述しました。

■分からないこと
・ボタン実行後、どうやって動的に対象の行および列をコピーしているか分からないです。

画像が以下になります。

イメージ説明
画像1 情報一覧ボタン.xlsmの画像 [ボタン]シート
手順②を実行後、[各シート一覧情報]シートに①のファイル情報を貼り付けます。

イメージ説明
画像2 情報一覧ボタン.xlsmの画像 [各シート一覧情報]シート
貼り付けた結果画面です。この空白部分を取り除いた状態で表示がしたい。

イメージ説明
画像③ データ情報一覧.xls
このファイルが読込み一覧データです。

コードが以下になります。

vba

1Private Sub SheetPasteButton_Click() 2'------------------------------------------------------------------------------- 3' SheetPasteButton_Click 4' 説明 5' 各シート情報貼り付け クリック時 6'------------------------------------------------------------------------------- 7 Dim wbk As Workbook '各シート一覧表ファイル 8 Dim wshCmp As Worksheet   'シートコピーファイル:[ボタン]シート 9 Dim wshOrd As Worksheet  'シートコピーファイル:[各シート一覧情報]シート 10 11 Set wshCmp = Worksheets("ボタン") 12 Set wshOrd = Worksheets("各シート一覧情報") 13 14 Set wbk = Workbooks.Open(wshCmp.Range("B3").Value, ReadOnly:=True) '読み取り専用で開く 15 16 wbk.Worksheets("1_情報一覧").Range("A4:H18").Copy wshOrd.Range("A2") 17 wbk.Worksheets("1_情報一覧").Range("K4:K18").Copy wshOrd.Range("I2") 18 19 wbk.Worksheets("2_情報一覧").Range("A4:H18").Copy wshOrd.Range("A17") 20 wbk.Worksheets("2_情報一覧").Range("K4:K18").Copy wshOrd.Range("I17") 21 22 wbk.Worksheets("3_情報一覧").Range("A4:H18").Copy wshOrd.Range("A32") 23 wbk.Worksheets("3_情報一覧").Range("K4:K18").Copy wshOrd.Range("I32") 24 25 '----- ブックを保存しないで閉じ、オブジェクトwbkの参照を解除 26 wbk.Close SaveChanges:=False: Set wbk = Nothing 27 28End Sub 29

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuma_kuma_

2020/09/28 17:10

なんかどっかで見たなと思ったら、私のコートの書き方だ! で質問者様はこのコードを作られた方ではないの? 作られた方に聞いた方が早いと思うけど... (基本的な命令2種類しかないから) 前回の回答丸投げがいけなかったかな... > 画像③のデータが増えた分だけ画像2に貼り付けたい(動的に)。 なにを持って「増えた分」か判断材料がないです。 あと前回の内容を把握してるからですが、これ条件が別にもありますよね? この情報だけで回答すると実際にはうまく連動して動きませんよ?
qqkf

2020/09/29 13:44

コメントありがとうございます。 前回、回答して頂いたコードはVBA側で処理が多かったため、 今回は、前回ベストアンサーにしましたkitasue様のコードを参考にして質問をしました。 kuma_kuma_様から回答して頂いたコードは少しずつですが理解していきたいと考えております。 質問ですが、予め行を多めに入れた設定でコードを書きました。 理由は、画像3各シートのデータが15個まで設定した場合、データを入れるためです。 ただこれだと、15個データが入らない限り空白のまま画像2に貼り付いてしまいます。 なのかつ、拡張したい場合になったとき(例えばデータが30個になったとき) 各シートで行の設定値を変えないといけないです。 今回は、どうやって空白部分を除いた状態でデータを増やして貼り付けていくのか質問しました。 前回、質問ときに増減の件ついてやり取りしたと思いますが、まだそちらのコードでは勉強中です。
kuma_kuma_

2020/09/29 22:50 編集

あの前回回答した処理ではシートに6行以上定義されてもシート自体が4つになってもそのまま動きますよ? (前回の質問者様の仕様があいまいだった為回答時点でそのように対応しております) ちなみにデータが15個以上というのはどのデータですか サンプル数でもA~Gの7サンプルですし
qqkf

2020/09/30 12:25

画像3を差し替えました。 15個のデータと言うのは各情報一覧(画像3)の赤枠で囲まれた部分のことになります。
kuma_kuma_

2020/09/30 14:27

TEST1列TEST2列はさすがに想定できていないので修正が必要だけど べつに15行だろうが30行だろうが動く設計にしてあるよ? 使わないのも質問者様の判断だから構いませんが...
qqkf

2020/09/30 15:36

N行でコーディングしてる部分ありましたので、参考にしたいと思います。 コメントありがとうございました。
guest

回答1

0

ベストアンサー

次のコードでいかがでしょうか。

VBA

1Private Sub SheetPasteButton_Click() 2'------------------------------------------------------------------------------- 3' SheetPasteButton_Click 4' 説明 5' 各シート情報貼り付け クリック時 6'------------------------------------------------------------------------------- 7 Dim wbk As Workbook '各シート一覧表ファイル 8 Dim wshCmp As Worksheet 'シートコピーファイル:[ボタン]シート 9 Dim wshOrd As Worksheet 'シートコピーファイル:[各シート一覧情報]シート 10 Dim lngSheetNum As Long 11 Dim lngRowsCount As Long 12 13 Set wshCmp = Worksheets("ボタン") 14 Set wshOrd = Worksheets("各シート一覧情報") 15 16 Set wbk = Workbooks.Open(wshCmp.Range("B3").Value, ReadOnly:=True) '読み取り専用で開く 17 18 wshOrd.Range("A2").CurrentRegion.ClearContents 19 20 For lngSheetNum = 1 To 3 21 With wbk.Worksheets(lngSheetNum & "_情報一覧").Range("A4").CurrentRegion 22 .Offset(1).Resize(.Rows.Count - 1, 8).Copy wshOrd.Range("A2").Offset(lngRowsCount) 23 .Offset(1, 10).Resize(.Rows.Count - 1, 1).Copy wshOrd.Range("I2").Offset(lngRowsCount) 24 lngRowsCount = lngRowsCount + .Rows.Count - 1 25 End With 26 Next lngSheetNum 27 28 '----- ブックを保存しないで閉じ、オブジェクトwbkの参照を解除 29 wbk.Close SaveChanges:=False: Set wbk = Nothing 30 31End Sub

投稿2020/09/28 20:55

kitasue

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qqkf

2020/09/29 13:54

コーディングありがとうございます。 空白部分を除き、各シートにn行分データが追加することができました。 無事に実現したいことができました。
syousuke.33

2020/10/01 12:27

Kuma_kuma_様の回答 初心者の私にも勉強になりました。 (lngSheetNum & "_情報一覧)これだと「情報一覧」のシートの並びが 順番に並んでいないと、コピーされないシートが発生するような気がします 質問者様のわからないことに もうひとつ ■分からないこと ・ボタン実行後、どうやって動的に対象の行および列をコピーしているか分からないです。 私の場合、マクロ組時、よくコピペします そしてSelectもよく使います モニター画面を右半分シート、左半分にモジュール画面表示させて [F8]キーを押しながら セルの動きを確認しながら組んでいます 私がこの質問者の回答したら構文の長さは、2,5倍の長さになってしまいます。私も勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問