• ベストアンサー

EXCELマクロでブック内のリンク状態を取得する方法

ブックが外部参照していると、取込時にエラーになってしまうソフトを使っています。 事前にEXCELマクロでブック内のリンクの状態の取得することで、エラーを回避できればと思っています。 外部参照、リモート参照ともに更新せずにブックを開くのは下記の方法でできそうなのですが、そこから先の方法が解らず困っています。 Workbooks.Open Filename:="C:\My Documents\リンク元.xls",UpdateLinks:=0 =[リンク先.xls]Sheet1!$A$1+[リンク先.xls]Sheet1!$A$2 条件1:このリンク先は「パス」も「ファイル名」も変動します。 条件2:無条件で値貼り付けはできません。

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

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.2

>事前にEXCELマクロでブック内のリンクの状態の取得することで、エラーを回避できればと思っています。 というのは外部参照しているかどうかが解ればいいのでしょうか? その場合は[LinkSources メソッド]でリンクソースを取得できます。 >条件2:無条件で値貼り付けはできません。 ...というところから推測すると、その外部参照数式だけを値化したいという事でしょうか? リンクソース取得後、その文字列で検索して該当セルだけ値化、でできると思いますが、 もしxl2002以降限定でも構わないなら[BreakLink メソッド]を使えば簡単です。 それぞれのヘルプを参照してください。 簡単なサンプル。 Sub try()   Dim astrLinks, Link   With ActiveWorkbook     astrLinks = .LinkSources(Type:=xlLinkTypeExcelLinks)     If Not IsEmpty(astrLinks) Then       For Each Link In astrLinks         .BreakLink Name:=Link, Type:=xlLinkTypeExcelLinks       Next     End If   End With End Sub

Excel-VBA
質問者

お礼

>条件2:無条件で値貼り付けはできません。 これは「値貼り付け」で計算式を値にすると他の処理に影響がでるのでできないという意味でした。表現が悪くてすみませんでした。 まさに[LinkSources メソッド]が私の望んでいたものでした。 ありがとうございました。

その他の回答 (1)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 以前、そういうコードは考えたことがあるのですが、プログラマブルには取れなかったと思います。だから、物理的に変更するしかないと思います。 >事前にEXCELマクロでブック内のリンクの状態の取得することで、エラーを回避できればと思っています。 取得しても、どこかに保存しなくてはならないけれども、こんどは戻すのが面倒ですね。 今、考えたものは、数式を、文字化してしまうという方法です。それを戻すプログラムも書きました。 戻すほうは、ものすごく時間が掛かります。 >条件1:このリンク先は「パス」も「ファイル名」も変動します。 マクロ中は、変動はしないという条件です。 ただ、こんなに簡単ではないかもしれません。オートシェイプや名前定義などの中にもあったりするかもしれません。その場合は、それらの中も書き換えなくてはならないと思います。その時は、また相談してください。 '------------------------------------------- Sub FormulaChange2Text() '数式を文字化   Dim sh As Worksheet   Dim r As Range   Dim c As Range   For Each sh In Worksheets '全シート     On Error Resume Next     Set r = sh.UsedRange.SpecialCells(xlCellTypeFormulas)     On Error GoTo 0     Application.ScreenUpdating = False     For Each c In r       If c.FormulaLocal Like "*[[]*[]]*" Then         c.Value = "!" & c.FormulaLocal       End If     Next c     Application.ScreenUpdating = True   Next sh End Sub '------------------------------------------- Sub FormulaRetrival() '数式を戻す   Dim sh As Worksheet   Dim r As Range   Dim c As Range   Application.Calculation = xlCalculationManual '計算を手動   For Each sh In Worksheets     On Error Resume Next     Set r = sh.UsedRange.SpecialCells(xlCellTypeConstants, xlTextValues)     On Error GoTo 0     Application.ScreenUpdating = False     For Each c In r       If c.Value Like "!=*" Then         c.FormulaLocal = Mid$(c.Value, 2)       End If     Next c     Application.ScreenUpdating = True   Next sh   Application.Calculation = xlCalculationAutomatic '計算を自動 End Sub

関連するQ&A