Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Excel 2016)
共有フォルダにあるファイルを自動でピックアップして、Excelファイルに張り付ける方法
投稿日時: 21/04/05 19:34:36
投稿者: sukenekosan

毎日、新しいファイルとして共有フォルダにExcelファイルが出されます。
全社員分の営業成績が毎日新しいExcelファイルで出されるので、それを別の集計用のExcelファイルにコピー&ペーストして私のチーム分のみソートをかけたいのですが、VBAを使えればそれらは可能でしょうか。
 
やり方まで教えて頂けると大変助かります。

回答
投稿日時: 21/04/05 20:19:45
投稿者: simple

こんにちは。
 
ブックを開いて、コピーペイストしたりソートしたりということであれば、VBAでできると思いますよ。
 
ただ、可否だけでなく、もう少し具体的なことが知りたいのであれば、
あなたから、
・こんな形式のブックがあり、(レイアウトも必要)
・作成したいのはこういう内容(レイアウトも必要)のもので、
・手作業では、今こんな手順でやっています、
という具体的な説明をされないと前に進まないと思います。
こちらからは不可能ですから。
また、トライ中のコートがあれば、途中までで結構ですので示されるとよいでしょう。
 
いえ、具体的なコードではなく、そのための知識だけを希望しています、ということなら、
こちらのサイトの「即効テクニック」にある
「複数ブックのシートを1つのブックにコピーする」
https://www.moug.net/tech/exvba/0060003.html
などが参考になるかも知れませんね。

回答
投稿日時: 21/04/05 20:26:56
投稿者: simple

ああ、言い忘れましたが、まだ着手しておらず、できれば作成して欲しいということですか?
 
もしそういうことであれば、こちらの掲示板の管理者さんが定めた「禁止事項」に
コード制作依頼
「●●●を実行するようなマクロを作りたいのですが」「●●●をする方法を教えてください」といった、コード制作依頼ともとれるような質問はおやめください。
というのがありますので、これに抵触しないかたちの質問にしてもらうとよいでしょう。
不明点に絞った質問にするとか、できているところまでのコードを示して意見を求めるとか、
ですかね。

投稿日時: 21/04/06 10:37:57
投稿者: sukenekosan

ご返答ありがとうございます
 
超初心者なもので、質問の仕方も雑で申し訳ございません。
 
そもそも、VBAでどこまでできるのかを認識しておらずこのような質問になりました。
 
ネット上の共有フォルダに毎日新しいファイルが作成されるのですが、それを自動で最も新しいものを引用することも可能なのでしょうか。
 
また、VBAの学び方がわからないので、simple様がVBAを習得した方法も教えて欲しいです。

回答
投稿日時: 21/04/06 10:53:23
投稿者: simple

そのネットワークに不案内なので、他のかたの回答をお待ちください。
後者の質問についてはパスさせていただきます。
学習の仕方は人それぞれですが、王道のようなものは無いと思いますよ。

投稿日時: 21/04/06 12:30:01
投稿者: sukenekosan

ご返信ありがとうございます。
 
そうなのですね。。。
 
とりあえず本でも買ってみます。
 
進めの教材があれば教えてください。

回答
投稿日時: 21/04/06 15:56:16
投稿者: めいぷる

こんにちは。
 
本もあるとよいと思いますが、まずは以下のようなサイトで一通り学んでみてはいかがでしょうか。
 
Excelでお仕事!
http://www.asahi-net.or.jp/~ef2o-inue/menu/menu04.html
 
Excelの神髄 VBA入門
https://excel-ubara.com/excelvba1/
 
office TANAKA Excel VBAコンテンツ
http://officetanaka.net/excel/vba/
 
あとは、ここモーグの「Excel VBAテクニック 」にもいろいろとTipsがありますよ。
https://www.moug.net/tech/exvba/
 
まずは自分のPC上にテスト用のファイルを作って、
コピー&ペーストなどの簡単なところから作ってみるといいと思います。
それをたたき台にして、「ここまでは出来たのだけれど、次に○○したいがわからなない」とか
「○○したくてこのようにしてみたが、エラーになる(または○○になると思ったが■■になってしまう)」などと質問してみて下さい。
 
最初は大変だと思いますが、自分で作ったものが動いたらうれしいですよ。
頑張って下さい。

回答
投稿日時: 21/04/07 09:44:30
投稿者: simple

"そのネットワークに不案内"というより、説明がないので、と書くべきでした。
 
共有フォルダというのがどのような種類のものかがポイントです。
通常のファイルサーバであれば、Dir関数で順次、対象ファイルを取得できるでしょう。
特段の問題はありません。
 
しかし、最近は OneDriveとかSharePointといったものの利用も増えており、
その場合は、Dirを使った順次取り出しはできないので、少々ややこしくなるようです。
https://www.moug.net/faq/viewtopic.php?t=80319
の議論を参考にして下さい。
https://www.moug.net/faq/viewtopic.php?t=80375
も同様の話を扱っています。
 
ポイントは、
・同期設定が許されていれば、Dir関数などで、条件にあったファイルを順次取得することが可能。
・しかし、この条件が満たされない場合、
   > システム担当者に確認するとセキュリティ上
   > OneDrive、SharePoint共に、ブラウザ上からのアクセスしか認められておらず
  上記のような手法が使えません。
・この場合は、ピンポイントでurlを指定する必要があります。
・月次で変わっていくのであれば、それを予め作成することになります。
 
 
いずれにしても、まだVBAの入り口をくぐった段階のようですから、
基本をもうすこし固めてからトライされたらいかがですか?
(ちなみに、私はネット上の情報は検索には向くが、
  基本的事項のマスターには余り向かないという持論を持っています。
  世代にも依りますし、人にも依ります。何が適切かは様々です。)

回答
投稿日時: 21/04/07 15:50:20
投稿者: Suzu

引用:
全社員分の営業成績が毎日新しいExcelファイルで出されるので、それを別の集計用のExcelファイルにコピー&ペーストして私のチーム分のみソートをかけたい

 
・「新しいファイル」をどのように判断するか
  → ファイル名に日付を入れているのか、それとも、ファイルの更新日等で判断するのか
・実行時に、共有フォルダ内では最新のファイルだとしても、
 それが、コピー済みかどうかどう判断するのか
 
→ ファイル名に「_済」をつけてしまう事で、取り込み済みかどうかを判断
 
ローカルまたは、ネットワーク上のフォルダ(\\コンピューター名)で始まるフォルダでのサンプルです。
 simple さんが気にされていた、クラウド上のファイルには非対応の サンプルです。
 
Sub Sample()
  'フォルダ FldPath 内の ファイル名の末尾が「_済.xlsx」以外ファイル を
  '自ファイルSheet1 の最終行に貼り付け
  '貼り付け終わったファイル名は、元ファイル名_済.xlsx にファイル名変更

  '対象フォルダパス
  Const FldPath As String = "C:\DATA\"

  Dim wbk0 As Workbook  '自ファイル
  Dim wbk1 As Workbook  'コピー元ファイル
  Dim wst0 As Worksheet
  Dim wst1 As Worksheet

  Dim FilName As String

  Dim r As Long
  Dim c As Long

  '自ファイルを変数に取得
  Set wbk0 = ThisWorkbook
  '自ファイル Sheet1を取得
  Set wst0 = wbk0.Worksheets("Sheet1")

  'フォルダ内にて、xlsxファイルを検索
  'ファイル名を FilNameに取得
  FilName = Dir(FldPath & "*.xlsx")

  'FilName が 「""」になるまでループ
  Do While FilName <> ""

    'ファイル名末尾が "*_済.xlsx" 以外を 処理対象
    If Not FilName Like "*_済.xlsx" Then

      'ファイルを開き変数に取得
      Set wbk1 = Workbooks.Open(FldPath & FilName)
      'ファイル Sheet1を取得
      Set wst1 = wbk1.Worksheets("Sheet1")
  
      '最終行のA列から 上方向でデータの入っているセルの行番号-1 を取得
      r = wst1.Cells(wst1.Rows.Count, 1).End(xlUp).Row - 1
      '最終列の1行から 左方向でデータの入っているセルの列番号 を取得
      c = wst1.Cells(1, wst1.Columns.Count).End(xlToLeft).Column
  
      '最新ファイルの A2を基点として データの入っている範囲を
      '自ファイルSheet1 の最終行にコピペ
      wst1.Range("A2").Resize(r, c).Copy Destination:=wst0.Cells(wst0.Rows.Count, 1).End(xlUp).Offset(1, 0)
  
      'コピー元のファイルを閉じる
      Set wst1 = Nothing
      wbk1.Close SaveChanges:=False
  
      'コピーし終えたファイル名を変更
      Name FldPath & FilName As FldPath & Left(FilName, Len(FilName) - 5) & "_済.xlsx"
    End If

    'フォルダ内の次のファイル名を取得
    FilName = Dir()
  Loop

  Set wbk1 = Nothing

  '自ファイル Sheet1 の 1列目を基準に並べ替え
  wst0.UsedRange.Sort Key1:=wst0.Range("A1"), Header:=xlYes

  Set wst0 = Nothing
  Set wbk0 = Nothing
End Sub

 
 
基本、手動でできる事は VBAで可能です。
ただ 自動化する為の判定や基準をどの様な手法を取り実現するのか
その方法が、Excelの中に用意されているのか、VBAの命令の中に用意されているのか等を
理解する必要があります。
 
初めてのプログラミングという事であれば、本が手元にあった方が良いと思います。
時間や金銭的な事が許されるのであればセミナーを受講し、とっかかりを得るのが良いかもしれません。

トピックに返信