dポイントプレゼントキャンペーン実施中!

【VBAマクロ初心者】Excel VBAで複数ファイルをマージする際にファイルがそれぞれヘッダーの項目が違い1つのファイルのヘッダーに合わせる為に不要な列を削除、足りない列には空白列を挿入したいのですが、後々ヘッダーの項目が変更になった際に削除する列や空白列を挿入する条件を変更できるようにしたいです。
また、マージ対象のフォルダやファイルの設定も可能にしてマージ後のファイル名も変更可能ですがデフォルトでは当日の日付(20191023.xls)にしたいですが、職場にマクロを組める人がいない状態です・・・【急いでいます】

質問者からの補足コメント

  • ファイルのヘッダーは現在は49列項目があります。
    フォルダの中に5~7個のxls形式のファイルがあり、ファイル名は
    それぞれ
    台帳(*CT)B票データ.xls
    台帳(*QE)B票データ.xls
    台帳(*ST)B票データ.xls
    台帳(*IS)B票データ.xls
    台帳(*SST)B票データ.xls
    *には英数字が記載されています。

    今回はCTのヘッダーを基準に
    20191023.xls(ファイル名はマージ当日の日付をデフォルトに)のファイルを作成して同じフォルダに保存したいです。

      補足日時:2019/10/23 16:33
  • 空白列の挿入や不要列の削除は以下のようにしていますが、この部分を可変で外部から設定できるようにしたいです。

    Sub test()
    Columns(11).Insert
    Columns(16).Insert
    Columns(18).Insert
    Columns(19).Insert
    Range("AY:CJ").Delete
    End Sub

      補足日時:2019/10/23 16:49
  • 補足が多くてすみません
    フォルダの中にはマージしないフォルダも含まれているので
    イメージとしては
    ・マージ対象のフォルダ選択
    ・同フォルダ内にバックアップ用のフォルダをコピー
    ・マージ対象のフォルダを選択
    ・バックアップ用のフォルダ内にマージ用ファイルを保存
    ・バックアップ用のフォルダ内のファイルの不要列削除と足りない列は空白を挿入
    ・マージして最初のフォルダ内にマージした日付をファイル名として保存
    ・バックアップ用のフォルダを削除

    初心者の自分にはハードルが高くなかなか実装出来ません・・・
    どうか御教授お願いします。

      補足日時:2019/10/23 17:20
  • >GooUserラックさん

    ①「バックアップ用のフォルダ」は作業用の仮のフォルダのことです。
    ②そのフォルダへのコピーもマクロで行いたいです。
    ③添付のような場合の結果は 基準にしたいヘッダーを上の「あ いう えお」にする場合は
    下の「か」の列は削除で「おあいえ」の列はそれぞれ上の「おあいえ」の列にマッピングしたいです。
    ちなみに1行目のヘッダー部分は全て埋まっている状態です。
    ④各ファイルはシートが1枚だけです。
    ⑤1つのファイルはデータのある列は全て同じ行まで埋まっています。
    ⑥ヘッダーは全てあるのですが中身が(2行目から下)空欄の列もあります。また基準にするCTのファイルよりもヘッダーが多いものもあります。その場合は多い分の列を削除したいです。またヘッダーの項目は一緒でもヘッダーの列がずれている場合があります。その場合は列を入れ替えるかマッピングして入力したいです。

    「【VBAマクロ初心者】Excel VBA」の補足画像4
      補足日時:2019/10/23 23:57
  • >GooUserラックさん
    ①②マージ元となるファイルは「20191023」「20191024」とフォルダを毎日作って手作業でxls形式のファイルを手作業で入れています。このフォルダの中に保管フォルダとマクロ付ファイルを置きたいです。③ここは手動でも大丈夫です。
    ④⑤⑥依頼者(マクロは組めない)からは「基準にするヘッダーだけのマージ用のファイル(今回はCTのファイルをコピーしてのヘッダー以外の行を削除したもの)を作って、そこにマッピングする動きをファイル数分繰り返したら出来るんじゃないの?先に要らない列を削除してもいいしマージしてから削除してもいいし、ただし後々項目も変わるかもしれないから外部から可変出来る様にして欲しい」という 分かるような分からないような感じの動きで作ってほしいそうです。
    ⑦⑧ ①②のファイルとマージ後のファイルだけを「20191023」に残して作業用は削除したいです。

    「【VBAマクロ初心者】Excel VBA」の補足画像5
      補足日時:2019/10/24 00:33

A 回答 (29件中1~10件)

上司との食い違いがあるようですが、手順として上司はどのような流れで作成してくれって言ったのでしょう?


質問文は質問者さんの考えた手順を提示されている(補足日時:2019/10/23 17:20)のであって、上司から承認を取れてた訳ではない?ように思えますが。
仮にそうなら社内的にどういう手順にしたいのかを纏め上げたうえで、質問のやり直しも必要かもしれませんね。

ちなみに不要行削除とか行追加とかの作業って質問者さんの思いつきではなくて?
揃えないと出来ない(ハズ?)と決めつけてしまっているからではないのかと。
でも各ブックのシートからデータを移すのに上記作業は必要ないですよ。
あくまで『マージ先に項目名が既にあれば列番号を記録し、マージ元の項目名でマージ先の列番号の位置に列毎(データ範囲を取得しておき)にコピペする』だけになるような???
そう言う手順ではないのかなって読んでて感じました。
違ってたらごめんなさい。
    • good
    • 0

No.27です。



会社がそれなりにIT系と感じたのはもしかしたら違ったかもですが、だいぶ部署内のPCに対してのセキュリティには対策取られてますよね?
そこで気になったのが『質問者さんが外部サイトへ質問をしてコード作成について助言を貰っていること』って上司から許可を得てます?
今はOSが判断して事前に停止させるかもですけど、昔とあるサイトで回答者として参加してた人が提示したコードの一部にシステムをダメにする内容が
書かれてたのです。
そのサイトは回答者同士勉強し合う方々もいて速攻管理者報告とその内容削除を依頼し、同時に質問者へ実行しないよう注意をしてましたので被害にはなりませんでした。
同様の事を複数のサイトで回答者として提示してたので、先輩回答者は直ぐわかったようです。

ここでそうなるとは限らないでしょうけど、上司・会社としてはどうなのかなってちょっと気になりました。
質問者さんの立場もありますしね。(自宅で検証してからされてる感じはありますが)
    • good
    • 0
この回答へのお礼

上司からも『 分からないことは調べてコピペしたらいいだろ』のスタンスで許可を貰っています。
まぁコピペは出来ませんが・・・

ただほぼ完全に受け身の状態ですので、めぐみんさんの指摘、心配は正しいと思います。
ありがとうございます。

お礼日時:2019/10/30 08:31

No.25です。



お礼を続けて読んでみると会社自体がそれなりにIT系な所のようにも思えますが、上司より理解を余りしてもらえないのは厳しいですね。
別のビルにってのも含め『出来る人間がすればいい。』との考えなのでしょうね。
指示を出す管理職としては間違ってもいませんけど、少なくとも社内状況がどうなっているのかの把握はしていて欲しい所でしょう。

それに他言語を既に勉強されているのならVBAって使いにくい物ではないのかな?と逆パターンで勉強した私は思いました。
先にVBAをやって『あ~こんなに便利なんだ』と感心しましたが、その後主にVB.NET・VC#をやってみた後で以前作成したVBAのコードを見たり
その質問に回答コードを作成しようとしたら、『んっだよ!ここで.NET Frameworkの〇〇が使えれば便利じゃん!!』と。
ま、OFFICEは不要になった時なので2003以降の購入をしていないのもありましたけど、セルの書式設定を使ってないならCSVファイルにしてVBで処理し
CSVファイルに保存してExcelで開くのがマシでしたね。
どうしても必要ってならExcelの機能は参照設定で追加(インストされているバージョンと同じなら)可能でしたし。

今のExcelが.NET FrameworkのSystem.Collections.Genericを最低限使えるなら検討もしたいですが、フリーのOFFICEでJavaScriptとかそのまま使えるならどっちかなぁです。

でも今後も無茶ぶりが続きそうな感じですね。
案外別ビルに行った人も辿っていた道なのかぁ?と思えてしまいますが。

全く回答と無関係で申し訳ありませんでした。
    • good
    • 0

多分スペースが有るところが無かったりするのかなぁ?


見やすい様に全角スペースにしてみました

Sub 処理()

Dim Day_今日 As Date
Dim Lng_ファイル数 As Long
Dim Str_ファイル名 As String
Dim Obj_シート As Object

 Day_今日 = Date
 Application.DisplayAlerts = False
 For Each Obj_シート In Sheets
  If Obj_シート.Name = "ファイル一覧" Then Obj_シート.Delete
 Next
 Application.DisplayAlerts = True
 Call フォルダ処理(Day_今日)
 If Dir(ThisWorkbook.Path & "\基本ヘッダー.xls") = "" Then
  MsgBox ("「" & ThisWorkbook.Path & "」に「基本ヘッダー.xls」が有りません。作成してやり直してください")
  Exit Sub
 End If
 MsgBox ("マージしたいファイルを作業フォルダにコピーして下さい。" & Chr(13) & _
     "(注意:コピーするとき移動にならないように注意してください。)" & Chr(13) & _
     "・このメッセージはコピーが終わるまで閉じないで下さい。")
 Lng_ファイル数 = ファイル数("台帳(*)B票データ.xls")
 If Lng_ファイル数 = 0 Then
  MsgBox ("マージ用ファイルがコピーされていませんでした。" & Chr(13) & _
      "・エクセルを一度閉じて、もう一度やり直して下さい。")
 Else
  Call マージ処理(Lng_ファイル数)
  Sheets("作業").Move
  Str_ファイル名 = ThisWorkbook.Path & "\保管\" & _
   Format(Day_今日, "yyyy") & "\" & _
   Format(Day_今日, "mm") & "\" & _
   Format(Day_今日, "yyyymmdd") & ".xls"
  If Dir(Str_ファイル名) <> "" Then Kill Str_ファイル名
  ActiveWorkbook.SaveAs Filename:=Str_ファイル名
  ActiveWindow.Close
  Call ファイル移動(Day_今日)
  MsgBox ("処理が終了しました")
 End If
 ThisWorkbook.Saved = True

End Sub
    • good
    • 1
この回答へのお礼

スマホでもとても見やすいです。わざわざありがとうございます。

先程上司にアドミン権限がなくて設定も変更できなくてコード以前の問題ですと伝えたら別のビルに別のマクロを作った人がいるから
その人に質問しといてやるから回答が来たら1日で出来るよな?みたいな無茶振りを受けつつ何とか期限を少し伸ばすことが出来ましたが、最初からその人に頼めばいいのにと、思いました。
しかもテキストファイルに不要行のワードを入れるのも気に入らないらしく、どれだけ便利か説明しても『 このテキストに別の文字をいれてたらどうする?』とかどうしようも無い文句を言われたり
わざわざ作業用フォルダにファイルをコピペしなきゃいけないの?
とか
それくらいやってよ!って言いたくなるようなことも言われて
またゼロから作らせる気なのかって感じで少し言い合いになってました。どうしてもセルに入力したりダイアログボックスを開いてフォルダやファイルを選べるようにしたりとかにこだわりたいんだと思います( ̄▽ ̄;)
また別の件で質問を立てないといけなくなるのか
せっかくここまで教えてもらってるのに・・・

お礼日時:2019/10/29 00:15

社内ネットワーク(?)において外部サイトへのアクセス権を与えられてないPCってのもありましたから、


スマホ見ながらデータの打ち込みも大変でしょうね。
方法としては既に出てますが、ご自宅ではサイトへのアクセスが可能な訳であればテキストファイルをUSBメモリに落として会社でぶっ刺すと言うのもありますよね。

ただ個人的に気にしちゃうのは今回の質問を解決できた際のあなたの評価を会社(上司)が高く買った場合、今後も「こっちはこうで、そっちはそうで・・・」と
今までかかっていた作業時間短縮をドンドン要望してこないかなって事ですかね。
そうなったら期待通りにこなせるよう頑張るしかないかもでしょうけど。

昔私が居た所ではたまたまVBAの存在さえ知らない上司とかのお陰で、そう言う依頼を相談される事はありませんでした。(そう言う業務の会社にいたのは10年以上前ですし)
制作したのはあくまで自身で使用する範囲のものだけです。
根本的には会社として使用していたのはOFFICE(Excel)よりも委託制作したシステム等でしたから。
    • good
    • 0
この回答へのお礼

USBメモリもぶっ差せない設定なので(セキュリティ的なあれで)
テキストの移動すらもダメみたいですね。
あとはマージだけだから1,2日くらいで出来るだろ?みたいなスタンスだったので逆に『 まだ出来ないの?』みたいな感じなので評価を買うことは無いと思います。(笑)
もともとはJavaメインで勉強してて前の職場ではPerlとRとC#とSQLを使ってて
どれも基本的なことを浅く広くって感じだったのでVBA自体もまだ1が月経ってないくらいのペーペーなのに
変にハードル上げられて今に至る感じです。それに加えてAdmin権限も無い状態の設定とか困惑しかないですね・・・
別の業務もあるのでスキマ時間に勉強しながら慣れていくしかないみたいですけど
今日中間報告したらまた仕様を変えられそうで流石に心が折れてます・・・
皆さんにはご迷惑をおかけしてますが引き続きよろしくお願いします。

お礼日時:2019/10/28 23:56

>スマホの画面をみながら手打ちなのでこちらのミスかもしれません


横からお邪魔します。
あなたの環境はメールも禁止なのでしょうか?
メールが使用できるなら、ここの回答をコピペしたものをテキストファイルに落とし込み、
それをメールで自分あてに送信すれば良いかと。
あなたの環境でそのメールからテキストファイルを取り出せば、そのままマクロへ貼り付けられると思いますが、いかがでしょうか。
    • good
    • 0
この回答へのお礼

開発用PCはメールも禁止でUSBメモリの接続も禁止でネットも繋げません
ネットに繋げる事務用のPCも開発用PCにデータを移すことすら出来ないようになっていて
お手上げ状態です( ̄▽ ̄;)
『 こっちのPCでは動くのに何とか移動できないんですか?』って聞いてみたんですけどダメでした。

お礼日時:2019/10/28 23:40

MsgBox("マージしたいファイルを~ThisWorkbook.Saved = True


End Sub
の部分でIfブロックに対応する
End Ifがありませんと表示されましたが
--------------------------------------------------------------------------
の件ですが、No.17 のアップしている「Sub 処理()」~「End Sub」取り込んで実行しましたが問題は起きませんでした。もしかしたらですがコードを手打ちされていたりしませんか?
    • good
    • 0
この回答へのお礼

スマホの画面をみながら手打ちなのでこちらのミスかもしれません

もう一度確認してみます。
申し訳ございません

お礼日時:2019/10/28 13:27

こちらも余談ですが



No.21 の様なテストを行うときは「作業」フォルダに何も入れずに先に進めると、ほとんど何もせずに処理が終了します。
ここでコードを追加してテストをする事が出来ます。
    • good
    • 0

余談ですが、モジュール分割したおかげで次のような事も出来ます。



☆ 特定の日付でフォルダー構成を確認する

Sub test()

 Call フォルダ処理(#1/23/2019#) '「2019/1/23」とした場合(アメリカ形式(m/d/yyyy)に直されてしまう)

End Sub
    • good
    • 0

大変申し訳ございません。

なぜか開発中の物が混ざってしまったようです。以下のように直してください。

☆「ThisWorkbook」へ

Sub Workbook_Open()

 Call 処理

End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。

もうひとつですが
MsgBox("マージしたいファイルを~ThisWorkbook.Saved = True
End Sub
の部分でIfブロックに対応する
End Ifがありませんと表示されましたが
どこか分かりますでしょうか?

お礼日時:2019/10/28 13:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!