Excel VBAファイルの参照方法について

このQ&Aのポイント
  • Excel VBAでプログラムを実行させたときに2つのファイルを参照します。
  • 2つのファイルのうち、どちらか一方が存在しない場合にエラーメッセージを表示させたいです。
  • メッセージ画面以外の処理は正常に動作しています。
回答を見る
  • ベストアンサー

Excel VBAファイルがない場合メッセージ表示

ExcelVBAでプログラムを実行させたときに2つのファイルを参照します。  (1)結果コピー先ファイル  (2)データ元ファイル この2つのファイルのうち、いずれかがなかった場合にメッセージを表示させたいのですが思うように表示されません。 以下のように動作させたいのですがうまくいきません。  (1)2種類のファイルがないときには両方のメッセージを   1つの画面に表示したい。  (2)どちらか一方のファイルがないときには、   エラーメッセージを表示させエラーのないファイルを   表示させない。    ※いろいろ試したら(a)がないメッセージが表示されたが、     (b)のファイルが表示された。  (3)正常に処理が終了した場合は、完了メッセージを表示したい。 途中まで書いてみたコードは以下の通りです。  ※実行コードは中略します。 '////////////////////////////////////////////////////// Sub test1() Dim sMsg As String Dim sMyDir As String sMyDir = ThisWorkbook.Path & "\" Dim Ws As Worksheet Dim vTgYear As Variant Dim Wb As Workbook Set Wb = Workbooks("算出プログラム.xls") Set Ws = Wb.Sheets("入力内容") vTgYear = Ws.Range("D17").Value With Application .ScreenUpdating = False .Calculation = xlCalculationManual End With Dim sWbkName As String, StName As String Dim wbk結果1 As Variant sWbkName = "3_結果\結果.xls"   StName = "Sheet1" Dim sWbkSubName As String sWbkSubName = "1_算定表\" & vTgYear & "_算定表.xls" Dim Kname As String, Mname As String Kname = sMyDir & sWbkName Mname = sMyDir & sWbkSubName Dim buf As String On Error GoTo myError Open sMyDir & "3_結果\結果.xls" For Input As #1 Line Input #1, buf Close #1 On Error GoTo ErrorHandler2 If Dir(Mname) <> "" Then Workbooks.Open Filename:=Mname, Password:="aaaaa" Else Dim Wb1 As Workbook Set Wb1 = Workbooks("結果.xls") Set wbk結果 = Wb1.Sheets(StName) Dim wbkA As Variant Dim sShtName As String sShtName = "地域1" Dim Wb2 As Workbook Set Wb2 = Workbooks(vTgYear & "_算定表.xls") Set wbk地域A = Wb2.Sheets(sShtName) wbk結果.Range("F9:N9").Value = wbk地域A.Range("AB7:AK7").Value wbk結果.Range("F10:N10").Value = wbk地域A.Range("AB51:AK51").Value wbk結果.Range("F11:N11").Value = wbk地域A.Range("AB95:AK95").Value wbk結果.Range("F12:N12").Value = wbk地域A.Range("AB139:AK139").Value wbk結果.Range("F13:N13").Value = wbk地域A.Range("AB183:AK183").Value wbk結果.Range("F14:N14").Value = wbk地域A.Range("AB227:AK227").Value wbk結果.Range("F15:N15").Value = wbk地域A.Range("AB271:AK271").Value wbk結果.Range("F16:N16").Value = wbk地域A.Range("AB315:AK315").Value ≪後略≫ Application.DisplayAlerts = False wbk結果1.SaveAs Filename:=sMyDir & "3_結果\" & vTgYear & "_テスト.xls" ' Application.DisplayAlerts = True With Application .ScreenUpdating = True .Calculation = xlCalculationAutomatic End With Workbooks(vTgYear & "_算定表.xls").Close SaveChanges:=False MsgBox "計算期間" & "「" & kenko_Label_10 & "」で" & vbLf & "ファイルを作成しました。", vbInformation Close #1 Exit Sub myError: MsgBox "出力先の「結果_健康寿命」ファイルが存在しません。" & _ vbLf & "処理を終了します。", vbOKOnly + vbExclamation Exit Sub ErrorHandler2: MsgBox "指定年の「長野県健康寿命算定表」" & _ vbLf & "ファイルが存在しません。処理を終了します。", vbOKOnly + vbExclamation End If End Sub '////////////////////////////////////////////////////// メッセージ画面以外は正常に動作することを確認しています。 メッセージ画面について教えてください。 素人で申し訳ありませんが、よろしくお願い致します。

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

  • ベストアンサー
noname#203218
noname#203218
回答No.2

openステートメント前にdirでファイルの有無をチェックする方法は如何ですか? openステートメントのエラーハンドルは不要となります。 メッセージの表示させるコードを最下位にもっていきたいのであればmsgboxを指定している箇所にGoToでも使用して下さい。 ご参考まで。 Kname = sMyDir & sWbkName Mname = sMyDir & sWbkSubName ----------------------------------------------- ここから追加 Dim kflag, mflag As Integer 'それぞれのファイルが無い場合フラグを0、あればフラグ1にする。 If Dir(Kname) = "" Then kflag = 0 Else kflag = 1 If Dir(Mname) = "" Then mflag = 0 Else mflag = 1 '両ファイルが存在する場合は、GoTo mystartでVBA続行、存在しない場合、メッセージを表示しsubを抜ける If kflag = 1 And mflag = 1 Then GoTo mystart Else If kflag = 1 Then MsgBox "指定年の「長野県健康寿命算定表」" & _ vbLf & "ファイルが存在しません。処理を終了します。", vbOKOnly + vbExclamation ElseIf mflag = 1 Then MsgBox "出力先の「結果_健康寿命」" & _ vbLf & "ファイルが存在しません。処理を終了します。", vbOKOnly + vbExclamation Else MsgBox "指定年の「長野県健康寿命算定表」及び出力先の「結果_健康寿命」" & _ vbLf & "ファイルが存在しません。処理を終了します。", vbOKOnly + vbExclamation End If Exit Sub End If mystart: ここまで ----------------------------------------------------------------------- Dim buf As String Open sMyDir & "3_結果\結果.xls" For Input As #1 Line Input #1, buf Close #1

minminwamidori
質問者

お礼

修正させていただきましたが、ご提供いただいたコードを参考にやりたいことが実現できました。ありがとうございました。

その他の回答 (1)

回答No.1

http://officetanaka.net/excel/vba/file/file01.htm 上記参考に考えてみてください。

関連するQ&A

  • エクセルVBAでファイル作成

    エクセルVBAで、データをフィルタで抽出し、別なBOOKの指定シートに転記し、名前をつけて保存したいのです。一応、下記のコードでテストは成功しました。 しかし下記コードでは1回ごとにデータの転記先を開かなくてはなりません。 処理する件数が多いので、できればいちいち新たに開き直さなくともよい方法はないでしょうか? 最初から開いておいて、転記後名前をつけて保存すると、開いていたファイルが閉じてしまい、うまくいきません。 別BOOKでなく別シートに転記して、そのシートをMoveして別ファイル保存ならわかるのですが、今回はどうしても別BOOKに転記しなければなりません。 よろしくお願いします。 Option Explicit Sub データ分割転記()   Dim myPth As String, fname As String   Dim myRng As Range, myC As Range   Dim i As Long, x As Long   Dim wb(2) As Workbook   Dim ws As Worksheet   Dim t As Single   t = Timer   Set wb(0) = ThisWorkbook   myPth = wb(0).Path   With wb(0).Sheets("Key")     Set myRng = .Range("A2", .Range("A2").End(xlDown)) 'KeyData   End With      For Each myC In myRng     Application.EnableEvents = False     Set wb(1) = Workbooks.Open(Filename:=myPth & "\20150806TEST.xlsm")     Set ws = wb(1).Sheets("List")        With wb(0).Sheets("DATA")       .Range("A1:J1").AutoFilter Field:=4, Criteria1:=myC.Value       .Range("A2", .Range("A2").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy ws.Range("A9")       .ShowAllData     End With     With ws       x = .Cells(Rows.Count, "A").End(xlUp).Row       myC.Offset(, 2).Value = x '行数確認       .Range("A9").Value = 1       If x > 9 Then         .Range("A9").AutoFill Destination:=.Range("A9:A" & x), Type:=xlFillSeries '連番       End If     End With     wb(1).SaveAs Filename:=myPth & "\作成ファイル\" & myC.Value & ".xlsm"     wb(1).Close (False)     Application.EnableEvents = True     i = i + 1   Next   MsgBox i & "件を完了" _   & vbCrLf & Timer - t & " Sec." End Sub *Application.EnableEvents = False を使っているのば別BOOKが持つイベントマクロを作動させないためです。

  • excel vbaでの質問になります

    このようなマクロを作成したのですが、セルに数式が入れてあると、どうしてもその下の空白の行に値を入力されてしまいます。 数式が入っているセルにもそのままセルに値を入れたいのですが・・ 宜しくお願いします。 Dim wb1 As Worksheet, r1 As Range Dim N As Integer, i As Integer Dim mycount As Long   Set wb1 = ThisWorkbook.Worksheets("請求書") mycount = Range("B111").CurrentRegion.Rows.Count Cells(111 + mycount, 2).Select ActiveCell.Offset(0, 0).Value = wb1.Range("C60").Value ActiveCell.Offset(0, 1).Value = wb1.Range("C61").Value ActiveCell.Offset(0, 12).Value = wb1.Range("C66").Value ActiveCell.Offset(0, 13).Value = wb1.Range("C74").Value ActiveCell.Offset(0, 14).Value = wb1.Range("C75").Value ActiveCell.Offset(0, 15).Value = wb1.Range("C84").Value ActiveCell.Offset(0, 16).Value = wb1.Range("C85").Value ActiveCell.Offset(0, 20).Value = wb1.Range("C69").Value ActiveCell.Offset(0, 22).Value = wb1.Range("C68").Value ActiveCell.Offset(0, 23).Value = wb1.Range("C76").Value ActiveCell.Offset(0, 24).Value = wb1.Range("C77").Value Exit Sub

  • VBAのコピー

    VBAのコピー Dim xls As New Excel.Application Dim wbk As New Excel.Workbook Dim sh3 As Worksheet Set sh3 = Worksheets("全") sh3.Activate sh3.Range("A1:Z65536").Select Selection.Clear Set wbk = xls.Workbooks.Open("\\***.***.*.***\管理\全データ抽出.xls") wbk.Worksheets("全").Activate 'ワークシートをアクティブにする wbk.Worksheets("全").Range("A1:Z65536").Copy 'コピーする 'ActiveSheet.Paste Destination:=Worksheets("全").Range("A1") '貼り付ける Worksheets("全").Range("A1").PasteSpecial Paste:=xlPasteValues wbk.Close SaveChanges:=False 'Worksheets("メイン").Cells(1, 1).Select を実行すると 『wbk.Close SaveChanges:=False』のところで クリップボードに大きな情報があります。・・・・ と言うメッセージがでて必ずとまってしまうのですが メッセージをでないようにしたいのですが 教えてください。お願いします。

  • エクセルVBAのエラー

    よろしくお願いします。 VBA初心者のものです。 下記のコードを作成しましたが、 アプリケーション定義?がされていません というエラーが出ます。 わかりやすく教えていただけないでしょうか。 修正方法を教えてください。 0901名簿.xlsという名前の ファイルAのsheet1の 情報(ファイルBのセルBD1に日付4桁が記入されている)を ファイルBのセルA1の情報を元にファイルBのセルB1に抽出したい Sub 関数の挿入() Dim i As Long Dim あ As String Dim い As String Dim う As String あ="=VLOOKUP(A1,[" い=Range("BD1") う="名簿.xls]Sheet1!$F:$I,1,0)" For i = 2 To 50 Range("A" & i )= あ & い & う Next i End Sub

  • エクセルVBA ブック間のコピー

    選択したテキストファイルをエクセルで開いたコピーし、 もう一つ開いたエクセルファイルにペーストするというマクロをVBAで 作成していますが、つまずいてしまいました。 ----------------------------------- Dim wb1 As String Dim wb2 As String Sub Opentxt() wb1 = Application.GetOpenFilename("テキストファイル,*.txt") If wb1 <> "False" Then Workbooks.OpenText Filename:=wb1, DataType:=xlDelimited, comma:=True End If End Sub Sub Copy() Dim LastRow As Long wb2 = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") If wb2 <> "False" Then Workbooks.Open wb2 LastRow = wb2.Sheets("一覧表").Range("A" & Rows.Count). End(xlUp).Row wb2.Sheets("一覧表").Range("A5:A" & lastRow).Copy _ wb1.Sheets("Sheet1).Range("B33") End If End Sub ----------------------------------- Opentxtの方は問題ないですが、Copyの方を実行すると wb1とwb2で引っかかって「コンパイルエラー/ 修飾子が不正です」と 表示されて、エラーになってしまいます。 この場合変数の型などがおかしいのでしょうか? excel2007を使用しています。 よろしくお願いします。

  • 実行時エラー’438 の解消

    QNo.3040449 と同じ内容の質問です。本を見ながらコードを書いてみましたが、 実行時エラー’438 オブジェクトはこのプロパティまたは メソッドをサポートしていません。となってしまいました。 どこを変更すれば、よいのでしょうか? また、元データをそれぞれ、<条件>シートの内容で抽出し、 可視セルのみ<集約>にコピーしたのち、他の2つの ファイルのデーターも先に貼り付けたデータの最後行の 下へコピーしたいのですが、コードがよくわかりません。 教えて頂ければ幸いです。 集約するシート:テスト用.xls sheet1.(集約) sheet2.(条件) 元のデータ: 金額一覧表(01~03).xls Sheet1.(01~03)   金額一覧表(04~06).xls Sheet1.(04~06)  金額一覧表(07~10).xls Sheet1.(07~10) <各データは1.5万~3万件> Sub 抽出後コピー() Dim myTbl As Range, myQry As Range, sakiRang As Range Dim Nx As Long Dim WBK As Workbook, WB1 As Workbook Dim SH1 As Worksheet, SH2 As Worksheet Set WBK = Workbooks("テスト用.xls") Set WB1 = Workbooks("金額一覧表(01~3).xls") Set SH1 = WB1.Sheets("(01-03)") WBK.Activate WB1.Activate Nx = SH1.Range("R65536").End(xlUp).Row Set myTbl = WB1.SH1.Range("A1:Nx") ←ここでデバック Set myQry = WBK.Sheets("条件").Range("A1:F27") Set sakiRang = WBK.Sheets("集約").Range("A1") myTbl.AdvancedFilter xlFilterCopy, myQry, sakiRng End Sub

  • エクセルVBAでファイル保存失敗の原因?

    エクセル2010です。 Sheets("DATA")にある822件のデータを、D列のデータ(担当者名)をキーにフィルター抽出し、雛形のシートにコピーして、そのシートを別ファイルとして名前をつけて、指定したフォルダーのサブフォルダに保存するマクロです。(サブフォルダ名はデータのG列にある文字列です。) キーとなる担当の数は223です。 以下のコードで一応作動するのですが、同じデータを使っても2回に一回くらいの割合で保存ができず、 wb(1).SaveAs Filename:=SaveDir & "\" & bcde & "_" & Trim(myC.Value) & ".xlsx" のところで止まってしまいます。 エラーは 「実行時エラー1004 SaveAsメソッドは失敗しました。Workbookオブジェクト」 というものです。このとき、画面上ではあたらしいファイルが出来あがっております。しかしその出来てるファイルを手動で保存しようと思っても、 「○○○(ファイル名)は保存中にエラーが検出されました。いくつかの機能を削除または修復することによりファイルを保存できる場合があります」 とでてしまいます。 まだテスト段階で、同一のデータでテストしているのですが、止まるデータは30件目であったり、140件目であったり、まちまちです。2回に1回くらいは最後まで動き、すべて正しく作成され保存できているので、データの問題ではないと思います。 ほかにどんな問題が考えられるのでしょうか?とても困っています。 Sub TEST20151114()   Dim SaveDir As String, bcde As String, sbfdr As String   Dim wb(1) As Workbook   Dim i As Long, x As Long   Dim myRng As Range, myC As Range   Dim t      t = Time      Set wb(0) = ThisWorkbook   Set myRng = wb(0).Sheets("担当別").Range("B2:B224")   Application.ScreenUpdating = False   For Each myC In myRng     wb(0).Sheets("回答雛型").Copy After:=wb(0).Sheets("回答雛型")     wb(0).Sheets("回答雛型 (2)").Name = "回答シート"     With wb(0).Sheets("DATA")       .AutoFilterMode = False       .Range("A1:J1").AutoFilter       .Range("A1:J1").AutoFilter Field:=4, Criteria1:=myC.Value 'D列       .Range("A2", .Range("A2").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy Sheets("回答シート").Range("A2")       .ShowAllData       x = wb(0).Sheets("回答シート").Cells(Rows.Count, "A").End(xlUp).Row       .Range("A823:J827").Copy wb(0).Sheets("回答シート").Range("A" & x + 1) '予備5行追加     End With          With wb(0).Sheets("回答シート")       .Rows(x + 6 & ":" & .Rows.Count).Delete Shift:=xlUp       Application.Goto Reference:=.Range("A1"), Scroll:=True       bcde = CStr(Trim(.Range("E2").Value))       sbfdr = Trim(.Range("G2").Value) 'サブフォルダ名              .Move     End With          Set wb(1) = ActiveWorkbook          SaveDir = wb(0).Path & "\20151114\" & sbfdr '保存先     If Dir(SaveDir, vbDirectory) = "" Then       MkDir SaveDir '無ければサブフォルダ作成     End If          DoEvents          wb(1).SaveAs Filename:=SaveDir & "\" & bcde & "_" & Trim(myC.Value) & ".xlsx"     wb(1).Close (False)     myC.Offset(, 1).Value = x - 1          i = i + 1     Application.StatusBar = i & "/" & myC.Value     Set wb(1) = Nothing   Next myC      Set wb(0) = Nothing   Application.ScreenUpdating = True   MsgBox i & "個のファイルを作成しました。" & vbCrLf & Format(Time - t, "hh:mm:ss")   Application.StatusBar = "" End Sub

  • VBAで新しい日付順にファイルを検索するには?

    ExcelのVBA初心者です。 ファイルを新しい日付のものから順番に検索したいのですが、幾ら探しても分かりませんでした。どなたか教えていただけないでしょうか? やりたいことは、あるフォルダ内に毎日5~6個のファイルが保存されていくのですが、その中の決められたセルに指定した文字列が含まれているもの3つ場合分けしてファイルを出力したいのです。 例えば、  ファイル名   セルE1の内容    日付  123.xls     ”111111A”    6/29 15:39:40  456.xls     ”111111N”    6/29 15:35:10  789.xls     ”222222V”    6/29 15:20:43  654.xls     ”222222A”    6/29 14:30:21  321.xls     ”111111V”    6/29 14:10:33  951.xls     ”222222N”    6/28 17:52:15  753.xls     ”333333A”    6/28 17:30:50 とファイルがあり、セルE1に”111111”の文字列を含むファイルを検索し、  末尾に”V”があるもの → f(1)=321.xls  末尾に”N”があるもの → f(2)=456.xls  末尾に”A”があるもの → f(3)=123.xls と出力したいのです。 分からないなりに、いろいろ調べて切り貼りしながら作ってみました。 これで一応うまくいったのですが、検索する文字列は、必ず上記例のように新しい日付の5~6ファイルの中にあり、検索対象のフォルダ内には1000個以上ファイルがあります。 上記プログラムだと読み込む順番が最後になってしまいますので、恐ろしく処理時間が掛かってしまいます。 Sub ファイル検索() Dim buf As String, cnt As Long Dim i As Integer Dim wb(3) Dim bk As String, lot As String, lt As String Dim Path As String Application.ScreenUpdating = False lt = Cells(1, 5) bk = ActiveWorkbook.Name Path = Cells(1, 5) buf = Dir(Path & "*.xls") i = 1 Do While wb(1) = "" Or wb(2) = "" Or wb(3) = "" cnt = cnt + 1 Workbooks.Open Path & buf Select Case Cells(2, 5) Case Is = lt & "V" wb(1) = buf Case Is = lt & "N" wb(2) = buf Case Is = lt & "A" wb(3) = buf End Select Application.DisplayAlerts = False Workbooks(buf).Close Application.DisplayAlerts = True buf = Dir() Loop For i = 1 To 3 Workbooks(bk).Sheets(1).Cells(i, 1) = "wb(" & i & ")" & "=" & wb(i) Next i Application.ScreenUpdating = True End Sub 日付の新しいファイルから読み込む良い方法はないでしょうか? Excelのバージョンは、2003です。 出来れば、2003~2010で対応できる方法があれば、ベストです。 よろしくお願い致します。

  • Excel VBAで異なるファイル間のコピー

    異なるファイル間で値のみをコピーしたいです。下記の様な感じです。 hoge1.xlsのA1からA10のセルの値のみをhoge2.xlsのB1からB10へコピーする。 以下の様に書いてみたのですが、数式がコピーされてしまいます。 VBAをやったことがなく、今ネットで30分ほど見て書いてみたので 根本的に理解していません。簡単な書き方を教えていただきたいです。 Sub test() Dim Fname As String Fname = "hoge1.xls" Workbooks.Open Filename:=Fname, ReadOnly:=True Dim range1 As Range Set range1 = Worksheets("Sheet1").Range("A1:A10") range1.Copy Destination:=Workbooks("hoge2.xls").Worksheets("Sheet1").Range("B1:B10") End Sub また、ファイルを開いたり閉じたりは必要なのでしょうか? Workbooks.Open Filename:=Fname, ReadOnly:=True を書かずに、いきなり Set range1 = Workbooks("hoge1.xls").Worksheets("Sheet1").Range("A1:A10") はダメなのでしょうか?? よろしくお願いします。

  • VBAについて質問です。

    下記の様なコードがあり、EXCELのデータを別EXCELの指定シートの日付欄と合致させ、データを 貼り付けるという内容です。 ★部の所で実行時エラー '1004':RangeクラスのSelectメソッドが失敗しました。となってしまいます。 なぜか不明確なためアドバイスを宜しくお願い致します。 K2 = Range("K2") K3 = Range("K3") Dim wb As String Dim dy As String Dim dy2 As String Dim a As String dy = Range("K5") dy2 = Range("M1") Range("R5:R41").Copy wb = "D:\Documents and Settings\ssk\デスクトップ\" & dy & ".xls" Workbooks.Open (wb) Workbooks(dy & ".xls").Sheets("data").Select For n = 2 To 100 Step 1 a = Cells(1, n).Value If Cells(1, n).Value = dy2 Then Worksheets("data").Activate Cells(3, n).PasteSpecial Paste:=xlPasteAll Application.CutCopyMode = False End If Next 'err1: 'Excel.Application.CutCopyMode = False 'With ThisWorkbook 'If Workbooks.Count > 1 Then '.Saved = True ' .Close False ' Else ' .Saved = True ' Application.Quit '.Close ' End If 'End With End Sub

専門家に質問してみよう