无法将公式指定给Excel

时间:2015-04-27 12:57:13

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

项目中的其他人的代码,我正在努力解决这个问题。

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.我尝试了很多不同(比如只放置没有=的公式,然后重新运行并放上等号),但同样的问题。

我对如何解决这个问题毫无头绪。

3 个答案:

答案 0 :(得分:4)

.formulalocal有效!(虽然.formula.value.formular1c1却没有。)

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

before

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

after

表格的整个代码:

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/

答案 1 :(得分:1)

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

我有一个案例,其中范围内部已经有错误的数据,然后奇怪的是,我不知道为什么,我不能分配新的公式。

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

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

答案 2 :(得分:-1)

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

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

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