- ベストアンサー
【Excel-VBA】アクティブセルが参照しているブックを開くには?
いろいろ検索したのですが、見つからないので質問させていただきます。 対象のセルが他ブックのセルを参照しているとき、そのブックが開かれていない場合、正しい値にはなりません。 (例:A1に =[Book2.xls]Sheet1!$A$3 が入力されている) そこで、そのセルが参照しているブックをVBAで自動的に開く方法を考えています。 つまり、例で言えば、Book2.xlsを開きたいのです。 文字列関数を使ってひとつひとつの文字を取得し、ファイル名を得て開く方法しかないのでしょうか? 何かいい方法があれば教えてください。 よろしくお願いします。
- みんなの回答 (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
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >対象のセルが他ブックのセルを参照しているとき、そのブックが開かれていない場合、正しい値にはなりません。 通常、リンクしているセルが正しい値にならない場合は、 メニュー-編集-リンクの編集 ---値の更新 をすればよいと思います。よほど、数が多くなければ、以下のようなマクロは必要ないと思います。 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
お礼
yoko14820です。 >で開ければよいと思うのです。 >リンクしているブックのひとつを、マクロという手段で >開けなくてはならないのか、理由が良く分かりません。 >かなり、複雑なのでしょうか? 質問の内容に余計な文を加えて混乱させて申し訳ございません。 とどのつまりは、参照元のセルにジャンプするマクロを作成させたかったのです。 同一ブック内であれば、簡単に参照できたものの、それ以外の処理方法を考えていたのです。 サンプルマクロのご提供ありがとうございました。
- papayuka
- ベストアンサー率45% (1388/3066)
> 対象のセルが他ブックのセルを参照しているとき、そのブックが開かれていない場合、 > 正しい値にはなりません。 これは使用する関数によってだと思います。 アクティブセルのって言うより、ブックの参照リンクを開けば良いのでは無いでしょうか? ヘルプの 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
お礼
さっそくの回答ありがとうございます! 今回は参照しているブックのセル値を取り出すのが目的ではなくて、参照しているブック自体を開きたいので、使用する関数うんぬんではないのです…。 LinkSourcesメソッドでの解決方法を伝授いただきありがとうございます! 目的は、そのセルが参照しているブックのみ開きたいので… この方法の場合は、暫定対策として、参照しているブック以外をすべて閉じるという操作で補うしかないようですね…。 ありがとうございます。 大変参考になりました!
お礼
ありがとうございます。 サンプルマクロをご教授いただいたおかげで、ほぼ目標としたマクロが完成しました!! papayukaさま、ありがとうございました!!