Excel (VBA)

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

 
(Windows 11全般 : Microsoft 365)
特定の文字の入ったファイルをコピーし、指定ホルダーへ格納をしたいです
投稿日時: 22/11/19 22:23:03
投稿者: y_0770

大変お世話になっております。
 
コード(数字)か国名(或いは、コードと国名両方)が入っているファイルをコピーし、指定ホルダーへ格納をしたいです。
 
【概要です】
1)”コード・国名対応表”があります((例)101:日本、202:アメリカ、308:イギリス、427:スペイン、599:ロシア、689:ベルギー、725:フランス 等…、100近くあります。)
 
2)”コード・国名対応表”の中から10か国程度を選択し、10〜15種類のファイルを作成します。(毎回選択する国が変わります)
 
ここからです…。
 
3)年月ホルダー例えば『2022年10月』の中に、『101_日本』、『202_アメリカ』、『308_イギリス』、『427_スペイン』、『599_ロシア』、『689_ベルギー』、『725_フランス』等、各国のホルダーと、『項目』のホルダーが入っています。
 
4)さらに、例えば『101_日本』のホルダー内に『@経済・法律・政治』、『A科学』、『B言語』、『C文化』、『工業』等の10以上のホルダーが入っています。(@等の番号が振っていないホルダーもあります)(各国のホルダー(例えば『101_日本』)の中のホルダーの名前は一律です)
 
5)『項目』ホルダーの中には、『経済』、『科学』、『法律』、『工業』、『政治』、『言語』等のホルダーがあります。
 
6)『項目』ホルダー内の例えば『経済』のホルダー内に、各国のコードが含まれているファイル、例えば『101経済』、『202経済』、『308経済』、『427経済』、『599経済』、『689経済』、『725経済』等が入っています。
 
7)『項目』ホルダー内の例えば『科学』のホルダー内に、各国の国名が含まれているファイル、例えば『日本_科学ニュース』、『アメリカ_科学ニュース』、『イギリス_科学ニュース』、『スペイン_科学ニュース』、『ロシア_科学ニュース』、『ベルギー_科学ニュース』、『フランス_科学ニュース』等が入っています。
 
8)これらのファイルを『101経済』であれば、101は日本にあたるので年月ホルダー『2022年10月』の中の『101_日本』のホルダー内の『@経済・法律・政治』に入れて、ファイル名『日本_科学ニュース』であれば日本とあるので『101_日本』のホルダー内の『A科学』に入れたいです。
 
9)『項目』ホルダーの中の他のホルダー『法律』、『工業』、『政治』、『言語』等のホルダー内のファイルも同様に年月ホルダー『2022年10月』の中の各国名のホルダー(例えば『101_日本』)内に『@経済・法律・政治』、『A科学』、『B言語』、『工業』等のホルダーに振り分けたいです。
 
10)上記のファイルは”コピー”をして指定ホルダーへ格納したいです。
 
11)ファイルの国名は『言語教育_フランス・ベルギー』と2〜3か国が纏まっていたり、『言語教育_中・日』(中国・日本)等、省略化されている場合もあります。
 
現在、これらのファイルを手作業で各ホルダーへ振り分けています。
各々のファイルを所定ホルダーへコピー・格納するマクロを組み、時間短縮をしたいです…。
 
下記は、ExcelシートのA列にファイル名(例えば、『日本_科学ニュース』、『101経済』等々…を記載し、各国のホルダー(『101_日本』)へ格納するコードです(コピーをし格納がしたいです…)。更に『@経済・法律・政治』、『A科学』、『B言語』、『工業』等のホルダーに振り分けたいことや、10か国分の作業が必要なため、もう少し手間のかからないコードをお教え頂けると有難いです…。
 
 
Option Explicit
 
Sub test()
 
    Const folderA = "F:\2022年10月"
    Const folderB = "F:\2022年10月\101_日本"
 
    Dim i As Long
    Dim fileName As String
 
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
 
    Dim ws As Worksheet
    Set ws = ActiveSheet
 
    Dim lastRow As Long
    lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
 
    For i = 1 To lastRow
        If ws.Cells(i, 1).Value <> "" Then
            fileName = ws.Cells(i, 1).Value & ".xlsx"
            If fso.FileExists(folderA & "\" & fileName) = True Then
                fso.moveFile folderA & "\" & fileName, folderB & "\" & fileName
            End If
        End If
    Next
    Set fso = Nothing
 
End Sub
 
です。
 
分かりづらく、大変申し訳ございません…。
ご回答を楽しみにお待ちしております。
どうぞ宜しくお願い申し上げます。
(質問をしながら大変恐縮ですが、仕事のため、お返事が遅くなってしまう場合があります。申し訳ございません…)
 
 

回答
投稿日時: 22/11/20 00:13:29
投稿者: simple

(1)
例外ケースもあるようですから、
まずは下記のような変換表をワークシート上で作るのがよいのでは?
それをもとにファイルコピーしてはどうですか?
 

     A         B                   C                   D
1                                  国フォルダ名        ジャンル
2    経済      101経済             101_日本            @経済・法律・政治
3    経済      202経済             202_米国            @経済・法律・政治
4    経済      ・・・              ・・・              @経済・法律・政治
5    経済      ・・・              ・・・              @経済・法律・政治
6    科学      日本_科学ニュース   101_日本            A科学
7    科学      米国_科学ニュース   202_米国            A科学
8    科学      ・・・              ・・・              A科学
9    科学      ・・・              ・・・              A科学

 
(2)
C列を作るには、B列の文字列に国コードや国名が含まれているかどうかで決められるのでは?
以下のような対応表を作っておいて、
A    B          C
101  日本       101_日本
202  アメリカ   202_米国
・・ ・・・     ・・・

・LOOPでA列の文字が含まれていたら、C列の国フォルダ名に変換します。
・同様にB列の文字が含まれていたら、C列の国フォルダ名に変換します。
 
(3)D列は手作業でやっても大したことがないでしょう。まとめてコピーペイストするだけです。
 
ご自身でコードにトライすることをお薦めします。

投稿日時: 22/11/20 00:44:59
投稿者: y_0770

simple様
 
大変お世話になっております。
早速のご連絡を下さいまして、本当に有難うございます。
 
(1)
>まずは下記のような変換表をワークシート上で作るのがよいのでは?
>それをもとにファイルコピーしてはどうですか?
 
 有難うございます…! 作ってみます!
 
(2)
>C列を作るには、B列の文字列に国コードや国名が含まれているかどうかで決められるのでは?
>以下のような対応表を作っておいて、
>A B C
>101 日本 101_日本
>202 アメリカ 202_米国
>・・ ・・・ ・・・
>・LOOPでA列の文字が含まれていたら、C列の国フォルダ名に変換します。
>・同様にB列の文字が含まれていたら、C列の国フォルダ名に変換します。
 
 承知致しました。有難うございます!
 
(3)
>D列は手作業でやっても大したことがないでしょう。まとめてコピーペイストするだけです。
 
 有難うございます! こちらもさせて頂きます…!
 
(1)から(3)の作業で、とても分かり易くなります…!
ただ私がコードが組めるかが、問題です……。
いつもアドバイスを下さいまして、感謝しております!
引き続き、どうぞ宜しくお願い申し上げます!

トピックに返信