项目中的其他人的代码,我正在努力解决这个问题。
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.我尝试了很多不同(比如只放置没有=
的公式,然后重新运行并放上等号),但同样的问题。
我对如何解决这个问题毫无头绪。
答案 0 :(得分:4)
.formulalocal
有效!(虽然.formula
,.value
和.formular1c1
却没有。)
我刚开始使用VB.NET并遇到了一个非常类似的问题。这是我最初的简化数据(Table1
中的Sheet1
):
然后在应用下面的代码后,我有了这个:
表格的整个代码:
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引用?