- ベストアンサー
エクセル2007で既に開かれているCSVファイルのセルA1に特定の文字が入力されているファイルに対してマクロを実行したいのです。
- エクセル2007で既に開かれているCSVファイルのセルA1に特定の文字が入力されているファイルに対してマクロを実行する方法を教えてください。
- マクロ実行前に、特定の文字が入力されているCSVファイルが開かれているかどうかを確認するためのVBAコードを作成したいです。
- 特定の文字が入力されているCSVファイルに対してマクロを実行するために、エクセル2007で開かれているファイルを順番にチェックするVBAコードの作成方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
提示コードはあくまでサンプルなので「もったいない」事もなく、 あまり気にされなくても良いかと。 文章で説明するよりコードを動かしたほうが理解し易い場合もあります。 それより 同名ファイルを同時に開く事はできないのでよく確認したほうが良いですよ。 Sub try_2() Dim wb As Workbook Dim s As String Dim i As Long ReDim v(1 To 10) As String For Each wb In Workbooks s = LCase(wb.Name) If s = "list.csv" Or s Like "list(#).csv" Then If wb.Sheets(1).Range("A1").Value = "特定文字" Then i = i + 1 v(i) = wb.Name Debug.Print i, v(i) '確認用 End If End If Next Select Case i Case 0 MsgBox "no file" Case 1 MsgBox v(1) & "処理" 'Call 処理 Case Is > 1 MsgBox i & "個から選択" ReDim Preserve v(1 To i) s = Join(v, vbLf) & vbLf & vbLf For i = 1 To i Application.Goto Workbooks(v(i)).Sheets(1).Range("A1") If MsgBox(s & "の" & vbLf & vbLf & v(i) & " ?", vbYesNo) = vbYes Then MsgBox v(i) & "処理" 'Call 処理 Exit For End If Next End Select End Sub 仕様的にはLoopで選択させるよりも対象外ファイルを閉じてもらったほうが良いような気もしますね。 Case Is > 1 の内容を以下に変えるとか。 ReDim Preserve v(1 To i) MsgBox Join(v, vbLf) & vbLf & vbLf & i & " ファイルあり。" _ & vbLf & vbLf & "対象外ファイルを閉じて再実行。"
その他の回答 (2)
- end-u
- ベストアンサー率79% (496/625)
今ひとつ納得いかない感もありますが 取り敢えず.. 名前に頼らずCollectionに格納したものを使う方式です。 Sub try_3() Dim col As Collection Dim wb As Workbook Dim s As String Dim i As Long ReDim v(1 To Workbooks.Count) As String Set col = New Collection For Each wb In Workbooks s = LCase(wb.Name) If s = "list.csv" Or s Like "list(#).csv" Then If wb.Sheets(1).Range("A1").Value = "特定文字" Then i = i + 1 v(i) = wb.Name col.Add wb End If End If Next Select Case i Case 0 MsgBox "no file" Case 1 MsgBox v(1) & "処理" 'Call 処理 Case Is > 1 MsgBox i & "個から選択" ReDim Preserve v(1 To i) s = Join(v, vbLf) & vbLf & vbLf For Each wb In col Application.Goto wb.Sheets(1).Range("A1") If MsgBox(s & "の" & vbLf & vbLf & wb.Name & " ?", vbYesNo) = vbYes Then MsgBox wb.Name & "処理" 'Call 処理 Exit For End If Next End Select Set wb = Nothing Set col = Nothing End Sub
お礼
おはようございます end-uさん またまた、お礼が遅れてすみません。 ご納得いかない。。。一緒に悩んで頂いて感謝です。 ご提示頂いたコードですが、try_2()と同様にアクティブになるのは、先に開いた、(1),(2)になりました。 もう少し、自助努力致します。
- end-u
- ベストアンサー率79% (496/625)
>Set myChkBook = Workbooks("List(" & i & ").csv") '←現状では、開かれていないファイルが >On Error GoTo 0 'あるとエラーになってしまいます。 On Error制御の後に 変数 Is Nothing 判定すれば良いです。 If Not myChkBook Is Nothing Then Call 処理 End If >マクロ実行前に、例えば list.csv と list(4) のセルA1に特定の文字が入力されている場合は、どちらかを選択するか、処理を中止する。(希望は前者ですが。。。) ユーザーに選択させるという意味でしょうか? 例えば Sub try() Dim wb As Workbook Dim v(1 To 10) As String Dim s As String Dim i As Long For Each wb In Workbooks s = LCase(wb.Name) If s = "list.csv" Or s Like "list(#).csv" Then If wb.Sheets(1).Range("A1").Value = "特定文字" Then i = i + 1 v(i) = wb.Name End If End If Next Select Case i Case 0 MsgBox "no file" Case 1 MsgBox v(i) & "処理" 'Call 処理 Case Is > 1 MsgBox i & "個から選択" For i = 1 To i If MsgBox(v(i) & "?", vbYesNo) = vbYes Then MsgBox v(i) & "処理" 'Call 処理 Exit For End If Next End Select End Sub 選択させるなら、対象ファイルがいくつあるか、全調査しないといけないですよね。 選択方法については、MsgBoxのLoopではなくて Application.InputBoxを使って処理したいファイルをアクティブにさせるという方法もありかもしれません。
補足
コードのご提供ありがとうございました♪ 思いもつかない方法が多々あり勉強になりました! 動作も素晴らしいと思いました。 >ユーザーに選択させるという意味でしょうか? はい。目で見て確認出来るように、 MsgBox v(i) & "処理" 'Call 処理の前に対象ファイルをアクティブにしてみました。 >If s = "list.csv" Or s Like "list(#).csv" Then の所は、#から*に変えました。(9個以上開くことは無いとは思いますが。。。) しかし、新たな問題が出てきてしまいました。。。 システムのイントラの設定を変えたものを開いたら(「一時フォルダー」に保存されているのかな?)ファイル名が同一になる事があり“MsgBoxのLoop”で発生してしまいました。 ケアレスネス防止でクリアーしたいと思いますが、改善策はありますでしょうか? ユーザーに注意喚起して、作業目的以外のファイルは閉じさせるか。。。(ご提供いただいたコードがもったいないです) 面倒でも、マクロファイルのワークシートに貼り付けさせるか。。。(こちらももったいないです) 悩み過ぎて、自己完結出来ません<(_ _)>
お礼
お礼が遅れてすみません。 色々試しては居るのですが、なかなか。。。 同じ環境(同名ファイルの同時表示)では無い上でご検討頂きありがとうございます。 もうしばらく、検証してみます。
補足
こんにちわ end-uさん まずは、ご提示頂いたコードだけでの検証結果をご連絡します。 同一ファイルが、(1),(1),(2),(2)と有った場合、アクティブになるのは、先に開いた、(1),(2)になる様です。 画面上に開けるという事は、CSVファイルの何かの属性が異なると思い、今はそれをネット検索したりしております。 それでも駄目なら、ご教示頂いた第二案を採決しようと思います。