2011-10-04 48 views
3

我有用VBA和单元格公式编写的大量程序。我的任务是将其逆向工程化为C#winforms。我想了一个开始,我需要在平面列表中看到所有单元格公式。生成所有Excel单元格公式的平面列表

任何现有的方式来做到这一点?提前致谢!

编辑:只是为了分享,与应答者的帮助下,我设法想出这个:

Excel formula browser lets you view precedents in a tree view.

+0

您可能会发现跟踪先例和跟踪依赖项工具很有用。它们位于Excel 2003的“工具”>“公式审核”菜单中。有关更高版本的Excel,请参阅http://office.microsoft.com/en-us/excel-help/display-the-relationships-between-formulas-and- cells-HP010066253.aspx如果大量使用可以动态改变公式引用的“INDIRECT”,查看一组公式可能会令人沮丧 - 请参阅http://www.cpearson.com/excel/indirect。 htm – barrowc

+0

谢谢,但这是因为跟踪功能不够好,这就是为什么我需要一个列表。我认为在这种情况下看一张纸的速度会更快。如果有像MSVS那样的“定义”,那会更好。 – Jake

+0

这非常酷 - 感谢分享! – brettdj

回答

2
在VBA(容易修改为VBScript)

,你可以迅速倾倒在所有的公式所有工作表都转换为一个平坦的txt文件(改变你的路径以适应)和一个高效的变体数组。 code sourced from my article here

Const sFilePath = "C:\test\myfile.txt"  

Sub CreateTxt_Output() 
    Dim ws As Worksheet 
    Dim rng1 As Range 
    Dim X 
    Dim lRow As Long 
    Dim lCol As Long 
    Dim strTmp As String 
    Dim lFnum As Long 

    lFnum = FreeFile 
    Open sFilePath For Output As lFnum 

    For Each ws In ActiveWorkbook.Worksheets 
    Print #lFnum, "*****" & ws.Name & "*****" 
     'test that sheet has been used 
     Set rng1 = ws.UsedRange 
     If Not rng1 Is Nothing Then 
      'only multi-cell ranges can be written to a 2D array 
      If rng1.Cells.Count > 1 Then 
       X = ws.UsedRange.Formula 
       For lRow = 1 To UBound(X, 1) 
        For lCol = 1 To UBound(X, 2) 
         'write each line to txt file 
         Print #lFnum, X(lRow, lCol) 
        Next lCol 
       Next lRow 
      Else 
       Print #lFnum, rng1.Formula 
      End If 
     End If 
    Next ws 

    Close lFnum 
    MsgBox "Done!", vbOKOnly 
End Sub 

[更新部分 - 你可以在VBA通过使用SpecialCells迅速隔离公式。需要的情况下的错误处理有在片材上没有公式,见GetFormula下面

Sub GetFormula() 
    Dim ws As Worksheet 
    Dim rng1 As Range 
    Dim rng2 As Range 
    For Each ws In ActiveWorkbook.Sheets 
    Set rng1 = Nothing 
     On Error Resume Next 
     Set rng1 = ws.Cells.SpecialCells(xlCellTypeFormulas) 
     On Error GoTo 0 
     If Not rng1 Is Nothing Then 
      For Each rng2 In rng1.Areas 
      'dump cells here 
      Next rng2 
     End If 
    Next ws 
End Sub 
+0

似乎ws.UsedRange.Formula返回一个对象[,](在C#中工作),它由包含该表中所有公式的最小范围内的所有字符串组成。所有的字符串,包括非公式。这个集合对于我的程序来说太大了。 – Jake

+0

但您仍然使用一些对象对我的参考很有帮助。谢谢。 – Jake

+0

Jake,我用一个新的代码片段更新了我的代码,它显示了如何快速分离公式单元格,而不是运行HasFormula测试。 – brettdj

0

组合键Ctrl +`(背面蜱)观察值和公式之间进行切换,这是不平坦的列表,但它是有用的。

+0

感谢您的提示。不幸的是,它对我来说仍然太麻烦。 – Jake

0

与brettdj的帮助下,我成功的那一刻

private static void FindFormula(Excel excel, TextWriter writer, int rowstart, int rowend, int colstart, int colend) 
{ 
    // Select the range 
    excel.Range(rowstart, rowend, colstart, colend); 

    // Check whether this range has formulas 
    if (!excel.RangeHasFormula()) 
     return; 

    // Check if we only have a single cell 
    if (excel.RangeCellCount() == 1) 
    { 
     Console.WriteLine(excel.CellFormula(rowstart, colstart)); 
     return; 
    } 

    int r1, r2, r3, r4; 
    int c1, c2, c3, c4; 

    r1 = rowstart; 
    r2 = rowstart + (rowend - rowstart + 1)/2 - 1; 
    r3 = r2 + 1; 
    r4 = rowend; 

    if (colstart == colend) 
    { 
     c1 = c2 = c3 = c4 = colstart; 

     FindFormula(excel, writer, r1, r2, c1, c2); 
     FindFormula(excel, writer, r3, r4, c1, c2); 
    } 
    else 
    { 
     c1 = colstart; 
     c2 = colstart + (colend - colstart + 1)/2 - 1; 
     c3 = c2 + 1; 
     c4 = colend; 

     FindFormula(excel, writer, r1, r2, c1, c2); 
     FindFormula(excel, writer, r1, r2, c3, c4); 
     FindFormula(excel, writer, r3, r4, c1, c2); 
     FindFormula(excel, writer, r3, r4, c3, c4); 
    } 
} 
1

掀起一个四叉树搜索下面是一些代码,我曾经得到与他们的公式一个工作表单元格的列表。它看起来很快。

try 
{ 
    Excel.Worksheet excelWorksheet = workbook.ActiveSheet as Excel.Worksheet; 
    Excel.Range formulaCell = excelWorksheet.Cells.SpecialCells(
     Excel.XlCellType.xlCellTypeFormulas, Type.Missing); 

    Excel.Range cell; 
    foreach (var fc in formulaCell) 
    { 
     cell = fc as Excel.Range; 
     string s1 = cell.Formula as string; 
     int c = cell.Column; 
     int r = cell.Row; 

     // Gives formula text and location of formula. 
    } 
} 
catch (Exception) 
{ 
    ; // Throws an exception if there are no results. 
     // Probably should ignore that exception only 
} 
相关问题