我有用VBA和单元格公式编写的大量程序。我的任务是将其逆向工程化为C#winforms。我想了一个开始,我需要在平面列表中看到所有单元格公式。生成所有Excel单元格公式的平面列表
任何现有的方式来做到这一点?提前致谢!
编辑:只是为了分享,与应答者的帮助下,我设法想出这个:
我有用VBA和单元格公式编写的大量程序。我的任务是将其逆向工程化为C#winforms。我想了一个开始,我需要在平面列表中看到所有单元格公式。生成所有Excel单元格公式的平面列表
任何现有的方式来做到这一点?提前致谢!
编辑:只是为了分享,与应答者的帮助下,我设法想出这个:
,你可以迅速倾倒在所有的公式所有工作表都转换为一个平坦的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
与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);
}
}
掀起一个四叉树搜索下面是一些代码,我曾经得到与他们的公式一个工作表单元格的列表。它看起来很快。
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
}
您可能会发现跟踪先例和跟踪依赖项工具很有用。它们位于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
谢谢,但这是因为跟踪功能不够好,这就是为什么我需要一个列表。我认为在这种情况下看一张纸的速度会更快。如果有像MSVS那样的“定义”,那会更好。 – Jake
这非常酷 - 感谢分享! – brettdj