電子書籍の厳選無料作品が豊富!

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

会社のイントラネットから各種データを開くと(ダウンロードではありません。)以下のファイル名になります。
list.csv , list(1).csv , list(2).csv , list(4).csv , … , list(n).csv ←list(3).csvは不要だったので閉じられている例です。

マクロ実行前に、例えば list.csv と list(4) のセルA1に特定の文字が入力されている場合は、どちらかを選択するか、処理を中止する。(希望は前者ですが。。。)

対象のCSVファイルが無ければ(CSVファイルが開かれていない、または、A1が不一致)メッセージを出力する。

Sub Sample()
Dim myChkBook As Workbook
Dim i As Integer
On Error GoTo Err0
Set myChkBook = Workbooks("List.csv") 'この時にセルA1の文字を比較したいです。
Call 処理
Exit Sub

Err0:
For i = 1 To 5 '←5は少なくとも list(n).csv のnまで処理したい。
On Error Resume Next
Set myChkBook = Workbooks("List(" & i & ").csv") '←現状では、開かれていないファイルが
On Error GoTo 0                      'あるとエラーになってしまいます。
Call 処理
Exit Sub
Next i
Exit Sub
Err1:
MsgBox "対象のCSVファイルが見つかりませんでした。"
End Sub

出だしで躓いてしまい、悩んでおります。
良い方法をご教示いただければと思い、質問致します。
宜しくお願い致します。

A 回答 (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 & "対象外ファイルを閉じて再実行。"

この回答への補足

こんにちわ end-uさん

 まずは、ご提示頂いたコードだけでの検証結果をご連絡します。
 同一ファイルが、(1),(1),(2),(2)と有った場合、アクティブになるのは、先に開いた、(1),(2)になる様です。

 画面上に開けるという事は、CSVファイルの何かの属性が異なると思い、今はそれをネット検索したりしております。

それでも駄目なら、ご教示頂いた第二案を採決しようと思います。

補足日時:2012/09/04 17:08
    • good
    • 0
この回答へのお礼

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

もうしばらく、検証してみます。

お礼日時:2012/09/03 16:49

今ひとつ納得いかない感もありますが


取り敢えず..
名前に頼らず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
    • good
    • 0
この回答へのお礼

おはようございます end-uさん
またまた、お礼が遅れてすみません。

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

お礼日時:2012/09/08 07:54

>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”で発生してしまいました。
ケアレスネス防止でクリアーしたいと思いますが、改善策はありますでしょうか?

ユーザーに注意喚起して、作業目的以外のファイルは閉じさせるか。。。(ご提供いただいたコードがもったいないです)
面倒でも、マクロファイルのワークシートに貼り付けさせるか。。。(こちらももったいないです)
悩み過ぎて、自己完結出来ません<(_ _)>

補足日時:2012/08/30 17:44
    • good
    • 0

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