🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

3回答

2019閲覧

[VBA]複数のセルの値を別のシートからコピーする

Jonny_dayo

総合スコア48

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2019/10/13 14:49

編集2019/10/14 04:20

前提・実現したいこと

別のエクセルにあるデータを開き、コピーして持ってくるコードを書いています。
下記のように書くとエラーも出ずに動きはするのですが、"AA9:AA13"のように複数を指定すると
AA9の値しか持ってきてくれません…

①複数のデータを持ってくる場合はどのようなコードにしたら良いのでしょうか?

②"AA9:AA13"の中にnilがあればそこはスキップし、値が入ってるもののみを入れることは可能なのでしょうか?

該当のソースコード

With Workbooks("管理表VBA").Worksheets("2019年10月") .Range("A" & MaxRow).Value = openBook.Worksheets(1).Range("E6").Value .Range("B" & MaxRow).Value = openBook.Worksheets(1).Range("AA9:AA13").Value End With

全文

Option Explicit Sub import_excel() '最終行を変数に取得 Dim MaxRow As Integer MaxRow = Worksheets("2019年10月").Cells(Rows.Count, 1).End(xlUp).Row + 2 Dim arrayPath As Variant arrayPath = Application.GetOpenFilename("ブック, *.xlsm", MultiSelect:=True) If IsArray(arrayPath) Then MsgBox "ちょっと時間かかるかも(´;ω;`)" '画面の描画を停止する Application.ScreenUpdating = False 'Forループ(iが1から配列の要素数まで) Dim i As Integer For i = 1 To UBound(arrayPath) '変数を用意し、ブックを開いて格納 Dim openBook As Workbook Set openBook = Workbooks.Open(arrayPath(i)) 'セルの結合を解除する Cells.Select Selection.UnMerge '必要項目をコピーしてくる 'テーマ ’A3からスタートし、 With Workbooks("管理表VBA").Worksheets("2019年10月") .Range("A" & MaxRow).Value = openBook.Worksheets(1).Range("E6").Value '取引先への支払い金額 'AA9~AA13、AA14は総額 '発注決定額を6行分B列に入れる 'nilがあればそこは入力しない '1~5のデータの総数が1であれば6列目は入れない .Range("B" & MaxRow).Value = openBook.Worksheets(1).Range("AA9").Value '取引先 'ブレーンの文字を6行分D列に入れる .Range("D" & MaxRow).Value = openBook.Worksheets(1).Range("S9:S13").Value Next 'nilがあればそこは入力しない '1~5のデータの総数が1であれば6列目は入れない '内制費 'D列の最後の行の横E列に内制費を入れる '見積もり総額 '担当営業 .Range("G" & MaxRow).Value = openBook.Worksheets(1).Range("B4").Value 'A列とG列はB列の最初と最後のセルに合わせて結合する End With 'エクセルファイルを保存せず閉じる Application.DisplayAlerts = False openBook.Close '全てのエクセルファイルに同処理をする MaxRow = MaxRow + 2 Next i '画面の描画を再開する Application.ScreenUpdating = True MsgBox "おわたよ(`・ω・´)" End If End Sub

ところどころコメントのみになっている箇所はこれからコードを書く予定の場所です…

ツールのバージョン

Excel 2016

追記

やりたいことを画像化したものが下記図です。(tatsu99さんありがとうございます)
イメージ説明

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

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

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

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

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

meg_

2019/10/13 15:12

Excelには「マクロの記録」機能があります。こちらを使用してExcel上でコピー&ペーストを実行するとコピー&ペーストのコードが自動生成されるので参考になりますよ。(ご存じなければ試してみてください)
Jonny_dayo

2019/10/13 15:20

回答ありがとうございます! マクロの記録便利ですよね、いつもお世話になっております。。 コピー&ペーストのコード自体は既に書いていて、動作も別に問題ないんですが、 複数選択した際に上手くいかないというのが悩みです。 マクロの記録しても複数選択は"AA9:AA13"という書き方で相違ないですもんね、、
hatena19

2019/10/14 04:09

元データと出力後のデータの例をマークダウンの表と実際の画像で提示してもらえませんか。 説明が曖昧なので、いろいろな解釈ができてしまいます。
Jonny_dayo

2019/10/14 04:21

hatena19さん、ご指摘ありがとうございます! 下でtatsu99さんがわかりやすい画像を貼ってくれたので、それをそのまま追記として記載しました! 以後、分かりやすい画像貼ること心掛けます!
guest

回答3

0

ベストアンサー

以下のようなプロシージャを作ります。

VBA

1'fromRg:コピー元セル 2'toRg:コピー先セル 3Private Sub RgCopy(toRg As Range, fromRg As Range) 4 Dim rg As Range 5 Dim i As Long 6 i = 0 7 For Each rg In fromRg 8 If rg.Value <> "" Then 9 toRg.Offset(i).Value = rg.Value 10 i = i + 1 11 End If 12 Next 13End Sub

呼び出し側です。

VBA

1 With Workbooks("管理表VBA").Worksheets("2019年10月") 2 Call RgCopy(.Range("A" & MaxRow), openBook.Worksheets(1).Range("E6")) 3 Call RgCopy(.Range("B" & MaxRow), openBook.Worksheets(1).Range("AA9:AA13")) 4 End With 5

投稿2019/10/14 04:53

tatsu99

総合スコア5493

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

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

Jonny_dayo

2019/10/14 05:14

わあああああああああ!!できたあああああ!!!!! ありがとうございますッッッッ!!!
guest

0

.Range("A" & MaxRow).Value = openBook.Worksheets(1).Range("E6").Value
.Range("B" & MaxRow).Value = openBook.Worksheets(1).Range("AA9:AA13").Value
でやりたいことは、添付図のようなことでしょうか。
赤いセルがコピー先、黄色いセルがコピー元です。
MaxRow=4と仮定した場合です。
添付図

投稿2019/10/14 01:48

編集2019/10/14 02:43
tatsu99

総合スコア5493

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

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

Jonny_dayo

2019/10/14 04:05

回答ありがとうございます!そうですそうです! それがやりたいです!!
guest

0

以下のような感じでいかがでしょうか。

With Workbooks("Book1.xlsm").Worksheets("Sheet1") .Range("D1").Value = .Range("A1").Value .Range("D2").Value = "" For Each cell In .Range("A1:A5").Value .Range("D2").Value = .Range("D2").Value + cell Next End With

イメージ説明
.Range("AA9:AA13").Valueで範囲内の値を全て取得できていますが、配列になっています。
取得された配列を一つずつ展開してあげると全ての値を取得できるかと思います。

展開の際に条件を入れてあげればスキップ処理も可能かと思います。

投稿2019/10/13 15:57

it.

総合スコア26

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

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

Jonny_dayo

2019/10/13 16:58

回答ありがとうございます! 頂いたコードを自分のやつに合わせてみたのですが、なぜか値が0しか入らず、他の動いていたコードも上手くコピーされなくなってしまいました… 同じシートからではなく、複数開いた別のファイルから、最終行+1でどんどん記載されていくようにしているので、それ用にアレンジはしたのですが… エラー等は出ていないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問