none
referencia a objeto no establecida como instancia de un objeto RRS feed

  • Pregunta

  • Hola tengo una función que pasa un datagridview a Excel pero me devuelve el error: referencia a objeto no establecida como instancia de un objeto. mi código es:

    Function DataGridAExcel(ByVal MiGrid As DataGridView) As Boolean
    
            exHoja = Nothing
            exLibro = Nothing
            exApp = Nothing
    
            Try
    
                'AÑADIMOS EL LIBRO AL PROGRAMA Y LA HOJA AL LIBRO
    
                exLibro = exApp.Workbooks.Add
                exHoja = exApp.Sheets(1)
    
                'CONTAMOS COLUMNAS Y FILAS
    
                Dim NCol As Integer = MiGrid.ColumnCount
                Dim NRow As Integer = MiGrid.RowCount
    
                'RECORREMOS TODAS LAS FILAS Y POR CADA COLUMNA ESCRIBIMOS
    
                For i As Integer = 1 To NCol
    
                    exHoja.Cells.Item(1, i) = MiGrid.Columns(i - 1).Name.ToString
    
                Next
    
                For Fila As Integer = 0 To NRow - 1
    
                    For Col As Integer = 0 To NCol - 1
    
                        exHoja.Cells.Item(Fila + 2, Col + 1) = MiGrid.Rows(Fila).Cells(Col).Value
    
                    Next
    
                Next
    
                Dim M_Izq As Integer = 63
                Dim M_Der As Integer = 43
                Dim M_Sup As Integer = 35
                Dim M_Inf As Integer = 40
    
                'ORIENTACIÓN DE LA HOJA
    
                With exHoja.PageSetup
    
                    .Orientation = Excel.XlPageOrientation.xlPortrait
    
                    'CONFIGURACIÓN DE MÁRGENES
    
                    .LeftMargin = M_Izq
                    .RightMargin = M_Der
                    .TopMargin = M_Sup
                    .BottomMargin = M_Inf
    
                End With
    
                'TÍTULO EN NEGRITA, ALINEADO AL CENTRO DE LAS CELDAS Y COLOR
    
                Dim objRango As Excel.Range = exHoja.Range(exHoja.Cells(1, 1), exHoja.Cells(exHoja.UsedRange.Rows.Count, exHoja.UsedRange.Columns.Count))
                Dim contador As Integer = exHoja.Rows.Count
    
                exHoja.PageSetup.PrintTitleRows = exHoja.Rows(1).Address 'PONEMOS LA FILA DE ENCABEZADO EN TODAS LAS HOJAS IMPRESAS
                exHoja.PageSetup.PaperSize = Excel.XlPaperSize.xlPaperA4 'TAMAÑO DE PAPEL A4
                exHoja.Name = "Extracto mensual"
                exHoja.Rows.Item(1).Font.Bold = 1 'NEGRITA
                exHoja.Rows.Item(1).Font.ColorIndex = 49 'COLOR DEL ENCABEZADO
                exHoja.Rows.Item(1).HorizontalAlignment = 3 'ALINEADO DEL ENCABEZADO
    
                objRango.HorizontalAlignment = 3 'ALINEADO DE LAS COLUMNAS
    
                exHoja.Range("A1").Value = "   FECHA   "
                exHoja.Range("B1").Value = "  SISTÓLICA  "
                exHoja.Range("C1").Value = "  DIASTÓLICA  "
                exHoja.Range("D1").Value = "  PULSACIONES  "
                exHoja.Range("E1").Value = "  SATURACIÓN  "
                exHoja.Range("A1:E1").Cells.Interior.Color = Color.Cyan
    
                objRango.Borders.LineStyle = 1 'BORDES DE LA HOJA
    
                exHoja.Rows.Font.Size = 12 ' TAMAÑO DE LA FUENTE
                exHoja.Rows.Font.Name = "Adobe Garamond Pro Bold" 'TIPO DE FUENTE
                exHoja.Columns.AutoFit() 'AJUSTE DE LAS COLUMNAS
    
                exHoja.Range("A2:A70").Font.ColorIndex = 5 'COLOR DE LA FUENTE DE LA COLUMNA DE FECHAS
    
                'DAMOS FORMATO CONDICIONAL DE LAS CELDAS
    
                For Fila As Integer = 2 To NRow + 1
    
                    For Col As Integer = 2 To NCol
    
                        Dim FC As String = Chr(64 + Col) & Fila
    
                        exHoja.Range(FC).Select()
                        exHoja.Range(FC).Font.ColorIndex = 5
                        exHoja.Range(FC).Font.Bold = True
    
                    Next
    
                Next
    
                For Fila As Integer = 2 To NRow + 1
    
                    For Col As Integer = 2 To NCol - 3
    
                        Dim FC As String = Chr(64 + Col) & Fila
    
                        exHoja.Range(FC).Select()
    
                        If exHoja.Range(FC).Value >= 13 Or exHoja.Range(FC).Value <= 11 Then
    
                            exHoja.Range(FC).Font.ColorIndex = 3
                            exHoja.Range(FC).Font.Bold = True
    
                        End If
    
                    Next
    
                Next
    
                For Fila As Integer = 2 To NRow + 1
    
                    For Col As Integer = 3 To NCol - 2
    
                        Dim FC As String = Chr(64 + Col) & Fila
    
                        exHoja.Range(FC).Select()
    
                        If exHoja.Range(FC).Value <= 6 Or exHoja.Range(FC).Value >= 8 Then
    
                            exHoja.Range(FC).Font.ColorIndex = 3
                            exHoja.Range(FC).Font.Bold = True
    
                        End If
    
                    Next
    
                Next
    
                For Fila As Integer = 2 To NRow + 1
    
                    For Col As Integer = 4 To NCol - 1
    
                        Dim FC As String = Chr(64 + Col) & Fila
    
                        exHoja.Range(FC).Select()
    
                        If exHoja.Range(FC).Value <= 59 Or exHoja.Range(FC).Value >= 80 Then
    
                            exHoja.Range(FC).Font.ColorIndex = 3
                            exHoja.Range(FC).Font.Bold = True
    
                        End If
    
                    Next
    
                Next
    
                For Fila As Integer = 2 To NRow + 1
    
                    For Col As Integer = 5 To NCol
    
                        Dim FC As String = Chr(64 + Col) & Fila
    
                        exHoja.Range(FC).Select()
    
                        If exHoja.Range(FC).Value <= 90 Then
    
                            exHoja.Range(FC).Font.ColorIndex = 3
                            exHoja.Range(FC).Font.Bold = True
    
                        End If
    
                    Next
    
                Next
    
                'COMPROBAMOS SI EXISTE EL FICHERO Y LO SOBRESCRIBIMOS SI ES ASÍ
                'MOSTRAMOS EL MESSAGE BOX
    
                Dim Message As String = "¿QUIERES GUARDAR LA HOJA EXCEL? "
                Dim Caption As String = "OPCIÓN DE GUARDAR"
                Dim Buttons As MessageBoxButtons = MessageBoxButtons.YesNo
    
                Dim Result As DialogResult
    
                Result = MessageBox.Show(Message, Caption, Buttons)
    
                exApp.ActiveWindow.WindowState = Excel.XlWindowState.xlMaximized
    
                'RESULTADO DE LA OPCIÓN AFIRMATIVA
    
                If Result = System.Windows.Forms.DialogResult.Yes Then
    
                    If System.IO.File.Exists(archivo) = True Then
    
                        'SI EL ARCHIVO EXISTE LO BORRAMOS Y GUARDAMOS EL NUEVO
    
                        System.IO.File.Delete(archivo)
                        exLibro.SaveAs(archivo)
    
                    Else
    
                        'SI NO EXISTE LO GUARDAMOS
    
                        exLibro.SaveAs(archivo)
    
                    End If
    
                Else
    
                    System.IO.File.OpenRead(archivo)
    
                End If
    
                'GUARDAMOS EL ARCHIVO TAMBIEN COMO PDF
    
                Dim nombre As String = exHoja.Name
    
                Dim ruta As String = "D:\Documentos\Escaneados\Informe_medico_infarto_2019\Tensión\"
    
                exLibro.ExportAsFixedFormat(Excel.XlFixedFormatType.xlTypePDF, ruta & nombre & ".pdf", Excel.XlFixedFormatQuality.xlQualityStandard, True, True, 1, 30, False)
    
                'APLICACIÓN VISIBLE
    
                exApp.Application.Visible = True
    
                exHoja = Nothing
                exLibro = Nothing
                exApp = Nothing
    
            Catch ex As Exception
    
                MessageBox.Show(ex.Message, "ERROR AL EXPORTAR A EXCEL", MessageBoxButtons.OK, MessageBoxIcon.Error)
    
                Return False
    
            End Try
    
            Return True
    
            exLibro.Workbooks("Extracto mensual.xlsx").Close()
    
        End Function

    ¿Cómo lo soluciono? Gracias.

    miércoles, 30 de septiembre de 2020 8:54

Todas las respuestas

  • El código es muy largo y no dices la línea concreta en la que te da el error.

    Ese error da cuando tratas de usar un objeto que no está definido y creado.
    Por ejemplo te puede dar en la primera línea exHoja = Nothing si no has creado antes el objeto exHoja.


    Saludos, Javier J

    miércoles, 30 de septiembre de 2020 11:04
  • Hola, el código es el de la función donde me da el error y no digo la línea porque no me salta el error en una en concreto. El objeto exHoja y todos los demás están creados en el Load del formulario como Public...
    miércoles, 30 de septiembre de 2020 11:44
  • El error te lo tiene que dar en una línea concreta si lo estás ejecutando en modo desarrollo.

    Puede ser que el error sea el parámetro que le estés pasando a la función como "MiGrid". También debe ser un objeto de tipo DataGridView que este iniciado.


    Saludos, Javier J

    miércoles, 30 de septiembre de 2020 11:56
  • He verificado/cambiado nombres de algunos parámetros que tenía en otros módulos por si se había quedado cogido alguno y el resultado sigue siendo el mismo.Referencia a objeto no establecida como instancia de un objeto.
    miércoles, 30 de septiembre de 2020 12:36
  • Si estás en modo de desarrollo, en el momento que te da el mensaje de error te indicará en que línea del código se produce.

    Pon la imagen para que lo podamos ver. 


    Saludos, Javier J

    miércoles, 30 de septiembre de 2020 15:46
  • Hola, buenos días, no me muestra la línea de código donde está el error. Igual es que no se hacerlo bien pero simplemente me muestra el error.
    jueves, 1 de octubre de 2020 7:58
  • no me muestra la línea de código donde está el error

    Es por culpa del try...catch. Cuando da el error, salta al catch y entonces no ves dónde ocurrió el error.

    Una chapuza rápida que puedes hacer es poner entre comentarios el try y el bloque catch (provisionalmente, hasta que resuelvas este problema). También hay una opción en Herramientas -> Opciones en Visual Studio para configurarlo de forma que en caso de error se pare en la línea del error en lugar de continuar por el "catch".

    Igual es que no se hacerlo bien

    Es importantísimo que aprendas a usar bien el Debugger. Sí, al principio perderás un poquito de tiempo en aprenderlo, pero luego te ahorrará horas y horas y horas de tiempo de desarrollo perdido en resolver los errores. Comienza por aprender a poner un punto de ruptura (F9) y luego avanzar paso a paso (F10 y F11), cosa que te permitirá seguir la ejecución y ver exactamente en qué punto se comporta en forma distinta a la esperada.

    jueves, 1 de octubre de 2020 11:25
  • Hola, siento hacerte perder el tiempo, al final voy ha intentar hacerlo de otro modo, no consigo ver el error así que voy ha intentar crear una hoja nueva dentro del libro que ya tengo, a ver si soy capaz.

    Gracias por tu interés/ayuda. Un saludo.

    jueves, 1 de octubre de 2020 12:02