【问题标题】:Unable to assign formula to cell range in Excel无法将公式分配给 Excel 中的单元格区域
【发布时间】:2015-04-27 12:57:12
【问题描述】:

项目中其他人的代码,我正在尝试修复。

listO.Range(i, j).FormulaR1C1 = FormulaMatrix(i, j)

其中FormulaMatrix(i, j) 始终是String 值。我尝试使用的任何随机/测试值都已成功分配,除非它是公式,例如。

=IF(LENGTH([@Units])>0;[@SalesAmount]-[@DiscountAmount]0)

如果我删除公式开头的= 符号,它会被正确分配,但它没用,因为它不是公式。

@Units@SalesAmount@DiscountAmount 是列的引用/名称。

因此,在分配公式时,我得到一个异常 HRESULT: 0x800A03EC。我查阅了in this answer 以获得解释,并按照那里的一些说明进行操作。我确定我的问题如下:问题是由于在单元格中输入了一个函数并且它正在尝试更新另一个单元格。

还检查了this post. 我尝试了完全不同的方法(比如只输入没有= 的公式,然后再次运行并输入等号),但同样的问题。

我不知道如何处理这个问题。

【问题讨论】:

  • 这个其他功能在哪里?它在做什么,它试图更新哪个单元格?
  • 那是 Excel 互操作吗?尝试使用 .Value 或 .FormulaLocal 而不是 .FormulaR1C1 直接将公式作为字符串传递。如果我没记错的话,R1C1 对我来说从来没有用过。
  • 另外,您问题中的公式无效...您的意思是=IF(LEN([@Units])>0,[@SalesAmount]-[@DiscountAmount],0)
  • @nwhaught ,公式很好。如果,当我已经在 Excel 中时,选择某个单元格并手动插入此公式 - 它可以工作。 :)
  • @nwhaught ,我也尝试了你建议的公式,但我仍然得到异常......

标签: vb.net excel excel-formula interop excel-2010


【解决方案1】:

.formulalocalworks!(而 .formula.value.formular1c1 不会。)

我刚刚开始使用 VB.NET,遇到了一个非常相似的问题。这是我最初的简化数据(Sheet1 中的Table1):

然后在应用下面的代码后,我得到了这个:

表单的完整代码:

Imports Excel = Microsoft.Office.Interop.Excel

Public Class Form1
    '~~> Define your Excel Objects
    Dim xlApp As New Excel.Application
    Dim xlWorkBook As Excel.Workbook
    Dim xlWorkSheet As Excel.Worksheet
    Dim strAddress As String = "C:\Temp\SampleNew.xlsx"
    Dim list1 As Object


    Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click
        '~~> Add a New Workbook (IGNORING THE TWO DOT RULE)
        xlWorkBook = xlApp.Workbooks.Open(strAddress)

        '~~> Display Excel
        xlApp.Visible = True

        '~~> Set the relevant sheet that we want to work with
        xlWorkSheet = xlWorkBook.Sheets("Sheet1")

        With xlWorkSheet

            '~~> Change the range into a tabular format
            list1 = .ListObjects("Table1")

        End With

        list1.range(2, 4).formulalocal = "=IF(LEN([@Month])>5;[@Income]-[@MoneySpent];0)"

        '~~> Save the file
        xlApp.DisplayAlerts = False
        xlWorkBook.SaveAs(Filename:=strAddress, FileFormat:=51)
        xlApp.DisplayAlerts = True

        '~~> Close the File
        xlWorkBook.Close()

        '~~> Quit the Excel Application
        xlApp.Quit()

        '~~> Clean Up
        releaseObject(xlApp)
        releaseObject(xlWorkBook)
    End Sub


    '~~> Release the objects
    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
End Class

@Siddharth Rout 为构建这段代码提供了很多帮助,因为他拥有这个很棒的网站:http://www.siddharthrout.com/

【讨论】:

  • 哈哈是的。 FormulaLocal 是我在带有 Interop 的项目中使用的。之后我停止使用 Excel Interop,因为它需要安装 Excel,如果您更改 Office 版本/语言,您的代码可能会停止工作!。我知道infragistics 是付费的,但它的 Excel 库非常棒,你甚至不需要办公室。
  • 不,我尝试了所有FormulaLocalValueFormula,但都不起作用。我仍然得到同样的例外......
  • 您能否将我的代码与您的代码进行比较并得出差异?更好 - 也许您可以创建一个演示,以便每个人都可以重新创建错误?这个特定的错误非常广泛,因为我已经在这个问题上搜索了一段时间。我认为可能的选择之一是您的代码中某处有一个从 0 开始计数的循环,而 Excel 需要从 1 开始。再次,请调查您的代码,如果可以的话,这将是一个很大的帮助粘贴Minimal, Complete, and Verifiable example
  • 多么奇怪的评论系统。
【解决方案2】:

错误可能来自您当前的数据,分别来自工作表的布局。我建议您在分配公式之前检查 listO.Range(i, j).FormulaR1C1 中的内容。

我遇到过一个情况,范围里面已经有错误的数据,然后奇怪的是,我不知道为什么,我无法分配新的公式。

如果是这种情况 - 尝试清除范围的值,然后分配公式:

listO.Range(i, j).FormulaR1C1 = ""
listO.Range(i, j).FormulaR1C1 = FormulaMatrix(i, j)

【讨论】:

  • 就这么简单...每个公式的范围都有错误的值。出于某种原因,在每个列引用之前都有一些额外的文本...当您修复/升级其他人的代码时会发生这种情况。
【解决方案3】:

问题可能出在您的公式上。试试这个-

=IF(LEN([@Units])>0,[@SalesAmount]-[@DiscountAmount],0)

如果这不起作用,我会尝试使用 .formula 方法而不是 .formulaR1C1.. 是否有任何理由特别是您使用 R1C1 引用?

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多