我正在尝试通过电子表格齿轮库获取单元格中的文本。
有一个公式应用于C1 =GETURL(I2)
列,它正在评估类似“https://loremipsum.com/2345/view”的文字
我有另一列C2,其公式输出'View'作为文本
=HYPERLINK(CONCATENATE("https://loremipsum.com/",[@[Customer CID]],"/view"), "View")
现在,当我尝试通过C2列中的单元格的C#代码获取Text时,当我运行以下语句并且“#Name?”时,我得到“View”对于C1列中的细胞。
worksheet.Cells[i, j].Text; //Outputs = "#NAME?"
我尝试在excel中使用=TEXT(GETURL(I2), "")
,但仍输出#Name!
我也试过worksheet.Cells[i, j].Value //Output = Name
为什么即使两个单元格都应用了公式,相同的语句也会给出不同的结果。
Function GETURL(cell As Range, Optional default_value As Variant)
With cell.Range("A1")
If .Hyperlinks.Count = 1 Then
GETURL = .Hyperlinks(1).Address
Else
If Left$(Replace(Replace(Replace(.Formula, " ", ""), vbCr, ""), vbLf, ""), 11) = "=HYPERLINK(" Then
Dim indexFirstArgument As Long: indexFirstArgument = InStr(.Formula, "(") + 1
GETURL = Application.Evaluate(Mid$(.Formula, indexFirstArgument, InStrRev(.Formula, ",") - indexFirstArgument))
Else
GETURL = default_value
End If
End If
End With
End Function
答案 0 :(得分:0)
就SpreadsheetGear而言,请注意SpreadsheetGear无法执行VBA代码(尽管它确实在现有的XLS或XLSM文件中保留了VBA)。 SpreadsheetGear支持添加您自己的自定义函数,但您必须通过.NET应用程序中的SpreadsheetGear。CustomFunctions API实现此功能。如果没有可用的自定义函数,SpreadsheetGear将返回#NAME!只要遇到像GETURL这样的函数就会出错,我怀疑这就是你的情况。
要在SpreadsheetGear中实现自定义函数,您基本上必须对Function类进行子类化并覆盖其Evaluate(...)方法,这是每当SpreadsheetGear遇到您的自定义函数时调用的方法在公式中。该文档包含示例,但您也可以在此处找到功能齐全的ASP.NET示例:
https://www.spreadsheetgear.com/support/samples/asp.net.sample.aspx?sample=customfunctions
重要:SpreadsheetGear自定义函数有许多必须遵守的规则。我强烈建议您查看这些规则,如上面链接中提供的Function.Evaluate(...)方法文档的“备注”部分所述。其中一条规则是必须通过IArguments参数提供给Evaluate(...)的参数来完成对单元格的所有访问。
您的GETURL函数似乎可以访问Range,其超链接集合和公式等.SpreadsheetGear的自定义函数API中不允许执行这些操作。您可以访问的是IArguments提供的内容,在将范围传入自定义函数的情况下,这些单元格的基础计算值。换句话说,上面实现的GETURL函数无法移植到SpreadsheetGear自定义函数。您需要以不访问IRange / IRange.Hyperlinks / etc的方式更新它。