• ベストアンサー

エクセルVBAで他Bookを閉じたまま参照・訂正

Cells(1, 1) = Application.ExecuteExcel4Macro _ ("'C:\My Documents\[Book2.xls]Sheet1'!R1C1") でBook2を開かずにセルを参照できますが、 1.別の記述方法があるのでしょうか。 2.逆に、閉じたBook2のセルに対し、値を訂正できないでしょうか。 よろしくお願いいたします。

  • ebis
  • お礼率54% (29/53)

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

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

こんにちわ。 以前私もあなたと同じことをやりたくてマイクロソフトのサポートセンターへ問い合わせたことがありますが、外部参照という機能を使わない限りブックを開かずにセルを参照することはできないそうです。 ですから、あなた様が書かれたコード以外書く方法はないと思います。 また、ブックのセルの値を訂正するには、そのブックを開かない限り訂正することができないそうです。 私でよろしければ、またサンプルマクロを作ってみたいと思います。ご希望の節は、あなた様がどの様なことをおやりになりたいのかお知らせ下さい。 お手数をおかけいたしますが、よろしくお願いいたします。

ebis
質問者

補足

度々の回答ありがとうございます。 そうでしたか、無理だったんですね。 今まで1台のPCで売上管理を行っていたのですが、その商品マスタとなるデータを 他のPC(LAN経由)と共有して、一方のPCを発注管理用としたかったのです。 このような事はエクセルでは、無理な使用法でしょうか。

その他の回答 (3)

回答No.4

こんにちわ。 ちょっと次の操作をしてみて下さい。 1.現在ファイルが保存してあるPCでファイルを開く。 2.ツールメニューバーからツール→ブックの共有を順にクリックし、ブックの共有ダイアログボックスを開く 3.編集タブをクリックし、その中の複数のユーザーが同時に編集する。をチェックしてOKボタンをクリックする。 4.保存を確認するメッセージが表示されるのでOKボタンをクリックする。 もしこの方法でよろしければ、詳細につきましてはヘルプを参照して下さい。 1.ツールメニューバーからヘルプ→マイクロソフトヘルプを順にクリック。 2.質問タブをクリックし、ブックの共有と入力し、OKボタンをクリック。 3.複数のユーザーが同じブックで作業する方法をダブルクリック。 もし、違っていた場合は、お許し下さい。

ebis
質問者

お礼

回答ありがとうございます。 共有ブックという機能を、全く知りませんでした。 試してみます。 ちょっと、質問の表題と異なる内容になってきましたので、締め切ります。

回答No.3

こんばんわ。 私は、1台のPCでしか操作をしたことがないので、ネットワークのことに関しては全くの無知です。でも、何かあなた様がおやりになりたいことは、できる方法があるように思います。 そこで提案なのですが、マイクロソフトのサポートセンターに問い合わせてみたらいかがでしょうか。Office製品は、無償サーポートという特典がついております。電話番号をお知らせいたします。 03(5354)4500 です。 私が答えられれば答えたいのですが、ネットワークに関しては解りませんのでお許し下さい。

ebis
質問者

お礼

情報ありがとうございます。 電話してみたのですが、OfficeXPはVBAが絡む質問は有料との事でした。 また、こちらが質問して、「それは無理です。」で終わっても1件と数えるそうなので、そこでやめてしまいました。 また、別の形で質問を出すかもしれませんが、よろしくお願い致します。

回答No.2

こんばんわ。前回私の作ったサンプルマクロの内容がお解りにならないということですので、この場をお借りして説明をさせていただきたいと思います。 Private Sub Workbook_Open() このイベントは、このブック(商品台帳)が開いたときに走るイベントです。 Dim myBook As Workbook  Dim myWbn As String For Each myBook In Workbooks 現在開いているブックの名前をすべてチェックします。 開いているブックの数だけ繰り返されます。 myWbn = myBook.Name ブックの名前を変数に代入します。 If myBook.Name = "商品コード.xls" Then Exit Sub 商品台帳が開いていたら処理を終了させます。 Next 商品台帳が閉じていた時のみ以下のコードが実行されます。 Workbooks.Open ("C:\My Documents\商品コード.xls") Workbooks("商品台帳.xls").Activate End Sub Private Sub Worksheet_Change(ByVal Target As Range) このイベントはシートに変化が起きたときに走るイベントです。 ・セルに値を入力し、エンターキー等でフォーカスを移した時。 ・セルの値を削除し、エンターキー等でフォーカスを移した時 ・行選択をして行を削除した時。範囲選択をして選択された行を削除した時。 このような動作が行われた時、すべて走ります。 Dim myRow As Integer myRow = Target.Row If Target.Address = Range("A" & myRow).Address _ Or Target.Address = Range("B" & myRow).Address Then target.rowは、行選択をした時先頭行の行番号・範囲選択をした時も先頭の行番号・セル選択の時もそのセルの行番号を返しています。 target.addressは行選択をした時$○:$△・範囲選択の時例えば$A$3:$H$10・セル選択の時例えば$B$3という値を返しています。 今回はA列とB列で一つのセルの値が変化した時のみマクロを走らせたいので、このように書きます。 Set myWsn = Workbooks("商品コード.xls").Worksheets(1) myWsnがWorkbooks("商品コード.xls").Worksheets(1)の代わりとして使えるように、setステートメントを使ってmyWsnに代入しています。 myCell = myWsn.Range("A1").CurrentRegion.SpecialCells(xlCellTypeLastCell).Address CurrentRegionは、データの入力されている範囲を参照しています。 SpecialCells(xlCellTypeLastCell)は上の範囲のデータの入っている最終セルを参照しています。 つまり、myCellに商品コードにデータの入力されている最終セルのセル番地を代入しているのです。 Set myRange = myWsn.Range("A2:" & myCell).Find(Target.Value, lookat:=xlWhole) target.valueは、商品台帳に入力された商品コードを表しています。 つまり、商品コードのA2から入力された最終行の範囲の中に入力された商品コードがあるかどうか探し、あればレンジオブジェクトをなければNothingを 変数に返します。 Application.EnableEvents = False If myRange Is Nothing Then 入力された商品コード・商品名がなかった時の処理 If Target.Address = Range("A" & myRow).Address Then 入力された商品コードがなかった時の処理 myWsn.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Target.Value Rangeオブジェクトの表し方は2通りあります。A5を例にするとRange("A5")という方法とCells(5,1)という方法です。Range("A5")の5を変数で表す時は、Range("A" & 変数)となります。 Cells(Rows.Count,1)は、A列の最終行を表しています。 Cells(Rows.Count,1).End(xlup)は、A列の最終行から上方向へ入力されている最終セルを参照しています。 Offsetは、セル番地を移動する時に使います。表し方は、Offset(行,列)です。B2を基準にA1はoffset(-1,-1),B1はoffset(-1,0),C1はoffset(-1,1),C2はoffset(0,1),C3はoffset(1,1),B3はOffset(1,0),A3はOffset(1,-1),A2はOffset(0,-1)と表します。 つまり、この式の意味は、商品コードのA列に入力されている最終行の1つ下のセルに商品台帳に入力された商品コードを入力せよということになります。 Else 入力された商品名がなかった時の処理 myWsn.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Target.Value End If Else 商品台帳に入力された商品コードがあったときの処理 Target.Offset(0, 1).Value = myRange.Offset(0, 1).Value Target.Offset(0, 1).Columns.EntireColumn.AutoFit End If Application.EnableEvents = True End If End Sub まだ解らないことがありましたら、遠慮なくお知らせ下さい。 それから、私がVBAを勉強するのに役に立った本をご紹介させていただきます。技術評論社から出ている大村あつしさんが書いた簡単プログラミングExcle2000VBAという本です。基礎編・関数偏・応用編の3部作になっています。これはとっても解りやすく書かれています。その他に辞書としてメソッドやプロパティを調べるのに使っている本は、ローカスという出版社から出ている逆引きExcel2000VBA偏です。VBAが持っているすべての機能やプロパティ・メソッド等が記載されています。この4冊があれば、十分です。 お互いにこれからも頑張っていきましょう。

ebis
質問者

お礼

ありがとうございます、理解できました。 辞書の様な本も必要と思ってました、さっそく本屋に行ってきます。

関連するQ&A

  • Application.ExecuteExcel4Macroなに?

    No.373903を拝見しまして、閉じたままのブックを参照できるらしいので使いたいのですが、ブックが複数ある場合、[ ]内はどのように書けば良いのでしょう? 例) Cells(1, 1) = Application.ExecuteExcel4Macro _ ("'C:\My Documents\[Book2.xls]Sheet1'!R1C1") Book2・sheet1の部分が可変。 また、 Application.ExecuteExcel4Macro("get.document(50)") や Application.ExecuteExcel4Macro ("Halt(True)") 等の使い方もあるようですが、どなたかわかりやすく教えて頂けませんか?

  • ファイルを閉じたままの外部参照で最終行の行数取得

    こんにちは。VBA初心者、の段階から脱出を試みているものです。 ここやその他サイトを調べて、EXCELファイルを閉じたまま外部参照するには、Application.ExecuteExcel4Macroを使えばいいことがわかったのですが、参照先の最終行などの情報を取得するにはどうしたらいでしょうか。 私が調べた限りでは、以下のような単純に値を取得する方法しか説明されておらず、VBEのヘルプにも詳しい説明がありませんでした。 Cells(1, 1) = Application.ExecuteExcel4Macro _ ("'C:\My Documents\[Book2.xls]Sheet1'!R1C1") 参照先から値を取得する際に、必要な範囲だけ見るようにしてできるだけ速く処理できるようにしたいと思っています。 (したがって、 65535行目までループするとか、OPENメソッドで一旦ファイルを開くような手法は避けたいと思っています) なにかいい方法がありましたらご教示いただけないでしょうか。 よろしくお願いします。

  • エクセルvbaに関する質問です

    ExecuteExcel4Macroを使った際について質問があります。 別ブックのセルを参照したいために、ExecuteExcel4Macroを使いました。 1つ目のmsgboxではパスを変数で、二つ目のmsgboxではパスを直書きしています。 下記のサンプルプログラムで2つとも同じものを表示させたいのですが、別の結果が表示されます。 =====サンプルプログラム===== Sub Sample1() Dim name As String Dim path As String Dim sheet As String path = "C:\Users\USER\Desktop\シフト表\新しいフォルダ\" name = "book1.xls" sheet = "Sheet1" Application.DisplayAlerts = False MsgBox ExecuteExcel4Macro("'" & path & "[" & name & "]" & sheet & "'!R1C1") MsgBox ExecuteExcel4Macro("'C:\Users\USER\Desktop\シフト表\新しいフォルダー\[book1.xls]Sheet1'!R1C1") Application.DisplayAlerts = True End Sub ===ここまで===== 実際のbook1.xlsのA1セルには「1」が入っているのですが、変数で書いた場合のみ「aaaaaa」が表示されます。 どうかご教授いただけたら幸いです。

  • EXCELのVBAにて閉じたブックの数値を拾い出したいため

    EXCELのVBAにて閉じたブックの数値を拾い出したいため ExecuteExcel4Macroを使用して次のように作成しましたが 生産管理ブック内の直出荷シートしか参照できません。 その他シートの参照して数値を拾い出したいため シートのループ処理(シート数不規則)を例えばworksheet(1)~処理終了の名前がついた シートまで行いたいのですがどの様に直出荷部分を書き込めばいいかわかりません。 いい方法を教えていただけ無いでしょうか? (:と生産計画の間 エン[ がうまく表示できません) Dim i As Long, idx As Long Dim hi As Integer For hi = 10 To 252 If Cells(2, 3) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & 11 & "C" & hi) Then Exit For End If Next hi i = 7 For idx = 7 To 3000 For i = i To 300 If ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx & "C" & 5) = 0 Then Exit Sub End If Cells(i, 1) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx & "C" & 5) Cells(i, 2) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx + 2 & "C" & 5) Cells(i, 3) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx + 11 & "C" & hi) i = i + 1 Exit For Next i idx = idx + 57 Next idx

  • 他のブックファイルのセルの参照が上手く行きません

    こんにちはよろしくお願いいたします。 エクセルのブックファイル(Book1.xlsx)に,他のブックファイル(Book2.xls)のセルの値を参照しようと思い”=”を入力し参照するブックファイルのセルをクリックし,「 =[Book2]Sheet1!$A$1 」のような参照を行いました。こうしてきちんと表示されました。 しかし,この参照の式を「 =[Book3]Sheet1!$A$1 」のように,他のブックファイル(Book3.xls)のセルに変更したところ,参照できなくなりました。ブックファイル(Book1.xlsx)には,「 =[Book3]Sheet1!$A$1 」という式そのものが表示された状態となっています。式は,キーボードを使って変更しました。もちろん,(Book3.xls)は,(Book2.xls)と同様のシート形式をもち,データも入力されています。 このような状態になると,先に挙げたように,”=”を入力して参照するブックファイル(Book3.xls)のセルをクリックしても,ブックファイル(Book1.xlsx)には,「 =[Book3]Sheet1!$A$1 」という式そのものが表示された状態となったままで,(Book3.xls)のデータは表示されません。 (Book2.xls)と(Book3.xls)のセルのデータは,文字列です。 気になるのは,(Book1.xlsx)はoffice2010で作成されたファイルであること,(Book2.xls)と(Book3.xls)は,互換モードと表示されるファイルであること,また表示されているファイルを見ると,フルパスで参照している点です。「 ='C:\aaa\bbb\・・・・・[Book3]Sheet1'!$A$1 」という参照式になっています。3つのファイルはすべて同一ファイルに入っています。 何が,参照を阻んでいるのでしょうか?教えてください。よろしくお願いします。

  • エクセルVBAで、閉じたブックを参照したい

    Excel97を使用しています。 過去のQ&Aを拝見しまして、 Application.ExecuteExcel4Macro を使うと閉じたままのブックを参照できることが判ったのですが、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=373903 同じ要領で閉じたブック内を検索して、見つかったセルからOffset(0,-4)のセルの内容を取得するには、どのように記述したらよろしいでしょうか? Sub コード取得()  氏名 = "●● ●●"  MsgBox Worksheets("s主項目").Range(Cells(1, 5), Cells(Range("A65536").End(xlUp).Row, 5)).Find(氏名, , , xlWhole).Offset(0, -4).Value End Sub このように書いて「s主項目」シート上で実行すると、氏名に対応するコードNo.が出てきますが、これを他ブック上で氏名を入力し、「s主項目」のブックを閉じたままコードNo.を取得したいのです。 ご存知の方、どうぞよろしくお願いいたします。

  • ExecuteExcel4Macroを使って他のブックを開かずにセルを

    ExecuteExcel4Macroを使って他のブックを開かずにセルを参照しているのですが、worksheet(1)という記述を使いたいのですがどうすればよいでしょうか? Target1 = "'" & Path & "[" & buf & "]sheet1'!R75C3" 上記だとsheet1という名前でなかったらエラーが出てしまうので・・・。

  • Excelで他Excelファイルのセルの値をVBAで参照したい時

    こんにちは。 Excelで他Excelファイルにあるセルの値をVBAで参照したい時って、 場所をどう指定したらいいのでしょうか。 やろうとしている事ですが、 c:\1.xlsに記述するVBAで c:\2.xlsのsheet1のA1の値を参照して、 それとc1.xlsのsheet1のA1の値が一致した時に、 c:\2.xlsのsheet1のB1の値を、 C:\1.xlsのsheet1のB1に書き出そうとしています。 派遣就業先でAccessで作ればいいものを なぜか社員の方たちでExcelで作ってしまったため、 そのメンテに四苦八苦しています。(笑) ご存知の方ぜひ教えてください。 よろしくお願いします!

  • EXCEL2010 他ブック セル参照

    Book1のA1セルに、Book2のA1セルを参照するため、 ='D:\TEMP\[Book2.xls]Sheet1'!$A$1 を入力しています。 Book2のSheet1には、マクロを組んでいて、その結果を$A$1から$C$50の範囲に表示させています。 Book1のA1からC50までには、Book2のA1セルからC50までには、同様の式を入力しています。 ご教授願いたい内容は、Book2のマクロ実行後に、Book1に='D:\TEMP\[Book2.xls]Sheet1'!$A$1 を入力した場合は、その結果が表示されるのですが、その後にBook2を更新しマクロ実行すると、Book1の式が='D:\TEMP\[Book2.xls]Sheet1'!'!#REF!とエラーになってします。 Book2を開いて、整列表示の場合でも(='[Book2.xls]Sheet1'!$A$1)結果は、同じです。 何か大事なことを忘れている?または、マクロ実行結果を参照するのは元々無理なのか?悩んでいます。 一応ネット検索したのですが、該当する対処方法が見つけられず、困っています。 解決方法をご教授いただきたく、お願いいたします。

  • エクセルで別ファイルの値を参照

    いまBOOK1.xlsがBOOK2.xlsの値を参照しています BOOK1.xlsのどこかのセルにBOOK3と入れるとBOOK3.xlsの値を参照するようにできますか? BOOK2とBOOK3はシートなどは値が違うだけで全く同じ構成です エクセルバージョンは2003です よろしくお願いします

専門家に質問してみよう