- ベストアンサー
増え続ける書類に採番をしてくれるようなソフトウェア
こちらの項目では初めてです。宜しくお願いいたします。 いろいろと電子データが増えてきたのですが、整理が混乱して参りました。 そこで、 *動作させると特定ディレクトリの中のファイルに番号を振る *検索ツールとして、其の番号とファイルが一致し、削除された場合番号が被らず反映する。 ちょっと言い方が正しいか分からないのですが、何か美味い方法が在ればご教授ください。 WindowsXP/2000です。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#01~03です。もう問題が解決しているかも? と思いつつ再度の掲載をお許しください。 先日のEXCELマクロにタイムスタンプ、ファイルサイズ表示機能を追加しましたのでupします。自分でも使っていますが、最低限のファイル管理はできると思います。 もしサブディレクトリまで一括して表示したい場合は、VBAをいじってみてください。では。 Sub ファイル名管理() ' ファイル管理簡易ツール 2006.06.17 by zap35 Dim strFolder, buf As String, idxROW, idxI As Long Dim FSO, pswM Application.ScreenUpdating = False If Range("a1") = "" Then strFolder = InputBox("検索するフォルダ名を" & Chr$(13) & "フルパスで入力してください" _ & Chr$(13) & "例 c:\windows\system32\") If Right(strFolder, 1) <> "\" Then strFolder = strFolder & "\" End If Range("a1:e1") = Array(strFolder, "削除FLG", "ファイル名", "最終更新", "サイズ(Byte)") Else strFolder = Range("a1") End If 'ファイル一覧作成 idxROW = Range("a65536").End(xlUp).Row '最終行取得 buf = Dir(strFolder & "*") Do While buf <> "" pswM = 0 pswM = Application.Match(buf, ActiveSheet.Range("c:c"), 0) If IsError(pswM) Then 'ファイル名追加 idxROW = idxROW + 1 Cells(idxROW, 1) = idxROW - 1 Cells(idxROW, 2) = "" Cells(idxROW, 3) = buf Else Cells(idxROW, 2) = "" '削除フラグクリア End If buf = Dir() Loop '削除ファイル消し込み idxROW = Range("a65536").End(xlUp).Row Set FSO = CreateObject("Scripting.FileSystemObject") 'File情報取得準備 For idxI = 2 To idxROW buf = Dir(strFolder & Cells(idxI, 3)) If buf = "" Then '削除済み Cells(idxI, 2) = "削除" Cells(idxI, 4) = "" Cells(idxI, 5) = "" Else Cells(idxI, 2) = "" Cells(idxI, 4) = FSO.GetFile(strFolder & Cells(idxI, 3)).DateLastModified Cells(idxI, 5) = Format(FSO.GetFile(strFolder & Cells(idxI, 3)).Size, "#,###,###,###,##0") End If Next idxI Application.ScreenUpdating = True End Sub
その他の回答 (5)
- lawson
- ベストアンサー率44% (29/65)
No4で記載したやり方は、そのつど、ファイルの変化するたびに、管理情報を作成するやり方です。 図書館に例えるなら、受付で、本の貸し出し返却や、会員登録を行うたびに、 システム内の管理情報を逐次変更するやり方です。 このやり方の弱点は、既にある未管理状態のデータを管理する形に一括でもっていく手段がない。 都度更新する時に、なにかの原因で、漏れが発生すると、現実と管理情報で不整合がおきる。 逐次更新をとるかは、一括更新をとるかは、 トリガーの形態に関するお話です。 「いろいろと電子データが増えてきたのですが」とありますが、 既に、未管理の状態のデータがあるわけで、それらを管理済み状態にもっていくために、 一括更新のトリガーも用意すべきでしょう。 トリガーの形態がどうあろうが、 ひとつひとつのデータをあらわすオブジェクトが自身に 管理情報を登録・更新するためのロジックを持っていれば、 管理情報を登録・更新するためのロジックは再利用可能です。 なので、逐次更新をとるかは、一括更新をとるかに 関係なく、 1データオブジェクト単位で、正しく、管理情報の登録・更新が行われるように 作るのがよいかもしれない。 そして、 「既に、己自身が管理済みになっている場合に、最後に管理状態になったときから、 データの状態に変化がない場合はなにもしない」 などのチェックロジックをいれておくことで、 一括更新をした時に、同じデータについて、重複管理されることがなくなり、 いつでも、手軽に一括更新のトリガーを引いて、 不整合が起きてない状態を保障するアクションが手軽におこなえるでしょう。 一括更新のトリガーを引いたら、毎回、毎回、すべの管理情報の更新をする 仕様にしてもいいのであれば、特に必要ないですが、 その際、「データが最後に変更されたのがいつかで、検索したい」などの要求に 影響がでるかもしれません。 また、逐次更新の運用中に一括更新を行うユースケースに対応するために、 自身を管理状態にするロジックを走らす前に自身をロックしてから、処理を 行うようにすることで、不整合もなくなります。 このように、制御の鍵を握る部分を個々に分散するように考えると いいと思います。 各データオブジェクトの自身を管理状態にならしめる部分の開発とは、別に、 トリガー部分を用意する必要があります。 逐次更新も必要であると感じるならば、 No4を参考にすればよいとおもいます。 一括更新のトリガーとするなら、 コンソールアプリでコマンドを用意したり。 簡単なパラメータを入力できるダイアログをもったアプリを用意してもいい。 >*検索ツールとして、其の番号とファイルが一致し、削除された場合番号が被らず反映する データを整理する目的として、 1) 検索や、発見を容易にしたいから 2) データを削除したい時に、どのデータが古くて、いらないのかを判別したいから。 3) どのユーザがいつ、どのように作成した。 4) 最後に作成したユーザで検索したい。 5) 最後に変更したユーザで検索したい。 6) データの中にある情報によって、検索および、整理したい。 など、いろいろな目的があるとおもいます。 「いろいろと電子データが」とありますが、 どのような電子データを管理しているのかは、わかりませんが。 どのような目的で整理したいかがはっきりしないと、作りようがないのでは? 単に、ファイル名に連番をつけたい。削除時の歯抜けた番号を整理して、連番を 振りなおしたいだけなら、 http://www.woodensoldier.info/computer/CSharp.htm#66 ここのURLのやり方などを参考にして、ファイル名の一覧を リストに保管、片っ端からリネームしていくような一括バッチのプログラムを 組めばよいだけの話だとおもいます。 No4は、もちろん、これまで、いろいろ私が書いてきた記述は全部忘れてかまわないです。 そこまで、する必要もないからです。 上記(1)~(6)のようないろいろな管理情報があるのであれば、 電子データのファイル名を直接いじらずに、 ふぁいるのフルパスまたは、ドキュメントルートからの相対パスと、 各種管理情報との対応づけの関係について、データベース設計をしてみて、 No4で説明した ########################################################################### 管理したいデータが複雑であれば、 Access MDBファイル、または、 フリーのDBサーバをたてて、先ほどの 「データの種類を抽象化したオブジェクトの振る舞い」から、DB層のモジュールを使用する形を とればよいとおもいます。 ########################################################################### のようなことをすればよいでしょう。 なので、プログラムを実際に組む以前に、何をしたいかがはっきりしないと、 方向性や難易度がまったくよめません。 ところが、不思議なことに、 トリガー部分のフレームワークとか、 データオブジェクトの更新部分の抽象概念などは、 管理情報の詳細には、関係なく、独立的に再利用可能な概念だと思います。 そのあたりがおもしろいですね。 以上です。
- lawson
- ベストアンサー率44% (29/65)
>*動作させると特定ディレクトリの中のファイルに番号を振る >*検索ツールとして、其の番号とファイルが一致し、削除された場合番号が被らず反映する。 この機能を持つソフトウェアを探しているのでしょうか? それとも、この機能をプログラミングする方法を 知りたいのでしょうか? プログラミング方法であれば、すぐ思いつく方法として、.NETアプリケーションですが・・・。 FileSystemWatcherというコンポーネントがあります。 http://dobon.net/vb/dotnet/file/filesystemwatcher.html 特定のディレクトリを監視して、そこにファイルが作られたり、ファイルの内容が変更されたり、削除されたり、したイベントを発生してくれるオブジェクトです。 常駐のWindowsサービスがこのFileSystemWatcher を生成して、初期化処理等を行い、 常駐サービス自体は、CPUを使用しない サスペンドロックで、そのまま休止してしまえば よいと思います。 私がもしやるとしたら、以下のようにすると思います。 扱いたいデータの種類ごとに、クラス設計を効率よくして、データに対する処理は、そのデータの種類を抽象化したオブジェクトの振る舞いとするような方向性で、実装していき。 それらのオブジェクトの振る舞いを FileSystemWatcher クラスのイベント変数にデリゲート登録するような 実装をすれば良いと思います。 管理したいデータが複雑であれば、 Access MDBファイル、または、 フリーのDBサーバをたてて、先ほどの 「データの種類を抽象化したオブジェクトの振る舞い」から、DB層のモジュールを使用する形を とればよいとおもいます。 ただし、上記URLのサイトでも書いてますが、 FileSystemWatcherクラスはWindows NT系のOSでしか使えません。 FileSystemWatcherは、監視しているディレクトリについて再帰的に下の階層も監視するかどうかを現すBoolean型のプロパティがあった記憶があります。 以上です。
補足
まとめてコメントさせていただくという事で。やはり組んでみるとか言うのが早そうですか。 環境はWindowsXPですのでまずはやってみます。ただ、正直プログラム関係では素人+実際使えないと意味が無いので、じりじり行ってみます。
- zap35
- ベストアンサー率44% (1383/3079)
#01です。もう一箇所不具合がありましたので再掲いたします。WinXP+EXCEL2003では動作確認済みですがMacでは確認していません Option Explicit Sub ファイル名管理() Dim strFolder, buf As String, idxROW, idxI As Long Dim idxM Application.ScreenUpdating = False If Range("a1") = "" Then strFolder = InputBox("検索するフォルダ名を" & Chr$(13) & "フルパスで入力してください" _ & Chr$(13) & "例 c:\windows\system32\") If Right(strFolder, 1) <> "\" Then strFolder = strFolder & "\" End If Range("a1") = strFolder Else strFolder = Range("a1") End If idxROW = Range("a65536").End(xlUp).Row '最終行 'ファイル一覧作成 buf = Dir(strFolder & "*") Do While buf <> "" idxM = 0 idxM = Application.Match(buf, ActiveSheet.Range("c:c"), 0) If IsError(idxM) Then 'ファイル名追加 idxROW = idxROW + 1 Cells(idxROW, 1) = idxROW - 1 Cells(idxROW, 2) = "" Cells(idxROW, 3) = buf Else Cells(idxROW, 2) = "" '削除フラグクリア End If buf = Dir() Loop '削除ファイル消し込み idxROW = Range("a65536").End(xlUp).Row For idxI = 2 To idxROW buf = Dir(strFolder & Cells(idxI, 3)) If buf = "" Then '削除済み Cells(idxI, 2) = "削除" Else Cells(idxI, 2) = "" End If Next idxI Application.ScreenUpdating = True End Sub
- zap35
- ベストアンサー率44% (1383/3079)
#01です。最終行-1は Application.ScreenUpdating = True の誤りでした
- zap35
- ベストアンサー率44% (1383/3079)
EXCELのこんなお手軽マクロはいかがですか 以下のVBAを標準モジュールシートにペースとして実行してみて下さい a1にフォルダ名を書き込みますから、最初はまっさらなシートで実行してください Option Explicit Sub ファイル名管理() Dim strFolder, buf As String, idxROW, idxI As Long Dim idxM Application.ScreenUpdating = False If Range("a1") = "" Then strFolder = InputBox("検索するフォルダ名を" & Chr$(13) & "フルパスで入力してください" _ & Chr$(13) & "例 c:\windows\system32\") If Right(strFolder, 1) = "\" Then Range("a1") = strFolder Else Range("a1") = strFolder & "\" End If Else strFolder = Range("a1") End If idxROW = Range("a65536").End(xlUp).Row '最終行 'ファイル一覧作成 buf = Dir(strFolder & "*") Do While buf <> "" idxM = 0 idxM = Application.Match(buf, ActiveSheet.Range("c:c"), 0) If IsError(idxM) Then 'ファイル名追加 idxROW = idxROW + 1 Cells(idxROW, 1) = idxROW - 1 Cells(idxROW, 2) = "" Cells(idxROW, 3) = buf Else Cells(idxROW, 2) = "" '削除フラグクリア End If buf = Dir() Loop '削除ファイル消し込み idxROW = Range("a65536").End(xlUp).Row For idxI = 2 To idxROW buf = Dir(strFolder & Cells(idxI, 3)) If buf = "" Then '削除済み Cells(idxI, 2) = "削除" Else Cells(idxI, 2) = "" End If Next idxI Application.ScreenUpdating = False End Sub
お礼
遅れましたが有り難うございます。 じりじり使ってみたいと思います。 ただ、マクロの有無を聞かれると、間違って採番用書類を開いた上司が首を捻りそうです(笑)