2015-04-27 6 views
5

Код чужого кода в проекте, который я пытаюсь исправить.Невозможно назначить формулу для диапазона ячеек в Excel

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

Где это другая функция? Что он делает, и какую ячейку он пытается обновить? – nwhaught

+1

Это Excel Interop? попробуйте прямо передать формулу как строку с .Value или .FormulaLocal вместо .FormulaR1C1. Если я правильно помню, что вещь R1C1 никогда не работала для меня. – Jaxedin

+3

Кроме того, формула в вашем вопросе недействительна ... вы имеете в виду '= IF (LEN ([@ Units])> 0, [@ SalesAmount] - [@ DiscountAmount], 0)'? – nwhaught

ответ

1

Ошибка может быть связана с вашими текущими данными, соответственно, с макетом листа. Я предлагаю вам проверить, что находится внутри listO.Range(i, j).FormulaR1C1, прежде чем назначать формулу.

У меня был случай, когда диапазон уже получил неправильные данные внутри, а затем, как ни странно, я не знаю, почему, я не могу назначить новую формулу.

Если это так - попробуйте очистить значение диапазона, а затем назначая формулу:

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

Простой, как это ... Диапазон имел неправильные значения для каждой формулы. По какой-то причине был добавлен некоторый дополнительный текст перед каждой ссылкой столбца ... Вот что происходит, когда вы исправляете или обновляете чужой код. – Syspect

-1

Проблема может быть связана с вашей формулой. Попробуйте this-

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

Если это не работает, я хотел бы попробовать использовать метод .formula вместо .formulaR1C1 .. Есть ли какая-либо причина, в частности, вы используете ссылки R1C1?

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 помог много построить этот c ode, так как он владеет этим удивительным сайтом: http://www.siddharthrout.com/

+1

Haha yup. FormulaLocal - это то, что я использовал в проекте w/Interop. После этого я прекращаю использовать Excel Interop, потому что ему нужно установить Excel, и если вы измените офисную версию/язык, код может перестать работать !. Я знаю, что «infragistics» выплачивается, но библиотека Excel просто потрясающая, и вам даже не нужен офис. – Jaxedin

+0

Нет, я пробовал все 'FormulaLocal',' Value' и 'Formula' и не работает. Я все еще получаю то же исключение ... – Syspect

+1

Можете ли вы сравнить мой код с вашим и вернуться с различиями? Еще лучше - ** возможно, вы можете создать демо-версию **, чтобы каждый мог воссоздать ошибку? Эта конкретная ошибка очень широк, поскольку я искал какое-то время по этому вопросу. Я думаю, что одним из вероятных вариантов будет то, что у вас есть петля где-то в вашем коде, который начинает отсчет с 0, в то время как Excel нужно будет начать с 1. Еще раз, пожалуйста, исследуйте свой код, это было бы большой помощью, если бы вы могли вставьте [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). – ZygD

Смежные вопросы