Excelで2つのファイルを参照する方法

このQ&Aのポイント
  • Excelを2つ起動し、VBAやワークシート関数を使用して1つのファイルから別のファイルのセル値を参照する方法について教えてください。
  • Excelで2つのファイルを開き、DDE接続を使用してリアルタイムにデータを更新しています。DDE接続の仕組みやVBAについての知識が浅く、セル値を反映させることができません。
  • Excelのファイル「ティック」の「連続」ワークシートのQ1〜Q6セルとR1〜R6セルの値を別のファイル「板とチャート」の「板」ワークシートのC5〜C45セルとI5〜I45セルにリアルタイムに表示させたいのですが、実行時エラーが発生し、うまくいきません。どのように修正すれば良いでしょうか?
回答を見る
  • ベストアンサー

あえてエクセルを2つ起動してセルを参照する方法

ご質問させていただきます。 Excel2007を2つ起動します(あえて2つ起動する必要があります)。1つのExcel上に2つのブックを開くのではありません。 1つ目のExcel2007をExcel(1)と呼び、2つ目のExcel2007をExcel(2)と呼ぶことにします。 Excel(1)で開くファイル名は「板とチャート」で、Excel(2)で開くファイル名は「ティック」です。 Excel(1)とExcel(2)は同一のデータベンダーとDDE接続しており、平日の午前9時~午後3時までリアルタイムでデータが更新されます。 それぞれ受信したデータをVBAやワークシート関数で加工して各シートに表示しています。 このDDE接続はデータベンダーが提供するものであり、プロシージャはパスワードでロックがかかっており、私は見る事もいじる事も出来ませし、そもそもVBAに関して初歩的な知識しかないため、DDE接続自体をよく理解しおらず、いじれません。 今回やりたいことを以下に記します。 Excel(2)のファイル名「ティック」ワークシート名「連続」のQ1,Q2,Q3,Q4,Q5,Q6セルのそれぞれの値をExcel(1)のファイル名「板とチャート」ワークシート名「板」のC5,C13,C21,C29,C37,C45に表示させ、同様に、Excel(2)のファイル名「ティック」ワークシート名「連続」のR1,R2,R3,R4,R5,R6セルのそれぞれの値をExcel(1)のファイル名「板とチャート」ワークシート名「板」のI5,I13,I21,I29,I37,I45に表示させたいのです。 なお、Excel(2)のQ1~Q6セル及びR1~R6セルの値はそれぞれIF関数で"A","B"または空欄にリアルタイムで変化します。 従いまして、その"A","B",空欄をExcel(1)のファイル名「板とチャート」ワークシート名「板」のC5,C13,C21,C29,C37,C45セル及びI5,I13,I21,I29,I37,I45セルにリアルタイムに反映させたいのです。 なお、Excel(2)のIF関数の"A","B"または空欄を判定する各セルはcalculateイベントで1秒間に複数回更新されるカウンターになっています。 従いまして、IF関数の"A","B"又は空欄は1秒間の間に変化することもあります。 以上の事を実現いたしたく、以下を試してみました。 Sub できるかな() Dim xlApp As Application Set xlApp = GetObject("C:\Users\hoully\Desktop\ティック.xlsm", "Excel.Sheet").Application Worksheets("板").Range("C5") = xlApp.Worksheets("連続").Range("Q1").Value End Sub 実行すると、VBAprojectにVBAproject(ティック.xlsm)が追加されるのですが、 「実行時エラー 9 インデックスが有効範囲にありません。」 と表示され、Worksheets("板").Range("C5") = xlApp.Worksheets("連続").Range("Q1").Valueが黄色になります。 Worksheets("板").Range("C5") = xlApp.application.Worksheets("連続").Range("Q1").Valueとやっても同じ事が起こりました。 次に、以下を試してみました。 Sub できるかな2() worksheets("板").range("C5").formula= "=INDEX([C:\Users\hoully\Desktop\ティック.xlsm]sheet2!Q1:R6,1,1))" End Sub 「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」 と表示されてしまいます。 私はExcelもVBAも初心者で、非常に単純なプロシージャを作るにも本やネットを参照しなければ作れないレベルです。 そのため、どこが悪いのかよくわかりません。 どなたか教えていただけないでしょうか? よろしくお願いいたします。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

特段マクロを使わなくても,前回お話ししていたようにDDEの式を記入しておくだけで競合せずにリアルタイムでリンクするはずですが,そちらは具体的にどのような不都合があったのでしょうか? もう一度同じ内容ですが作成例: >Excel(2)のファイル名「ティック」ワークシート名「連続」のQ1,Q2,Q3,Q4,Q5,Q6セルのそれぞれの値をExcel(1)のファイル名「板とチャート」ワークシート名「板」のC5,C13,C21,C29,C37,C45に表示させ Excel(2)のティック.xlsのシート名「連続」のQ1:Q6に MyRng1 と名前を定義する Excel(1)の板のC5に =INDEX(Excel|ティック.xls!MyRng1,1) と数式を記入する #もちろん,ブック名は拡張子を含めて正確に記載すること

hoully
質問者

お礼

keithin 様 ご回答ありがとうございます。 >特段マクロを使わなくても,前回お話ししていたようにDDEの式を記入しておくだけで競合せずにリアルタイムでリンクするはずですが,そちらは具体的にどのような不都合があったのでしょうか? はい。前回は以下のご回答をいただきました。 >たとえば元のブックのA1からA48のセル範囲にTargetと名前を定義しておき,=INDEX(excel|book2.xls!Target,ROW(A1)) これを見て、私はExcelを2つ起動しているのでexcel|book2.xls!の部分にファイルフルパスを記入する必要があるのだと思い込み"=INDEX([C:\Users\hoully\Desktop\ティック.xlsm]sheet2!Q1:R6,1,1))"としたのですが、根本的に間違っていたみたいですね。 今回教えていただいた方法を試してみました。 まず、Excel(2)のティック.xlsmのシート名「連続」のQ1からQ6までをドラッグして右クリックし、「範囲に名前を付ける」を選択し、MyRng1と名前を付けました。 次に下記のプロシージャを実行してブックの名前を取得しました。 Sub ブックの名前() MsgBox "現在のブック名:" & ActiveWorkbook.Name End Sub 実行すると「現在のブック名:ティック.xlsm」と表示されたので、 Excel(1)の板のC5に =INDEX(Excel|ティック.xlsm!MyRng1,1) と入力いたしました。 すると、C5に#REF!と表示されてしまいました。 ここで行き詰ってしまいました。 どのようにすればよろしいでしょうか? 教えてください。 よろしくお願いいたします。

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

追加の情報提供で書かれている#REFが出る前に,「外部データにアクセスできません」のダイアログが出ていた場合,Excelのオプションの詳細設定の欄でダイアログをずっと下に下げたところにある「Dynamic Data Exchange(DDE)を使用する他のアプリケーションを無視する」のチェックが入っているのかも?しれません。チェックを外し,全部のエクセルを再起動します。 または,Excel(1)とExcel(2)を別個に起動したいがために,何か特別な細工を以前にしていた場合は,それが悪さをしている可能性もあります。 別の可能性としては,「MyRng1」を設定する手順が実は書かれているのと違うことをしていて,INDEX関数が正しく計算できていない場合にも#REFが出る事が考えられます。 別のエクセルでティック.xlsmを開いておいた状態で,こちらのエクセルのセルに =excel|ティック.xlsm!myrng1 とだけ記入して,myrng1の先頭セルの値が参照できれば成功になります。

hoully
質問者

お礼

keithin 様 できました!ありがとうございます! >Excelのオプションの詳細設定の欄でダイアログをずっと下に下げたところにある「Dynamic Data Exchange(DDE)を使用する他のアプリケーションを無視する」のチェックが入っているのかも?しれません。 チェック自体は入っていなかったのですが、ある事に気が付きました。 地震の影響でデータベンダーとのDDEリンクが来週まで接続できません。 そのため、EXCELの数式バーの上に「セキュリティーの警告 リンクの自動更新が無効にされました (オプション)」と表示されていました。この(オプション)をクリックし、リンクの接続を色々といじっていたらできるようになりました。 複数回に渡りご回答いただきまして本当にありがとうございます。 また、私の説明不足のためにお手数をおかけしたことをお詫び申し上げます。 ありがとうございました。

関連するQ&A

  • エクセルのセル参照について

    エクセル2007でワークシートAのセル参照をワークシートBのセル(20カ所位)で設定しています。このワークシートBのセル参照のワークシート名をAから新たに作成するワークシートCに効率良く変更する方法はありますか?

  • エクセルの開放

    VB2008でエクセルを操作しているのですが、エクセルのプロセスが残ってしまってどうやって解放すればいいのかわかりません。 サンプルプログラム-------------- Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Dim xlobj As Object '開放用 xlobj = xlSheet.Range("A1:C3") xlobj.Value = "TEST" MRComObject(xlobj) MRComObject(xlSheet) MRComObject(xlSheets) xlBook.Close(False) MRComObject(xlBook) MRComObject(xlBooks) xlApp.Quit() MRComObject(xlApp) MRComObjectでCOM オブジェクトへの参照を解放しています。 このプログラムでは特に問題ないのですが、 xlobj = xlApp.Worksheets("Sheet2") xlobj2 = xlobj.Range("A1:C2") xlobj2.Value = "TEST" のようにワークシートを指定すると解放できません。 xlSheet = xlBook.Worksheets("Sheet2") としてもプロセスが残ります。 またVB6.0では可能だった xlApp.Worksheets("Sheet2").Select() のようにワークシートを切り替えるときもVB2008ではプロセスが残ってしまいます。 これはどのようにしたら解決するのでしょうか?

  • セル値のシート参照

    excel2010 セル値のシート参照がうまく動作しません。 構成は下記です。 ディスクトップにa.xlsmのファイル。シート名称はSheet1、シート計算は手動にしています。 Cドライブのtempフォルダにabc.xlsというファイルを登録しています。 C:\TEMP\abc.xls abc.xlsのファイルは、シート名称が(日付け)という構成です。 9/1だと(1)、9/23だと(23)の様になっています。 a.xlsmのファイルからマクロを使い、日付けに相当するシートを表示させようとしています。 a.xlsmのQ2セルには日付けのデータが入ります。表示形式は9/23みたく。 Q3セルは、="("&TEXT(Q2,"dd")*1&")" これで、日付けからabc.xlsファイルのシート名称を参照させる構成です。 作成したマクロは下記です Sub マクロからブックを開く2() Worksheets("Sheet1").Activate Dim t As String t = Range("Q3").Value Debug.Print t ’Q3セル値を更新させる為に計算実行 Calculate Workbooks.Open "C:\TEMP\abc.xls" Worksheets(t).Activate End Sub 上記だと、Q2セルの日付けを変えても1つ前の日付けで参照されます。 上記を2回そのまま実行すると正しく反映されます。 Debug.Print tでも更新されていないのが分かります。 なぜなのでしょうか? ちなみに、下記の様にマクロを分割すると、正しく表示されます。 Sub マクロからブックを開く() Worksheets("Sheet1").Activate Dim t As String t = Range("Q3").Value Debug.Print t Calculate cal End Sub Sub cal() Dim t As String t = Range("Q3").Value Debug.Print t Workbooks.Open "C:\TEMP\abc.xls" Worksheets(t).Activate 'Call カレントフォルダの表示 End Sub 上記の様に2つに分けると Debug.Print tで更新されていることが確認出来ます。 1つ目のマクロ マクロからブックを開く2 のおかしな内容の理由と対策内容を教えていただきたく、よろしくお願いします。

  • excelのセル参照

    vba初心者です。 excelのvbaでセル範囲(rangeなど)を指定して数値の入力や参照をしますが vbaを使わずに元のワークシート側で行・列の挿入、削除した場合 vbaにはその分反映されません。(当然ですが) Range("C3:D4")の場合、B列に列を挿入したらRange("D3:E4") となるような。 vbaの修正を最小限に抑える簡単で良い方法はありますか。

  • VBA セル参照のパスを汎用性を持たせたい

    皆様よろしくお願いします。マクロの記録で作成後、少し手直しをする程度の初心者です。 エクセル2000にて統合のマクロを作っています。 複数のシートの参照はしません。 統合元のワークブック名を汎用性をもたせたいと考えています。 今は"日別スケジュール"というブック名でしかマクロが使えません。 シート名は"チェックシート"固定名です。 (1)アクティブなワークブックの"チェックシート"シートを参照セルにすることはできますか? (2)また、R1C3:R5000C9はいつも同じではありません。指定方法がわからないので大きめに指定してます。可変にすることはできますか? With Worksheets("チェックシート") .Range("J1").Consolidate _ Sources:="[日別スケジュール]チェックシート!R1C3:R5000C9", _ Function:=xlSum, _ TopRow:=True, LeftColumn:=True, _ CreateLinks:=False End With

  • エクセルで、ワークシート名をセルから参照する

    エクセルで、ワークシート名をセルに表示する方法は書いてありますが、セルの値をワークシート名とするにはどうしたらいいでしょうか。 つまり、 「ワークシート名 → セル」 ではなく、 「セルの値 → ワークシート名」 ということです。 現状、会社が変わると決算期が変わるため、決算期を変更する度にワークシート名を変えていますが、変わった都度ワークシート名を手で変更するのは手間が掛っています。 具体的には、例えば、 3月決算の会社のファイルは、4月シート、5月シート・・・ 12月決算の会社は、1月シート、2月シート・・・ のようにシート名を変えています。 そのため、セルに決算期を入力すると、自動で各ワークシート名も変更するようにしたいのですが、どうしたらいいでしょうか。 そういう関数はないようですし、マクロ・VBAの本等を見ても、よくわかりません。 宜しくお願い致します。

  • Excel VBA 複数のSheet の合計

    Excel VBA  超超 初心者です。見よう見まねで、複数のSheet の L11:Q1000 ,T1:AW100 セル範囲にある文字 "~" を計算できたのですが、 更に各Sheet で計算された合計をしたいのですが、さっぱり判りません。Sheet 名は、バラバラです。合計は、最初か最後のsheet のどこかのセルに表示させたいです。どなたかヒントをてください。よろしくお願いします。 Sub すべてのシートでマクロ実行() Application.ScreenUpdating = False Dim シート As Worksheet For Each シート In Worksheets シート.Select Range("H3").Select ActiveCell.FormulaR1C1 = "=COUNTIF(R[8]C[4]:R[997]C[9],""*~*"")" Range("I3").Select ActiveCell.FormulaR1C1 = "=COUNTIF(R[-2]C[11]:R[997]C[40],""*~*"")" Range("I4").Select Next Application.ScreenUpdating = True End Sub

  • Excel vba selectが効かない

    2と3の2つのエクセルファイルがあります。縦の列を新しいファイルの横の行に コピーしていきたいプログラムです。 2のファイルの1シート目の"C8:C25" 3のファイルの1シート目の"C9:C65" を新しい1のファイルの1シート目の1行目にコピーするプログラムを 作っていますが1シート目はpasteされるのですが 3のファイル2シート目からselectの指定が"C9:C65"ではなく、B9からQ65の指定になってしまい思ったコピーができません(★のところ)、1シート目はうまくいっているのでどうして3のファイルの2シート目のからうまくいかないかわかりません。 5シートまででテストをしているのですが実際は各々255シートありもってくる列も 12列あります。とりあえずCの列だけ5シートで試してみています。 Dim i As Long Dim N As Long i = 1 N = 1 Do While i <= 5 ''C列''' Workbooks(2).Worksheets(i).Activate   '2のファイル Worksheets(i).Range("C8:C25").Select   'もってくるところ Selection.Copy Workbooks(1).Worksheets(1).Activate   '1新しいファイル Range("C" & N).Select   '貼り付けるところ Selection.PasteSpecial Paste:=xlPasteValues, operation:=xlNone, skipblanks:=False, Transpose:=True Workbooks(3).Worksheets(i).Activate   '3のファイル Workbooks(3).Worksheets(i).Range("C9:C65").Select  '★もってくるところ Selection.Copy Workbooks(1).Worksheets(1).Activate   '1新しいファイル Range("U" & N).Select   '貼り付けるところ Selection.PasteSpecial Paste:=xlPasteValues, operation:=xlNone, skipblanks:=False, Transpose:=True i=i+1 N=N+1 LOOP

  • エクセル VBAで 各シートの特定セルの一覧の作成

    エクセル VBAで 各シートの特定セルの一覧の作成について教えて下さい。 同一フォーマットのシート(20~40シート前後)のエクセルファイルが7個ありまして、 こちらの各シートの特定セルのデータを一覧化したいのです。 色々と調べ以下◆で一覧が作成可能となりました。 以下◆では、モジュールに記載した同一ファイルの全シートの 指定セルデータを”一覧”シートに書き出します。 こちらを、一覧データを取得する独立した1ファイルとし、 ”ファイルを開く”のダイアログを表示させ 任意のファイルを指定し、そのファイルの指定セルのデータを一覧化 したいと思っています。 独立した一覧ファイルと、データ元であるファイルは同一フォルダに あるとは限らないので、 自分で選択できる様にしたいのです。 また、シート名は 07nnnn、08nnnnと決められた名前のつけかたなのですが、 一覧化する対象シートを08から始まる名前のシートとしたいのです。 Application.GetOpenFilename("Microsoft Excelブック,*.xls,テキストファイル,*.txt") で”ファイルを開く”のダイアログは開く様になったのですが、 開いたファイルのデータを読んだ結果となりませんでした。 おそらく、書き方が違ったのだと思います。 エクセルは2003を使用しています。 説明不足、情報不足がございましたら、ご指摘願います。 宜しくお願い致します。 ◆----- Sub 一覧作成() Dim sh As Worksheet, r As Range Const sName = "一覧" Worksheets(sName).Cells.ClearContents Worksheets(sName).Activate Range("B3").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.ClearContents Range("B3").Select Set r = Worksheets(sName).Range("B3") For Each sh In Worksheets If (sh.Name <> sName) Then With sh r.Value = .Name r.Offset(, 1).Value = .Range("H2").Value r.Offset(, 2).Value = .Range("E3").Value r.Offset(, 3).Value = .Range("E4").Value End With End If Set r = r.Offset(1, 0) Next End Sub

  • Excel のセルどうしでの循環を避けた参照の方法

    次の方法があれば教えてください。 Excelの同一ワークシートの中にある、または複数のワークシートに存在するセルA,B,C,D,...の間において、任意のセルを選択し、そのセルに任意の数値/文字列を入力した場合、他のセルもその数値を参照するように関連付けたいのですが、これらのセル間で、互いに循環問題を生じないようにするには、どうしたらよいのでしょうか?

専門家に質問してみよう