Openメソッドの使い方とエラーコード1004について
- Openメソッドを使用してブックAのデータをブックBにコピーする方法について説明します。
- Openメソッドはブックの場所を指定する必要がありますが、該当のブックのある場所を指定しなくても使用することができます。
- しかし、エラーコード1004「指定されたファイルが存在しません」が表示される場合は、指定したブックのパスが正しくない可能性があります。
- ベストアンサー
Openメソッドについて
ブックAのSheet1にあるセルのデータをブックBのSheet1のセルにコピーするために、以下のようにOpenメソッドを使ったVBAを記述してみたのですが、エラーコード1004「指定されたファイルが存在しません」のようなエラーメッセージが出てきました。Openメソッドが使われている例を見ているとどうやらブックのあるフォルダを指定しているような感じがするのですが、Openメソッドは具体的に該当のブックのある場所を指定しなくてはならないのでしょうか??(私がVBAを記述するにあたり参考にしたインターネットのVBAを紹介するページでは、ブックのある場所を指定せず、私が記述したように直にブック名を入力していました。) お忙しい中申し訳ないのですが、どなたかご教授いただけると、とても嬉しいです!よろしくお願いいたします。 Sub ブックAのデータをブックBに() With Workbooks.Open("ブックA.xlsx") .Sheets("Sheet1").Range("E8").Value = _ ThisWorkbook.Range("C2").Value End With End Sub
- osashi
- お礼率76% (45/59)
- Visual Basic
- 回答数1
- ありがとう数3
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんんちは。 > With Workbooks.Open("ブックA.xlsx") > .Sheets("Sheet1").Range("E8").Value = _ > ThisWorkbook.Range("C2").Value > End With のように、 フォルダパスを省略しても期待通りの結果が得られる 事の方がレアケースと考えた方がいいです。 具体的には、 「開こうとしているブック」 と 「マクロが記載されたブック=ThisWorkbook」※ とが 「同一のフォルダにある場合」※ にのみ、 "Workbooks オブジェクトの .Open メソッド" の引数'FileName'については、フォルダパスを省略可能、 ということです。 ※厳密には、引数'FileName'のフォルダパスを省略した場合は、 Excelからみたカレントディレクトリ(※可変)内にあるファイル を参照して開こうとする、ということになります。 従って、開こうとするブックが、 ThisWorkbookの存在するフォルダ(正しくははカレントディレクトリ) とは異なるフォルダに存在する場合には、 正しくフォルダパスを指定する必要があります。 With Workbooks.Open("C:\Users\UserName\Documents\ブックA.xlsx") とか、 With Workbooks.Open("D:\MyExcelBooks\ブックA.xlsx") とかのように。 省略可能とはいっても、カレントディレクトリ自体が変更可能ですので、 「開こうとしているブックとマクロが記載されたブックとが 同一のフォルダにある場合で省略可能」であっても、業務上は、 省略することに不確実さを抱えることになりますから、 With Workbooks.Open(ThisWorkbook.Path & "\" & "ブックA.xlsx") のような形で、半絶対的な参照を指す書き方が奨められます。 > Openメソッド 用語の省略には注意して下さい。 "Workbooks オブジェクトの .Open メソッド" です。 "Open メソッド"は、多数のオブジェクト・クラスに用意された よくある名前です。 同じ名前の地名が沢山存在するのと同じくらい、 属性を示さないと混乱の元に(伝わり難く)なります。 ついでに、 "Visual Basic" と ご質問の"Excel VBA" とは、これも 似て非なるものですので、 "Excel VBA"の質問であることを明示して質問するようにするか、 『Excel(エクセル)』カテゴリで質問するか、のどちらか、 また、ご質問の内容はご使用の環境によって回答内容が変わる 可能性があるテーマですので、 ご使用のOS、ExcelまたはOfficeのバージョンを明示して 質問するのがベター(解答が得られ易い)です。 以上、次にご質問なさる時に留意してみてください。 > ?(私がVBAを記述するにあたり参考にした > インターネットのVBAを紹介するページでは、 > ブックのある場所を指定せず、 > 私が記述したように直にブック名を入力していました。) 前後の文脈、例示された動作条件、など、 よく読んでみないと何とも言えないですけれど、 なんの説明もなく、唐突に"これで大丈夫"と書いてあるのなら、 かなり怪しい解説と言わざるを得ません、です。 ただ、今日のようにファイルを保存するフォルダを ユーザーが積極的に選択することが当たり前になる、 よりも昔の、当時の常識に副って無駄を省いて解り易く 易しく教えてくれていたようなサイトでは、 ありがちな親切、だったかも知れませんね。 "Workbooks オブジェクトの .Open メソッド"に限らず、 VBAにも限らず、 ファイルをファイル名だけを頼りに直接開く場合には、 努めて絶対的な参照を心掛けるのが今日的には好まれる、かと。 実は、ご提示の記述についても、 それが標準モジュールに記されたものであるならば、 他にも省略可能な部分(With ブロック)があります。 そっちは絶対的に参照しているのに、 フォルダパスは省略している、というのは、 なんだかアンバランス(歪)な印象でもあります。 無論、間違いが起こらない、という確信があるのなら、 積極的に省略したっていいのが、VBAマクロ、だと思いますが、 ご質問のような点で疑問を持つ間は、 例えば住所を書く時に必ず都道府県(国名?)から書く ような感覚で、一旦は絶対参照で書けるようにしてから、 今回ご質問のように、 どんな場合に省略可能なのか確認すること、 を押えておくと、ご自身で選んで書けるようになって吉、 と思いますです。以上です。
関連するQ&A
- アクティブでないシートのセルを選択
Excel VBAでアクティブでないシートのセルをSelectすることはできないのでしょうか。 Selectメソッドというのは,もともとそういうものなのでしょうか。 エラー: 「RangeクラスのSelectメソッドが失敗しました。」 コード Sub aaa() With Worksheets("Sheet2") .Range(.Cells(44, 1), .Cells(48, 21)).Select End With End Sub
- ベストアンサー
- その他MS Office製品
- エクセルVBA
VBAの素人です。 以下のようなVBAを実行しようと、何とか形にしました。 単独のBOOKではうまくいくのですが、同時に他のBOOKを開くと 「インデックスが有効範囲にありません」とエラーになります。 エラー箇所は、With Sheets("Sheet1").Range("B1")部分です。 修正をご教示頂ける方、何卒よろしくお願い致します。 全くVBA無知なのにすみません。 Private Sub Workbook_Open() test01 test02 Application.OnTime Now + TimeValue("00:10:00"), "終了" End Sub Sub 終了() Application.OnTime Now + TimeValue("0:00:02"), "test01", , False ThisWorkbook.Close Savechanges:=False Application.Quit End Sub Sub test01() With Sheets("Sheet1").Range("B1") .Value = Time .NumberFormatLocal = "mm:ss" End With Application.OnTime Now + TimeValue("0:00:02"), "test01" End Sub Sub test02() With Sheets("Sheet1").Range("B2") .Value = Time .NumberFormatLocal = "mm:ss" End With End Sub
- 締切済み
- オフィス系ソフト
- VBAにおけるセルの名前の参照方法
現在、Aシート、Bシートがあり、BシートのA1セルに test という名前を付けました。(範囲はブック) Aシートが再計算されれば、BシートのA1セルをメッセージボックスで表示したいのですが、調べましたが、よくわかりませんでしたので、詳しい方教えてください。 範囲はブックになっているし、他に同じセルの名前もつけれないようになっているので、 このような記述で大丈夫かと思いましたがエラーが出でしまいました。 なぜでしょうか?やはりわざわざ毎回シート名から記述が必要なのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) MsgBox (Range("test").Value) End Sub このようにシート名から書けば表示されました。 Private Sub Worksheet_Change(ByVal Target As Range) MsgBox (Worksheets("B").Range("test").Value) End Sub
- ベストアンサー
- その他MS Office製品
- Excel VBA セルの双方向同期のエラーについ
エラーが発生して理由がわからないので、どなたか助言をお願いします。 以下のVBAにて、目的のセルにデータを入力すると、1回目は必ず添付写真の通りのエラーが出まして、デバッグをすると3行目が黄色でハイライトされます。 記述は以下の通りです。どうぞよろしくお願いします。 シートAへのVBA設定 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$A$1" Then Sheets("シートB").Range("$B$1").Value = Sheets("シートA").Range("$A$1").Value End If End Sub シートBへのVBA設定 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$B$1" Then Sheets("シートA").Range("$A$1").Value = Sheets("シートB").Range("$B$1").Value End If End Sub
- ベストアンサー
- Visual Basic
- EXCEL VBA におけるブック終了後の値の保存方法について
EXCEL VBAについて質問があります。もしかしたら初歩的なことかもしれませんがよろしくお願いいたします。 まず、 Sub Test() Dim i As String i = InputBox("好きな果物を入力してください") Sheets("Sheet1").Range("A1").Value = i End Sub を実行し、ブックを保存して終了する。 ブックを開く Private Sub Workbook_Open() Dim k As String k = Sheets("Sheet1").Range("A1").Value If k = "みかん" Then MsgBox ("a") Else: MsgBox ("b") End If End Sub この処理を Sheets("Sheet1").Range("A1").Value = i というシート上のセルに値を保存するという方法を取らずに iの値をブック終了後もプロシージャ内に持っておくというのは可能なのでしょうか。 Publicで宣言してもブックを一度閉じると やっぱりiの値は保存されませんでした。 どうぞよろしくお願いいたします。
- ベストアンサー
- オフィス系ソフト
- なぜ張り付けは、「セルを指定+.Paste」ではだ
なぜ張り付けは、「セルを指定+.Paste」ではだめなのでしょうか? VBAを勉強しているのですが セルを指定+メソッドで セルに対して動作ができると覚えていました。 例えば、 Range("A1").Copy もRange("A1")でセルを指定して、Copyメソッドを使っています。 しかし、張り付けに関しては、 Range("A1").Paste をすると、 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438)」 と言うエラーになってしまいます。 それに、 「 Range("A1")」を入力して、「.」を入力すると、ヒントが出ますが そこにCopyはあるけど、Pasteは出てきません。 Pasteは特別な扱いなのでしょうか? そもそもPasteはメソッドではないのでしょうか? ちなみに Sub test() Range("A1").Copy Range("A2").PasteSpecial End Sub なら問題なくできました。 どなたか Range("A1").Paste がエラーになる理由を教えてください。 ご回答よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- Excelのセルのフォントサイズを自動調整
Excel97VBAの質問です。 セルの値が長すぎて表示しきれない場合は、フォントサイズを調整したい。 Sub Macro1() With Sheet1 .Columns("A").ColumnWidth = 1 .Range("A1").Value = 1 .Range("A2").Value = 12 .Range("A3").Value = 123 .Range("A4").Value = 1234 End With End Sub この場合、A2~A4の表示が潰れます。 フォントサイズを例えば、 Sub Macro2() .Range("A2").Font.Size = 7 .Range("A3").Font.Size = 5 .Range("A4").Font.Size = 3 End Sub と設定すれば潰れずに値が表示されます。 このようなフォントサイズの最適値を自動的に設定したい。 よろしくご指導お願いします。
- ベストアンサー
- Visual Basic
- ハイパーリンクのアドレスを取得したい
A1セルにリンクが張ってあるのですが、 それをVBAを使って、B1セルにA1のアドレスを書き出したいのですが、 どうすればいいですか? Sub test() Range("b1").Value = Range("a1").Hyperlink.Address End Sub だと、 「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」 となってしまいます。
- ベストアンサー
- Visual Basic
- エクセルVBA:取得したファイル情報を別シートに貼るには・・・
いつもお世話になっています。 今エクセルVBAで指定したフォルダ内のファイル情報を取得し、sheet2に貼り付けるものを作っています。 指定したフォルダ内のファイル情報を取得するまでは分かったのですが、作ったVBAを実行するとsheet1のA2セルから自動的に貼り付けられてしまいます。 sheet2のA1セルから貼り付けるにはどうすれば良いのでしょうか?? 作ったVBAはこんな感じです。 まず、フォルダのパスを取得しA2セルへ表示します。 Sub test2() With Application.FileDialog(msoFileDialogFolderPicker) If .Show = 0 Then Exit Sub Range("A2").Value = .SelectedItems(1) End With End Sub 次に、A2セルの値を使ってファイル名を取得しました。 Sub Test() Dim i As Long Dim pass As String pass = Range("A2").Value With Application.FileSearch .NewSearch .LookIn = pass .FileType = msoFileTypeAllFiles .SearchSubFolders = True If .Execute() > 0 Then For i = 1 To .FoundFiles.Count Cells(i + 1, 1) = .FoundFiles(i) Cells(i + 1, 3) = FileDateTime(.FoundFiles(i)) Next i End If End With End Sub です。 長くて申し訳ありません。よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- シートにデータがなければ削除するVBA
こんばんは、VBAについて質問させてください(^O^) あるブックに32個のシートが入っています。 32個のシートのうち、セルA2にデータの入っているシートとそうでない シートがあります。(毎回変動します。) これを踏まえて、セルA2にデータが入っていればそのまま、 入っていなければそのシートを削除。 という作業をVBAでやろうと思って以下の通りVBAを記述したのですが、 シートが削除されるとシートの数が変わってしまうので、これではだめだと 思ったのですが、どのように記述すればいいのか分かりません(T_T) どなたかご教授いただけないでしょうか、よろしくお願いいたします。 Sub Macro1() Application.DisplayAlerts = False Dim i As Integer For i = 1 To 32 Sheets(i).Select If Range("A2").Value = "" Then Sheets(i).Delete End If Next i End Sub
- ベストアンサー
- Visual Basic
お礼
非常に丁寧な解説いただき、ありがとうございます!なるほど…同じ場所にある場合のみフォルダの場所などは省略が可能なのですね!(;゜Д゜)ブックはデータを扱う人によって移動させたりもするので、データはこれからなるべく同じブック内の別シートに貼り付けすることにします! また、カテゴリ違いもご指摘いただきありがとうございました!