【问题标题】:Replace cell references with string from a corresponding cell用相应单元格中的字符串替换单元格引用
【发布时间】:2017-10-22 21:26:48
【问题描述】:

我有计算单元格。

这是一个简单的例子,在第 11 行。

=$V11*$AB11*AF11

我正在努力解决这个问题:

=[EAD: On Balance Sheet]*[PD Low]*[Collateral LGD High]

这 3 个字符串都来自第 10 行,即 V、AB 和 AF 列。

这是另一个例子:

改变这个:

=$V11*VLOOKUP($AA11,Rates!AQ:AU,5,FALSE)*AE11

到这里:

'[EAD: On Balance Sheet]*VLOOKUP([Proposed Risk Rating],Rates!AQ:AU,5,FALSE)*[Collateral LGD Low]

所有公式都在第 11 行,我想从第 10 行获取相应的标题,这些标题都是字符串。

我认为必须有办法做到这一点,因为 Excel 知道所有相关的单元格引用,并跟踪所有内容。

我不知道如何用字符串替换引用(在本例中是第 10 行中的相应标题)。

【问题讨论】:

  • 您是否要设置命名范围?您的数据在表格中吗?关于命名实体的重要性的更多细节将在这里有所帮助。
  • 编写应用程序来解析 Excel 公式并确定哪些位是单元格引用(因此需要更改),哪些位是运算符,哪些位是命名范围,哪些位是函数名,等等,这将不是一个简单的练习。您还需要考虑如果公式是 =SUM($AB11:$AF11),您希望发生什么。

标签: vba excel


【解决方案1】:

我对此很陌生,因此没有足够的“声誉”来评论和澄清您的问题。 如果单元格 V11、AB11 和 AF11 具有文本“EAD:在资产负债表上”、“PD Low”和“Collat​​eral LGD High”,并且您希望此单元格显示这些词。 那么下面的代码就可以工作了:

sub combine_words()
dim i as string
dim j as string
dim k as string

i = range("V11").value
j = range("AB11").value
k = range("AF11").value

range("A11").value = "[" & i & "]*[" & j & "]*[" & k & "]"

end sub

将单元格 A11 替换为您希望输入文本的单元格。

如果我对您的问题的理解有误,请告诉我,如果可以的话,我会更改代码以满足您的需求。

【讨论】:

  • 罗汉,没那么容易。我刚刚更新了我原来的帖子。我正在尝试挑选第 11 行中的单元格引用,并将它们替换为第 10 行中的字符串(Access 表中的标题)。有什么想法吗?这似乎有些棘手。
【解决方案2】:

也许在公式中进行简单的查找和替换就足够了。我敢肯定有很多我没有考虑过的边缘情况。希望这能引导对话朝着正确的方向发展。

Sub SOExample()
    Dim mySheet         As Worksheet: Set mySheet = ThisWorkbook.Sheets("Sheet1")
    Dim headerRng       As Range: Set headerRng = mySheet.Range("A1:J1") 'Specify where to do replacements
    Dim mycell          As Range
    Dim vkey            As Variant
    Dim myDict          As Object: Set myDict = CreateObject("Scripting.Dictionary")

    'Iterate each header row add the address as the key, and the NEXT row's Text as the value
    For Each mycell In headerRng
        If Not myDict.exists(mycell.Offset(1, 0).Address) Then
            myDict.Add mycell.Offset(1, 0).Address, mycell.Text
        End If
    Next

    'Iterate each cells formula and replace it
    For Each mycell In headerRng
        For Each vkey In myDict.keys
            mycell.Offset(1, 0).Formula = Replace(mycell.Offset(1, 0).Formula, vkey, myDict(vkey), , , vbTextCompare)
        Next
    Next

End Sub

【讨论】:

  • 是的,Ryan,这在一个具体的例子中有效。我需要遍历 M11:GZ11 中的几百个单元格,在每个单元格中找到多个引用,并将所有引用替换为第 10 行中的相关字符串。这里还有一个示例:=ABS(DQ11+DT11) --> = ABS([Base+Imprecision]+[Concentration Risk])。因此,DQ10=[Base+Imprecision] 和 DT10=[Concentration Risk]。
  • 你可以遍历标题行并将标题作为键和偏移单元格的地址作为值添加到字典中吗?
  • 听起来不错,但我不知道该怎么做。我想我需要解析单元格地址,并用标题替换每个单元格,但我不知道该怎么做。
  • 查看我编辑的答案,看看是否越来越接近。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多