• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル2007で既に開かれているCSVファイル)

エクセル2007で既に開かれているCSVファイルのセルA1に特定の文字が入力されているファイルに対してマクロを実行したいのです。

このQ&Aのポイント
  • エクセル2007で既に開かれているCSVファイルのセルA1に特定の文字が入力されているファイルに対してマクロを実行する方法を教えてください。
  • マクロ実行前に、特定の文字が入力されているCSVファイルが開かれているかどうかを確認するためのVBAコードを作成したいです。
  • 特定の文字が入力されているCSVファイルに対してマクロを実行するために、エクセル2007で開かれているファイルを順番にチェックするVBAコードの作成方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

提示コードはあくまでサンプルなので「もったいない」事もなく、 あまり気にされなくても良いかと。 文章で説明するよりコードを動かしたほうが理解し易い場合もあります。 それより 同名ファイルを同時に開く事はできないのでよく確認したほうが良いですよ。 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 & "対象外ファイルを閉じて再実行。"

mayu1992
質問者

お礼

お礼が遅れてすみません。 色々試しては居るのですが、なかなか。。。 同じ環境(同名ファイルの同時表示)では無い上でご検討頂きありがとうございます。 もうしばらく、検証してみます。

mayu1992
質問者

補足

こんにちわ end-uさん  まずは、ご提示頂いたコードだけでの検証結果をご連絡します。  同一ファイルが、(1),(1),(2),(2)と有った場合、アクティブになるのは、先に開いた、(1),(2)になる様です。  画面上に開けるという事は、CSVファイルの何かの属性が異なると思い、今はそれをネット検索したりしております。 それでも駄目なら、ご教示頂いた第二案を採決しようと思います。

その他の回答 (2)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.3

今ひとつ納得いかない感もありますが 取り敢えず.. 名前に頼らず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

mayu1992
質問者

お礼

おはようございます end-uさん またまた、お礼が遅れてすみません。  ご納得いかない。。。一緒に悩んで頂いて感謝です。 ご提示頂いたコードですが、try_2()と同様にアクティブになるのは、先に開いた、(1),(2)になりました。  もう少し、自助努力致します。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

>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を使って処理したいファイルをアクティブにさせるという方法もありかもしれません。

mayu1992
質問者

補足

コードのご提供ありがとうございました♪ 思いもつかない方法が多々あり勉強になりました! 動作も素晴らしいと思いました。 >ユーザーに選択させるという意味でしょうか? はい。目で見て確認出来るように、 MsgBox v(i) & "処理" 'Call 処理の前に対象ファイルをアクティブにしてみました。 >If s = "list.csv" Or s Like "list(#).csv" Then の所は、#から*に変えました。(9個以上開くことは無いとは思いますが。。。) しかし、新たな問題が出てきてしまいました。。。 システムのイントラの設定を変えたものを開いたら(「一時フォルダー」に保存されているのかな?)ファイル名が同一になる事があり“MsgBoxのLoop”で発生してしまいました。 ケアレスネス防止でクリアーしたいと思いますが、改善策はありますでしょうか? ユーザーに注意喚起して、作業目的以外のファイルは閉じさせるか。。。(ご提供いただいたコードがもったいないです) 面倒でも、マクロファイルのワークシートに貼り付けさせるか。。。(こちらももったいないです) 悩み過ぎて、自己完結出来ません<(_ _)>