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

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

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

Q&A

解決済

2回答

1030閲覧

可変の行数を自動で可変数コピーしてくる方法

pegy

総合スコア243

0グッド

1クリップ

投稿2018/10/16 14:14

編集2018/10/17 02:54

programフォルダには
summay.xlsxとsource_yyyymmdd.xlsxが存在しており、summay.xlsxは空で
例えば本日のsource.xlsxは下記の通りです。
source.xlsxを毎日フォルダに格納することにより自動で、summary.xlsxのA1:A3に
反映されるようにしたいと考えております。
当然、summary.xlsxのA列にsource.xlsxのA1から順番に参照する式を予め埋めておけば
フォルダにファイルを格納するだけで自動で転記されていくと思いますが、source.xlsxのA:Aのデータは
可変で、summary.xlsxのA:Aに全て参照する=式を入れるととても思いファイルになってしまいます。
このような可変データをフォルダ格納をトリガーにして転記する場合で、可変数分だけ持ってきたい場合には
どのようにするのが一般的またはベストな解決方法なのでしょうか。

この描写をうまくgoogle検索できなかったため、ご質問させていただきましたが、不明瞭な点があれば
ご指摘ください。

source_20181017.xlsx

列1列2列3

source_20181018.xlsx

列1列2列3

以下が転記後の例になります。
_yyyymmddを添えておりますが、マクロ上本日の日付を含めたブックを参照する方法をとることが
煩雑ですし、仮にtoday()関数を使用して可変的に参照しても、必ずしもその日に本処理を実行するため
実際には同じsoure.xlsxファイルのブック名のみを参照することを想定しております。
また、A:A列だけなら手でコピペすれば良いのですが、実際には複数の参照先ブックから同じように
複数列を引用してくる(source_2,source_3等があるB:BやC:C二反映される)ため、これを存在する行の範囲だけ
自動で実行したいという主旨になります。
summary.xlsx

●20181017日にsource_20181017.xlsxを格納しsummary.xlsxを開いた場合に以下の内容が自動で反映される

列1列2列3

●20181018日にsource_20181018.xlsxを格納しsummary.xlsxを開いた場合に以下の内容が自動で反映される

列1列2列3

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

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

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

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

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

ttyp03

2018/10/16 23:40

summary.xlsxを更新するタイミングはsummary.xlsxを開いたときでしょうか?それともsource.xlsxが更新されたときでしょうか?
ttyp03

2018/10/16 23:41

サンプルのシートがどちらもsource.xlsxになっています。また転記後のイメージもあったほうがわかりやすいです。
pegy

2018/10/17 02:43

ご指摘有難うございます。summary.xlsxの更新のタイミングは開いたタイミングです。本当はどちらもが望ましいですが。
pegy

2018/10/17 02:46

転記後のイメージを本文に加筆させて頂きます。
ttyp03

2018/10/17 02:58

10/18に開いたら、summaryには10/17の分があるから、犬・猫・猿の次の行から10/18分を追加するのではないのですか?総入れ替え?
pegy

2018/10/17 03:40

毎日summaryを開くたび、同じフォルダに新たなsourceが格納されて更新されるため、「総入れ替え」になります。追加ではございません。なので、sourceは同じファイル名にいたしておりました。
guest

回答2

0

ベストアンサー

簡単ですがこんな感じのマクロを書いてみました。
マクロを使うのでsummary.xlsxはsummary.xlsmで保存する必要があります。
ThisWorkbookに以下を仕込めば、ファイルを開いたときにsource.xlsxの中身をコピーしてきます。
転記元・先ともに仮に先頭シートのA列を対象にしていますが、必要であれば適宜対象を変更してください。

VBA

1Private Sub Workbook_Open() 2 3 Dim ds As Worksheet ' 転記先シート 4 Dim sb As Workbook ' source.xlsx 5 Dim ss As Worksheet ' source.xslsの対象シート 6 7 Set ds = ThisWorkbook.Worksheets(1) 8 Set sb = Workbooks.Open(ThisWorkbook.Path & "\source.xlsx") 9 Set ss = sb.Worksheets(1) 10 11 ds.Range("A:A").Clear 12 ss.Range("A:A").Copy ds.Range("A:A") 13 14 sb.Close 15 16End Sub 17

投稿2018/10/17 04:28

編集2018/10/17 04:32
ttyp03

総合スコア16998

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

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

pegy

2018/10/17 06:51

ありがうございます!こんなシンプルなvbaで実行できるのですね、いま、それぞれのオブジェクトを調べ、また動作を確認して無事解決することができました。 コードまでご提示頂き申し訳ございません。 最後に本当に申し訳ないのですが、 転記された列1に値がある場合のみ列2で関数を実行することも可能なのでしょうか。 同じように列2二予め関数を仕込んでおくのが重くなってしまうためです。 「range 隣のセル 値がある場合のみ 実行」等でvbaを検索しているのですが、オブジェクトやメソッド等のヒントだけでもいただけるととてもうれしいです。 わがままなお願いと承知をしているため、ご放念いただいても構いません。 一旦、ベストアンサーにさせていただきます。 本当に有難うございました。
ttyp03

2018/10/17 06:54

summaryのA列に値がある場合は、B列に転記するということでしょうか?
pegy

2018/10/17 07:06 編集

ご返信ありがとうございます。 正確に表現させていただく場合、「上記の処理の結果、SummaryのA列に転記されてきた場合、B列にA列に対応する関数を実行する」ということを探しております。 当初の例、20181017では 犬、猫、猿が転記されてくるので、A列のこの3つの値に対して、B1:B3で関数が実行される。例えばA1&"が好きです"が実行され、B1:B3に"犬が好きです"、"猫が好きです"、"猿が好きです"と実行されます。 SummayのB:BにはじめからA1&"が好きです"と埋め込んだ場合、B4のセルに以降に"が好きです"だけ残ってしまうだけではなくファイルが重くなるため、A列に値がある場合のみでIF文で実行すべきか調べておりました。
ttyp03

2018/10/17 07:15

Clear以降を次に置き換えてください。 ds.Range("A:B").Clear ss.Range("A:A").Copy ds.Range("A:A") r = 1 While ds.Cells(r, 1) <> "" ds.Cells(r, 2).Formula = "=A" & r & "&""が好きです""" r = r + 1 Wend A列の行数分B列に数式を設定するようにしています。
pegy

2018/10/17 08:17

有難うございます。 なるほど、(r,1)が""ではないかぎり、隣のセルでFormulaを実行し続けるということですね! 本当に勉強になりましたし、とても助かりました。 改めて御礼を申し上げます。
guest

0

そういうときは、セルに関数を入れるのじゃなくて、VBAを使うと良いです。

投稿2018/10/17 00:18

otn

総合スコア84555

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

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

pegy

2018/10/17 06:52

コメント有難うございます。 vbaで解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問