按照VLOOKUP和VBA中的引用

情况:

我有许多工作表的Excel工作簿。 工作簿中的某些单元格通过MasterData引用另一个Excel文件(称为MasterData )。

一个工作表内的一些单元格(称为Worksheet A )引用另一个工作表的其他单元格(称为Worksheet B )。 Worksheet B的单元格引用MasterData

在第三个工作Worksheet C工作Worksheet C一些单元MasterData直接引用MasterData

我的任务是find依赖关系结构。 所以对于上面的例子,它应该给:

 Worksheet A -> Worksheet B -> MasterData Worksheet C -> MasterData 

当然,对于更高级别的链接(例如, Worksheet D – > Worksheet E – > Worksheet F – > MasterData

到目前为止我所做的是:

我遍历所有工作表,然后遍历工作表的单元格。 在迭代内我testing如果单元格有一个公式,如果公式包含MasterData我知道这个工作表引用MasterData

所以我已经有了第一层。

问题:

现在我有像这样的单元格:(假设我在单元格B2中的Worksheet1中)

 =Worksheet2!A1 

Worksheet2的单元格A1如下所示:

 ='X:\[MasterData.xslm]FZE'!A8 

所以当我处理单元格Worksheet1!B2我想遵循对Worksheet2!A1的引用,然后看到这个引用了MasterData我怎样才能做到这一点?

附录

我提供了迄今为止我写的代码。 但是它比我所说的更多(它在MasterData查找具体的工作表)。

 Sub Verknuepfungen_zwischen_Sheets_und_Masterdata() ' Zeigt auf, mit welchem Sheet aus der Masterdata ein Sheet der Planung verknüpft ist Dim referenceToMaster As String referenceToMaster = "MASTERDATA-Sep2014.xlsm]" ' schreibe Ausgabe in Analyse-Blatt Dim analysisSheet As Worksheet ' finde dazu ein eventuell vorhandenes Analyse-Blatt If (SheetExists("Analyse-Blatt")) Then Set analysisSheet = sheets("Analyse-Blatt") Else Set analysisSheet = sheets.Add(before:=sheets(1)) analysisSheet.Name = "Analyse-Blatt" End If worksheetCount = ActiveWorkbook.Worksheets.Count currentRowIndex = 1 ' Nun gehe jedes WorkSheet durch Dim sheetsInMaster As Collection Dim currentSheet As Worksheet For c = 2 To worksheetCount Set currentSheet = sheets(c) ' nur sichtbare durchschauen If currentSheet.Visible = xlSheetVisible Then ' nur die durchschauen, welche nicht schon Analyse-Blätter sind If (InStr(currentSheet.Name, "Formeln_") = 0) Then Set sheetsInMaster = New Collection Set r1 = currentSheet.Range("a1", currentSheet.Range("a1").SpecialCells(xlLastCell)) For Each cell In r1.Cells ' schaue ob die Zelle eine Formel enthält If cell.HasFormula Then ' schaue ob Formel eine Verweis auf die Masterplanung enthält If InStr(cell.formula, referenceToMaster) > 0 Then ' füge den Bereich in der Masterplanung den sheetsInMaster hinzu AddMasterSheets cell.formula, sheetsInMaster End If End If Next cell ' Ausgabe in Analyse-Blatt If sheetsInMaster.Count > 0 Then analysisSheet.Cells(currentRowIndex, 1) = currentSheet.Name For Each sheetInMaster In sheetsInMaster analysisSheet.Cells(currentRowIndex, 2) = sheetInMaster currentRowIndex = currentRowIndex + 1 Next sheetInMaster End If End If End If Next c End Sub Sub AddMasterSheets(ByVal formula As String, sheetsInMaster As Collection) ' Fügt der Collection "sheetsInMaster" die Namen der Arbeitsblätter der Masterplanung hinzu, ' auf welche in der "formula" verwiesen wird Dim referenceToMaster As String referenceToMaster = "MASTERDATA-Sep2014.xlsm]" Dim currentIndexOfReferenceToMaster As Integer Dim currentIndexOfPrime As Integer currentIndexOfReferenceToMaster = InStr(formula, referenceToMaster) Do While currentIndexOfReferenceToMaster <> 0 currentIndexOfPrime = InStr(currentIndexOfReferenceToMaster, formula, "'") currentStart = currentIndexOfReferenceToMaster + Len(referenceToMaster) sheetInMaster = Mid(formula, currentStart, currentIndexOfPrime - currentStart) On Error Resume Next sheetsInMaster.Add sheetInMaster, CStr(sheetInMaster) On Error GoTo 0 currentIndexOfReferenceToMaster = InStr(currentIndexOfPrime, formula, referenceToMaster) Loop End Sub Function SheetExists(sheetName As String) As Boolean ' Gibt zurück, ob ein Arbeitsblatt mit dem Namen existiert SheetExists = False For Each ws In Worksheets If sheetName = ws.Name Then SheetExists = True Exit Function End If Next ws End Function 

如果您在具有两个名为“PlanningA”和“PlanningB”的工作表的Workbook上尝试此代码,其中“PlanningA”中的单元格为:

 A1: =SVERWEIS($E4;'X:\[MASTERDATA-Sep2014.xlsm]Departments'!$G:$CF;AF$1238;FALSCH) A2: =AF4*'X:\[MASTERDATA-Sep2014.xlsm]Stammdaten'!AG$2*('X:\[MASTERDATA-Sep2014.xlsm]Stammdaten'!AG$15+'X:\[MASTERDATA-Sep2014.xlsm]Stammdaten'!AG$19)/60+(AF11*AF4) A3: =SVERWEIS($D4;'X:\[MASTERDATA-Sep2014.xlsm]Stammdaten'!$E$262:$CE$337;AF$1239;FALSCH)*8*AF4 A4: =SVERWEIS($E4;'X:\[MASTERDATA-Sep2014.xlsm]Machinery'!$G:$CF;AF$1238;FALSCH) 

在“PlanningB”中:

 A1: =WENNFEHLER(SVERWEIS($E10;Werkebereich;BE$10000;FALSCH)*WVERWEIS($F10;'X:\[MASTERDATA-Sep2014.xlsm]FZE'!$3:$520;Montage!$D10-2;FALSCH);0)+WENNFEHLER(SVERWEIS($E10;Kitbereich;BE$10000;FALSCH)*WVERWEIS($F10;'X:\[MASTERDATA-Sep2014.xlsm]FZE'!$3:$520;Montage!$D10-2;FALSCH);0) A2: =SVERWEIS($E4;'X:\[MASTERDATA-Sep2014.xlsm]LKZ-Part'!$G:$CF;AF$1238;FALSCH) 

您将得到一个名为“Analyze-Blatt”的新工作表,它应该如下所示:

  |A |B 1|PlanningA |Departments 2| |Stammdaten 3| |Machinery 4|PlanningB |FZE 5| |LKZ-Part 

这是第一级,所以我知道工作表PlanningA引用MasterData的工作表Departments 。 但是正如你所看到的, PlanningB中的A1单元有一个VLookUp to WerkebereichWerkebereich的引用单元对Werkebereich中的工作表Employees有自己的依赖关系。 所以我正在寻找的是一个像这样的表格:

  |A |B |C 1|PlanningA |Departments | 2| |Stammdaten | 3| |Machinery | 4|PlanningB |Werkebreich | Employees 5| |FZE | 6| |LKZ-Part | 

我希望我提供了足够的信息,了解我在什么地方,并给我一个解决问题的线索:

我如何能像VBA中的VLOOKUP一样引用?

这会为你工作吗?

我的testing工作簿有五个工作表。 从Sheet1!A1 ,每个A1单元格链接到下一个工作表上的A1单元格。 在Sheet5!A1上只有一个值。 所以下面的代码只是检查与给定单元格相关的公式是否是引用,然后跟随它直到结束并返回一个包含整个链的string。 (你可以用一个数组,或逗号分隔的string或任何你需要的东西replace这个string。)在下面的testing子单元Sheet1!A2只有一个简单的值(所以Formula为空)。

 Option Explicit Private cellRefChain As String Sub test() Debug.Print ListCellReferenceChain(Sheets("Sheet1").Range("A2"), 0) Debug.Print ListCellReferenceChain(Sheets("Sheet1").Range("D2"), 0) End Sub Function ListCellReferenceChain(startingCell As Range, level As Integer) As String Dim thisCellReference As String Dim destSheet As String If level = 0 Then cellRefChain = startingCell.Parent.Name & "!" & Replace(startingCell.Address, "$", "") End If destSheet = IsReference(startingCell.Formula) If Len(destSheet) > 0 Then thisCellReference = Right(startingCell.Formula, Len(startingCell.Formula) - 1) cellRefChain = cellRefChain & " --> " & thisCellReference level = level + 1 ListCellReferenceChain Range(thisCellReference), level Else cellRefChain = cellRefChain & ".Value = " & startingCell.Value End If ListCellReferenceChain = cellRefChain End Function Function IsReference(cellFormula As String) As String Dim destinationSheet As String Dim pos1 As Integer destinationSheet = "" pos1 = InStr(1, cellFormula, "!", vbTextCompare) If pos1 > 0 Then destinationSheet = Mid(cellFormula, 2, pos1 - 2) End If IsReference = destinationSheet End Function 

输出是

 Sheet1!A2.Value = LastName Sheet1!A1 --> Sheet2!A1 --> Sheet3!A1 --> Sheet4!A1 --> Sheet5!A1.Value = 123 

如果您拥有Office 365或Office Professional Plus 2013,则有一项名为Spreadsheet Enquire的function非常强大,它完全符合您的需求,并将以良好的networking图打印出来。 更多信息 – 请看这里: 你可以用电子表格查询做什么

专业加2013(我们公司有一个许可证)有更多的程序,如电子表格比较(我们用来区分excel文件),很好。