• ベストアンサー
  • すぐに回答を!

ExcelVBA変数等でのファイルのOpen方法

ExcelVBAで、変数でのファイルのOpen方法を教えてください。 以下のフォルダ構造とします。 '////////////////////////////////////////////////////// マクロファイル.xls 1フォルダA  ∟1999ファイルA.xls  ∟2000ファイルA.xls  ∟2001ファイルA.xls  ∟2002ファイルA.xls  ∟2003ファイルA.xls  ∟2004ファイルA.xls ・・・ 2フォルダB  ∟1999ファイルB.xls  ∟2000ファイルB.xls  ∟2001ファイルB.xls  ∟2002ファイルB.xls  ∟2003ファイルB.xls  ∟2004ファイルB.xls ・・・ 3フォルダC  ∟結果ファイルC.xls '////////////////////////////////////////////////////// マクロファイル.xlsのシートにコンボボックスとボタンを配置します。 コンボボックスで【2001】を選択した場合は、 前後1年…合わせて合計3年分のファイルの「A5~A25」の値が、 「結果ファイルC.xls」にコピーされるようにしたいのです。 コピー内容や範囲が多く1つのプロシージャーに収まり切りませんでした。 そこで「結果ファイルC.xls」ファイルを1つめのプロシージャで開き、 2つめのプロシージャで残りの処理を実行しようとしたのですが、 変数、コンボボックスの値でのファイルを開く方法がわからず困っており、 どなたかお知恵をお貸し下さい。 以下のようなコードを書いてみましたがエラーとなりました。 '////////////////////////////////////////////////////// Dim vTgYear As Variant Dim myFLName1 As String, sWbkSubName1 As String Dim myFLName2 As String, sWbkSubName2 As String, SubName As String, vTgYear = ComboBox1.Value For i = -1 To 1 sWbkSubName1 = "3_フォルダC\結果ファイルC.xls" myFLName1 = ThisWorkbook.Path & sWbkSubName1 Workbooks.Open Filename:=myFLName1 SubName = "vTgYear + i & _ファイルA.xls" sWbkSubName2 = "1_フォルダA & SubName" myFLName2 = ThisWorkbook.Path & sWbkSubName1 Workbooks.Open Filename:=myFLName2 (実行コード中略) Next i '////////////////////////////////////////////////////// 今回はファイルの開き方だけなので、実行コードを省略させていただきました。 初歩的な質問かと思いますが、何卒お力をお貸しいただけますと幸いです。 よろしくお願い致します。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数227
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.1

こんにちは。 http://www016.upp.so-net.ne.jp/cheetah/xlvba/Excel/Workbook/Workbook07.html 「ブックを連続的に開く(For文を使用)」 http://www016.upp.so-net.ne.jp/cheetah/xlvba/Excel/Worksheet/Worksheet04.html 「シートをコピーする」 を組み合わせてみるのはどうでしょうか。 http://www016.upp.so-net.ne.jp/cheetah/xlvba/Excel/Range/index.html にはセルに関する方法もあります。^.^

参考URL:
http://www016.upp.so-net.ne.jp/cheetah/xlvba/

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • エクセル2007でVBAが動きません、助けて下さい

    先日、使用していたエクセルを2003から2007に変更した所、 オブジェクトのテキストが読み込めなくなってしまいました。 マクロの記録なども試したのですが、問題が解決せず 困っています。 原因が分かる方が入らしたら、ぜひとも教えてください。 =================================== Sub namae() Dim namae1 As String Dim namae2 As String namae1 = Application.Caller namae2 = ActiveSheet.Shapes(namae1).TextFrame.Characters.Text MsgBox namae2 End Sub

  • excelVBAコードを教えていただけませんか

    excel2000です。 下記コードが簡単そうと思いつつ、いざやろうとすると自分では作ることができず投稿させていただきました。どうかご教授の程よろしくお願いいたします。 excel2000 VBAのコードを教えていただけませんか ・「差し込み表示.xls」から「実験データ」へ値を読みに行き、表示させようとしています。 一日だけの日付をする場合は、下記に記載しているようなコードで対応できるのですが、月を指定して、30(31)日分のデータを読みにいく場合、どういうコードに変更していいか分からず、投稿させていただきました。 ■やりたいこと ・年月を「差し込み表示」のE1セルに記載して、データ読み込みを押すと、したのNO1~31(日付をあらわしています)にそれぞれ対応する値を表示させたい。 ■現物ファイル 現物ファイルを、下記にUPさせて頂きました。差し支えなければ確認いただけると幸いです。よろしくお願いいたします。 ■アップローダー 投稿NO4662 http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi ■一日で読み込むときのプロシ-ジャー Sub datatyuusyutu() Const sashikomiDisplay As String = "差し込み表示.xls" Const dataFile As String = "実験データ.xls" Dim i As Long Dim j As Long Dim k As Long Dim objectionrow As Long Dim lastRow As Long Dim targetDate As String Dim targetTime As String Dim data(1 To 43) As Double Dim dataFindFlag As Boolean Dim 対象フォルダ As String '検索する年月日を取得 targetDate = Range("E5").Value 対象フォルダ = ThisWorkbook.Path & "\" Workbooks.Open 対象フォルダ & dataFile lastRow = Cells(Rows.Count, "B").End(xlUp).Row 'B列の最終行を得る '年月日で検索 For i = 2 To lastRow If Cells(i, 2) = targetDate Then Cells(i, 2).Select dataFindFlag = True For k = 1 To 43 data(k) = Val(Cells(i, k)) Next k Exit For End If Next i Windows(sashikomiDisplay).Activate With Workbooks(dataFile) If dataFindFlag = True Then Cells(1, 2) = data(1) Cells(12, 3) = data(4) Cells(14, 6) = data(5) MsgBox "実行しました" Else MsgBox "データがありません" End If End With Workbooks(dataFile).Close savechanges:=False End Sub

  • ゾンビエクセル・・・(ExcelVBA)

    ExcelのVBAからAccessを起動し、エクセルファイルのインポートを行っています。 この処理を行うと、その後エクセルを閉じてもプロセスにエクセルが残ってしまいます。 なぜこうなってしまうのか判りません。よろしかったら教えてください(><) 一応コードを書いてみます。TransferSpreadsheetのコードを実行しない場合はゾンビエクセルは残らないので、それが原因だとは思うのですが他の方法がわかりません。 よろしくお願いいたします。 Dim appAccess As Object Dim acImport, fname As String, ffname As String acImport = "acImport" fname = ThisWorkbook.Path & "\取込.mdb" ffname = ThisWorkbook.FullName Set appAccess = CreateObject("Access.Application") appAccess.OpenCurrentDatabase fname appAccess.DoCmd.TransferSpreadsheet , 8, _ "torikomi", ffname, True, "torikomi" Set appAccess = Nothing

その他の回答 (2)

  • 回答No.3

minminwamidori さん 変数と定数が理解できていないような気がします。 例)SubName の値がおかしくなります。   SubName = "vTgYear + i & _ファイルA.xls"     → "vTgYear + i & _ファイルA.xls" がそのままSubName に設定されます。   SubName = vTgYear + i & "ファイルA.xls"     → "2001ファイルA.xls" がSubName に設定されます。 以下、プログラムを修正(命令数をコンパクトにしてあります)しました。  vTgYear = ComboBox1.Value  For I = -1 To 1   Workbooks.Open Filename:=ThisWorkbook & "\3フォルダC\結果ファイルC.xls"   SubName = vTgYear + I & "ファイルA.xls"   Workbooks.Open Filename:=ThisWorkbook.Path & "\1フォルダA\" & SubName       (実行コード中略)  Next I ご確認下さい。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

私の書き方が悪かったです。申し訳ありません。その後自力で解決できました。ありがとうございました。

  • 回答No.2
  • nda23
  • ベストアンサー率55% (773/1384)

パス名は「フォルダ\フォルダ\…\ファイル名」ですよね。 >myFLName1 = ThisWorkbook.Path & sWbkSubName1 これだと、自ブックのフォルダの最後と、"3_フォルダC・・・"の 間に"\"が入りません。自ブックがルートディレクトリならOK ですが… >SubName = "vTgYear + i & _ファイルA.xls" 気持ちは分かりますが、"vTgYear"で始まるパスなんか無いでしょ? SubName = CStr(vTgYear + i) & "_ファイルA.xls" このように数値(計算結果)を文字列化(CStr)し、固定の文字列と 組み合わせなければいけません。""の内側は単なる文字列で 計算や関数の効果は期待できません。 >myFLName2 = ThisWorkbook.Path & sWbkSubName1 せっかくsWbkSubName2に年度のファイル名を作ったのに無視して sWbkSubName1を使うんですか? 以下はサンプルです。 Dim 親パス As String 親パス = ThisWorkbook.Path '★親パスの最後が必ず"\"になるようにする If Right(親パス, 1) <> "\" Then 親パス = 親パス & "\" '★以下はForループの前に行う vTgYear = ComboBox1.Value '★同上 結果ファイルC.xlsを3回も開かないこと sWbkSubName1 = "3_フォルダC\結果ファイルC.xls" '★\付ける myFLName1 = 親パス & sWbkSubName1 Workbooks.Open Filename:=myFLName1 For i = -1 To 1   '★計算結果と固定文字列を結合する   SubName = CStr(vTgYear + i) & "_ファイルA.xls"   sWbkSubName2 = "1_フォルダA\" & SubName" '★\付ける   '★sWbkSubName1ではなくsWbkSubName2を使う   myFLName2 = 親パス & sWbkSubName2   Workbooks.Open Filename:=myFLName2 尚、変数名に日本語が使えるので、コピペしても動きます。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

遅くなりまして申し訳ありません。その後自力で解決させることができました。ありがとうございました。

関連するQ&A

  • ExcelVBA どこが間違えていますか?

    ExcelVBA 初心者です。 下記のようなプロシージャを人様の作ったのをコピーして作ったのですが意図したとおりになりません。どこが間違っているのか教えてください。 私の意図は選択したフォルダの中の全ファイル(Book)名をアクティブシートのA列に順番に表示したい、です。今は実行すると全部セルA1に表示されてしまって、最後の1つのファイル名しか分かりません。ファイルごとに別のセルに表示したいのです。よろしくお願いします。 Sub ファイル一覧() Dim foldername As String Dim filename As String Dim i As Integer Dim dlg_folder As FileDialog Set dlg_folder = Application.FileDialog(msoFileDialogFolderPicker) Folder_Dialog: dlg_folder.Show If dlg_folder.SelectedItems.Count <> 1 Then Exit Sub Else foldername = dlg_folder.SelectedItems.Item(1) MsgBox "選択したフォルダは " & foldername & " です。" filename = Dir(foldername & "\*.xls", vbNormal) If filename = "" Then MsgBox "Excelファイルがありません。" GoTo Folder_Dialog End If End If Set dlg_folder = Nothing Do While filename <> "" For i = 1 To Workbooks.Count Cells(i, 1).Value = filename i = i + 1 Next i filename = Dir() Loop MsgBox "フォルダ " & foldername & " の中のファイルはすべて表示されました。" End Sub あれ、なぜかインデントが無効になっています。

  • ExcelVBAコードの編集方法を教えてください

    「ExcelVBA別フォルダにあるブックのコピー方法」 http://okwave.jp/qa/q8488933.html 上記質問でコードを教えていただきました。 自分で編集しようと思ったのですが、どうにもうまくいきません。 編集したい内容としては、 出力する「ファイルC」に複数のシートがあるので、 それぞれのシートを指定して値をコピーしたいのです。 でも、別のシート名の指定がうまくいきません。 シートはフォーマットが決まったものが配置されているのですが、 1つのシートごとに数が異なります。 '////////////////////////////////////////////////////// Private Sub CommandButton1_Click() Dim vTgYear As Variant Dim sht結果 As Worksheet, sht上小 As Worksheet Dim sht保存 As Worksheet Dim sht元データ As Worksheet Dim sMyDir As String Dim sWbkFullName As String Dim sWbkName2 As String Dim sShtName As String Dim sMsg As String Dim i As Long Dim seru As Range vTgYear = ComboBox1.Value '  ● If Not vTgYear Like "####" Then MsgBox "年次を指定してからやり直し", vbExclamation Exit Sub End If Select Case vTgYear Case 1999 To 2012 '  ● Case Else MsgBox "1999&#65374;2012の間で年次を指定してからやり直し", vbExclamation '  ● Exit Sub End Select sMyDir = ThisWorkbook.Path & "\" With Application .ScreenUpdating = False '    .DisplayAlerts = False .Calculation = xlCalculationManual End With ' ' ファイルC_結果.xls を開く sWbkFullName = sMyDir & "3_フォルダC\ファイルC_結果.xls" '● sShtName = "地域A" '● On Error Resume Next Set sht結果 = Workbooks.Open(sWbkFullName).Sheets(sShtName) On Error GoTo 0 If sht結果 Is Nothing Then MsgBox sWbkFullName & vbLf & sShtName & vbLf & "開くことが出来ませんでした", vbExclamation Exit Sub End If ' ' 出力先のセル範囲を値消去 sht結果.Range("D7:F44,H7:J44,L7:L44,N7:Q44").ClearContents ' ' 前年&#65374;翌年、ループ For i = -1 To 1 ' ' 1_フォルダA sWbkFullName = sMyDir & "1_フォルダA\" & vTgYear + i & "_ファイルA.xls" sShtName = "Sheet1" On Error Resume Next Set sht元データ = Workbooks.Open(sWbkFullName).Sheets(sShtName) On Error GoTo 0 If sht元データ Is Nothing Then sMsg = sMsg & vbLf & "●" & sWbkFullName & vbLf & sShtName Else sht結果.Range("E7:E25").Offset(, i).Value = sht元データ.Range("C5:C23").Value sht結果.Range("E26:E44").Offset(, i).Value = sht元データ.Range("D5:D23").Value sht元データ.Parent.Close SaveChanges:=False Set sht元データ = Nothing End If ' ' 2_フォルダB sWbkFullName = sMyDir & "2_フォルダB\" & vTgYear + i & "_ファイルB.xls" '● sShtName = "Sheet1" '● On Error Resume Next Set sht元データ = Workbooks.Open(sWbkFullName).Sheets(sShtName) On Error GoTo 0 If sht元データ Is Nothing Then sMsg = sMsg & vbLf & "●" & sWbkFullName & vbLf & sShtName Else sht結果.Range("I7:I25").Offset(, i).Value = sht元データ.Range("C5:C23").Value sht結果.Range("I26:I44").Offset(, i).Value = sht元データ.Range("C25:C43").Value sht元データ.Parent.Close SaveChanges:=False Set sht元データ = Nothing End If Next i ' ' "ファイルC_2006&#65374;2008年結果.xls"形式の名前を付け保存して閉じる Application.DisplayAlerts = False sht結果.SaveAs Filename:=sMyDir & "3_フォルダC\" & ComboBox1.Value & "_ファイルC.xls" '  ● Application.DisplayAlerts = True With Application .ScreenUpdating = True '    .DisplayAlerts = True .Calculation = xlCalculationAutomatic End With Set sht結果 = Nothing If sMsg = "" Then MsgBox Label1.Caption & vbLf & "処理完了", vbInformation Else MsgBox sMsg & vbLf & "開くことが出来ませんでした", vbExclamation End If End Sub '////////////////////////////////////////////////////// 文字数制限のため全てのコードを書けなかったのですが、 (1)フォルダは複数ある (2)データ元のコピー方法は3種類   (1)コンボボックスで選択した前後2年のファイルの値をコピーする   (2)コンボボックスで選択した年次のみのファイルの値をコピーする   (3)範囲がどの結果の範囲に対しても同一の場合がある (1)(2)は教えていただいたコードでクリアしているのですが、 前の質問の時に結果のファイルにシートが複数あるのをお伝えするのを忘れてしまいました。 結果ファイルの複数のシートにコピーするにはどのように編集したらよいのか教えていただけますと幸いです。 締め切りが近くとても焦っています。 自分でどうにかできないのがお恥ずかしいのですが、どうかよろしくお願い致します。

  • エクセルのマクロ

    お世話になります。 Book1.xlsというファイルから、不特定のファイルを開き、一定の作業の後、閉じる場合のマクロについて伺います。 name1、name2のファイルを開き、vlookup関数を入力する場合のマクロの記載は、サイトを検索し、下記のようにすればできました。 Dim name1 As String Dim name2 As String sub macro1() 省略 Workbooks.Open Filename:=name1 Workbooks.Open Filename:=name2 Windows("Book1.xls").Activate Range("C6").Select ActiveCell.FormulaR1C1 = _ "=VLOOKUP(RC1,'[" & name1 & "]sheei1'!C1:C155,R1C,FALSE)" Range("C7").Select ActiveCell.FormulaR1C1 = _ "=VLOOKUP(RC1,'[" & name2 & "]sheei1'!C1:C155,R1C,FALSE)" (省略) ***************************** Windows("name1").Activate ActiveWindow.Close  Windows("name2").Activate ActiveWindow.Close ***************************** として、呼び出したファイルを(保存せず)閉じたいのですが、("name1")("name2")の部分の記載方法を教えてください。よろしくお願いします。

  • VBAにおいて、""内で変数を使用したい

    VBAにおいて、""内で変数を使用したい 0864_001.xls 0864_002.xls … 0864_009.xls というファイルがあるとき、0864_001.xlsを開く→処理→閉じる→0864_002.xlsを開く→… というように処理をしたいと思い、以下のようなマクロを作成しました。 Sub Test() Dim i As Integer For i = 1 To 9 Workbooks.Open ThisWorkbook.Path & "\0864_00i.xls" 処理 閉じる Next i End Sub 実行しようとしてもファイルを開くことが出来ずに困っています。 ""内で変数を使うことは出来ないのでしょうか? また、どのようにすれば実行できるようになるのか教えてください。

  • ExcelVBAでファイルコピー

    ExcelVBA2000です。 VBAでファイルコピーしたいのですがどのようにしたらよいのでしょうか。 Dim FromFile As String ' コピー元ファイル Dim ToFile As String ' コピー先ファイル Copy FromFile, ToFile とか FileSystemObject.CopyFile FromFile, ToFile とかのようには思うのですが出来ません。

  • 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でのファイルの開き方について

    いつもお世話になっております。(エクセル2010を使用) エクセルVBAを学習中の者です。 ダイアログボックスを表示してファイルを開く・・・というコードを記述しているのですが、分からない点があるためご指導をお願いします。 Sub Sample1() Dim openFileName As String openFileName = Application.GetOpenFilename filefilter:="Microsoft Excelブック,*.xls?" Workbooks.Open Filename:=openFileName End Sub を実行するとコンパイルエラーの構文エラーが表示されます。 Sub Sample2() Dim openFileName As String openFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") Workbooks.Open Filename:=openFileName End Sub を実行すると正常に動作します。 私の現在の知識ではSample1も正常に動作するはずなんですが・・・ (※コードはVBEをコピペしています) 両者の違いはなんでしょうか?(※スペルの間違いは無いとは思いますが・・・) どうぞよろしくお願いいたします。

  • EXCEL VBAで変数を使ってファイルを開きたいのですが。

    いつもお世話になります。Win98-EXCEL2000での作業です。 いくつかのファイルで同じ処理をしたいので、変数を使ってファイルを開くことができたらいいなと思って、こんな感じがいいなと作ってみたのですが、 Dim iii As Integer Dim myF As String For iii = 1 To 5 If iii = 1 Then myF = "偏貼_log" ElseIf iii = 2 Then myF = "Cof_log" ・・・と、5つのファイル名を入れて、 Workbooks.Open Filename:="myF.xls" としたいのですが、当然ここで変数が入っても「myF.xls」というファイルを探しに行ってしまいますよね・・・ こういう場合はどうすればよいのでしょうか。 宜しくお願いします。

  • vbaでファイルを開くパス名に変数を使いたい

    お世話になります。 下記の様にファイルを開く時のパス名に変数を使用したいのですが、 エラーがかかります。 ご教示頂けます様宜しくお願い致します、        記 Dim mywNm1 As String mywNm1 = Format(Now, "yyyymm") Workbooks.Open Filename:="C:\mywNm1_glp.xls", ReadOnly:=True

  • ExcelVBAのDir関数について。

    下記の処理の流れで、「dir_check = Dir(f_name2)」の処理があります。ここで、Excelのファイル名を取得して変数として登録し、 きちんとファイル名が取得出来ていれば、結果抽出の処理を呼び出す 流れに持って行きたいのですが、値を代入できません。 ファイル名は、Excelの施設ファイル名シートのC列から取得して、 同じものを「f_name2」で取得したパスから探し出す仕組みです。 ファイルの有無は、文字数をカウントして結果が0以上ならファイルありの処理です。上手く流す処理の仕方を教えてください。 ご教示頂けますようお願い致します。 For nendo = 1 To 2 path = Worksheets("スタート").Cells(11, 4) path = path & Worksheets("スタート").Cells(8 + nendo - 1, 4) & "\" For shisetsu = 1 To 188 f_name1 = Worksheets("施設ファイル名").Cells(shisetsu + 1, 3) f_name2 = path & Worksheets("施設ファイル名").Cells(shisetsu + 1, 1) & "\" & f_name1 dir_check = Dir(f_name2) If Len(dir_check) > 0 Then dir_err(shisetsu, nendo) = 1 Workbooks.Open Filename:=f_name2 Call 結果抽出 Workbooks(f_name1).Close End If Next shisetsu Next nendo