プロが教える店舗&オフィスのセキュリティ対策術

あるソフトからwaveって名前の画像が連番で作成されるのですが、その作成されたwaveの並びが画像の様になっているため、VBAでファイル名を抽出した結果が画像の状態です。
そのため、出力されたテキストデータから、一致したwave番号の名前変更が困難な状態なので、お助け願います。

■画像の詳細■
上側VBAで抽出したファイル名
下側テキストファイルないの情報
写真が切れてるため分かりにくいですが、写真に写ってるwave2はグループの最後です。(3行でで1つの情報を持ってます)

■やりたい事■
1.VBAで抽出したファイル名を用いて、テキストファイル内の文字列から検索を行う。
※テキストファイルが出力される場所は同じで、出力されるデータの中身の順番は下側の画像と同じ
2.上側で抽出したデータの.pngを対象に入れずwave1やwave10等を検索する文字列にし、テキストファイル内3行目から検索し1行目内のM16ケミカルから1行目の最後まで取り出し、A列と同じ名前の横のB列へ代入。
3.代入後、拡張子.pngを付けフォルダ内をリネーム

■問題点■
テキストファイル内を検索する時.pngが付いているため、テキストファイル内の3行目にあるwave番号と一致確認ができない。

仮に一致確認が出来ても、リネームしたいデータが1行目のお尻の方であるため、文字列検索が困難。

といった問題を抱えているため、お助け願います(´。・д人)シクシク

「Microsoftの異常?リネームが出来」の質問画像

A 回答 (13件中1~10件)

No.12に追記。



画像を見てみると『M16ケミカル・・・』の前に日付(らしい数字の羅列)と"-" or "-" がありますけど、
これは『基礎ボルト・・・.txt』の時にも存在しているのでしょうか?

No.7で私が作ったテキストファイルは、あくまで不足している情報から取り敢えず作った物ですが、
1行目の文字列に規則性があるならそこを情報としてあげて頂かないと。
私と同じように余りに省略してしまえば判定の手段が決められませんしね。
    • good
    • 0

作成できる可能性がある条件としては、



>あああああM16ケミカル.txt
>かかかかか基礎ボルト・・・.txt

において
・ファイル名『M16ケミカル.txtや基礎ボルト・・・.txt』の前に半角スペースなど共通する文字(1種類はに限らない)がある。
・上記共通する文字はファイル名には含まれる事はない。

でしょうかね。
    • good
    • 0

No.10のお礼について。



>その情報は上記の作業実行時、同時に出力されるテキストファイル内に存在するので、そのファイルを開き、いらない情報を置換と区切り文字を使用しバラバラにしたあと、VLOOKUPで紐付けをしリネームしています。

この作業内容が不明な点であるので止まってしまいますよね。
・いらない情報とは何か
・区切り文字でバラバラにするとはどう言う事か
・『VLOOKUPで紐付け』これは抜き出す際の目印に関係があるのかないのか

と、やっぱり実際のテキストファイルを見てみないと難しいのでは?と感じますよ。
それも出力毎に判断基準が違っていてとかになると尚更ですし。
逆に言えば出力するソフト側のアップデート(もうちょい作業しやすくなるよう)を求めるか。

>waveのファイル名は、こちらで作成したマクロを実行すると、順番にファイル名をwave1、wave2etc、且つ拡張子は.pngを付けてフォルダに出力されるよう作ってます。

ここも気にはなりますよね。
今回の件とは繋がらないのかもですけど、そもそもマクロを実行する前は何を基準にファイルには名前がついているのか?
そのファイル名がテキストファイルから除外できる文字列として書かれているのか否か。

計測機器などの出力って事であれば、メーカーの技術者と話をしてみるのが早いのではないのかな?
    • good
    • 0

No.8に追記。



>M16ケミカル.txt
>基礎ボルト・・・.txt

これらのテキストファイル名は、吐き出された.pngに対になって吐き出されるテキストファイル名という事はないのでしょうか?
仮にそうだとするとそのファイル名をリスト化し、画像のテキストファイルを1行読み込んではリストと照合して合致したら『wave?』を
取得するように出来る『かも』ですね。

もしテキストファイルとして吐き出されないのならお手上げかもしれませんが、そちらで『何故リネームの名前を判断できるのか?』と
考えてみると、
・出力する際にファイル名の一部をソフトに入力している
・上記のように『対になったファイル』が存在している
辺りかと思いまして。
    • good
    • 0
この回答へのお礼

waveのファイル名は、こちらで作成したマクロを実行すると、順番にファイル名をwave1、wave2etc、且つ拡張子は.pngを付けてフォルダに出力されるよう作ってます。

次に必要となる作業が、現在フォルダ内はwaveと言った名前なので、それをリネームしてあげないといけないのでが、リネームするにはwave1とはなんの名前をwave1に置き換えたのか特定しないといけないので、その情報は上記の作業実行時、同時に出力されるテキストファイル内に存在するので、そのファイルを開き、いらない情報を置換と区切り文字を使用しバラバラにしたあと、VLOOKUPで紐付けをしリネームしています。
まずこの作業が手動で行っている作業になります。

上記の作業を自動化させるのが今回の問題点です。。。

お礼日時:2018/01/12 18:22

と言うよりも、実際にリネームしようと作業される方は『どうやって新しいファイル名』と識別しているのですかね?

    • good
    • 0

No.7のお礼に対して。



まるで『え?』と言う感じです。
画像と合わせてみてコード化してみたのに、根本から違ってた訳ですよね。
しかもリネームするのに『拡張子』がついていて、『.png』のままでいくのか『.txt』に変更するのかもファイル管理から見ても疑問視です。

それに
>あああああM16ケミカル.txt
>かかかかか基礎ボルト・・・.txt
これですと『取り出したい明確な基準』がありません。
Excelは『人が目で見て判断する』事を自身ではやってくれませんよ。
取り出したい文字列とそうでない文字列の区切りが『ある基準で区分けできる』と言うのでなければ、
どうしようもないですね。

基準とは
・『wave?』のように":"など『ある文字』で分けられる
・頭文字から何文字は必要のないものである。
とかですかね。
面倒な方法になれば『どんな言葉から始まれば良いか』のリストを作成し、1行に対して該当するか否かを何度もループで比較すると言う
かなりの手間もあり得るかも。

他の基準を作成するには『実際のテキストファイル』を見てみないと検討も困難と思います。
上司等と相談の上、外注委託を考えた方が宜しいのでは?
守秘義務などもあるでしょうし、仮に『それほどの物ではない』にしても公の場で出せるものでもないでしょう。
    • good
    • 0

現在までの認識の確認・検証結果を連絡します。



・Dドライブにtestと言うフォルダを作成しsample.txtと言うテキストファイルを作成
・テキストファイルの中身は、

ああああああM16ケミカル・・・あなたのNo.は1です
ここはダミーです。
ああああああ:wave1
かかかかかかかM16ケミカル・・・あなたのNo.は2かな?
ここもダミーです。
かかかかか:wave2
さささささM16ケミカル・・・あなたのNo.は3かも?
こここそダミーです。
ささささささささ:wave3

です。
・新規Bookを用意しSheet1のA列に
wave1.png
wave2.png
wave3.png
と打ち込みました。
・B列に『M16ケミカル・・・』を書き出すコード

Sub try()
Dim FSO As Object, myReg As Object, myDic As Object
Dim r As Range, key As String, v As Variant, ReadData As String
Dim PathName As String, OldName As String, NewName As String

Set FSO = CreateObject("Scripting.FileSystemObject")
Set myReg = CreateObject("VBscript.RegExp")
Set myDic = CreateObject("Scripting.Dictionary")

myReg.Pattern = "^.+?(M16ケミカル.+)$"

PathName = "D:\test\" ' テキストファイル等のあるフォルダ

With FSO.OpenTextFile(PathName & "sample.txt")
While Not .AtEndOfStream

ReadData = .ReadLine
If myReg.Test(ReadData) Then ' M16ケミカル・・・ の判定でTrueなら
.SkipLine ' 1行飛ばす
v = Split(.ReadLine, ":") ' ":"(半角文字)で区切る
' Dictionaryに『wave?』をキーに『M16ケミカル・・・』を値として入れる
myDic.Add v(1), myReg.Execute(ReadData)(0).SubMatches(0)
End If
Wend
.Close
End With

With Worksheets("Sheet1")

For Each r In .Range("A1", .Cells(Rows.Count, 1).End(xlUp))
key = Replace(r.Value, ".png", "")
r.Offset(, 1).Value = myDic(key)
Next

End With

Set myDic = Nothing
Set myReg = Nothing
Set FSO = Nothing
End Sub

を実行し結果は以下のように。

リネームについてはまだですけど。
「Microsoftの異常?リネームが出来」の回答画像7
    • good
    • 0
この回答へのお礼

返信が遅くなりました。。。
やりたいことは近いですが、A列のセルに入る値は何とか取ることが出来ましたが、B列に入る値がどうしても取れないですね。

テキストファイルの詳細な中身は、
あああああM16ケミカル.txt
あああああFFT_1002_20170329-M1
あああああ ウェーブ:wave1

かかかかか基礎ボルト・・・.txt
かかかかかFFT_1002_20170329-M1
かかかかか ウェーブ:wave106

と言ったように欲しい情報は固定ではないのです

お礼日時:2018/01/12 12:42

ちょっと気になったので。



『あるソフトから吐き出された画像ファイル名を取り敢えずExcelシートのA列に書き出した。』
とするのなら、そもそも同時に吐き出されるテキストファイルを元に名前の変更が出来るのなら、
B列への書き出しは必要なのかな?

リスト作成って事でやってるのなら必要なんでしょうけど、順番がわかりにくい感じはしますね。
その時は別の列(C列?)にA列の値を置換により数字部分を数値にして書き込み、
その列を基準に昇順でA~C列を並び替えると言う手段もありますよ。

または

A列をコピーしてC列に書き出してC列を選択しツールバーの置換で
置換前:wave
置換後:(何も入力しない)

置換前:.png
置換後:(何も入力しない)

でも数値だけが残るかもですが。
    • good
    • 0

No.4の追記。



先にテキストファイルのデータをDictionaryオブジェクトに放り込むためのテキストの読み込みを全て終わらせてから、Excelのシートを使った処理に移行します。
    • good
    • 1
この回答へのお礼

明日、会社に到着したら一部分になりますが、詳細なテキストファイル内のデータを送ります。

仕事が終わったばかりで、もうテキストファイルのデータを見ることが出来ないのです(´。・д人)シクシク…

お礼日時:2018/01/10 18:58

【考えている手段】


1.テキストファイルを1行目から1行毎に読み込む。
2.読み込んだ行が『M16ケミカルから文末まで』が一致するPatternを持つ物か正規表現で判定する。
3.判定した結果Trueであれば『M16ケミカルから文末まで』を正規表現にて抜き出す。
4.1行読み込む(ダミー)
5.1行読み込み『wave?』を何とかして取り出す。⇒★ここが現在不明確な状況。
6.『wave?』をキーに『M16ケミカルから文末まで』を値としてDictionaryオブジェクトに放り込む。
7.シートのA列の値を順次取得しながら『.png』を削除した文字をキーとしてDictionaryのキーに存在するか確認し、存在していたら値をB列に書き込む。
8.Nameステートメントを用いA列の値をDictionaryの値 & ".png" で名前の変更を行う。⇒保存されているディレクトリは適当に書いてしまうけど。

こんな感じになるんじゃないかな?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!