『VBA別ファイルへデータを蓄積するには』(SAM) VBAはじめたばかりです。 ブック1からブック2にデータを蓄積する記述を教えて下さい。 ブック1とブック2それぞれ項目名はA1からK1まで入っており、項目名の並びは同じです。 中身の項目は 決済番号 加盟店ID 屋号 店舗ID 店舗名 端末番号/PosID 取引ステータス 取引日時 取引金額 レシート番号 支払い方法 となっており、決済番号は、絶対にかぶらないユニークな値です。 ブック1は毎日ダウンロードで取得しているファイルで、ダウンロードのたびにその月の1日からダウンロード当日までのデータが入っており、1日分のデータだけをダウンロードする事はできません。 蓄積用のファイルは今年の1月からのデータが入っています。 やりたい事としましては、ブック1のデータをブック2に反映する際、ブック2に蓄積されているデータを消さずにデータを蓄積していきたいです。 「これはVBAは無理だよ」という場合も無理だとおっしゃってもらえるとありがたいです。 厚かましい内容、恐縮ですが、ひとつよろしくお願いします! < 使用 Excel:Excel2010、使用 OS:Windows10 > ---- こんにちは。 ブック1の全データをブック2にコピーして、 【データ】→【重複の削除】で、決済番号 だけをキーに選択してやったらどうでしょう。 決済番号 がユニークなら、これで大丈夫なはず。 ブック1のデータから、既にコピー済みのデータを選別するよりは簡単になるでしょう。 (でれすけ) 2019/03/20(水) 13:23 ---- でれすけさん、コメントありがとうございます! ブック2にVBAを記述してボタンを配置し実行。 ↓ ブック1を開き(開かないで出来るのであれば不要)コピー。 ↓ ブック2に重複しない値だけを貼り付け これが自動で出来たら効率良いと思ったのですが、やはりVBAでは難しいんでしょうか? 毎日行う作業なので実現出来れば非常に助かるのですが… よろしくお願いします! (SAM) 2019/03/20(水) 14:10 ---- 難しいかといわれれば、そんなことはないと思いますが... せっかくVBAはじめたのであれば、ある程度まで自分でやってみたらどうでしょう。 それとも、まるっと完成品を作って欲しいということでしょうか。 初心者レベルの課題としては、ちょっと難しい部分もあるかもしれませんが、 VBAのいいところは、マクロの記録で、ある程度まで形が出来てることろです。 ブック2にVBAを記述してボタンを配置し実行。 ↓ ブック1を開きコピー。 ↓ ブック2にすべてのデータを貼り付け ↓ ブック2の重複データを削除 とした方が楽ですよと書いたのです。 これをマクロの記録してみたらどうでしょう。 データを貼り付けする行は、既存の行の次の行にしないといけないので、 その都度変わりますので、その部分は記録されたマクロから修正が必要です。 そこはちょっとコツがあるので、また聞いていただければ。 (でれすけ) 2019/03/20(水) 14:23 ---- でれすけさんコメントありがとうございます! マクロの記録を試してみたのですが、うまくいきません Sub Macro1() Windows("Book1.xlsx").Activate Columns("A:K").Select Selection.Copy ActiveWindow.WindowState = xlNormal Windows("Book2.xlsx").Activate Columns("A:K").Select ActiveSheet.Paste Application.CutCopyMode = False ActiveSheet.Range("$A$1:$K$29").RemoveDuplicates Columns:=1, Header:=xlYes End Sub 毎回、ダウンロードしてこなければいけないブック1のデータの最初が 今月だと3月1日からの開始となっているのでブック2にコピーしようとすると、おっしゃるとおり 次の行にしないといけないので、それをどう記録すればよいのかさっぱりです。1月からのデータが消えてしまいます。 あとブック1と2をコピペするのに切り替える動作からだと思うのですが画面がチラチラします。これは解消できないのでしょうか。 よろしくお願いします (SAM) 2019/03/20(水) 14:52 ---- 内容推敲していたら編集かぶりましたけど、書いてしまったので投稿しておきます。 余計なツッコミかもですが、 (1) >ダウンロードのたびにその月の1日からダウンロード当日までのデータが入っており 正しくは、その【前の月】の1日からダウンロード当日までのデータが入っておりではないですか? でないと、たとえば 3/20にダウンロード → 3/1〜3/20 4/ 1にダウンロード → 4/1〜4/ 1 となり、3/31にダウンロードを忘れたら「前回ダウンロード〜3/31のデータを得る方法が存在しない」ことになりそうな気が・・・ (2) また、「ブック」と表現されていますが、実はcsvファイルだったりしませんか? (3) >これが自動で出来たら効率良いと思ったのですが、やはりVBAでは難しいんでしょうか? でれすけさんの案をVBAでやればよいのでは? (1)蓄積側(ブック2)の対象シートの最終行を調べる。 (2)ブック1の対象シートのうち項目行以外を(1)で調べた行の下に貼付 (3)決済番号(A列)をキーに重複の削除 の順番で組み立てればよさそうですが・・・ (もこな2) 2019/03/20(水) 14:54 ---- もこな2さんありがとうございます! 3/20にダウンロード → 3/1〜3/20 4/ 1にダウンロード → 4/1〜4/ 1 この内容で間違いないです!上司からデータをもらい集計しており、過去のデータも一通り見てみましたが、その月の1日が必ず最初でした。 エクスプローラー?から確認してみて種類のところを見てみたところ、マイクロソフトエクセルワークシートになっていましたので、CSVファイルじゃなかったです。 (1)蓄積側(ブック2)の対象シートの最終行を調べる。 (2)ブック1の対象シートのうち項目行以外を(1)で調べた行の下に貼付 (3)決済番号(A列)をキーに重複の削除 この内容がマクロの記録からじゃできなそうでネットで調べている最中ですが高レベル過ぎてどうしていいのかさっぱりで頭から変な煙が出てきそうです・・・ (SAM) 2019/03/20(水) 15:18 ---- マクロの記録をするときに、A列からB列まで全部選択してますけど、 このように、貼り付けるときに、データの最後に貼り付けられないですよね。 マクロの記録をするときに、必要なデータ範囲だけを、 マウスを使わずに、キーボード操作だけで記録するとこうなります。 データの選択するとき、 (1) ブック1をアクティブにする (2) タイトル行を除いてデータの最初のセル A2 をマウスクリック (3) CtrlキーとShiftキーを押しながら [↓]キー (4) CtrlキーとShiftキーを押しながら [→]キー (5) Ctrlキーと[C]キーでコピー データを貼り付けるとき、 (1) ブック2をアクティブにする (2) A1セルを選択する (3) CtrlキーとShiftキーを押しながら [↓]キー (4) [↓]キーでもう一つ下のセルを選択 (5) Ctrlキーと[V]キーで貼り付け そうやって記録したのが下のマクロです。 ブック1を開くところからやっているので、そこは適当にファイルの場所を修正してください。 Sub Macro1() ' ' Macro1 Macro ' ' ChDir "D:\test" Workbooks.Open Filename:="D:\test\ブック1.xlsx" Range("A2").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy Windows("ブック2.xlsm").Activate Range("A1").Select Selection.End(xlDown).Select Range("A14").Select ' [1] ここはもう一つ下のセルにしたい。 ActiveSheet.Paste Range("A1").Select Application.CutCopyMode = False ActiveSheet.Range("$A$1:$I$2624").RemoveDuplicates Columns:=1, Header:=xlYes ' [2]ここは範囲を可変にしたい Windows("ブック1.xlsx").Activate ActiveWindow.Close End Sub これを元に修正して、もっと見やすくしていきます。 [0] ほにゃらら.Select がうるさい ほにゃらら.Select Selectin.これこれ は できるだけ、 ほにゃらら.これこれ に修正 VBAが分かってくれば、Select はほぼ使わなくなります。 [1] ここはもう一つ下のセルにしたい。 Range("A1").Select Selection.End(xlDown).Select Range("A14").Select この3行はこうする Range("A1").End(xlDown).Offset(1).Select [2]ここは範囲を可変にしたい ActiveSheet.Range("$A$1:$I$2624").RemoveDuplicates Columns:=1, Header:=xlYes は、こうする ActiveSheet.Range("$A$1").CurrentRegion.RemoveDuplicates Columns:=1, Header:=xlYes (でれすけ) 2019/03/20(水) 15:34 ---- でれすけさん、コメントありがとうございます!! 記録するときはショートカットで行うのと、ショートカットではじめて知ったものもありました!貴重な情報ありがとうございます! [0]から順番に修正等を行うところ、これから行います! (SAM) 2019/03/20(水) 16:03