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

How do I set an Excel RangePtr's Value = Value in C++? Currently I get HRESULT 0x80004005

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

rng->Value = rng->Value;

但是当我 运行 那个时,我从 HRESULT 0x8004005 得到一个异常。单元格值中没有任何内容会导致 Excel 窒息;返回的值应该只是一个 _variant_t 包含 SAFEARRAYdouble 值。那我做错了什么?

哦。看起来 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 的等价物。让我看看是否有效...是的,这就是解决方案,有效!

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

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

通常,类型转换如“safe_cast”和“safe_cast”也很有用.使用 Excel 自动化与 C++/CLI 的整个主题很少被记录。