質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

36176閲覧

エクセルマクロでセルに記入してあるパスから指定のブックを開きたい。

macro-beginner

総合スコア25

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2017/01/25 01:08

編集2017/01/25 02:01

イメージ説明

エクセルマクロでセルに記入してあるパスから指定のブックを開きたい。

上記画像のK1の部分に任意の数値、例えば3といれるとその数値分、C2からC4までのパスからブックを開けるようにしたいのですが
どうしても見つかりませんとでてしまいます。

イメージ説明

イメージ説明

ファイル名は間違ってないし、パスも間違いないです。

となるとコードが問題だと思うのですが何がダメなのかわかりません。
なので教えていただきたいです。

よろしくお願い致します。

Sub Graph() Dim op As Worksheet Dim cPath As String Set op = Workbooks("CAB-Grapf.xls").ActiveSheet cPath = op.Range("B1").Value Application.ScreenUpdating = False 'シートを追加 Worksheets.Add After:=Sheets("DATA"), Count:=op.Range("K1").Value Dim i As Integer For i = 1 To op.Range("K1").Value If i > 10 Then '入力値が予定数を超えてしまったら終了 MsgBox "シートが追加されていません。" Exit For End If Sheets("sheet" & i).Select 'シート名部分を sheet と i で組み合わせて作る ActiveSheet.Name = op.Range("B2").Offset(i - 1, 0).Value 'B2セルを先頭に行方向にオフセット Next 'シート追加ここまで 'WorkBookを開く Sheets("DATA").Select For i = 1 To op.Range("K1").Value If i > 10 Then MsgBox "Bookがそんなにありません" Exit For End If Workbooks.Open op.Range("C2").Offset(i - 1, 0).Value Next End Sub

あと、もう一つあるのですが、

Workbooks.Open op.Range("C2").Offset(i - 1, 0).Value

のOffsetの部分をなんとなく使っていてあまり理解できてないのですが、
C2を起点としてOffset(i - 1, 0).ValueをするとなぜC2から行が順に下がっていくのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

単純なミスです。

コードの最後のほうにあるWorkbookを開いてゆくループの中を見てみましょう。
Workbookを開く下記のコードです。

Workbooks.Open op.Range("C" & i).Offset(i - 1, 0).Value

ループでiの値は1から始まりますから、実行されるコードは

Workbooks.Open op.Range("C1").Offset(0, 0).Value

質問のExcelのスクリーンショットを見るとC1セルは空ですから、ファイルパスを指定せずに(空を指定して)Workbookを開くことになります。
ファイルが見つからないというエラーが出るのは、当然ですよね。

== 修正案 ==

ファイルパスはC2~C11セルに入っているようですから、以下のようにコードを修正すれば正常に動くはずです。

Workbooks.Open op.Range("C" & (i + 1)).Value

あるいは、

Workbooks.Open op.Range("C2").Offset(i - 1, 0).Value

投稿2017/01/25 01:59

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macro-beginner

2017/01/25 02:05

とてもわかりやすいご説明ありがとうございます! あと、もう一つあるのですが、 Workbooks.Open op.Range("C2").Offset(i - 1, 0).Value のOffsetの部分をなんとなく使っていてあまり理解できてないのですが、 C2を起点としてOffset(i - 1, 0).ValueをするとなぜC2から行が順に下がっていくのでしょうか?
guest

0

Workbooks.Open op.Range("C" & i).Offset(i - 1, 0).Value

変数 i の変化に注意

i=1 で始まっているので Range("C" & i) の部分の最初は

Range("C" & 1)Range("C1")

となりますね

ファイルパス情報はC2から入っているので参照場所が間違っています

Workbooks.Open op.Range("C2").Offset(i - 1, 0).Value '参照先セルを固定してオフセットで変化

または

Workbooks.Open op.Range("C" & (i+1)).Value '参照先セルそのものが変化しているのでオフセット不要

が正しいですね

投稿2017/01/25 01:20

編集2017/01/25 03:08
takito

総合スコア3111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

VBA

1Workbooks.Open op.Range("C" & i).Offset(i - 1, 0).Value

で、最初のループでは i が 1 なので、
参照しているセルは C1 になってしまっています。
正しくはこうでしょうか。

VBA

1Workbooks.Open op.Range("C2").Offset(i - 1, 0).Value

投稿2017/01/25 01:17

twyujiro15

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macro-beginner

2017/01/25 01:58

あ・・・なんていうミス・・ 気づけなかったです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問