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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

2回答

1279閲覧

Accessデータ連携のVBAによるファイル名変更

jabe

総合スコア43

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2023/04/24 08:01

編集2023/04/24 08:05

実現したいこと

・VBAで子フォルダ内pdfファイル名を格納先親フォルダ名をキーにして、Accessクエリから情報取得しファイル名を変更するツールを作成したいです。

●処理イメージ図
イメージ説明
●処理前
イメージ説明

●処理後
イメージ説明

●フォルダ構成
イメージ説明
●ツール一覧フォルダ構成
イメージ説明

前提

<Accessとの連携>
共通キー:親フォルダ名=社外購買番号
共通キー(社外購買番号)からファイル名変更の情報を取得し、pdfファイル名を変更
イメージ説明

<条件>
※処理イメージ図参照
パターン1
①sample1.pdf⇒②202301-00010_A0001_株式会社山田.pdf⇒③202301-00010_A0001_株式会社山田_00.pdf
①sample1-1.pdf⇒②202301-00010_A0001_株式会社山田.pdf⇒③202301-00010_A0001_株式会社山田_01.pdf
詳細
①⇒②:Accessクエリ
②⇒③:ファイル名語尾をファイル数分カウント表示

パターン2
①202302-00010_B0001_株式会社田中_00.pdf
①sample2.pdf⇒②202302-00010_B0001_株式会社田中.pdf⇒③202302-00010_B0001_株式会社田中_01.pdf
詳細
パターン1の条件に追加して、ファイル名に親フォルダ名(例.B0001)が無いファイルの場合、①⇒②⇒③:Accessクエリ、ファイル名語尾をファイル数分カウント表示

パター3
①sample3.pdf⇒②C0001_株式会社小川.pdf⇒③C0001_株式会社小川_00.pdf

共通
パターンにある通り、ファイル名の語尾をファイル数に応じてカウント名にしたい。
例.2ファイルの場合、_00.pdf、_01.pdf

発生している問題・エラーメッセージ

1.Accessのクエリから取得した情報とフォルダ名を照合し、ファイル名変更のやり方が全く分かりませんでした。
2.1の後から、条件にそって、ファイル名を変更する方法が全く分かりませんでした。

該当のソースコード

VBA

1Sub ファイル名変更() 2Const TargetFld As String = "C:\Users\○○○\Desktop\一時\テスト環境" 'フォルダ作成上位場所 3Dim objFso As Object 4Set objFso = CreateObject("Scripting.FileSystemObject") 5 6Dim objfld As Object 7Dim strFolderPath As String 8 9For Each objfld In Object.GetFolder(Target.Path & "\完了").SubFolders 10 11 12 13 14Next 15 16 17Call Access情報取得 18 19 20 21End Sub 22 23Sub Access情報取得() 24 25 Dim DBpath As String 'Accessファイルのフルパス 26 Dim adoCn As Object 'Accessへの接続用オブジェクト 27 Dim adoRs As Object 'Accessからの取得用オブジェクト 28 Dim strSQL As String 'SQL文 29 Dim myArray As Variant '全レコードを格納する配列 30 Dim tmpFldCnt As Variant 'フィール数 31 Dim tmpRcdCnt As Variant 'レコード数 32 33 'Accessへ接続する 34 Set adoCn = CreateObject("ADODB.Connection") '接続用オブジェクト作成 35 DBpath = "C:\Users\z09071\Desktop\一時\Access情報からファイル名変更" & "\Database.accdb" '接続するファイルのフルパス 36 adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBpath & ";" 'Accessファイル(2007~)を開く 37 38 'オブジェクトの設定(取得用) 39 Set adoRs = CreateObject("ADODB.Recordset") 40 adoRs.CursorLocation = 3 ' クライアントサイドカーソルに変更 41 42 'SQL文(全レコード取得) 43 strSQL = "SELECT 社外購買番号,ファイル名変更 FROM Q_STEP1" 44 45 'SQL文の実行(読込の場合) 46 adoRs.Open strSQL, adoCn 'SQLを実行して取得したデータをadoRsへ格納する 47 48 tmpFldCnt = adoRs.Fields.Count 'フィールド数を取得 49 tmpRcdCnt = adoRs.RecordCount 'レコード数を取得 50 51 'レコード数がゼロじゃない場合 52 If tmpRcdCnt > 0 Then 53 54 '全レコードを配列に格納 55 myArray = adoRs.GetRows 56 57 End If 58 59 '後処理 60 adoCn.Close 'Accessへの接続解除 61 Set adoRs = Nothing '取得用オブジェクトの解放 62 Set adoCn = Nothing '接続用オブジェクトの解放 63 64End Sub 65

試したこと

・Accessのクエリ情報をを変数に入れる事は出来たのですが、各ファイルに対してのファイル名変更ができませんでした。
・コードも中途半端になっていますが、ご協力よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

logres_Fan

2023/04/25 14:13

 パターン2「Sample2.pdfの社内購買番号が202302-00010」。これはユーザ自身で確認して打ち込むという事でしょうか?違う社内購買番号やパターン3に該当する場合も想定出来ますが、どう配慮するのかな。  2023年のPDFを一覧したいときはどうするの?全フォルダを検索するの?年別フォルダを追加するの?パターン3は、年月情報がないけど。要望が出たら、その場その場でコードを改修するのかな。
jabe

2023/04/26 00:25

返信ありがとうございます。 ●パターン2について、自動転記を考えています。 B0001フォルダへ格納されている為、B0001をキーにしてAccessクエリのファイル名変更項目にてファイル名変更と考えています。 パターン3につても、2同様でAccessクエリからファイル名変更になります。 ●年度別でのPDF一覧は機能は考えていないです。 エクスプローラ内で変更された名称で検索する運用になります。
logres_Fan

2023/04/26 04:40

返信ありがとうございます。 ●パターン2について、自動転記を考えています。 Sample2.pdfの場合、Q-STEP1を開いて、ユーザ自身に社内購買番号を打ち込んでもらうことになるという認識で合っていますか?B0001フォルダへ格納されている場合、社内購買番号=202302-00010と自動的にに決まってしまうわけではないですよね。 ●年度別でのPDF一覧は機能は考えていないです。 了解しました。
jabe

2023/04/26 07:47

返信ありがとうございます。 ●パターン2について、自動的に決まると考えていました。 以下イメージでいました。 B00001フォルダ⇒社外購買番号B0001⇒ファイル名変更⇒202302-00010_B0001_株式会社田中
logres_Fan

2023/04/26 08:03

返信ありがとうございます。 了解しました。そうすると、202302-00020_B0001_株式会社田中、202303-00010_B0001_株式会社田中、202402-00010_B0001_株式会社田中のようなファイルは存在しない、もしくは、B0002、D0001のような別のフォルダに格納される、という事で合っていますか?
jabe

2023/04/26 08:42

返信ありがとうございます。 はい、1つの社外購買番号に対して1つのファイル名変更のみ存在する条件になります。 画像では、C0001までですが、データは、D0001..等増えていく形になります。 桁数はすべて同じになります。
logres_Fan

2023/04/26 14:57

返信ありがとうございます。 理解しました。では、以下のようなイメージも成り立つのかな。 B00001フォルダ⇒社外購買番号B0001⇒子フォルダ名変更:202302-00010_B0001_株式会社田中⇒ファイル名変更⇒00.pdf、01.pdf、・・・ と思いましたが、次の質問に進まれたようですね、頑張って下さい。 では、退出します。
jabe

2023/04/27 02:08

返信ありがとうございます。 成り立ちます。 この質問で編集してしまうと、分かりづらくなると考え、次の質問へ移動しました。 やりたい事の内容は変わっていません。 変更点は、Accessをなくし、Excelから情報と取得という形になった点になります。 https://teratail.com/questions/tvfemn1qp824e2
guest

回答2

0

手を広げ過ぎです。課題を1つずつ消化していくしかないのではないでしょうか。
Accessに手を出してその現状では、心がボキッと折れてサラサラになるくらい駄目出しされるでしょうね。
追記:
ググったらヒットしたので

AccessVBA

1Name “C:¥..ディレクトリ(略)¥旧ファイル.拡張子“ As “ C:¥..ディレクトリ(略)¥新ファイル.拡張子”

T‘sWare#304 VBAによるディスク操作(移動とリネーム)
https://tsware.jp/tips/tips_304.htm

AccessVBA

1Dim File As Object 2For Each File In CreateObject(“Scripting.FileSystemObject”).GetFolder(“C:¥..(略)¥B0001¥完了¥“).Files 3Me.社外購買番号 = “B0001” 4Me.旧ファイルパス = .Path 5DoCmd.GoToRecord acDataForm, "新しいフォーム", acNewRec 6Next File

T‘sWare#100 FileSystemObjectでファイルの情報を列挙する方法
https://tsware.jp/tips/tips_100.htm

社外購買番号サプライヤー
A0001株式会社山田
B0001株式会社田中
C0001株式会社小川
社外購買番号旧ファイルパス社内購買番号語尾
B0001C:¥..(略)¥202302-00010_B0001_株式会社田中_00.pdf手動入力手動入力
B0001C:¥..(略)¥sample2.pdf手動入力手動入力

投稿2023/04/24 08:58

編集2023/04/25 13:49
logres_Fan

総合スコア169

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

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

jabe

2023/04/25 06:24

返信ありがとうございます。 私もそう思いながらも、一括ツールとして出来ないか思い相談させていただきました。 回答を待ちながらも、コード細分化としてAccessクエリとの連携部分は、別VBAで別Excelへの転記を実施してみます。
logres_Fan

2023/04/25 15:22

 転記せずにExcelに直に打てば、Accessクエリとの連携コスト削減になると思います。  ファイル管理のノウハウを参考に努力されているのはわかるけど、たぶん市販ソフト利用と同じところまで作るのは無理筋です。市販ソフトよりもむしろgitですし、いやいやそれももう古いかもしれないですよ。
jabe

2023/04/26 00:29

返信、提案ありがとうございます。 市販ソフトみたいな感じになってしまってるんですね😢 git初めて知りました。検索したらこういう管理もあるですね。 連携コストを下げるため、別VBAでAccessクエリをExcelデータに落とし込むのをトライしてみます。
guest

0

フォルダをクリックして簡単に名前を変更できます。 次に、新しいフォルダー名を入力します。その上、smash karts は、自由な時間に試すのに適した興味深いゲームです。 参加できます。

投稿2023/04/24 09:45

Amaru95749

総合スコア4

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問