如何在C ++中设置Excel RangePtr的Value = Value?目前我得到HRESULT 0x80004005

时间:2016-08-02 17:17:27

标签: c++ excel com

我有一个Excel RangePtr对象,我正在尝试将其相应的单元格转换为值而不是公式。我习惯在VBA中这样做,只需使用r.Value = r.Value即可。在C ++中,我尝试了一种类似的方法:

rng->Value = rng->Value;

但是当我运行它时,我从HRESULT 0x8004005得到一个例外。单元格值中没有任何内容会导致Excel窒息;返回的值应该只是包含_variant_t SAFEARRAYdouble值的var state = Immutable.fromJS({ cmsData: { "pages": [ { "name": "page1", "content": { "header": "Example header", "intro": "Example intro", "body": "Example body", } } ] }}); 。那么我做错了什么?

2 个答案:

答案 0 :(得分:0)

D'哦。看起来RangePtr.Value实际上必须指定一个XlRangeValueDataType常量,这在VBA中不存在:

rng->Value[Excel::XlRangeValueDataType::xlRangeValueDefault] = rng->Value;

或者我可以使用Value2属性而不是普通Value

rng->Value2 = rng->Value2;

希望这对将来遇到此问题的其他人有所帮助。

答案 1 :(得分:0)

经过痛苦的搜索,我得出了同样的结论,并使用 value[Excel::XlRangeValueDataType::xlRangeValueDefault] 在 c# 或 vb 在 C++/CLI 中获得相当于 range.value 的值。让我看看这是否有效...是的,这就是解决方案,它有效!

顺便说一句:如果您需要使用 Range::Address 属性,您可以使用样式 地址[false, false, Excel::XlReferenceStyle::xlA1, Type::Missing, Type::Missing];当然,使用适当的参数。

此外,关于 value 属性,我发现可以通过以下方式检查单元格值的存在: 值[Excel::XlRangeValueDataType::xlRangeValueDefault] != nullptr

通常,“safe_cast”和“safe_cast”的类型转换也很有帮助。将 Excel 自动化与 C++/CLI 结合使用的整个主题没有详细记录。