我正在编写一个将简单数据库与Excel工作表同步的工具。数据库中表中的每个项对应于工作表中的一行。我使用C#和Excel互操作com接口将Excel工作表读入工具,然后在同步后比较项目的值(即excel表中的一列),以确保它们相等。
昨天我发现了一个比较不正确的案例:
"'<MedalTitle>' Medal - <MedalDescription>"
"<MedalTitle>' Medal - <MedalDescription>"
第二个是我从Excel中读到的那个,你可以看到它跳过了第一个撇号。有没有办法告诉Excel将单元格视为文本(不,只是设置单元格的格式没有帮助)?
我甚至尝试在VBA中复制单元格的值('hello'),如下所示:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Target.Offset(1, 0).Value = Target.Worksheet.Range("b2").Value
Target.Offset(2, 0).Value = Target.Worksheet.Range("b2").Formula
Target.Offset(3, 0).Formula = Target.Worksheet.Range("b2").Formula
Target.Offset(4, 0).Formula = Target.Worksheet.Range("b2").Value
End Sub
结果是目标细胞的值总是 hello'
如果没有办法,我将不得不做一些丑陋的事情,如
if (dbitem.value[0] == ''' )
{
// stuff
}
else
{
// regular comparison
}
答案 0 :(得分:10)
我担心撇号'
是Excel中的一个特殊字符,当它出现在您发现的单元格中的第一个字符时。它告诉Excel将字符串的其余部分视为文本,以便您可以在单元格中输入'34.2
之类的内容,并将其视为字符串而不是数字(用于格式化等)。
我建议你做一些类似于你建议的事情,除了你把它放到Excel中的地方,检查第一个字符,如果已经有一个'
,还要添加额外的{{1}}。
或者,您可以在所有值之前添加撇号 - 如果您希望它们全部为文本。这样你就不需要额外的第一个字符检查了。
答案 1 :(得分:4)
查看与该单元格对应的PrefixCharacter
对象的Range
属性
来自帮助:
如果
TransitionNavigKeys
属性是False
,此前缀字符为' 用于文本标签或空白。如果TransitionNavigKeys
属性为True
, 这个角色将是'为了一个 左对齐标签,“for a 右对齐标签,^为a 居中的标签,\重复 标签,或空白。
TransitionNavigKeys
部分与Lotus 1-2-3的兼容性有关,所以它很可能是False
基于以下文章的答案:
http://excel.tips.net/Pages/T003332_Searching_for_Leading_Apostrophes.html
(警告:可能会出现稍微恼人的弹出窗口)
编辑:实际上这可能不会有任何用处,因为PrefixCharacter
是只读的:(
edit2:我第一次是对的。 PrefixCharacter
只有在添加到单元格中的值以'所以只读回PrefixCharacter
加Value
并连接后才会填充。只要TransitionNavigKeys
为False
,即
答案 2 :(得分:1)
尝试targetcell.Value
。 .Formula
是公式栏中显示的公式,而.Value
是单元格的评估值。
所以,我猜你也会在原始代码中使用.Formula
。改变它应该有效。
编辑:好的,它不起作用(尴尬)。
Excel专门处理起始单引号..特别是即使是模糊的单元格/范围属性也没有访问权限。我能找到的唯一解决方法与您最初的想法基本相同。这是:
If VarType(cell) = 8 And Not cell.HasFormula Then
GetFormulaI = "'" & cell.Formula
Else
GetFormulaI = cell.Formula
End If
答案 3 :(得分:0)
您可以尝试在查询中预先挂起单个引号到文本字段(''''+ + dbField),以便对于嵌入单引号的字段,您的查询将返回:
"''stuff in single quotes'"
当放在Excel单元格中时会转换为:
"'stuff in single quotes'"
对于没有引号的字符:
"'stuff that wasn't in quotes"
当放在Excel单元格中时会转换为:
"stuff that wasn't in quotes"
值得一试。 : - )