如何设置 Excel 范围 Ptr 的值 = C++值?目前我得到 HRESULT 0x80004005

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

本文关键字:目前 C++ 0x80004005 HRESULT 的值 何设置 设置 Ptr 范围 Excel      更新时间:2023-10-16

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

rng->Value = rng->Value;

但是当我运行它时,我从 HRESULT 0x8004005中得到一个异常。单元格值中没有任何内容会导致 Excel 阻塞;返回的值应该只是一个包含doubleSAFEARRAY_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 一起使用的整个主题记录很少。

相关文章: