excel vba 值粘贴“=X()”类型的所有公式
excel vba value paste all formulas of type "=X()"
我有一个数据库应用程序,它通过 UDF 将数据存储在数组公式中。
我想要一个通过 sheet/wbook 并通过用给定单元格中的当前值替换 udf 数组公式来破坏所有外部链接的宏。
挑战在于给定数组公式中的单元格不能单独编写。例如,像下面这样的宏将导致整个数组在第一次被破坏写.
Public Sub breaklink()
Dim c
For Each c In ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas)
Debug.Print c.FormulaArray
If InStr(c.FormulaArray, "MYFORMULA(") Then
Stop
c.FormulaArray = c.Value
'c.Value = c.Value --THIS THROWS ERROR 1004 (Can't edit part of an array)
Stop
End If
Next
End Sub
如果有像 c.getArrayFormulaRange
这样的单元格方法,那么我可以用它来创建一个值数组,然后覆盖数组公式。
我可以想象循环遍历相邻的单元格以尝试找到每个数组的边界,但这看起来很麻烦(另外,我会改变我在循环过程中循环的范围,这可能会引发问题) .是否有任何方法或对象 属性 可以帮助我识别给定数组公式所占用的整个范围?
根据上面 simpLE MAn 的建议,这是我的解决方案:
Public Sub breakLinks(scope As String)
Dim formula_tokens()
Dim c As Range, fa_range As Range
Dim ws As Worksheet
Dim token
formula_tokens = Array("MYFORMULA1(", "MYFORMULA2(", "OTHERFORMULA(", "OTHERFORMULA2(")
If scope = "sheet" Then
For Each c In ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas)
For Each token In formula_tokens
If InStr(UCase(c.FormulaArray), token) Then
If c.HasArray Then
Set fa_range = c.CurrentArray
fa_range.FormulaArray = fa_range.Value
Else
c.Formula = c.Value
End If
End If
Next
Next
ElseIf scope = "wbook" Then
For Each ws In Worksheets
For Each c In ws.Cells.SpecialCells(xlCellTypeFormulas)
For Each token In formula_tokens
If InStr(UCase(c.FormulaArray), token) Then
If c.HasArray Then
Set fa_range = c.CurrentArray
fa_range.FormulaArray = fa_range.Value
Else
c.Formula = c.Value
End If
End If
Next
Next
Next
End If
End Sub
我有一个数据库应用程序,它通过 UDF 将数据存储在数组公式中。
我想要一个通过 sheet/wbook 并通过用给定单元格中的当前值替换 udf 数组公式来破坏所有外部链接的宏。
挑战在于给定数组公式中的单元格不能单独编写。例如,像下面这样的宏将导致整个数组在第一次被破坏写.
Public Sub breaklink()
Dim c
For Each c In ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas)
Debug.Print c.FormulaArray
If InStr(c.FormulaArray, "MYFORMULA(") Then
Stop
c.FormulaArray = c.Value
'c.Value = c.Value --THIS THROWS ERROR 1004 (Can't edit part of an array)
Stop
End If
Next
End Sub
如果有像 c.getArrayFormulaRange
这样的单元格方法,那么我可以用它来创建一个值数组,然后覆盖数组公式。
我可以想象循环遍历相邻的单元格以尝试找到每个数组的边界,但这看起来很麻烦(另外,我会改变我在循环过程中循环的范围,这可能会引发问题) .是否有任何方法或对象 属性 可以帮助我识别给定数组公式所占用的整个范围?
根据上面 simpLE MAn 的建议,这是我的解决方案:
Public Sub breakLinks(scope As String)
Dim formula_tokens()
Dim c As Range, fa_range As Range
Dim ws As Worksheet
Dim token
formula_tokens = Array("MYFORMULA1(", "MYFORMULA2(", "OTHERFORMULA(", "OTHERFORMULA2(")
If scope = "sheet" Then
For Each c In ActiveSheet.Cells.SpecialCells(xlCellTypeFormulas)
For Each token In formula_tokens
If InStr(UCase(c.FormulaArray), token) Then
If c.HasArray Then
Set fa_range = c.CurrentArray
fa_range.FormulaArray = fa_range.Value
Else
c.Formula = c.Value
End If
End If
Next
Next
ElseIf scope = "wbook" Then
For Each ws In Worksheets
For Each c In ws.Cells.SpecialCells(xlCellTypeFormulas)
For Each token In formula_tokens
If InStr(UCase(c.FormulaArray), token) Then
If c.HasArray Then
Set fa_range = c.CurrentArray
fa_range.FormulaArray = fa_range.Value
Else
c.Formula = c.Value
End If
End If
Next
Next
Next
End If
End Sub