Brian需要先处理工作表,然后才能将其分发给其他人。他需要的是消除工作表中的大部分(但不是全部)公式。他想逐步浏览选定单元格区域中的所有单元格,如果该单元格包含公式,请检查该公式。如果公式包含对当前工作簿中其他工作表的引用(任何引用),则该公式将被忽略。如果公式不包含这样的引用,则宏需要用公式的结果替换该公式。

这是一个相对简单的任务。您需要做的就是让宏步骤遍历单元格,然后(1)找出单元格是否包含公式。如果是这样,请检查该公式是否包含感叹号。感叹号用于公式参考中,例如:

=Sheet2!A1

因此,如果公式包含感叹号,则可以忽略它。如果它不包含感叹号,则可以将其替换为它的值。

Sub ConvertFormulas1()

Dim c As Variant     Dim frm As String

On Error Resume Next

For Each c In Selection         If c.HasFormula Then             frm = c.Formula             If InStr(1, frm, "!") = 0 Then                 c.Value = c.Value             End If         End If     Next c End Sub

这种方法有一个缺点:感叹号将出现在当前工作表外部的所有公式中,包括其他工作簿中的公式。如果您确实只想将公式替换为当前工作簿中的其他工作表,而忽略引用其他工作簿中的工作表的公式,那么您需要添加一些其他逻辑。当您查看Excel如何引用其他工作簿时,逻辑将变得显而易见:

=[OtherWorksheet.xls]Sheet1'!$C$9

请注意,另一个工作簿的名称包含在方括号中。

因此,在测试了感叹号(通知您引用是指向另一个工作表)之后,您需要检查是否存在左括号。如果有,则该引用不是针对当前工作簿中的单元格。

Sub ConvertFormulas2()

Dim c As Variant     Dim OtherSheet As Boolean     Dim frm As String

On Error Resume Next

For Each c In Selection         If c.HasFormula Then             frm = c.Formula             OtherSheet = False             If InStr(1, frm, "!") Then                 OtherSheet = True                 If InStr(1, frm, "[") Then                     OtherSheet = False                 End If             End If             If Not OtherSheet Then                 c.Value = c.Value             End If         End If     Next c End Sub

||相对容易地修改此宏中使用的公式,以便在离开时摆脱所有外部引用实际上,您要做的就是摆脱对括号的检查,然后摆脱检查OtherSheet变量的结构中的“ Not”关键字。 |||| 注意:

|如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)上描述的宏,我准备了一个特殊页面,其中包含有用的信息。

`链接:/ excelribbon-ExcelTipsMacros [单击此处可在新的浏览器标签]。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(6959)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本:

链接:/ excelribbon-Replacing_Some_Formulas_with_the_Formula_Results [用公式结果替换某些公式]。