Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6484 / 13644 ツリー ←次へ | 前へ→

【44956】ディレクトリが異なる場合 tomo 06/12/8(金) 10:35 質問[未読]
【44957】Re:ディレクトリが異なる場合 Jaka 06/12/8(金) 10:52 発言[未読]
【44973】Re:ディレクトリが異なる場合 tomo 06/12/8(金) 15:44 お礼[未読]

【44956】ディレクトリが異なる場合
質問  tomo  - 06/12/8(金) 10:35 -

引用なし
パスワード
   「Workbook オブジェクト」についてヘルプを参照すると”開かれているすべてのブックを表す Workbooks コレクション”とかかれています。例として,moji = Workbooks("sample1.xls").Sheets("Sheet1").Range("A1").value のような使い方をすると思います。
たとえば,"sample1.xls" が ThisWorkbook.Path と異なるディレクトリに保存されている場合でも,ファイルが開いている状態であれば,マクロ実行の際には問題ないと思います。

そこで質問なのですが,"sample1.xls" が閉じている状態では,moji = Workbooks("sample1.xls").Sheets("Sheet1").Range("A1").value はどのような書き方に代わるのでしょうか?

具体的には次のように記述したものを書き換えたいと思っています。(ブックが開いている状態では問題なし)

Set wk1 = Worksheets("summary")
wk1.Cells(2, 4).Value = Application.WorksheetFunction.Index( _
      Workbooks("sample1.xls").Sheets("Sheet1").Range("P:P"), _
      Application.WorksheetFunction.Match(Range("$A2"), _
      Workbooks("sample1.xls").Sheets("Sheet1").Range("A:A"), 0), 1)
ブックは "sample1.xls" , "sample2.xls" というように複数あり(全てディレクトリが異なります),シート数も複数あり,If や Select Case 等で使い分けしたいため,Set ステートメントや変数等で表したいと思っています。
なお,
wk1.Cells(2, 5).Value = Application.WorksheetFunction.Index( _
      Workbooks("sample1.xls").Sheets("Sheet1").Range("Q:Q"), _
      Application.WorksheetFunction.Match(Range("$A2"), _
      Workbooks("sample1.xls").Sheets("Sheet1").Range("A:A"), 0), 1)
というようにループさせたいと思っています。

やはり,Workbooks.Open 等でブックを一度開かせて,処理させ,Close させ,別のブックを開くのような手順をさせる方法がいいのでしょうか?
【44727】の質問の際,やたらといろんなブックは開かない方がいいですよと,アドバイスを頂いたため,なんとかコードが記述されているブック以外開かないコードを作ろうと挑んだのですが,行き詰まり質問させて頂きました。
宜しくお願いします。

【44957】Re:ディレクトリが異なる場合
発言  Jaka  - 06/12/8(金) 10:52 -

引用なし
パスワード
   ▼tomo さん:
>やはり,Workbooks.Open 等でブックを一度開かせて,処理させ,Close させ,別のブックを開くのような手順をさせる方法がいいのでしょうか?
マクロでエクセル関数を使って他ブックを参照する場合、参照先ブックは開いていないとエラーになると思いますが......。
開くのがいやなら、セルに関数を書き込んだほうが良いと思います。
Evaluateを使えばとも思いましたが、確認したことは無いです。

【44973】Re:ディレクトリが異なる場合
お礼  tomo  - 06/12/8(金) 15:44 -

引用なし
パスワード
   ▼Jaka さん:
>開くのがいやなら、セルに関数を書き込んだほうが良いと思います。

リンクが出来るのが嫌だったため,Application.WorksheetFunction でなんとか出来ないものかと悩んでいたのですが,やはり,書き込む方法がいいようですね。
P:P→・・・→Z:ZのループもR1C1形式にすることで解決できました。

Set wk1 = Worksheets("summary")
dpath = Thisworkbook.Path & "\Case1"
shtname = "\[sample1.xl]"
numcolumn = 16
fname = dpath & shtbame
For i = 1 to 11
 wk1.Cells(2, i + 3 ).Value = "=INDEX('" & fname & "summary1'!C" & numcolumn + 1 & ",MATCH(RC1, '" & fname & "summary1'!C1,0),1)"
Next i

最後に数値の貼り付け直しを行い,リングを外すよう対処することにします。
ご助言,ありがとうございました。

6484 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free