no existe la variable de instancia NAME

HMG en Español

Moderator: Rathinagiri

Post Reply
User avatar
edufloriv
Posts: 240
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

no existe la variable de instancia NAME

Post by edufloriv »

Saludos amigos,

Como siempre, esperando se encuentren todos bien de salud.

Tengo este error que me sale a veces cuando mis clientes quieren sacar un reporte en excel, no logo identificar bajo que circunstancias específicas se genera, pero lo encuentro cuando reviso la carpeta de trabajo y lo encuentro en el errorlog.
Date:29/09/20 Time: 12:22:47
Error BASE/1005 No existe la variable de instancia: NAME

Called from _NAME(0)
Called from DBF_A_XLS(53)
Called from REPODINAMIKACEPTAR(249)
Called from (b)REPOVENTADINAMICA(76)
Called from _DOCONTROLEVENTPROCEDURE(6056)
Called from EVENTS(1801)
Called from DOMESSAGELOOP(0)
Called from _ACTIVATEWINDOW(5717)
Called from REPOVENTADINAMICA(86)
Called from REPOALLEJECUTAR(174)
Called from (b)REPORTES(75)
Called from EVENTS(3244)
Called from DOMESSAGELOOP(0)
Called from _ACTIVATEWINDOW(5717)
Called from REPORTES(80)
Called from ABREMODULO(460)
Called from EJECUTAOPCION(342)
Called from (b)MAIN(162)
Called from _DOCONTROLEVENTPROCEDURE(6056)
Called from EVENTS(1816)
Called from DOMESSAGELOOP(0)
Called from _ACTIVATEWINDOW(5717)
Called from MAIN(212)
Y esta es mi rutina, es un código sencillo que uso para pasar una .DBF a .EXCEL pero no logro entender cual es la razón por la que en ocasiones me genera el error mencionado:

Code: Select all

FUNC Dbf_A_Xls( cLaDbf , cTitulo , aTitulos , aCamposBase , aFormatos , aAlineacion , aColores , aTotaliza , nQueHoja )

LOCAL aTotal

   IF ! SYS_OFFICE
      MsgInfo('Usted no tiene instalado Microsoft Excel en esta computadora.')
      RETURN
   ENDIF

   ***Solo en MS office XP
   IF nQueHoja = NIL
      oExcel := CreateObject( "Excel.Application" )  // HMG 3
      if Ole2TxtError() != "S_OK"
         MsgStop("Excel no esta disponible en esta computadora - Error "+Ole2TxtError(), "ATENCION")
         return nil
      endif
      oExcel:DisplayAlerts := 0
      oWorkBook := oExcel:WorkBooks:Add()
      oHoja := oExcel:ActiveSheet
   ELSE
      IF nQueHoja = 1
         oExcel := CreateObject( "Excel.Application" )  // HMG 3
         if Ole2TxtError() != "S_OK"
            MsgStop("Excel no esta disponible en esta computadora - Error "+Ole2TxtError(), "ATENCION")
            return nil
         endif
         oExcel:DisplayAlerts := 0
         oWorkBook := oExcel:WorkBooks:Add()
         oHoja := oExcel:ActiveSheet
      ELSE
         oExcel:Sheets(nQueHoja):Select()
         oHoja := oExcel:ActiveSheet
      ENDIF
   ENDIF

// Prepara el array para las columnas totalizadas.
   aTotal := ARRAY( LEN(aCamposBase) )
   AFILL( aTotal , 0 )

// Se setea el tipo y el tamaño de letra de las hojas
   oHoja:Cells:Font:Name := "Arial" //<- EL ERROR SE GENERA AQUI ESTA ES LA LINEA 53
   oHoja:Cells:Font:Size := 9

// Formatear las columnas
   IF ! aFormatos = NIL

      FOR nCol = 1 TO LEN( aFormatos )

         oHoja:Columns( nCol ):NumberFormat := aFormatos[nCol]

      NEXT

   ENDIF

// Colorear las columnas
   IF ! aColores = NIL

      FOR nCol = 1 TO LEN( aColores )

         IF VALTYPE(aColores[nCol]) = 'A'
            oHoja:Columns( nCol ):Font:Color := RGB(aColores[nCol,1],aColores[nCol,2],aColores[nCol,3])
         ENDIF

      NEXT

   ENDIF

// Alinear las columnas
   IF ! aAlineacion = NIL

      FOR nCol = 1 TO LEN( aAlineacion )

         DO CASE
            CASE aAlineacion[nCol] = 'I'
               oHoja:Columns( nCol ):HorizontalAlignment := -4131
            CASE aAlineacion[nCol] = 'C'
               oHoja:Columns( nCol ):HorizontalAlignment := -4108
            CASE aAlineacion[nCol] = 'D'
               oHoja:Columns( nCol ):HorizontalAlignment := -4152
         ENDCASE

      NEXT

   ENDIF

// ........................................................
// Carga de los titulos de los campos
   nLin := 2
   FOR nCol := 1 to Len( aTitulos )
      oHoja:Cells( nLin, nCol ):VALUE := aTitulos[ nCol ]
   NEXT

// ........................................................
// Carga Valores de la Base en la Planilla
   SELE &cLaDbf
   GOTO TOP
   nRow := 3
   DO WHILE ! EOF()
      FOR nCol = 1 to Len( aCamposBase )
         cCampo := aCamposBase[ nCol ]
         vCampo := &cCampo
         IF VALTYPE( vCampo ) = 'C'
            vCampo := RTRIM(vCampo)
         ENDIF
         oHoja:Cells( nRow, nCol ):Value := vCampo
         IF ! aTotaliza = NIL
            IF aTotaliza[nCol] = .T.
               aTotal[nCol] := aTotal[nCol] + vCampo
            ENDIF
         ENDIF
      NEXT
      nRow++
      SKIP
   ENDDO
   cRango := "A3:"+XlsColName( LEN(aTitulos) , nRow )
   oHoja:Range( cRango ):Borders:LineStyle   := 1


// Totaliza las columnas
   IF ! aTotaliza = NIL
      FOR nCol = 1 to LEN( aCamposBase )
         IF aTotaliza[nCol] = .T.
            oHoja:Cells( nRow, nCol ):Value                 := aTotal[nCol]
            oHoja:Cells( nRow, nCol ):Font:Bold             := .T.
            oHoja:Cells( nRow, nCol ):Interior:Color        := RGB( 255 , 215 , 0 )
            oHoja:Cells( nRow, nCol ):Borders(7):LineStyle  := 1 // Left
            oHoja:Cells( nRow, nCol ):Borders(8):LineStyle  := 1 // Top
            oHoja:Cells( nRow, nCol ):Borders(9):LineStyle  := 1 // Bottom
            oHoja:Cells( nRow, nCol ):Borders(10):LineStyle := 1 // Right
         ENDIF
      NEXT
   ENDIF

// ........................................................
// Ajusta Anchos de Columnas
   FOR nCol:=1 TO Len( aCamposBase )
      oHoja:Columns( nCol ):AutoFit()
   NEXT

// ........................................................
// Formatea las titulos de los campos - se pone al final pq estan afectados
// por la alineacion de columnas hecha arriba y los titulos siempre serán centrados.
   cRango := CHR(64+1)+LTRIM(STR(nLIN))+":"+XlsColName(LEN(aTitulos),nLIN)
   oHoja:Range( cRango ):Font:Bold := .T.
   oHoja:Range( cRango ):Interior:ColorIndex := 36 //sombrear celdas
   oHoja:Range( cRango ):Borders:LineStyle   := 1  // grillado
   oHoja:Range( cRango ):HorizontalAlignment := -4108 // centrado

// ........................................................
// Escribe el encabezado del reporte en la primera fila
// Se coloca aca al final para que el AUTOFIT no se ajuste al ancho del titulo del reporte.
   oHoja:Cells( 1 , 2 ):VALUE := cTitulo
   oHoja:Cells( 1 , 2 ):HorizontalAlignment := -4131 // izquierda

// Congela las 2 primeras filas
   oHoja:Cells( 3 , 1 ):Select()
   oExcel:Application:ActiveWindow:FreezePanes := .T.

   IF nQueHoja = NIL
      oExcel:Visible := .T.
   ENDIF

RETURN NIL
Si alguien tiene una idea de como evitarlo le agradeceré su ayuda.

Reciban un cordial saludo.

Eduardo Flores Rivas


LIMA - PERU
User avatar
AUGE_OHR
Posts: 2093
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: no existe la variable de instancia NAME

Post by AUGE_OHR »

hi,

Code: Select all

// Se setea el tipo y el tamaño de letra de las hojas
   oHoja:Cells:Font:Name := "Arial" //<- EL ERROR SE GENERA AQUI ESTA ES LA LINEA 53
   oHoja:Cells:Font:Size := 9
as it is 1st Action to a Sheet i "think" oHoja is not valid ...
activeX is NOT stable so i recommend to use BEGIN SEQUENCE

---

as i see you "fill" Sheet "Cell by Cell" and skip in DBF ...
i recommend to use Array and fill it before open activeX and use

Code: Select all

   oSheet:range( "A1:" + cEnd + LTRIM( STR( numRows ) ) ) :value := aArray
this Way you "paste" hole Array into Sheet in 1 Line
have fun
Jimmy
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: no existe la variable de instancia NAME

Post by SALINETAS24 »

Hola Edu, tal y como dices el error se da cuando tienes más de una hoja en la excel.
Utilizas el parametro nQueHoja.
Si nQuehoja no tiene ningun valor entonces crea el libro y su hoja
Si nQuehoja vale 1, lo mismo que antes.
Pero si hoja vale otro valor, directamente pasas a la activación de la hoja sin comprobar que existe, y es posible que el parametro que pasas en "nQuehoja" no tenga el valor adecuado. :roll:

Te paso unas lineas que te pueden servir para verificar la existencia de la hoja

Esta seria la rutina rueva

Code: Select all

IF nQueHoja = NIL
      oExcel := CreateObject( "Excel.Application" )  // HMG 3
      if Ole2TxtError() != "S_OK"
         MsgStop("Excel no esta disponible en esta computadora - Error "+Ole2TxtError(), "ATENCION")
         return nil
      endif
      oExcel:DisplayAlerts := 0
      oWorkBook := oExcel:WorkBooks:Add()
      oHoja := oExcel:ActiveSheet
   ELSE
      IF nQueHoja = 1
         oExcel := CreateObject( "Excel.Application" )  // HMG 3
         if Ole2TxtError() != "S_OK"
            MsgStop("Excel no esta disponible en esta computadora - Error "+Ole2TxtError(), "ATENCION")
            return nil
         endif
         oExcel:DisplayAlerts := 0
         oWorkBook := oExcel:WorkBooks:Add()
         oHoja := oExcel:ActiveSheet
      ELSE
            nSheets := oExcel:Sheets:Count()       // Compruebo las hojas que hay
           IF nSheets >= nQueHoja                      // Si hay más hojas que la que pido, la activo
                oExcel:Sheets(nQueHoja):Select()
           ELSE
                oExcel:Sheets:Add()                       // En caso contrario la activo
          ENDIF
          oHoja := oExcel:ActiveSheet
    
      ENDIF
   ENDIF
Espero que te funcione y si es así vamos con una cervecita bien fresquita !!!! :)
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
Tiger
Posts: 70
Joined: Mon Aug 31, 2015 11:28 am
Location: Taipei

Re: no existe la variable de instancia NAME

Post by Tiger »

I guess it might cause by the EXCEL is not close properly ... the EXCEL might exist on the memory, you can check it from task manger ...
Post Reply