我有一个 Excel RangePtr
对象,我正在尝试将其相应的单元格转换为值而不是公式。我习惯于在 VBA 中执行此操作,您只需使用 r.Value = r.Value
即可执行此操作。在C++中 ,我尝试了一种类似的方法:
rng->Value = rng->Value;
但是当我运行它时,我从 HRESULT 0x8004005
中得到一个异常。单元格值中没有任何内容会导致 Excel 阻塞;返回的值应该只是一个包含double
值SAFEARRAY
的_variant_t
。那我做错了什么呢?
D'oh.看起来RangePtr.Value
实际上必须指定一个 XlRangeValueDataType
常量,这在 VBA 中不存在:
rng->Value[Excel::XlRangeValueDataType::xlRangeValueDefault] = rng->Value;
或者我可以使用 Value2
属性而不是普通Value
:
rng->Value2 = rng->Value2;
希望这对将来遇到此问题的其他人有所帮助。
经过痛苦的搜索,我得出了同样的结论,并使用value[Excel::XlRangeValueDataType::xlRangeValueDefault] 获取 c# 中的 range.value 或 C++/CLI 中的 vb 等效值。让我看看这是否有效...是的,这就是解决方案,它有效!
顺便说一句:如果你需要使用 范围::地址 属性,你可以使用样式地址[false, false, Excel::XlReferenceStyle::xlA1, Type::Missing, Type::Missing];当然,使用适当的参数。
此外,关于 value 属性,我发现单元格值的存在可以通过以下方式检查:Value[Excel::XlRangeValueDataType::xlRangeValueDefault] != nullptr
通常,"safe_cast<Excel::Range^>"和"safe_cast<Excel::Workbook^>"的类型转换也很有帮助。将 Excel 自动化与 C++/CLI 一起使用的整个主题记录很少。