のセル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
出だしで躓いてしまい、悩んでおります。
良い方法をご教示いただければと思い、質問致します。
宜しくお願い致します。
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 & "対象外ファイルを閉じて再実行。"
この回答への補足
こんにちわ end-uさん
まずは、ご提示頂いたコードだけでの検証結果をご連絡します。
同一ファイルが、(1),(1),(2),(2)と有った場合、アクティブになるのは、先に開いた、(1),(2)になる様です。
画面上に開けるという事は、CSVファイルの何かの属性が異なると思い、今はそれをネット検索したりしております。
それでも駄目なら、ご教示頂いた第二案を採決しようと思います。
お礼が遅れてすみません。
色々試しては居るのですが、なかなか。。。
同じ環境(同名ファイルの同時表示)では無い上でご検討頂きありがとうございます。
もうしばらく、検証してみます。
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
おはようございます end-uさん
またまた、お礼が遅れてすみません。
ご納得いかない。。。一緒に悩んで頂いて感謝です。
ご提示頂いたコードですが、try_2()と同様にアクティブになるのは、先に開いた、(1),(2)になりました。
もう少し、自助努力致します。
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を使って処理したいファイルをアクティブにさせるという方法もありかもしれません。
この回答への補足
コードのご提供ありがとうございました♪
思いもつかない方法が多々あり勉強になりました!
動作も素晴らしいと思いました。
>ユーザーに選択させるという意味でしょうか?
はい。目で見て確認出来るように、
MsgBox v(i) & "処理" 'Call 処理の前に対象ファイルをアクティブにしてみました。
>If s = "list.csv" Or s Like "list(#).csv" Then
の所は、#から*に変えました。(9個以上開くことは無いとは思いますが。。。)
しかし、新たな問題が出てきてしまいました。。。
システムのイントラの設定を変えたものを開いたら(「一時フォルダー」に保存されているのかな?)ファイル名が同一になる事があり“MsgBoxのLoop”で発生してしまいました。
ケアレスネス防止でクリアーしたいと思いますが、改善策はありますでしょうか?
ユーザーに注意喚起して、作業目的以外のファイルは閉じさせるか。。。(ご提供いただいたコードがもったいないです)
面倒でも、マクロファイルのワークシートに貼り付けさせるか。。。(こちらももったいないです)
悩み過ぎて、自己完結出来ません<(_ _)>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- Excel(エクセル) 【マクロ】webアドレスにて指定されたCSVファイル【excelソフト表示】を印刷する件 1 2023/02/15 01:52
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/17 11:59
- Visual Basic(VBA) エクセルのマクロについて教えてください。 3 2023/02/22 08:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ドリブン??
-
ProgressBarを用いる場合、全体...
-
UWSCのTHREADについて
-
どう増強すべきか
-
VBA For Each 〜 複数条件について
-
private subモジュールを他のモ...
-
VBAの進捗状況をリアルタイ...
-
エクセル画面のちらつきなくす...
-
For ~ Next文
-
マクロで、次のコードへ行く前...
-
条件文でelseはつけるべき?
-
vbaのエラー対応(実行時エラー...
-
ExcelのVBAで、選択したファイ...
-
VBA マクロ 英語版WINDOWSで全...
-
特定の名前のオートシェイプの...
-
エクセルVBAでロックをかけたい
-
エクセル VBAで複数セル選択時...
-
IF文に時間(何時から何時ま...
-
Word VBA。各マクロの間に待ち...
-
エクセル2007で既に開かれ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
IF文に時間(何時から何時ま...
-
private subモジュールを他のモ...
-
vbaのエラー対応(実行時エラー...
-
マクロで、次のコードへ行く前...
-
どう増強すべきか
-
特定の名前のオートシェイプの...
-
シグナル 6(SIGABRT)とは?
-
Excel VBA セルの名前があるか...
-
ExcelのVBAで、選択したファイ...
-
どうやってもFor文を抜けてしま...
-
シェルスクリプトでファイル内...
-
ドリブン??
-
特定のファイルを他のプロセス...
-
VB6にてネットワーク上にある共...
-
【VBA】エラー処理で別プロシー...
-
Functionで戻り値を複数返す方法
-
Word VBA。各マクロの間に待ち...
-
エクセル VBAで複数セル選択時...
-
VBA 複数の行を高速で削除する...
おすすめ情報