Excel VBA 質問スレ Part75

■ このスレッドは過去ログ倉庫に格納されています
2022/02/09(水) 14:24:32.62ID:I0u44nFvd
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑2行に減ってるけど、同じ内容を3行に増やして貼り付けるナリ

ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ

※前スレ
Excel VBA 質問スレ Part74
https://mevius.5ch.net/test/read.cgi/tech/1639932059/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/02/10(木) 10:32:50.12ID:NHAjzQuTa
>>1
3デフォルトの名無しさん (ワッチョイ bfe6-AiWJ)
垢版 |
2022/02/10(木) 15:15:12.01ID:nfSYASk10
時々お世話になっています。

方針を確認したいです。
やりたい事は、特定のフォルダを指定して、その中にあるフォルダ・ファイルの中から最新の更新日を取得する
です。

今考えているやり方は、
@特定のフォルダを取得する(エクセル内にパスの指定あり)
Aサブフォルダを含むすべてのフォルダパスを取得
Bサブフォルダを含むすべてのファイルパスを取得
C取得したフォルダパスとファイルパスの最新更新日時を取得
Dその中から一番最新の日時を取得
です。

他に簡単な手順ってあるでしょうか?
ヒントでもいただけるとうれしいです。
よろしくお願いします。
2022/02/10(木) 15:37:12.23ID:x6E7pXvm0
powershellならこれだけなんだが

ls -recurse|sort-object -property LastWriteTime -Descending|select-object -First 1|%{$_.LastWriteTime}

VBAからpowershell呼び出せば?
2022/02/10(木) 15:44:08.91ID:M1zV1i+Cd
>>3
一般的だと思うけどフォルダ内の検索はそれ自身を一つの関数Aにしてその関数の中で関数Aを呼び出すと思う
関数は例えばこんな感じ Sub ProcA(ByVal pFolder As String, ByRef pDate as Date)
中はこんな感じどっちが先でも構わない
pFolder内のフォルダ一覧を取得してフォルダ分ProcAを呼ぶ
pFolder内のファイル一覧を取得して最新日時をpDateに戻す

なので手順は
@特定のフォルダを取得する(エクセル内にパスの指定あり)
AProcAを呼ぶ(これでサブフォルダ内も含めて全部検索してくれる)
BpDateが最新日時
2022/02/10(木) 15:50:58.22ID:M1zV1i+Cd
>>4
これだとフォルダの日時も対象になってしまわない?
7デフォルトの名無しさん (ワッチョイ bfe6-AiWJ)
垢版 |
2022/02/10(木) 16:04:20.32ID:nfSYASk10
>>4
ありがとうございます。

powershellだとそんなに短くなるんですね・・・

ただ私を含め、powershellに詳しい人が周りにいないのと、
私が死んでもメンテナンスできる状態にしておきたいので、今回はVBAで作成をしたいです。
(でもそのコードは保存させていただきます。)

勉強になります。ありがとうございます。
8デフォルトの名無しさん (ワッチョイ bfe6-AiWJ)
垢版 |
2022/02/10(木) 16:09:01.41ID:nfSYASk10
>>5
ありがとうございます。
処理時間が短くなって良さそうですね!
こちらの方向で考えてみます!

ありがとうございます!
9デフォルトの名無しさん (ワッチョイ bfe6-AiWJ)
垢版 |
2022/02/10(木) 16:10:41.24ID:nfSYASk10
>>6
今回はフォルダの更新日時も取得したかったので、
powershellが使えればこのコードが有効だったと思います。

私の勉強不足で残念ですが・・・
2022/02/10(木) 16:25:27.01ID:J5PrGMnU0
Ruby のglob では、** で、フォルダ以下を再帰的に処理する

# 絶対パスのディレクトリ名の後ろに、* を付けること!
# . で始まる、隠し directory, file を除く

glob_pattern = "C:/Users/Owner/Documents/test/**/*"

puts Dir.glob( glob_pattern )
.select { |full_path| File.file?( full_path ) } # ファイルのみ
.max_by { |full_path| File.mtime( full_path ) } # 更新時刻が最も最近のファイルパス
2022/02/10(木) 16:53:52.57ID:jnAzFgRy0
前スレで「VBA内で今まで使えてたKillが急に使えなくなった」野郎ですが、システムの復元で先月に戻したら直った。
たぶんOfficeの最新のアップデートがクソ。

VBA内で作って使い終わったADODBを削除する部分。
10年くらい使い続けてるし、connectionとかちゃんとcloseしてるのに。
2022/02/10(木) 18:14:16.34ID:lf0ILJru0
>>7
そもそもVBAで作る意味がわからんが
自分で作れもしないものを俺が死んでもメンテしろとか...


なにをやるかだけをドキュメントなりコメントなりで残せよ
あとの人はそれ見て自分でできるやり方でやればいいだけ
13デフォルトの名無しさん (ワッチョイ bfe6-AiWJ)
垢版 |
2022/02/10(木) 18:19:09.16ID:nfSYASk10
>>10
Rubyでもそんなに短くなるんですね。
もしかしてVBAが一番大変なんじゃないかと思えてきます。

すみません。Rubyは私が全く使えないため、今回は見送らせていただきます。
コードまで記載していただいたのに申し訳ないです。

ありがとうございました。
2022/02/10(木) 18:22:09.15ID:lf0ILJru0
ふと思ったが、ファイル列挙を再帰で処理するときになにも考えずに
うっかり上位フォルダへのショートカットとか処理したらループするのな

素のVBAでやるならDir関数だろうけど、これショートカットとかどう処理するんだろ
15デフォルトの名無しさん (ワッチョイ bfe6-AiWJ)
垢版 |
2022/02/10(木) 18:23:45.71ID:nfSYASk10
>>12
VBA(エクセル)であれば多少使える人が周りにいるため、メンテナンスが可能だと思いました。
自動化した処理はコード内のコメントでも残しますし、ドキュメントにも記載します。

>>自分で作れもしないものを俺が死んでもメンテしろとか...
 これは確かに・・・自分で作れていない以上ぐうの音も出ません。
2022/02/10(木) 18:27:43.99ID:Cq74F0AH0
こんな簡単な処理もできないのにVBAならできると言うか
2022/02/10(木) 18:56:39.50ID:M1zV1i+Cd
>>14
VBA内のコードだけならそうだろうけど今風だとFileSystemObject使うかもね
自分はフォルダ検索とか嫌って程使うツールを作ってるから検索用のライブラリずっと使いまわしてるわ

>>15
VBAなんて所詮俺ツールぐらいの気持ちで考えて自分が死んだら使わないでねぐらいでいいと思うけどね
2022/02/10(木) 19:15:17.51ID:tWYuVSEa0
>>3
Power Query で親のフォルダ指定すると、サブフォルダも含めた
ファイル名、拡張子、アクセス日時、更新日時、作成日時、パス
の一覧を作ってくれる。

作成日時か更新日時で降順して1から始まるインデックス付けて、
BinaryとかRecordの余計な列は削除して、クエリーテーブルとしてsheetに読込ませたら、
あとは外のセルからINDEX・MATCH関数で
「インデックスの列が1」の行のパス&"\"&ファイル名を表示させる。

VBAはこのbookを開いたときにクエリー更新させるとか、
ボタンでクエリー更新させるとか。

Power Query内にセルに指定したフォルダパスを取り込むときは
そのセルを名前定義しておいて、

let
 定義名 = Excel.CurrentWorkbook(){[Name="定義名"]}[Content]{0}[Column1],
 ソース = Folder.Files(定義名)
in
 ソース

これが元ネタ
https://stackoverflow.com/questions/49281763/powerquery-use-a-cell-values-in-a-url
2022/02/10(木) 19:24:51.89ID:hZgX7eKD0
>>15
たとえばエクスプローラー開いて
フォルダ指定してから右上の枠に 更新日時:>2022/1/1
って入力すると2022/1/1 以降のファイル一覧とか見れるよ
2022/02/11(金) 13:48:46.29ID:901NTZe+0
処理が複雑になるにつれて、より本格的なプログラミング言語に変えていかないといけない。
これを適材適所・目的別最適化と言う

小中高大学みたいなもの。
VBAが小学生の宿題なら、Rubyは大学生の宿題

VBA > PowerShell, Bash > Ruby

これが分からない会社は、すべてのシステムをVBAで作って、
色々なモジュールを共通化して、
会社の資産にしてみたいに発展させていって、最後には破綻する

維持・保守コストが膨大になって、おまけに低品質で、誰も修正できなくなる

システムみたいなものは修正・保守必須で本格的なものだから、
Rubyみたいなプロ用の言語じゃないとダメ

ちょっとした秀丸マクロとか、そういうのはダメ。
適材適所・目的別最適化みたいな事を分かっていない会社が多すぎる
2022/02/11(金) 13:55:56.83ID:ZK+oZ0Mxd
不等号が逆な時点で説得力ゼロ
矢印のつもりなら、さらに頭が悪いとしか思わん
2022/02/11(金) 13:58:55.07ID:z1hZYaqu0
www
23デフォルトの名無しさん (ワッチョイ bfda-HF6V)
垢版 |
2022/02/11(金) 14:17:29.48ID:LtQN2K+P0
だってルビキチだもん
2022/02/11(金) 14:33:23.73ID:uXHB2mBC0
無意味な喩えする奴頭悪いから嫌いなんだよね
2022/02/11(金) 14:47:23.80ID:4kl07p+n0
>>21
ほんとに逆なのお?
2022/02/11(金) 14:48:15.45ID:AGDJERK+d
そもそも自社開発するようなスキルを持ち合わせてるならそんな三択じゃない他のを選ぶだろうにw
RubyRuby言ってる人はそれしかできないのかね?w
2022/02/11(金) 15:17:29.69ID:dkQ+i8pZM
VBAもRubyもPwerShellもVSCodeも、片手間のちょっとしたツールを作るには便利だけど、がっつりアプリの開発には使えんわ
みんな同レベル
あとは適切に使い分けできるかという、使用者の頭脳レベルの問題
28デフォルトの名無しさん (スッップ Sdbf-HF6V)
垢版 |
2022/02/11(金) 15:23:45.94ID:+e4i5uLyd
なんでVSCode出てきた
2022/02/11(金) 15:53:04.17ID:EfY4NLKC0
まだRubyキチガイ居るのか…
何年他の言語スレに粘着してるんだ
2022/02/11(金) 16:07:37.46ID:1hOwJ8um0
お前らみたいに相手する奴居るからだろ…
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況