vb.net - valor - No se puede asignar fórmula al rango de celdas en Excel
hacer referencia a una celda de otro libro excel (3)
El problema podría ser con tu fórmula. Prueba esto-
=IF(LEN([@Units])>0,[@SalesAmount]-[@DiscountAmount],0)
Si esto no funciona, trataría de usar el método .formula en lugar de .formulaR1C1 ... ¿Hay alguna razón en particular por la que esté utilizando referencias R1C1?
El código de otra persona en el proyecto, que estoy tratando de arreglar.
listO.Range(i, j).FormulaR1C1 = FormulaMatrix(i, j)
donde FormulaMatrix(i, j)
es siempre un valor String
. Cualquiera que sea el valor aleatorio / de prueba, intento con, se está asignando con éxito, excepto cuando es una fórmula, por ej.
=IF(LENGTH([@Units])>0;[@SalesAmount]-[@DiscountAmount]0)
Si elimino el signo =
al principio de la fórmula, se asigna correctamente, pero luego es inútil, porque no es una fórmula.
@Units
, @SalesAmount
, @DiscountAmount
son referencias / nombres de columnas.
Entonces, cuando asigno una fórmula, obtengo una excepción HRESULT: 0x800A03EC
. Levanté la vista en esta respuesta para obtener una explicación y seguí algunas de las instrucciones allí. Determiné que mi problema es el siguiente: el problema ocurre debido a una función ingresada en una celda y está tratando de actualizar otra celda.
Revisado también esta publicación. Intenté bastante diferente (como poner solo las fórmulas sin =
y luego volver a correr y poner los signos iguales), pero el mismo problema.
No tengo ni idea de cómo abordar esto.
El error puede provenir de sus datos actuales, respectivamente, del diseño de la hoja. Le sugiero que compruebe qué hay dentro de listO.Range(i, j).FormulaR1C1
antes de asignar la fórmula.
He tenido un caso en el que el rango ya tiene datos erróneos en el interior y, curiosamente, no sé por qué, no puedo asignar la nueva fórmula.
Si ese es el caso, intente borrar el valor del rango y luego asignar la fórmula:
listO.Range(i, j).FormulaR1C1 = ""
listO.Range(i, j).FormulaR1C1 = FormulaMatrix(i, j)
.formulalocal
funciona! (Mientras que .formula
, .value
y .formular1c1
no).
Empecé a trabajar con VB.NET y tuve un problema muy similar. Esta fue mi información simplificada al principio ( Table1
en la Sheet1
):
Luego, después de aplicar el siguiente código, tuve esto:
El código completo para el formulario:
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 ayudó mucho a construir este código, ya que posee este increíble sitio: http://www.siddharthrout.com/