プロが教えるわが家の防犯対策術!

いろいろ検索したのですが、見つからないので質問させていただきます。

対象のセルが他ブックのセルを参照しているとき、そのブックが開かれていない場合、正しい値にはなりません。
(例:A1に =[Book2.xls]Sheet1!$A$3 が入力されている)
そこで、そのセルが参照しているブックをVBAで自動的に開く方法を考えています。
つまり、例で言えば、Book2.xlsを開きたいのです。

文字列関数を使ってひとつひとつの文字を取得し、ファイル名を得て開く方法しかないのでしょうか?
何かいい方法があれば教えてください。
よろしくお願いします。

A 回答 (3件)

#1です。



> 参照しているブック以外をすべて閉じるという操作で補うしかないようですね…。

ActiveCell.Formulaと見比べて開けば良いのかも。

Sub Test1()
 myLinks = ThisWorkbook.LinkSources(xlExcelLinks)
 If Not IsEmpty(myLinks) Then
   s1 = WorksheetFunction.Substitute(ActiveCell.Formula, "[", "")
   s1 = WorksheetFunction.Substitute(s1, "]", "")
   For i = 1 To UBound(myLinks)
     If InStr(1, UCase(s1), UCase(myLinks(i)), 1) > 0 Then
       Workbooks.Open myLinks(i)
       Exit Sub
     End If
   Next i
 End If
End Sub

---
文字列操作パターンだとこんな感じでもイケるのかなぁ、、、

Sub Test2()
 On Error Resume Next
 With WorksheetFunction
    Workbooks.Open .Substitute(Mid(ActiveCell.Formula, 3, _
      .Find("]", ActiveCell.Formula) - 3), "[", "")
 End With
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
サンプルマクロをご教授いただいたおかげで、ほぼ目標としたマクロが完成しました!!
papayukaさま、ありがとうございました!!

お礼日時:2007/10/28 11:33

こんばんは。



>対象のセルが他ブックのセルを参照しているとき、そのブックが開かれていない場合、正しい値にはなりません。

通常、リンクしているセルが正しい値にならない場合は、
 メニュー-編集-リンクの編集 ---値の更新
をすればよいと思います。よほど、数が多くなければ、以下のようなマクロは必要ないと思います。

Sub LinkUpDateMacro()
  Dim ar As Variant
  Dim v As Variant
  ar = ActiveWorkbook.LinkSources(xlExcelLinks)
  If Not IsEmpty(ar) Then
    For Each v In ar
      ActiveWorkbook.UpdateLink v, xlExcelLinks
    Next v
  End If
End Sub


----------------------------------------------------------
ひとつのブックを開くなら、

 メニュー-編集-リンクの編集 ---リンク元を開く

で開ければよいと思うのです。リンクしているブックのひとつを、マクロという手段で開けなくてはならないのか、理由が良く分かりません。かなり、複雑なのでしょうか?

たとえば、ダブルクリックして、開くというなら以下のようなコードになります。つまり、ハイパーリンクと同じ役割をしています。

'シートモジュール

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  Dim i As Integer
  Dim j As Integer
  Dim n As Integer
  Dim k As String
  Cancel = True
  If Target.HasFormula = False Then Exit Sub
  k = Target.Formula
  i = InStr(k, "[")
  j = InStr(i, k, "]")
  n = InStr(k, "\")
  Application.ScreenUpdating = False
  If i > 0 And j > 0 And n > 0 Then
    k = Mid$(k, 3, j - 3)
    k = Replace(k, "[", "")
    On Error Resume Next
    Workbooks.Open k
    On Error GoTo 0
  End If
  Application.ScreenUpdating = True
  k = Target.FormulaR1C1
  If i > 0 And j > 0 Then
    Application.Goto k
  End If
End Sub
    • good
    • 0
この回答へのお礼

yoko14820です。

>で開ければよいと思うのです。
>リンクしているブックのひとつを、マクロという手段で
>開けなくてはならないのか、理由が良く分かりません。
>かなり、複雑なのでしょうか?

質問の内容に余計な文を加えて混乱させて申し訳ございません。
とどのつまりは、参照元のセルにジャンプするマクロを作成させたかったのです。
同一ブック内であれば、簡単に参照できたものの、それ以外の処理方法を考えていたのです。

サンプルマクロのご提供ありがとうございました。

お礼日時:2007/10/28 11:43

> 対象のセルが他ブックのセルを参照しているとき、そのブックが開かれていない場合、


> 正しい値にはなりません。

これは使用する関数によってだと思います。

アクティブセルのって言うより、ブックの参照リンクを開けば良いのでは無いでしょうか?
ヘルプの LinkSources メソッド使用例のほとんどまんまですが、、

Sub Test()
 myLinks = ThisWorkbook.LinkSources(xlExcelLinks)
 If Not IsEmpty(myLinks) Then
   For i = 1 To UBound(myLinks)
     Workbooks.Open myLinks(i)
   Next i
 End If
End Sub
    • good
    • 0
この回答へのお礼

さっそくの回答ありがとうございます!
今回は参照しているブックのセル値を取り出すのが目的ではなくて、参照しているブック自体を開きたいので、使用する関数うんぬんではないのです…。

LinkSourcesメソッドでの解決方法を伝授いただきありがとうございます!
目的は、そのセルが参照しているブックのみ開きたいので…
この方法の場合は、暫定対策として、参照しているブック以外をすべて閉じるという操作で補うしかないようですね…。
ありがとうございます。
大変参考になりました!

お礼日時:2007/10/27 22:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!