【问题标题】:How do I set an Excel RangePtr's Value = Value in C++? Currently I get HRESULT 0x80004005如何在 C++ 中设置 Excel RangePtr 的值 = 值?目前我得到 HRESULT 0x80004005
【发布时间】:2016-12-08 04:20:48
【问题描述】:

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

rng->Value = rng->Value;

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

【问题讨论】:

    标签: c++ excel com


    【解决方案1】:

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

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

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

    rng->Value2 = rng->Value2;
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      通常,“safe_cast<:range>”和“safe_cast<:workbook>”的类型转换也很有帮助。将 Excel 自动化与 C++/CLI 结合使用的整个主题的文档很少。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-16
        • 1970-01-01
        • 2015-10-02
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多