- ベストアンサー
VBA for Excel でファイルを条件付きで開く
VBA for Excel で、開いているか開いていないか判らないファイルを開きたいと思い(ファイルは2つ、名前はGRT と GTATNO という変数に入っている)、下記のように書いてみましたが、Excel2000 ではエラーが起きるようです。 Sub ファイルを開く Dim hbook As Workbook AP = ActiveWorkbook.Path 'ファイルが開いていたら何もしない For Each hbook In Workbooks If hbook.Name <> GRT Then Workbooks.Open (AP & "\" & GRT) End If If hbook.Name <> GTANTO Then Workbooks.Open (AP & "\" & GTANTO) End If Next End Sub 原因は、そのときゲットした開いているファイル名(hbook.Name)がたまたま一致しないときにファイルを開こうとしてしまう、ということは判りました。 こうなると「2重に開こうとしている。開いて良いか?」のメッセージが表示され、それにNoと答えるとマクロがエラーを表示し、利用者は困ってしまうのですが、 どうしたらうまく動くマクロになるのかがわからず、悩んでいます。 ほとんど「組んでちょーだい」状態ですが、よろしくお願いいたしますm(_ _)m また職場でネットしているため、解答いただいた時間によってはお礼が8日(月)になってしまいますことを、予めお断りしお詫びしておきます。
- オフィス系ソフト
- 回答数3
- ありがとう数0
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
'こんな感じでどうでしょう Sub ファイルを開く() Dim hbook As Workbook Dim file As String AP = ActiveWorkbook.Path On Error GoTo FILEOPEN file = GRT '開くファイル名 Set hbook = Workbooks(file) ' ワークブックに含まれていないとエラーになる file = GTATNO Set hbook = Workbooks(file) Exit Sub FILEOPEN: Workbooks.Open (AP & "\" & file) 'エラーになったファイルを開く Resume Next '次の行から実行 End Sub
その他の回答 (2)
- masa_019
- ベストアンサー率61% (121/197)
#1です。 >開きたいファイルが2つあるのですが... >Nothing が条件だと1つだけ開いている場合、その1つは「2重に開く」になってしまいませんか? 開くファイルが二つなのはわかってますが、 提示したコードはあくまでこんな感じでどうですか? という参考程度のもので、そのまま使って下さいというものでは有りませんでした。 質問内容からある程度VBAも知ってらっしゃるようなので、提示したコードを応用して後はご自分で何とかできるかと判断しましたが、不親切だったでしょうか? 申し訳ありません。 既に、#2の回答者さんが二つのファイルに対応したコードを出して下さっているので、今さら私がコードを提示する必要はありませんね。 失礼しました。
- masa_019
- ベストアンサー率61% (121/197)
こんにちは。 ブックをオブジェクト変数に格納し、 その変数がNothingだったら 開く処理をするというのはどうでしょう。 Sub ファイルを開く() On Error Resume Next Dim hbook As Workbook AP = ActiveWorkbook.Path Set hbook = Workbooks(GRT) If hbook Is Nothing Then Workbooks.Open (AP & "\" & GRT) End If End Sub
補足
早速のご返事ありがとうございます。 開きたいファイルが2つあるのですが... Nothing が条件だと1つだけ開いている場合、その1つは「2重に開く」になってしまいませんか?
関連するQ&A
- VBAでフォルダにあるエクセルファイルを開く
こんにちは このコードがうまく動かないのですが、 どこがいけないのかわからなく助けてください。 なおフォルダの中には******データ.xlsと言うファイルがあり、アスタリスク部分は日付が不規則に変化して上書きされるのです。 このファイルを開くマクロを作りたいのですが。 うまく行きません。 よろしくおねがいします。 Sub excelopen() ' ' Dim エクセル As String 'エクセル = Dir(ActiveWorkbook.Path & "\*データ.XLS") If エクセル = "" Then Exit Sub エクセル = ActiveWorkbook.Path & "\" & エクセル Workbooks.Open Filename:=エクセル End Sub
- ベストアンサー
- オフィス系ソフト
- もしも新規Excelファイルを開いてる場合は閉じる
Excel2003です・ ユーザーが新規Excelファイル(book1)かテスト用ファイルを開いている場合は閉じる処理を考えております。 Option Explicit Dim ws As Workbook, flag As Boolean Private Sub Workbook_Open() For Each ws In Workbooks If ws.Name = "Book1" Then flag = True Next ws If flag = True Then Workbooks("Book1.xls").Close Else End IF For Each ws In Workbooks If ws.Name = "テスト用.xls" Then flag = True Next ws If flag = True Then Workbooks("テスト用.xls").Close Else End IF End Sub このコードだとBook1を開いているのに、Trueで拾ってくれません。 ws.Name = "Book1.xls"にしても同じです。 どこかおかしい部分があるのでしょうか?
- ベストアンサー
- その他MS Office製品
- エクセル VBA 読み取り専用になっているファイルを開く場合
エクセルVBAを取り組んでいるのですが、 "A"のファイルでマクロを作動させて、"B"のファイルを開くマクロを組んでいます。 その時に誰かが"B"のファイルを開いていた場合強制的に読み取り専用で開いてしまいます。 読み取り専用で開こうとした場合には、マクロを停止させるようにしたいのですが、どういう形にしたら良いでしょうか? ちなみに"B"ファイルを開いているマクロを下に乗せておきますので、変更しなければならない等がありましたら、教えていただけますと幸いです。 For Each wb In Workbooks If InStr(wb.Name, "B") > 0 Then flag = True Next wb If flag = True Then Else Workbooks.Open Filename:="Z:\B.xls" End If
- ベストアンサー
- オフィス系ソフト
- エクセル2000VBAで質問です。
デスクトップ上に「T」というフォルダがあり、そこに「x05.txt」という カンマ区切りファイルがあるのですが、 そのファイルの内容を デスクトップ上の実績フォルダ内の「book1.xls」sheet1に、 カンマ区切りで貼り付けていく処理をしたいのです。 「x05.txt」の05は、作成した日付が?月5日という意味です。 貼り付けも、上書きではなくA1に1日のデータ、その続きの行の1列目に2日目のデータを貼り付ける という風にしたいのですが・・・さっぱりです。 OSは、WindowsXPです。 どうか、よろしくお願いいたします。 以下、作っている途中のプログラムです。 * 変数の宣言を抜いております。 Sub データ結合() SYSBASE = ActiveWorkbook.Name res = MsgBox("累積処理を開始します。", vbOKCancel) If res = vbCancel Then Exit Sub End If Workbooks(SYSBASE).Sheets("累積データ").Activate Cells.Delete For h = 1 To 31 メインパス名 = ActiveWorkbook.Path 日付パス名 = Right("00" + Mid(Str(h), 2), 2) On Error GoTo オープンエラー ChDir メインパス名 + "\" + 日付パス名 On Error GoTo 0 If ermsg = 1 Then ermsg = 0 Else ermsg = 0 For i = 1 To 10 ファイル名 = "T-LOG1_" + Right("00" + Mid(Str(i), 2), 2) On Error GoTo オープンエラー Workbooks.Open Filename:=メインパス名 + "\" + 日付パス名 + "\" + "個別" + _ "\" + ファイル名 + ".txt" On Error GoTo 0 If ermsg = 1 Then ermsg = 0 Exit For End If Workbooks(SYSBASE).Sheets("累積データ").Activate datarec = Range("A1").CurrentRegion.Rows.Count If datarec = 1 And Cells(1, 1) = "" Then Workbooks(ファイル名 + ".txt").Activate Range(Cells(1, 1), Cells(1, 20)).Copy Workbooks(SYSBASE).Sheets("累積データ").Activate Cells(1, 1).Select ActiveSheet.Paste End If Workbooks(ファイル名 + ".txt").Activate D_datarec = Range("A1").CurrentRegion.Rows.Count If D_datarec <= 1 Then ActiveWorkbook.Close savechanges:=False Else Range(Cells(2, 1), Cells(D_datarec, 20)).Copy Workbooks(SYSBASE).Sheets("累積データ").Activate datarec = Range("A1").CurrentRegion.Rows.Count Cells(datarec + 1, 1).Select ActiveSheet.Paste Workbooks(ファイル名 + ".txt").Activate Application.DisplayAlerts = False ActiveWorkbook.Close savechanges:=False Application.DisplayAlerts = True End If Next i End If Next h Exit Sub オープンエラー: ermsg = 1 Resume Next End Sub
- 締切済み
- その他(プログラミング・開発)
- Excel 2007 Windows7での不具合
下記のExcel 2007 VBAマクロを Windows XP で組んでいましたが、 Windows 7 に乗り換えたとたん、強制終了してしまいます。 Workbooks.Openのアドレスは、Windows 7用に書き換えました。 何方かご教授願います。 Private Sub CommandButton63_Click() Application.ScreenUpdating = False Dim wb As Workbook wbn1 = ActiveWorkbook.Name For Each wb In Workbooks If wb.Name = wbn1 Then Workbooks.Open "D:\ユーザー\PC18\Documents\※※※※\※※※※.xls" ActiveWindow.WindowState = xlMaximized Workbooks(wbn1).Save Application.DisplayAlerts = False Workbooks(wbn1).Close Else: Application.ScreenUpdating = False End If Next Application.ScreenUpdating = True End Sub
- 締切済み
- Visual Basic
- Excel2007VBAファイルの表示について
●質問の主旨 開いたダイアロボックス内のファイルについてエクセルファイル(.xlsxのみ)を 対象としたいと考えています。 下記コードをどのように書き換えればよいでしょうか? ご存知の方ご教示願います。私はVBA初心者です ●質問の補足 作成した下記のコードでは 「実行時エラー1004:GetOpenFilenameメソッドに失敗しました」 と表示されます。 参考書2冊読んで全くその通りに引用していて、なぜエラー表示に なるのかよく分かりません。 またTarget = Application.GetOpenFilename("Excelブック,*,xlsx")を Target = Application.GetOpenFilename()にするとダイアロボックスは 表示され、その中にあるエクセルファイルは表示されます。 ●コード Sub Sample3() Dim Target As String Target = Application.GetOpenFilename("Excelブック,*,xlsx") If Target <> "False" Then Workbooks.Open Target Else MsgBox "キャンセルされました" End If End Sub
- ベストアンサー
- Visual Basic
- VBA:2つのCSVファイルを開きたいです。
エクセル2010のVBAにてCSVファイルを開き結合させるプログラムを組もうとしているのですが、2つ目のCSVファイルを開こうとすると、何故かエラーが出てしまいます。 -------------------------------------------------------------------------------- 1つ目 Sub mobile_FileSearch(Path As String) 'test.csvのデータを検索して開く Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Call mobile_FileSearch(Folder.Path) Next Folder For Each File In FSO.GetFolder(Path).Files If File.Name = "test.csv" Then Workbooks.Open ("test.csv") End If Next File End Sub ---------------------------------------------------------------------------- 2つ目 Sub local_FileSearch(Path As String) 'bbb.csvのデータを検索して開く Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") For Each Folder In FSO.GetFolder(Path).SubFolders Call local_FileSearch(Folder.Path) Next Folder For Each File In FSO.GetFolder(Path).Files If File.Name = "bbb.csv" Then Workbooks.Open ("bbb.csv")'←ここでエラー End If Next File End Sub ------------------------------------------------------------------------ まったく同じプログラムで、csvファイル名だけ変えただけで実行時エラー1004が出てしまいます。 一体全体何が問題なのでしょうか?
- ベストアンサー
- その他(プログラミング・開発)
- フォルダ内の全てのファイル開く時間短縮の方法
Excelのマクロを使ってフォルダ内の全てのファイルを開く以下のコードを利用しているのですが(教えてgoo!で教えて頂いたコードです)、ファイル数が10個くらいあるため全部開くのに1分くらいかかってしまいます。 もっと時間を短縮することはできませんでしょうか? Sub OpenAllBook() Dim FileName As String Dim OpenedBook As Workbook Dim IsBookOpen As Boolean ChDir ("フォルダ名") FileName = Dir("*.xls") Do While FileName <> "" If FileName <> ThisWorkbook.Name Then IsBookOpen = False For Each OpenedBook In Workbooks If OpenedBook.Name = FileName Then IsBookOpen = True Exit For End If Next If IsBookOpen = False Then Workbooks.Open (FileName) End If End If FileName = Dir() Loop End Sub
- ベストアンサー
- Windows系OS
- エクセルVBA 日付つきバックアップファイル
下記のような連番でバックアップファイルを作成するマクロを書きました。バックアップファイルの最上部に行を挿入し、そこにバックアップファイルの作成日とオリジナルのFullName(フルパス)を記したいのですがうまくいきません。 .Range("a1") = "保存時刻 : " & Format(Now, "yyyy年mm月dd日hh時nn分") .Range("a2") = "オリジナル : " & ActiveWorkbook.FullName ↑のような感じの情報を加えたいのです。 どなたか、下記のマクロにフルパスと作成日を付与し、マクロ実行後も作業中のブックをアクティブのままにして置く方法をおしえてください。 Sub MySave2() Dim FSO As New Scripting.FileSystemObject バックアップファイル名 = "C:\My Documents\エクセルBackUps\" & Format(Date, "yyyymmdd") _ & ActiveWorkbook.Name If FSO.FileExists(バックアップファイル名) = False Then ActiveWorkbook.SaveCopyAs バックアップファイル名 Else Dim indn As Variant For indn = 2 To 1000 新 = "C:\My Documents\エクセルBackUps\" & Format(Date, "yyyymmdd") _ & "-" & indn & ActiveWorkbook.Name If FSO.FileExists(新) = False Then ActiveWorkbook.SaveCopyAs 新 Exit For Else End If Next indn End If End Sub
- ベストアンサー
- Visual Basic
- Excel2007 VBA Copyメッソド
Excel2003で開発されたVBAをExcel2007で動くように修正しているのですが、 次のコードがExcel2007ではエラーになります。 (1)Workbooks.Open Filename:=pthFolder & "\" & nmFile (2)nmSheet = Workbooks(nmFile).ActiveSheet.Name (3)Workbooks(WB_Name).Worksheets(S_MAIN).Copy After:=Workbooks(nmFile).Sheets(nmSheet) (1)と(2)は実行されますが、(3)がエラーになり、(4)に飛びます。 (4) SaveError: MsgBox "エラー発生" Application.DisplayAlerts = False Workbooks(nmFile).Close End Sub どなたか、Excel2007でエラーになる理由と解決策を教えていただけないでしょうか。 既に同じ質問が出ているかもしれませんが、VBA初心者なもので、うまく探せませんので、 ご協力をお願いいたします。
- ベストアンサー
- Visual Basic
補足
再度のご回答ありがとうございます。 アレンジできればと思って読んだのですが、それでも発想できませんでした(--;) その程度の知識・発想力しかないので、 >Nothing が条件だと1つだけ開いている場合、その1つは「2重に開く」になってしまいませんか? と質問させていただきました。 不快な思いされたようで、申し訳ございませんでした。