2017-06-20 13 views
1

外部参照警告を出していたExcelワークブックに問題がありました。 Excelはこれらの参照を分割するオプションを提供しますが、参照の場所を特定する方法はありません。VBAを使用してExcel ListObjectテーブルの計算された列の数式を特定する方法

最終的には、ブックのすべてのシートでエラーチェックユーティリティを実行した後でリファレンスを検出しました。それはテーブルオブジェクトの中に隠されていました。参照はデータ接続または式に含まれていませんでした。これは、通常のCtrl + Fタイプの検索検索では検索できませんし、VBAオブジェクトに含まれている検索もできません。

テーブルオブジェクトを作成してから(外部参照を持つ)列に式を追加し、手動で各行の式を別のものに置き換えると、参照が発生します。 Excelは元の式をファイルのどこかに保持します。私は、テーブルに対応するListObjectのさまざまなプロパティ、列を含む範囲、数式を含むListObjectのListColumnなど多くのものにアクセスしようとしました。

参照はファイル内のどこかにあります。セルの数式エラー警告をクリックし、「計算列式に復元」を選択すると表示されます。

これらの隠れた参照をVBAなどと体系的に見つける方法はありますか?

編集1:

私は外部ソースに隠された参照のための様々な異なるオブジェクトを検索するには次のスクリプトを書きましたが、このタイプの参照を含むオブジェクトを発見していません。

Sub ListLinks() 

Dim wb As Workbook 
Set wb = Application.ActiveWorkbook 

' Identify any links to external workbooks 
If Not IsEmpty(wb.LinkSources(xlExcelLinks)) Then 
    wb.Sheets.Add 
    xIndex = 1 
    For Each link In wb.LinkSources(xlExcelLinks) 
     Application.ActiveSheet.Cells(xIndex, 1).Value = link 
     xIndex = xIndex + 1 
    Next link 
End If 

Dim outSheet As Worksheet 
Set outSheet = wb.Worksheets.Add 

' Extract all hidden references into a searchable sheet 
Dim ws As Worksheet 
Dim sh As Shape 
With Range("A1:D1") 
    .Value = Array("ObjectType", "Parent", "ObjectName", "Reference") 
    .Interior.Color = xlColor1 
    .Font.Color = xlColor2 
End With 

' All shape objects can have an action assigned that may be in another workbook 
i = 2 
For Each ws In Worksheets 
    For Each sh In ws.Shapes 
     outSheet.Cells(i, 1).Value = "Shape" 
     outSheet.Cells(i, 2).Value = ws.Name 
     outSheet.Cells(i, 3).Value = sh.Name 
     outSheet.Cells(i, 4).Value = "'" & sh.OnAction 
     i = i + 1 
    Next 
Next 

' All name references may point to a range or table in another workbook 
Dim nm As Name 
For Each nm In ActiveWorkbook.Names 
    outSheet.Cells(i, 1).Value = "Name" 
    outSheet.Cells(i, 3).Value = nm.Name 
    outSheet.Cells(i, 4).Value = "'" & nm.RefersTo 
    i = i + 1 
Next 

' All chart series and chart shapes can contain references 
Dim ch As Chart 
Dim srs As Series 
For Each ch In ActiveWorkbook.Charts 
    For Each srs In ch.SeriesCollection 
     outSheet.Cells(i, 1).Value = "ChartsSeries" 
     outSheet.Cells(i, 2).Value = ch.Name 
     outSheet.Cells(i, 3).Value = srs.Name 
     outSheet.Cells(i, 4).Value = "'" & srs.Formula 
     i = i + 1 
    For Each sh In ch.Shapes 
     outSheet.Cells(i, 1).Value = "ChartsShapes" 
     outSheet.Cells(i, 2).Value = ch.Name 
     outSheet.Cells(i, 3).Value = sh.Name 
     outSheet.Cells(i, 4).Value = "'" & sh.OnAction 
     i = i + 1 
    Next 
    Next 
Next 

' As above, but for charts in a Worksheet, previous was for Chart Sheets 
Dim chOb As ChartObject 
For Each ws In Worksheets 
    For Each chOb In ws.ChartObjects 
     For Each srs In chOb.Chart.SeriesCollection 
      outSheet.Cells(i, 1).Value = "ChartsObjectsSeries" 
      outSheet.Cells(i, 2).Value = ws.Name & " | " & ch.Name 
      outSheet.Cells(i, 3).Value = srs.Name 
      outSheet.Cells(i, 4).Value = "'" & srs.Formula 
      i = i + 1 
     Next 
     For Each sh In chOb.Chart.Shapes 
      outSheet.Cells(i, 1).Value = "ChartsObjectsShapes" 
      outSheet.Cells(i, 2).Value = ws.Name & " | " & ch.Name 
      outSheet.Cells(i, 3).Value = sh.Name 
      outSheet.Cells(i, 4).Value = "'" & sh.OnAction 
      i = i + 1 
     Next 
    Next 
Next 

' Query tables can reference external sheets 
Dim qryTbl As QueryTable 
For Each ws In Worksheets 
    For Each qryTbl In ws.QueryTables 
     outSheet.Cells(i, 1).Value = "QueryTables" 
     outSheet.Cells(i, 2).Value = ws.Name 
     outSheet.Cells(i, 3).Value = qryTbl.Name 
     outSheet.Cells(i, 4).Value = "'" & qryTbl.Connection 
     i = i + 1 
    Next 
Next 

Dim lstObj As ListObject 
For Each ws In Worksheets 
    For Each lstObj In ws.ListObjects 
    For Each qryTbl In lstObj.QueryTables 
     outSheet.Cells(i, 1).Value = "TableQueryTables" 
     outSheet.Cells(i, 2).Value = ws.Name & " | " & lstObj.Name 
     outSheet.Cells(i, 3).Value = qryTbl.Name 
     outSheet.Cells(i, 4).Value = "'" & qryTbl.Connection 
     i = i + 1 
    Next 
Next 

' OLEObjects such as images can point to external sources 
Dim oleOb As OLEObject 
For Each ws In Worksheets 
    For Each oleOb In ws.OLEObjects 
     outSheet.Cells(i, 1).Value = "OLEObjects" 
     outSheet.Cells(i, 2).Value = ws.Name 
     outSheet.Cells(i, 3).Value = oleOb.Name 
     outSheet.Cells(i, 4).Value = "'" & oleOb.SourceName 
     i = i + 1 
    Next 
Next 

' Hyperlinks can point to external sources 
Dim hypLk As Hyperlink 
For Each ws In Worksheets 
    For Each hypLk In ws.Hyperlinks 
     outSheet.Cells(i, 1).Value = "HyperLinks" 
     outSheet.Cells(i, 2).Value = ws.Name 
     outSheet.Cells(i, 3).Value = hypLk.Name 
     outSheet.Cells(i, 4).Value = "'" & hypLk.SubAddress 
     i = i + 1 
    Next 
Next 

End Sub 

編集2:

Slaiさんのコメントから、私は

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" id="1" name="Table1" displayName="Table1" ref="A1:B4" totalsRowShown="0"> 
    <autoFilter ref="A1:B4"/> 
    <tableColumns count="2"> 
     <tableColumn id="1" name="a"/> 
     <tableColumn id="2" name="b" dataDxfId="0"> 
      <calculatedColumnFormula>[1]Sheet1!$A2</calculatedColumnFormula> 
     </tableColumn> 
    </tableColumns> 
    <tableStyleInfo name="TableStyleMedium2" showFirstColumn="0" showLastColumn="0" showRowStripes="1" showColumnStripes="0"/> 
</table> 

で、/xl/tables/table1.xml内のファイルのXML内のリファレンスを見ることができる方法はありますVBAオブジェクトモデルの内部からこれにアクセスするには?

+0

[データ]タブの[リンクの編集]にリストされていますか? Ctrl + Fで検索できないため、コントロール上にある可能性もあります。 – Slai

+0

はい、そこから参照がどこにあるかはわかりません。 – SuaveIncompetence

+0

https://support.office.com/en-us/article/Find-links-external-references-in-a-workbook-fcbf4576-3aab-4029-ba25-54313a532ff1 – Slai

答えて

1

ExcelにListObjectに行を追加することでファントムの計算式を表示させることができます。既存のデータに影響を与えずに行を追加する最も安全な方法は、テーブルを一時シートにコピーしてから、新しいシートにlistObjectのサイズを変更することです。

私はすべての隠されたforumlaと参照を抽出するために、元の質問から、私の既存のクエリに、次の追加しました: https://stackoverflow.com/a/40734667/2341820:その後

Dim tmpSht As Worksheet 
For Each ws In Worksheets 
    For Each lstObj In ws.ListObjects 
     Set tmpSht = Sheets.Add 
     lstObj.Range.Copy 
     tmpSht.Range("A1").PasteSpecial 
     tmpSht.ListObjects(1).Resize tmpSht.ListObjects(1).Range.Resize(lstObj.Range.Rows.Count + 1, lstObj.Range.Columns.Count) 
     For j = 1 To lstObj.ListColumns.Count 
      outSheet.Cells(i, 1).Value = "Table ListObjects - Calculated Formulas" 
      outSheet.Cells(i, 2).Value = ws.Name & " | " & lstObj.Name 
      outSheet.Cells(i, 3).Value = lstObj.ListColumns(j).Name 
      outSheet.Cells(i, 4).Value = "'" & Cells(tmpSht.ListObjects(1).Range.Rows.Count, j).Formula 
      i = i + 1 
     Next 
     Application.DisplayAlerts = False 
     tmpSht.Delete 
     Application.DisplayAlerts = True 
    Next 
Next 

、私は今、同様のソリューションで、次の質問を見つけました

関連する問題