- ベストアンサー
Mp3と一致するflacの行をFINDして表示
- Sheet1,2に音楽ファイルを複数抜き出しています。
- 同じ2列目でDEF.flacとGHJ.mp3のファイル名は同名ではないが、Ws2.C2と同じファイル名を持つファイル名がW1のC列のどこかに存在する。これをsheet7に検索して抜き出す。
- sheet7(flac分割)の構造は、A2: W2のC列
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> ws4は、自分自身であるFlac検索のシートマクロでは必要ないのですが > 他のシートと間違えないようにあえて記載していますが > 問題が有るでしょうか? コード内にws4指定のセルとかないので、記載してコメントにしておけばいいのではないでしょうか。 また、ws4指定でセルを指定するとコードを見ただけではWorksheet_Changeのシートのセルなのかどうか不明になります。 > Set r = ws1.Cells.Find(FileNameOnly) シート全体を検索してますが sheet1(Everthing)の構成 ---> set w1= sheetes("Everthing") A列:FullPass w1.A2: K:\ABC\DEF.flac B列:Passのみ w1.B2: K:\ABC\ C列:ファイル名(*****.flac) w1.C2: DEF.flac なのでしたら、C列だけでいいのではないでしょうか。 シート全体だとDEFを探したときにDEF.flacの行より先に K:\ABCDEF\DDD.flac があるとDDD.flacの行がヒットすると思います。 それと 拡張子の「.flac」を付けて完全一致にしたほうがいいのではないでしょうか 「ABCDEF.flac」と「DEF.flac」があった場合 「DEF」で検索したら、先に「ABCDEF.flac」があればそちらがヒットします。 Find(FileNameOnly & ".flac",LookIn:=xlValues, LookAt:=xlWhole) また、引数は指定しておいた方がいいみたいです。 参照: 第98回.Findメソッド(Find,FindNext,FindPrevious) https://excel-ubara.com/excelvba1/EXCELVBA398.html 引数が保存される注意点の部分 前回、動作が遅いの時に Application.ScreenUpdating = False の追加を提案しましたが、現状は存在しないみたいですので Application.ScreenUpdating = True は不要です。
その他の回答 (5)
- kkkkkm
- ベストアンサー率66% (1742/2617)
> 以下の1),2)のws4が同じでなくても問題ないですよね ? 参照するD1があるシートを指定しないと駄目です。 Worksheets("横_縦")のD1を変更して Worksheets("Flac検索") を参照してるのでしたら駄目です。
お礼
kkkkkmさん、アドバイスありがとうございます。 旧マクロと今回のマクロが混在する状態だったの 旧マクロの縦_横シートも削除してFlac検索シートのみにしました。 そして、最初を表示()マクロなどの参照先をFlac検索に書き換え(統一)ました。 (その他、見直しのため改変したコードが数か所発生。) 旨く矢印マクロも作動するようになりました。 以下flac検索シートのマクロですが、変更箇所あればお願いします。 Set ws4 = Worksheets("Flac検索") など ws4は、自分自身であるFlac検索のシートマクロでは必要ないのですが 他のシートと間違えないようにあえて記載していますが 問題が有るでしょうか? Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> Range("D1").Address Then Exit Sub End If If Range("D1").Value < F_ROW Or _ Range("D1").Value > Range("E1").Value Then MsgBox "パスを表示する行番号が範囲外です。" Application.EnableEvents = False Application.Undo '入力したものを取り消します。 Application.EnableEvents = True Exit Sub End If '↓イベントの発生を停止します。 Application.EnableEvents = False '並び替え実行のコード Dim r As Range, FindRow As Integer Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet, ws4 As Worksheet Dim FileNameOnly As String Dim i As Long Dim tmp As Variant Set ws1 = Worksheets("Everything") Set ws2 = Worksheets("Mp3") Set ws3 = Worksheets("Convert") Set ws4 = Worksheets("Flac検索") '横/縦並び替え,行数指定 i = Range("D1").Value 'サーチするmp3のファイル名部分のみ(拡張子は除く) FileNameOnly = Left(ws2.Cells(i, 3), InStrRev(ws2.Cells(i, 3), ".") - 1) 'Flacにmp3と同じ部分はあるかサーチ? Set r = ws1.Cells.Find(FileNameOnly) If r Is Nothing Then '存在しないなら MsgBox "指定のflacが見つかりませんでした。", vbExclamation Application.EnableEvents = True Application.ScreenUpdating = True Exit Sub Else FindRow = r.Row '存在したら、その行数を求める End If 'mp3のファイル名表示 Range("A2") = ws2.Cells(i, 3) '見出し行 (Flacのフルパス) Range("A4") = "Flacのフルパス名 / 表示の行番号 = " & FindRow '使用列Aのクリアー Range(Cells(Rows.Count, 1).End(xlUp), Cells(5, 1)).ClearContents '横/縦並び替え tmp = Split(ws1.Cells(FindRow, 1), "\") ws3.Range(ws3.Cells(FindRow, 2), ws3.Cells(FindRow, UBound(tmp) + 2)).Copy Range("A5").PasteSpecial Transpose:=True Set ws1 = Nothing Set ws2 = Nothing Set ws3 = Nothing Set ws4 = Nothing '↓イベントの発生を再開します。 Application.EnableEvents = True End Sub
- kkkkkm
- ベストアンサー率66% (1742/2617)
前回の Worksheet_Change( のまま .Find にすることによって追加した部分や変更した部分(FindRowなんかの部分です)をあてはめたらいけると思います。 i = 2 は、もとの i = Range("D1").Value のままです。 Range("D1").Value が作業の元になる行の値ですから。 MsgBox "指定のflacが見つかりませんでした。", vbExclamation のあとに Application.EnableEvents = True Application.ScreenUpdating = True を入れておかないと以後_Changeイベントなどが無効のままです。 End より Exit Sub の方がいと思います。
お礼
アドバイス、感謝します。 アドバイスを受けて sheet7(Flack変換)のシートモジュールに以下の記載しましたが 旨く機能しません。 D1に直接数値を指定すると 抜き出しは旨く処理できているのですが '見出し行 (Flacのフルパス) ws4.Range("A4") = "Flacのフルパス名 / 表示の行番号 = " & FindRow が表示されずません。 又、 前回作成した、「前を表示」などが機能しません。 以下の1),2)のws4が同じでなくても問題ないですよね ? ’----------------- Sub 前を表示() Dim ws4 As Worksheet Set ws4 = Worksheets("横_縦") <------ 1) ’----------------- Sub Worksheet_Change の Set ws1 = Worksheets("Everything") Set ws2 = Worksheets("Mp3") Set ws3 = Worksheets("Convert") Set ws4 = Worksheets("Flac検索") <------------- 2) Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> Range("D1").Address Then Exit Sub End If If Range("D1").Value < F_ROW Or _ Range("D1").Value > Range("E1").Value Then MsgBox "パスを表示する行番号が範囲外です。" Application.EnableEvents = False Application.Undo '入力したものを取り消します。 Application.EnableEvents = True Exit Sub End If '↓イベントの発生を停止します。 Application.EnableEvents = False '並び替え実行のコード Dim r As Range, FindRow As Integer Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet, ws4 As Worksheet Dim FileNameOnly As String Dim i As Long Dim tmp As Variant Set ws1 = Worksheets("Everything") Set ws2 = Worksheets("Mp3") Set ws3 = Worksheets("Convert") Set ws4 = Worksheets("Flac検索") '使用列Aのクリアー Range(Cells(Rows.Count, 1).End(xlUp), Cells(5, 1)).ClearContents '横/縦並び替え i = Range("D1").Value 'サーチするmp3のファイル名部分(拡張子は除く) FileNameOnly = Left(ws2.Cells(i, 3), InStrRev(ws2.Cells(i, 3), ".") - 1) 'flacのどこかにmp3と同じ部分はあるか? Set r = ws1.Cells.Find(FileNameOnly) If r Is Nothing Then '存在しないなら MsgBox "指定のflacが見つかりませんでした。", vbExclamation Application.EnableEvents = True Application.ScreenUpdating = True Exit Sub Else FindRow = r.Row '存在したら、その行数を求める End If 'mp3のファイル名表示 ws4.Range("A2") = ws2.Cells(i, 3) '見出し行 (Flacのフルパス) ws4.Range("A4") = "Flacのフルパス名 / 表示の行番号 = " & FindRow '使用列Aのクリアー ws4.Range(ws4.Cells(Rows.Count, 1).End(xlUp), ws4.Cells(5, 1)).ClearContents '横/縦並び替え tmp = Split(ws1.Cells(FindRow, 1), "\") ws3.Range(ws3.Cells(FindRow, 2), ws3.Cells(FindRow, UBound(tmp) + 2)).Copy ws4.Range("A5").PasteSpecial Transpose:=True Set ws2 = Nothing Set ws3 = Nothing '↓イベントの発生を再開します。 Application.EnableEvents = True End Sub
- kkkkkm
- ベストアンサー率66% (1742/2617)
sheetes("Mp3") を上から順番の元にしてやりたいという事でしたら 前回のコードを i = Range("D1").Value のまま今のFindを生かすコードに変更すればいいような気もしますが。
補足
>sheetes("Mp3") >を上から順番の元にしてやりたいという事でしたら 希望は、Mp3のソート順が望ましいです。 >前回のコードを >i = Range("D1").Value >のまま今のFindを生かすコードに変更すればいいような気もしますが。 んー。 知識が追いつかず、ガッテン「なるほど」と行きません。 もう少し、補足をお願いします。
- kkkkkm
- ベストアンサー率66% (1742/2617)
sheetes("Everthing") C列:ファイル名 と sheetes("Mp3") C列:ファイル名 でした。 > やりたいのは、 > A5以下に行方向にw1の24行目を抜き出すです。 前回はws3のデータを並び替えしてたと思いますし、質問のコードもws3になってます。 ws3でしたら Worksheets("Convert") から一行ずつ取り出して横/縦並び替えしてるのに Worksheets("Mp3")の方からWorksheets("Everything")探して見つかっても並び替えしたデータと合致しないと思うのですが…。 Worksheets("Convert")のその時の行の一番右の列のデータからWorksheets("Mp3")の方を探した方がいいのではないでしょうか。 ws3.Cells(i, Columns.Count).End(xlToLeft).Column で右端の列番号が取得できます。
補足
>Worksheets("Convert")のその時の行の一番右の列のデータから >Worksheets("Mp3")の方を探した方がいいのではないでしょうか。 今回私が考えた「Sub 同じ値のセルを見つけて横_縦並び替え()」は mp3(ws2)からファイル名(拡張子部を除く)を検索すべきターゲットとして flac(ws1)から探して見つかったら、その行をFindRowとして ws1の1行目とConvert(ws3)の1行目は同じなので FindRowでws3を横/縦並び替えする手順ですが 要点は、Mp3のファイル名(拡張子部分は除く)とConvertの番右の列のデータ=ファイル名(拡張子を除く) が一致するのを探しても良いです。 要は、拡張子部を除いてMp3のファイル名と同じファイル名を持つflacがどの行にあるか探して 横/縦変化して表示されれば問題は解決します。 作業上kkkkkmさんの推薦の方法がスマートなコードなら その方向で考えますがどうでしょうか ?
- kkkkkm
- ベストアンサー率66% (1742/2617)
sheetes("Convert") D列: ファイル名 を優先キーにして並び替え sheetes("Mp3") C列:ファイル名 を優先キーにして並び替え したら、両方同じ行は同じファイル名にならないでしょうか。
補足
kkkkkmさん、回答感謝します。 >sheetes("Convert") >D列: ファイル名 >を優先キーにして並び替え Convertシートのファイル名のみ列は、行によって不揃いです。 "¥”の数で分割数が違うので例えば”D列”が常にファイル名とはなりません。 L:aaa\bbb\ccc\dddd.flac なら 5番目のF列がファイル名 L:fgh\ggg\hjk.flac なら 4番目のE列がファイル名 分割数の最後、最大列数がファイル名の列数です。
補足
kkkkkmさん、アドバイスありがとうございます。 >コード内にws4指定のセルとかないので、記載してコメントにしておけばいいのではないでしょうか。 コメントにしました。 >シート全体を検索してますが >Set r = ws1.Cells.Find(FileNameOnly) 説明を受けてCellだけでは検索ミスの可能性があるので対象範囲を絞る必要があると納得しました。 「シート全体を検索」をC列だけを検索するように 以下に変更しました。 >また、引数は指定しておいた方がいいみたいです。 URLの説明を読んで FINDのパラメーターで必要があると思われるパラメーターを追加しました。 'サーチするmp3のファイル名部分のみ(拡張子は除く) FileNameOnly = Left(ws2.Cells(i, 3), InStrRev(ws2.Cells(i, 3), ".") - 1) 'Flacの名前(C列)にmp3と同じ部分はあるかサーチ? 'What:= -------- 検索するデータの指定 'LookIn:=xlValues 値 'LookAt:=xlWhole 全てが一致するセルを検索 'Matchcase:= False(規定値) 大文字と小文字を区別しない 'MatchByte:= False (規定値) 半角と全角を区別しない Set r = ws1.Range("C:C").Find(what:=FileNameOnly & ".flac", LookIn:=xlValues, LookAt:=xlWhole) >Application.ScreenUpdating = Trueは不要です。 以下のようにコメントアウトにしました。 If r Is Nothing Then '存在しないなら MsgBox "指定のflacが見つかりませんでした。", vbExclamation Application.EnableEvents = True 'Application.ScreenUpdating = True Exit Sub '------------------------ Worksheet_Changeの最初の方に「最終行」を見失わないように以下を追加しました。 Range("E1") = ws2.Cells(Rows.Count, 1).End(xlUp).Row