有没有一种简单的方法可以替换为Excel中的占位符?

锡吉尔

我有一个这样的公式:

=IF(OR($A1="xyz",$B1="abc",$C5="dmz"),1,0)

我想将每个单元格地址替换为一个明确声明工作表的静态地址,即

=IF(OR(Sheet1!$A$1="xyz",Sheet1!$B$1="abc",Sheet1!$C$5="dmz"),1,0)

我有这个:

Public Function absoluteFormula(sheetname As String, ByVal formula As String) As String

Dim re As New RegExp
Dim matches As MatchCollection
Dim mtch As Match
Dim absoluteAddress As String


'get all addresses in formula
re.pattern = "[$][A-Za-z]+[0-9]+"
re.Global = True

Set matches = re.Execute(formula)

'replace each address with its static version
For Each mtch In matches
    absoluteAddress = sheetname & "!" & getAbsoluteAddress(re, mtch.value)
    formula = Replace(formula, mtch.value, absoluteAddress)
Next

absoluteFormula = formula

End Function


'makes row static, e.g. "$AU1" -> "$AU$1"
Private Function getAbsoluteAddress(re As RegExp, address As String)

Dim matches As MatchCollection
Dim alphaColumn As String


re.pattern = "[A-Za-z]+"

Set matches = re.Execute(address)
alphaColumn = matches(0).value
getAbsoluteAddress = Replace(address, alphaColumn, alphaColumn & "$")


End Function

这似乎是完成基本功能(伪代码)的许多代码:

find all instances of "[$][alpha]+"
replace with sheetname & "!" & instance & "$"

有没有更简单的方法来执行此替换?

悉达思·劳特

没有经过完全测试,但是这样会有所帮助吗?选择具有公式的单个单元格并运行Sample我没有做任何错误处理。我假设ActiveCell WILL有一个公式。我也同意您在上述评论中所说的,您的公式将没有命名范围

Dim sformula As String
Dim sh As String

Sub Sample()
    Dim cell As Range, c As Range

    '~~> This is what you want to append
    sh = "Sheet1!"

    '~~> Store the formula in a variable
    sformula = ActiveCell.Formula

    Debug.Print sformula

    '~~> Get the precedents
    Set cell = ActiveCell.Precedents

    '~~> Loop though them
    For Each c In cell
        ReplaceAddress c.Address                                            '~~> $A$1
        ReplaceAddress c.Address(RowAbsolute:=False)                        '~~> $A1
        ReplaceAddress c.Address(ColumnAbsolute:=False)                     '~~> A$1
        ReplaceAddress c.Address(RowAbsolute:=False, ColumnAbsolute:=False) '~~> A1
    Next

    Debug.Print sformula
End Sub

Function ReplaceAddress(s As String) As String
    Dim pos As Long

    pos = InStr(1, sformula, s)

    Do While pos > 0
        If pos = 1 Then
            sformula = sh & sformula
        ElseIf pos > 1 Then
            '~~> Various checks for "!","$" and ":"
            If Mid(sformula, pos - 1, 1) <> "!" And Mid(sformula, pos - 1, 1) <> "$" And _
            Mid(sformula, pos - 1, 1) <> ":" And Mid(sformula, pos - 2, 1) <> ":" Then
                sformula = Left(sformula, pos - 1) & sh & Mid(sformula, pos)
            End If
        End If
        '~~> Find next occurance
        pos = InStr(pos + 1, sformula, s)
    Loop
    ReplaceAddress = sformula
End Function

各种测试

之前:

=IF(OR($A1="xyz",$B1="abc",$C5="dmz"),1,0)

后:

=IF(OR(Sheet1!$A1="xyz",Sheet1!$B1="abc",Sheet1!$C5="dmz"),1,0)

之前:

=VLOOKUP(K4,N10:Q18,1,0)

后:

=VLOOKUP(Sheet1!K4,Sheet1!N10:Q18,1,0)

稍微复杂一点的测试

之前:

=IF(G4>MAX($D$4:$D$8),"N/A",INDEX($B$4:$B$8,INDEX(MATCH(G4,$C$4:$C$8,1),0,0),0))

后:

=IF(Sheet1!G4>MAX(Sheet1!$D$4:$D$8),"N/A",INDEX(Sheet1!$B$4:$B$8,INDEX(MATCH(Sheet1!G4,Sheet1!$C$4:$C$8,1),0,0),0))

评论的跟进

用这个

Sub Sample()
    Dim cell As Range, c As Range

    '~~> This is what you want to append
    sh = "Sheet1!"

    '~~> Store the formula in a variable
    sformula = ActiveCell.Formula

    Debug.Print sformula

    '~~> Get the precedents
    Set cell = ActiveCell.Precedents

    '~~> Loop though them
    For Each c In cell
        ReplaceAddress c.Address                                            '~~> $A$1
        ReplaceAddress c.Address(RowAbsolute:=False)                        '~~> $A1
        ReplaceAddress c.Address(ColumnAbsolute:=False)                     '~~> A$1
        ReplaceAddress c.Address(RowAbsolute:=False, ColumnAbsolute:=False) '~~> A1

        sformula = Replace(sformula, c.Address(RowAbsolute:=False), c.Address)
        sformula = Replace(sformula, c.Address(ColumnAbsolute:=False), c.Address)
        sformula = Replace(sformula, c.Address(RowAbsolute:=False, ColumnAbsolute:=False), c.Address)
    Next

    Do While InStr(1, sformula, "$$")
        sformula = Replace(sformula, "$$", "$")
    Loop

    Debug.Print sformula
End Sub

Function ReplaceAddress(s As String) As String
    Dim pos As Long

    pos = InStr(1, sformula, s)

    Do While pos > 0
        If pos = 1 Then
            sformula = sh & sformula
        ElseIf pos > 1 Then
            '~~> Various checks for "!","$" and ":"
            On Error Resume Next
            If Mid(sformula, pos - 1, 1) <> "!" And Mid(sformula, pos - 1, 1) <> "$" And _
            Mid(sformula, pos - 1, 1) <> ":" And Mid(sformula, pos - 2, 1) <> ":" Then
                sformula = Left(sformula, pos - 1) & sh & Mid(sformula, pos)
            End If
            On Error GoTo 0
        End If
        '~~> Find next occurance
        pos = InStr(pos + 1, sformula, s)
    Loop
    ReplaceAddress = sformula
End Function

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有一种简单的方法可以在Excel中重新格式化?

有没有一种简单的方法可以比较列表中数据框的匹配元素并将其替换为数据框?

在Racket中,有没有一种简单的方法可以将字符串转换为变量名(标识符)?

有没有一种简单的方法可以将jquery代码转换为javascript?

有没有一种简单的方法可以在Java中将String转换为Inetaddress?

有没有一种简单的方法可以在C#中堆叠比较运算符?

有没有一种简单的方法可以将字节[]转换为Fsharp中的ReadOnlySpan <byte>?

有没有一种简单的方法可以将我的XML对象转换为Java中的String?

有没有一种简单的方法可以将 name:value 子项转换为 postgresql 中的列?

有没有一种简单的方法可以将数据库行转换为Golang中的JSON

有没有一种方法可以在Visual Studio搜索/替换中插入换行符?

有没有一种方法可以更改占位符以仅读取模型的显示名称属性?

有没有一种方法可以为Python对象属性实现某种占位符?

有没有一种简单的方法可以在 Kotlin 中通过 _id 获取对象?

有没有一种简单的方法可以从 Kotlin 的对象列表中获取数组?

有没有一种简单的方法可以在 Kotlin 中优化代码?

有没有一种简单的方法可以更改 django 中的路径?

有没有一种简单的方法可以在C#中创建序数?

有没有一种简单的方法可以在JSF中实现路由?

有没有一种简单的方法可以在Android中获得整数?

有没有一种简单的方法可以在Android Studio中查看颜色?

有没有一种简单的方法可以在WebStorm中评估JavaScript?

有没有一种简单的方法可以在Rust中对枚举字段进行突变?

有没有一种简单的方法可以为列表中的单词添加空格?

有没有一种简单的方法可以在 python 中获取文本输入字段?

有没有一种简单的方法可以在类中全局变量

有没有一种简单的方法可以在Matlab GUI中显示“表格”?

有没有一种简单的方法可以从数组中删除重复的元素?

Kompozer会怎样?有没有一种简单的方法可以在13.10中安装?