• Viernes 19 de Abril de 2024, 19:18

Autor Tema:  error procedimiento demasiado largo  (Leído 18354 veces)

joko1220

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
error procedimiento demasiado largo
« en: Sábado 12 de Septiembre de 2009, 00:58 »
0
buanas, espero que me puedan ayudarme, mi problema es este  tengo un programa que hace las  facturacion de una empresa. me sale un error que dice error procedimiento demasiado largo. ya se por que tengo mas de 1600 lineas mi problema es que no se que hacer por que de hay yo imprimo en excel un reporte por eso se hace las 1600 lineas como haria para porder dividir el codigo y poder continuar imprimiendo el mismo reporte. para continuar con mi programa.

gracias..

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: error procedimiento demasiado largo
« Respuesta #1 en: Sábado 12 de Septiembre de 2009, 05:06 »
0
Si no recuerdo mal los procedimientos están limitados a un tamaño de 64 kb (que se cargan en memoria de una sola vez)... tus 1600 líneas pueden ser aproximadamente 120 kb (depende del tamaño de las líneas)... sin embargo eso no significa que no se pueda ejecutar, todo lo que tienes que hacer es repartir el código en varios procedimientos... Es bastante posible que estés produciendo 'código espagueti'...

Es buen seguro que mucho código que tienes en ese procedimiento estaría mejor ubicado en su propio procedimiento...

Espón 30 ó 40 líneas y te muestro in situ como repartirlo (ya sería mala suerte que justo fueras a exponer un conjunto de líneas que precisamente deban ir juntas y seguidas)... básicamente un procedimiento de más de 200 líneas es seguro que parte de elló puede moverse a otro procedimiento.
«Ma non troppo»
----> ModoVacaciones = False<----

joko1220

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: error procedimiento demasiado largo
« Respuesta #2 en: Sábado 12 de Septiembre de 2009, 15:16 »
0
este es una parte del código. En el mismo procedimiento ajusto las casillas de Excel y de hay mismo escribo información de la base de datos. yo intente colocar un pedazo del código que genera  Excel dentro de otro procedimiento pero me sale otro error que dice falta crear el objecto algo así. yo no quiero abrir otra vez Excel quiero continuar imprimiendo en la misma hoja.

espero que este pedazo de código sea el conveniente. gracias


ApExcel.Range("A16:N17").Borders(xlEdgeBottom).LineStyle = xlContinuous
ApExcel.Range("A16:N17").Borders(xlEdgeBottom).Weight = xlThin
ApExcel.Range("A16:N17").Borders(xlEdgeBottom).ColorIndex = xlAutomatic
ApExcel.Range("A16:N17").Borders(xlEdgeRight).LineStyle = xlContinuous
ApExcel.Range("A16:N17").Borders(xlEdgeRight).Weight = xlThin
ApExcel.Range("A16:N17").Borders(xlEdgeRight).ColorIndex = xlAutomatic
ApExcel.Range("A16:N17").Borders(xlInsideVertical).LineStyle = xlContinuous
ApExcel.Range("A16:N17").Borders(xlInsideVertical).Weight = xlThin
ApExcel.Range("A16:N17").Borders(xlInsideVertical).ColorIndex = xlAutomatic
ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).LineStyle = xlContinuous
ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).Weight = xlThin
ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).ColorIndex = xlAutomatic
ApExcel.Range("A16:N17").Borders(xlDiagonalDown).LineStyle = xlNone
ApExcel.Range("A16:N17").Borders(xlDiagonalUp).LineStyle = xlNone
ApExcel.Range("A16:N17").Borders(xlEdgeLeft).LineStyle = xlContinuous
ApExcel.Range("A16:N17").Borders(xlEdgeLeft).Weight = xlMedium
ApExcel.Range("A16:N17").Borders(xlEdgeLeft).ColorIndex = xlAutomatic
ApExcel.Range("A16:N17").Borders(xlEdgeTop).LineStyle = xlContinuous
ApExcel.Range("A16:N17").Borders(xlEdgeTop).Weight = xlMedium
ApExcel.Range("A16:N17").Borders(xlEdgeTop).ColorIndex = xlAutomatic
ApExcel.Range("A16:N17").Borders(xlEdgeBottom).LineStyle = xlContinuous
ApExcel.Range("A16:N17").Borders(xlEdgeBottom).Weight = xlMedium
ApExcel.Range("A16:N17").Borders(xlEdgeBottom).ColorIndex = xlAutomatic
ApExcel.Range("A16:N17").Borders(xlEdgeRight).LineStyle = xlContinuous
ApExcel.Range("A16:N17").Borders(xlEdgeRight).Weight = xlMedium
ApExcel.Range("A16:N17").Borders(xlEdgeRight).ColorIndex = xlAutomatic
ApExcel.Range("A16:N17").Borders(xlInsideVertical).LineStyle = xlContinuous
ApExcel.Range("A16:N17").Borders(xlInsideVertical).Weight = xlThin
ApExcel.Range("A16:N17").Borders(xlInsideVertical).ColorIndex = xlAutomatic
ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).LineStyle = xlContinuous
ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).Weight = xlThin
ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).ColorIndex = xlAutomatic
ApExcel.Range("A1:F17").Font.Bold = True
'Adodc6.Recordset.MoveFirst

'CODIGO DE MATERIALES

i = 1
'j = 1
Dim VarSumatoria As Double
Dim VarSumatoria2 As Double
Dim indi As String
VarSumatoria = 0
VarSumatoria2 = 0
VarStop = 0
VarCantCortes = 0
NumeroCorte2 = FrmCrearCotizacion.ObtenerNumero(TxtDescripcionCorte6)
NumeroCorte2 = NumeroCorte2 - 1
VarIdCorte1 = TxtIdCorte
Varo = 0

L = 7
S = 8
Z = 18
ex = 1


For cor = 1 To ValorCorte
    indi = cor
    Limpiavec
    Z = 18
    Adodc6.Recordset.MoveFirst
        Do While Not Adodc6.Recordset.EOF
            If TxtIdCotizacion6 = FrmCrearCotizacion.TxtIdCotizacion Then
                    If ItenExiste6 = False Then
                        VectorItemAvance(Varo) = TxtItem6
                        ApExcel.Cells(Varo + 18, 1).Formula = Val(TxtItem6) 'TxtItem6
                        ApExcel.Cells(Varo + 18, 2).Formula = TxtNOmbreItem6 'TxtNOmbreItem6
                        ApExcel.Cells(Varo + 18, 3).Formula = TxtUnidadItem6 'TxtUnidadItem6
                        ApExcel.Cells(Varo + 18, 4).Formula = TxtCantidadPresupuestada6 'cant
                        ApExcel.Cells(Varo + 18, 5).Formula = Val(TxtVrInitItem6) 'Precio unitario
                        ApExcel.Cells(Varo + 18, 6).Formula = TxtVrInitItem6 * TxtCantidadPresupuestada6 'Vr total
               
                        If indi = ex Then
                            ApExcel.Cells(17, L).Formula = "CANT"
                            ApExcel.Cells(17, S).Formula = "Vr,TOTAL"
                            ApExcel.Cells(16, L).Formula = "AVANCE " + indi
                   
                            'Unir Celdas
                   
                            ApExcel.Range("G16:N16").HorizontalAlignment = xlCenter
                            ApExcel.Range("G16:N16").VerticalAlignment = xlBottom
                            ApExcel.Range("G16:N16").WrapText = False
                            ApExcel.Range("G16:N16").Orientation = 0
                            ApExcel.Range("G16:N16").AddIndent = False
                            ApExcel.Range("G16:N16").IndentLevel = 0
                            ApExcel.Range("G16:N16").ShrinkToFit = False
                            ApExcel.Range("G16:N16").ReadingOrder = xlContext
                            ApExcel.Range("G16:N16").MergeCells = False
                           
                            ApExcel.Range("G16:H16").Merge
                            ApExcel.Range("I16:J16").Merge
                            ApExcel.Range("K16:L16").Merge
                            ApExcel.Range("M16:N16").Merge
                           
                            ex = ex + 1
                        End If
               
                            Do While Not Adodc1.Recordset.EOF
                                If TxtItem6 = TxtItem1 And TxtIdCotizacion1 = TxtIdCotizacion6 And TxtDescripcionCorte1 = "Corte No " + indi Then
                                    If FrmCrearCotizacion.FechaMayor(TxtFecIngresoCant1, TxtFechaInicio1) = True Then
                                        If FrmCrearCotizacion.FechaMayor(TxtFechaFin1, TxtFecIngresoCant1) = True Then
                                            VarSumatoria = TxtCantidadEjecutada1 + VarSumatoria 'cant eje
                               
                                        End If
                                    End If
                                End If
                                Adodc1.Recordset.MoveNext
                            Loop
               
                            Adodc1.Recordset.MoveFirst
                            ApExcel.Cells(Varo + Z, L).Formula = VarSumatoria 'cant eje
                            ApExcel.Cells(Varo + Z, S).Formula = TxtVrInitItem6 * VarSumatoria 'Precio unitario
                            SUMATOAVA = TxtVrInitItem6 * VarSumatoria
                             Varo = Varo + 1
                        End If
                    End If
                    Adodc6.Recordset.MoveNext
                    VarSumatoria = 0
                Loop
                Adodc6.Recordset.MoveFirst
   
   
            L = L + 2
            S = S + 2
            Z = Z + 1
               
    Next cor
       
    ApExcel.Cells(17, L).Formula = "CANT"
    ApExcel.Cells(17, S).Formula = "Vr,TOTAL"
    ApExcel.Cells(16, L).Formula = "AVANCE TOTAL"
       
     For i = 1 To Varo
        ApExcel.Cells(i + 17 + ii, L).FormulaLocal = "=SUMA(G" & (i + 17) & "+I" & (i + 17) & ")"
        ApExcel.Cells(i + 17 + ii, S).FormulaLocal = "=SUMA(H" & (i + 17) & "+j" & (i + 17) & ")"
     Next i
           
    i = Varo
       
   
ApExcel.Range("A" & (i + 19) & ":N" & (i + 19)).HorizontalAlignment = xlCenter
ApExcel.Range("A" & (i + 19) & ":N" & (i + 19)).VerticalAlignment = xlBottom
ApExcel.Range("A" & (i + 19) & ":N" & (i + 19)).Orientation = 0
ApExcel.Range("A" & (i + 19) & ":N" & (i + 19)).AddIndent = False
ApExcel.Range("A" & (i + 19) & ":N" & (i + 19)).IndentLevel = 0
ApExcel.Range("A" & (i + 19) & ":N" & (i + 19)).ShrinkToFit = False
ApExcel.Range("A" & (i + 19) & ":N" & (i + 19)).ReadingOrder = xlContext
ApExcel.Range("A" & (i + 19) & ":N" & (i + 19)).MergeCells = False
ApExcel.Range("A" & (i + 19) & ":N" & (i + 19)).Interior.ColorIndex = 15
ApExcel.Range("A" & (i + 19) & ":N" & (i + 19)).Interior.Pattern = xlSolid
   
ApExcel.Cells(i + 19, 1).Formula = "VALOR TOTAL TRABAJOS PREDEFINIDOS:"

VarX1 = i + 19

ApExcel.Range("E18:F" & (i + 17)).NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
ApExcel.Range("H18:H" & (i + 17)).NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
ApExcel.Range("J18:J" & (i + 17)).NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: error procedimiento demasiado largo
« Respuesta #3 en: Domingo 13 de Septiembre de 2009, 06:12 »
0
Este códiigo vale perfectamente... aunque mejor si lo hubieras metido  entre dos etiquetas de 'code', para que quedara convenientemente indentado y fuera cómodo de leer...

De entrada, tal que lo que dices el objeto ApExcel lo tienes definido a nivel de procedimiento y en tu caso conviene definirlo a nivel de formulario, supongamos que tu procedimiento se llamara TrabajarExcel ....

Código: Visual Basic
  1.  
  2. ' Este es el código que tienes para definir el objeto
  3. private sub TrabajarExcel ()
  4.      Dim ApExcel As Excel.Application
  5.      Set ApExcel = New Excel.Application      
  6.     ' ................. resto del código
  7. end Sub
  8.  
  9. ' este es el código que debes usar
  10. ' a nivel de formulario
  11. private ApExcel As Excel.Application
  12.  
  13. private sub TrabajarExcel ()
  14.      Set ApExcel = New Excel.Application      
  15.     ' ................. resto del código
  16. end Sub
  17.  
  18.  

Ahora ya estando declarado el objeto a nivel de formulario lo podrás usar desde el resto de procedimientos que son llamados desde el que crea el objeto....
Fíjate, ahora de entrada ya vamos a meter en u´n procedimiento el formateo de las casillas

Código: Visual Basic
  1.  
  2. private ApExcel As Excel.Application
  3.  
  4. private sub TrabajarExcel ()
  5.      Din Varo as long
  6.    ' declaración  de otras variables locales que utiliza el procedimiento
  7.  
  8.     Set ApExcel = New Excel.Application
  9.    
  10.     If Not (ApExcel Is Nothing) Then
  11.         ' crear el resto de objetos que necesitamos....
  12.  
  13.         ' ...   código
  14.        ' .... código
  15.        ' .... código
  16.        Call FormatearCasillas
  17.         Call CodigoMateriales(Varo)
  18.         ' .... código
  19.        ' .... código
  20.        ' .... código
  21.        
  22.     Else
  23.         Call MsgBox("Ocurrió algún propblema al intentar crear la instancia de Excel..." & vbCrLf & "Has agregado una referencia al proyecto ?... está instalado Excel ?", vbCritical + vbOKOnly, "No se puede continuar...")
  24.     End Ifend Sub
  25.  
  26.  
  27. Private Sub FormatearCasillas()
  28.     ApExcel.Range("A16:N17").Borders(xlEdgeBottom).LineStyle = xlContinuous
  29.     ApExcel.Range("A16:N17").Borders(xlEdgeBottom).Weight = xlThin
  30.     ApExcel.Range("A16:N17").Borders(xlEdgeBottom).ColorIndex = xlAutomatic
  31.     ApExcel.Range("A16:N17").Borders(xlEdgeRight).LineStyle = xlContinuous
  32.     ApExcel.Range("A16:N17").Borders(xlEdgeRight).Weight = xlThin
  33.     ApExcel.Range("A16:N17").Borders(xlEdgeRight).ColorIndex = xlAutomatic
  34.     ApExcel.Range("A16:N17").Borders(xlInsideVertical).LineStyle = xlContinuous
  35.     ApExcel.Range("A16:N17").Borders(xlInsideVertical).Weight = xlThin
  36.     ApExcel.Range("A16:N17").Borders(xlInsideVertical).ColorIndex = xlAutomatic
  37.     ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).LineStyle = xlContinuous
  38.     ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).Weight = xlThin
  39.     ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).ColorIndex = xlAutomatic
  40.     ApExcel.Range("A16:N17").Borders(xlDiagonalDown).LineStyle = xlNone
  41.     ApExcel.Range("A16:N17").Borders(xlDiagonalUp).LineStyle = xlNone
  42.     ApExcel.Range("A16:N17").Borders(xlEdgeLeft).LineStyle = xlContinuous
  43.     ApExcel.Range("A16:N17").Borders(xlEdgeLeft).Weight = xlMedium
  44.     ApExcel.Range("A16:N17").Borders(xlEdgeLeft).ColorIndex = xlAutomatic
  45.     ApExcel.Range("A16:N17").Borders(xlEdgeTop).LineStyle = xlContinuous
  46.     ApExcel.Range("A16:N17").Borders(xlEdgeTop).Weight = xlMedium
  47.     ApExcel.Range("A16:N17").Borders(xlEdgeTop).ColorIndex = xlAutomatic
  48.     ApExcel.Range("A16:N17").Borders(xlEdgeBottom).LineStyle = xlContinuous
  49.     ApExcel.Range("A16:N17").Borders(xlEdgeBottom).Weight = xlMedium
  50.     ApExcel.Range("A16:N17").Borders(xlEdgeBottom).ColorIndex = xlAutomatic
  51.     ApExcel.Range("A16:N17").Borders(xlEdgeRight).LineStyle = xlContinuous
  52.     ApExcel.Range("A16:N17").Borders(xlEdgeRight).Weight = xlMedium
  53.     ApExcel.Range("A16:N17").Borders(xlEdgeRight).ColorIndex = xlAutomatic
  54.     ApExcel.Range("A16:N17").Borders(xlInsideVertical).LineStyle = xlContinuous
  55.     ApExcel.Range("A16:N17").Borders(xlInsideVertical).Weight = xlThin
  56.     ApExcel.Range("A16:N17").Borders(xlInsideVertical).ColorIndex = xlAutomatic
  57.     ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).LineStyle = xlContinuous
  58.     ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).Weight = xlThin
  59.     ApExcel.Range("A16:N17").Borders(xlInsideHorizontal).ColorIndex = xlAutomatic
  60.     ApExcel.Range("A1:F17").Font.Bold = True
  61. End Sub
  62.  
  63. 'CODIGO DE MATERIALES
  64. Private Sub CodigoMateriales(ByVal Varo As Long)
  65.     Dim VarSumatoria As Double
  66.     Dim VarSumatoria2 As Double
  67.     Dim indi As String
  68.     Dim i As Long, l As Long, S As Long, Z As Long, ex As Long
  69.     Dim cor As Long, Valorcorte As Long, VarStop As Long, VarCantCortes As Long
  70.     Dim NumeroCorte2 As Long, VarIdCorte As Long
  71.    
  72.     i = 1
  73.  
  74.     VarSumatoria = 0
  75.     VarSumatoria2 = 0
  76.     VarStop = 0
  77.     VarCantCortes = 0
  78.     NumeroCorte2 = FrmCrearCotizacion.ObtenerNumero(TxtDescripcionCorte6)
  79.     NumeroCorte2 = NumeroCorte2 - 1
  80.     VarIdCorte1 = TxtIdCorte
  81.     Varo = 0
  82.  
  83.     l = 7
  84.     S = 8
  85.     Z = 18
  86.     ex = 1
  87.  
  88.     For cor = 1 To Valorcorte
  89.         indi = cor
  90.         Limpiavec
  91.         Z = 18
  92.         Adodc6.Recordset.MoveFirst
  93.         Do While Not Adodc6.Recordset.EOF
  94.             If TxtIdCotizacion6 = FrmCrearCotizacion.TxtIdCotizacion Then
  95.                 If ItenExiste6 = False Then
  96.                     VectorItemAvance(Varo) = TxtItem6
  97.                     ApExcel.Cells(Varo + 18, 1).Formula = Val(TxtItem6) 'TxtItem6
  98.                    ApExcel.Cells(Varo + 18, 2).Formula = TxtNOmbreItem6 'TxtNOmbreItem6
  99.                    ApExcel.Cells(Varo + 18, 3).Formula = TxtUnidadItem6 'TxtUnidadItem6
  100.                    ApExcel.Cells(Varo + 18, 4).Formula = TxtCantidadPresupuestada6 'cant
  101.                    ApExcel.Cells(Varo + 18, 5).Formula = Val(TxtVrInitItem6) 'Precio unitario
  102.                    ApExcel.Cells(Varo + 18, 6).Formula = TxtVrInitItem6 * TxtCantidadPresupuestada6 'Vr total
  103.                    
  104.                     If indi = ex Then
  105.                         ApExcel.Cells(17, l).Formula = "CANT"
  106.                         ApExcel.Cells(17, S).Formula = "Vr,TOTAL"
  107.                         ApExcel.Cells(16, l).Formula = "AVANCE " + indi
  108.                        
  109.                         'Unir Celdas
  110.                        
  111.                         ApExcel.Range("G16:N16").HorizontalAlignment = xlCenter
  112.                         ApExcel.Range("G16:N16").VerticalAlignment = xlBottom
  113.                         ApExcel.Range("G16:N16").WrapText = False
  114.                         ApExcel.Range("G16:N16").Orientation = 0
  115.                         ApExcel.Range("G16:N16").AddIndent = False
  116.                         ApExcel.Range("G16:N16").IndentLevel = 0
  117.                         ApExcel.Range("G16:N16").ShrinkToFit = False
  118.                         ApExcel.Range("G16:N16").ReadingOrder = xlContext
  119.                         ApExcel.Range("G16:N16").MergeCells = False
  120.                        
  121.                         ApExcel.Range("G16:H16").Merge
  122.                         ApExcel.Range("I16:J16").Merge
  123.                         ApExcel.Range("K16:L16").Merge
  124.                         ApExcel.Range("M16:N16").Merge
  125.                        
  126.                         ex = ex + 1
  127.                     End If
  128.                    
  129.                     Do While Not Adodc1.Recordset.EOF
  130.                         If TxtItem6 = TxtItem1 And TxtIdCotizacion1 = TxtIdCotizacion6 And TxtDescripcionCorte1 = "Corte No " + indi Then
  131.                             If FrmCrearCotizacion.FechaMayor(TxtFecIngresoCant1, TxtFechaInicio1) = True Then
  132.                                 If FrmCrearCotizacion.FechaMayor(TxtFechaFin1, TxtFecIngresoCant1) = True Then
  133.                                     VarSumatoria = TxtCantidadEjecutada1 + VarSumatoria 'cant eje
  134.                                End If
  135.                             End If
  136.                         End If
  137.                         Adodc1.Recordset.MoveNext
  138.                     Loop
  139.                    
  140.                     Adodc1.Recordset.MoveFirst
  141.                     ApExcel.Cells(Varo + Z, l).Formula = VarSumatoria 'cant eje
  142.                    ApExcel.Cells(Varo + Z, S).Formula = TxtVrInitItem6 * VarSumatoria 'Precio unitario
  143.                    SUMATOAVA = TxtVrInitItem6 * VarSumatoria
  144.                     Varo = Varo + 1
  145.                 End If
  146.             End If
  147.             Adodc6.Recordset.MoveNext
  148.             VarSumatoria = 0
  149.         Loop
  150.         Adodc6.Recordset.MoveFirst
  151.         l = l + 2
  152.         S = S + 2
  153.         Z = Z + 1
  154.     Next cor
  155. End Sub
  156.  
  157.  

No es necesario que me extienda más... debe quedarte claro como se procede....

Simplemente se trata de cumplir el lema romano: 'Divide y  vencerás'.  
Toma líneas de código que realicen una labor concreta y crea un procedimiento que con el nombre que define esa labor, mueve esas líneas a dicho procedimiento. Como has creado código espagueti, tendrás un montón de variables en el procedimiento, las variables que refieren objetos de excel declaralos a nivel de formulario  y las variables que se usan en muchos procedimientos también (por ejemplo la variable Adodc6), en cambio las variables que sólo se usen en un procedimiento las declaras locales (por ejemplo en el procedimiento 'CodigoMateriales', la variable 'cor' se refiere al bucle se declara y muere en el procedimiento la variable)  también podemos pasar variables declaradas en un procedimiento a otro mediante parámetros (por ejemplo, si te fijas la variable 'Varo' está declarada en el procedimiento original y se la hemos pasado como parámetro al procedimiento 'CodigoMateriales')

Eso, si declara todas y cada una de las variables en el tipo que son, o de otro modo se asume que son variant y las variables variant consumen mucho más recursos y son más lentas
Naturalmente cada escisión del procedimiento debe ser suplantado por la llamada al correspondiente procedimiento que contiene las líneas que hemos movido...

La idea no es que tengas 8 procedimientos de 200 líneas sino tal vez 15 unos con 40 líneas y otros con 120 líneas... conviene que los separes de acuerdo a labores concretas, si las siguientes 80 líneas dan formato, pués creas un procedimiento llamado DarformatoA... y metes ahí el código que realiza esa labor, si luego tienes 30 líneas que leen datos de un archivo pues creas otro procedimiento llamado TomarDatosFicheroTemporal, mueves ahí elcódigo que realiza esa tarea y donde estaban colocas la llamada a dicho procedimiento y así sucesivamente. Si las líneas no las separas reunidas por tareas tendrás muchas variables compartidas entre diferentes procedimientos lo que te forzará a declararlas a nivel de formulario. en principio no hay nada malo en tener variables declaradas a nivel de formulario, simplemente que las variables declaradas a nivel de formulario utilizan memoria hasta que se destruye elformulario, las variables de un procedimiento (declaradas dentro de él) se descargan de memoria cuando se sale del procedimiento....

Si tienes dudas, ahora ya puedes hacer preguntas concretas...
«Ma non troppo»
----> ModoVacaciones = False<----

joko1220

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: error procedimiento demasiado largo
« Respuesta #4 en: Lunes 14 de Septiembre de 2009, 16:38 »
0
bueno algunas cosa entiendo, otras cosa no entiendo. la verdad yo llevo como 3 meses trabajando en este lenguaje de programación. y las cosas que he aprendido han sido con manuales. te entiendo lo de los procedimiento lo de dividir por bloque que tenga parte especificas eso ok.

lo que no entiendo es esto, tu me dices que declare el   objeto ApExcel a nivel de formulario la verdad, esta parte de reporte en Excel  yo leí por medio de un manual como hacer eso me explicaba que por medio de macro de Excel sacar el código para poder pasarlo a visual basic 6 así fue que lo hice cuando tu me hablas de declarar el objecto  ApExcel en el formulario principal me imagiano esto.

Código: Visual Basic
  1. Dim VectorItemAvance(1000) As Integer
  2. Dim VectorItemAvanceMO(1000) As Integer
  3. Dim VectorItemAvanceCR(1000) As Integer
  4. Dim VectorItemAvanceIA(1000) As Integer
  5. Dim Varo As Integer
  6. Dim VaroMO As Integer
  7. Dim TempMO As Integer
  8. Dim VaroCR As Integer
  9. Dim TempCR As Integer
  10. Dim VaroIA As Integer
  11. Dim TempIA As Integer
  12. Dim l As Integer
  13. Dim S As Integer
  14. Dim AvanceTMO As Integer
  15.  
  16. Private Sub Form_Load()
  17. Dim VarVrTotalItem As Double
  18. Dim VarPorEjecutado As Double
  19. 'Dim Selection As Object
  20. 'Dim xlGeneral As Object
  21. Dim ContCantidad As Double
  22. 'bExcel = False
  23. 'Set ApExcel = GetObject(, "Excel.Application") 'Obtiene el objeto aplication de Excel, si no está abierto ocurre un error
  24.  
  25. Set ApExcel = CreateObject("Excel.application")
  26. ' Hace que Excel se vea
  27. 'bExcel = True
  28. ApExcel.Visible = True
  29. 'Agrega un nuevo Libro
  30. ApExcel.Workbooks.Add
  31. 'Poner Titulos
  32. ApExcel.Cells(2, 1).Formula = "INGESOFT LTDA - CARBONES DEL CERREJON LIMITED"
  33. 'ApExcel.Cells(3, 1).Formula = "PROY:"
  34. 'ApExcel.Cells(3, 2).Formula = FrmCrearCotizacion.TxtDescripcionCotizacion.Text
  35. ApExcel.Cells(4, 1).Formula = "CUADRO DE CANTIDADES DE OBRA Y PRECIOS UNITARIOS"
  36. ApExcel.Cells(5, 1).Formula = "CONTRATO CON-002482007 - CONSTRUCCIÓN OBRAS ELECTRICAS Y SERVICIOS TÉCNICOS AFINES"
  37. ApExcel.Cells(6, 1).Formula = "TRABAJOS PREDEFINIDOS - TARIFAS POR PRECIOS UNITARIOS"
  38. ApExcel.Cells(7, 1).Formula = "CENTRO DE COSTO:"
  39. ApExcel.Cells(7, 3).Formula = FrmCrearCotizacion.TxtCentrodeCosto.Text
  40. ApExcel.Cells(8, 1).Formula = "No. Orden de trabajo"
  41. ApExcel.Cells(8, 3).Formula = FrmCrearCotizacion.TxtNoCotizacion
  42. ApExcel.Cells(8, 5).Formula = "Plazo:"
  43. ApExcel.Cells(8, 6).Formula = TxtDiasCalendario & " Dias "
  44. ApExcel.Cells(10, 1).Formula = "Objeto de la Orden:"
  45. ApExcel.Cells(10, 3).Formula = FrmCrearCotizacion.TxtDescripcionCotizacion.Text
  46. ApExcel.Cells(11, 1).Formula = "Administrador de la orden de Trabajo:"
  47. ApExcel.Cells(11, 3).Formula = FrmCrearCotizacion.TxtNombreElaboraCotizacion.Text
  48. ApExcel.Cells(12, 1).Formula = "Persona que elaboro la cotizacion:"
  49. ApExcel.Cells(12, 3).Formula = "RICARDO ANTURI"
  50. 'ApExcel.Cells(4, 1).Formula = "COD:"
  51. 'ApExcel.Cells(4, 2).Formula = "IELEC-CAMP"
  52. 'ApExcel.Cells(4, 3).Formula = "FECHA:"
  53. 'ApExcel.Cells(4, 4).Formula = FrmCrearCotizacion.TxtFechaCotizacion.Text
  54. ApExcel.Columns("A:A").ColumnWidth = 8.43
  55. ApExcel.Columns("B:B").ColumnWidth = 33.57
  56. ApExcel.Columns("C:C").ColumnWidth = 8.29
  57. ApExcel.Columns("D:D").ColumnWidth = 9.71
  58. ApExcel.Columns("E:E").ColumnWidth = 15.14
  59. ApExcel.Columns("F:F").ColumnWidth = 17.57
  60.  

donde  Private Sub Form_Load()  me imagino que es el formulario principal. corrigeme si me equivoco. si quiere dame un manual donde yo podria buscar esa información. la verdad se cual es tu idea pero la parte de  declaración de formulario me confunde.

Código: Visual Basic
  1. 'por que tu declaras por ejemplo
  2.  
  3.  Dim ApExcel As Excel.Application
  4. Set ApExcel = New Excel.Application
  5.  
  6. 'y mi declaracion es asi
  7.  
  8. Set ApExcel = CreateObject ("Excel.application")
  9.  
  10. '  parece que me faltara esto
  11. Dim ApExcel As Excel.Application
  12.  
  13. ' Segun lo que observo
  14.  

espero que  CreateObject y New sean lo mismo.
de pronto estoy haciendo deducciones tonta pero la verdad tengo poco en este lenguaje espero me entiendas.



la verdad no se  como no conosco casi el lenguaje

 pero me has dado una idea de como pasar mas el codigo a procedimiento. por que el mio esta muy estructurado (osea que un solo bloque quiero hacer todo). y disculpa las molestias

ha ya aprendí lo de la etiquetas gracias XD

y gracias por tu ayuda de verdad. eres muy bueno en esto..

joko1220

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: error procedimiento demasiado largo
« Respuesta #5 en: Martes 15 de Septiembre de 2009, 21:12 »
0
Vamos por partes...
- CreateObject y new son equivalentes... se utilizan para crear objetos activex (variables de tipo objeto).
- Entiendes los de seccionar en procedimientos, luego no daremos más vueltas a ello salvo que se te quede alguna duda en el tintero.
- Como dices que tomaste el ejemplo de una macro, evidentemente lo has copiado tal cual lo sacaste (lo entiendo así), como es tan largo que te da problemas, te ves obligado a repartirlo. Si lo haces sin más, sucedería que los valores se las variables se perderían, como dices que eres novato en VB6 (e intuyo que en programación), conviene que entiendas la 'vida de las variables', sobre ello hablamos un poco ahora...

Una variable cobra vida normalmente cuando se declara, cobrar vida significa que se añade a una 'tabla' el nombre de la misma, el tipo y la dirección de memoria donde se alojará, deesto se encarga el entorno de programación... sin embargo esta  tabla es un poco más  compleja, un modo de definirla sería imaginarse varias tablas, (o sólo 1 con con el campo alcance) con las indicaciones siguientes...
Cuando necesitemos que una variable esté disponible para todo el proyecto y durante toda la vida del mismo, la declaramos como global (o public) en un módulo (archivo .bas). Si en cambio queremos que una variable sólo esté disponible en un formulario y no en todo el proyecto la declaramos dentro del formulario (archivo .frm) si la declaramos public, implica que desde otro lugar que pueda acceder al formulario podrá accederse a ella, por ejmplo, tengo un formulario llamado FormExcel y tengo otro formulario llamado FormEjecuta dentro del primero tengo una variable declarada así: ' public Valor as long' entonces implica que desde formEjecuta podrá acceder a esa variable así
Código: Visual Basic
  1. dim v as long
  2. v= formExcel.Valor
  3.  
Si en cambio la variable valor la hubiera declarado así: ' Private Valor as long (private y dim es lo mismo aplicado a las variables), entonces en este caso  no puedo acceder a la variable valor desde fuera del formulario de forma directa...

Los procedimientos es como si fueran 'mini módulos', todas las variables declaradas dentro de un procedimiento sólo son accesibles desde dentro de ese procedimiento, por tanto obligadamente son privadas pero puesto que no admiten ser públicas, sólo pueden declararse  con dim no con private.
El acceso de una variable se suele llamar 'alcance' y está directamente relacionado con la vida de una variable... me extiendo.
Cuando se arranca un proyecto lo primero que se hace (de forma transparente al programador) es mirar si  hay módulos y toma todas las variables (globales y públicas) y procedimientos públicos y los añade a una tabla, todas estas variables se crean las primeras y duran todo lo que dura el proyecto, es decir ocupan memoria todo el tiempo que el proyecto. Luego mira si hay formularios, todas las variables y procedmientos públicos 'nacen' cuando se crea el formulario y su vida se agota cuando se cierra el formulario 'call Unload( me)' ojo, no si se oculta 'Me.Hide' .
Luego están las variables declaradas dentro de los procedimientos, realmente también están en una tabla, pero sólo se les asigna memoria cuando se accede al procedimiento y cuando salen del procedimiento  se 'tiran', se libera la memoria que ocupan (hay una tabla que diríamos master que contiene un identificador por cada formulario, módulo, clase, diseñador, usercontrol, etc... y esa misma tabla tiene todos los identificadores de acceso global en el proyecto, luego si cargamos un formulario se añaden a esa tabla o a una específica (esos son detalles del compilador de vb6, que no se especifican en ninguna parte) todos los identificadores del formulario, pero sólo se asigna memoria a  aquellos que son accesibles desde todo el formulario, luego si se entra en un prooocedimiento automáticamente a todos sus identiificadores se les asigna memoria.

Cuando se sale de un procedmiento, toda la memoria donde está contenida el dato, de cada identificador declarado dentro del procedimiento se libera, cuando se descarga el formulario 'unload me', se libera toda la memoria donde está contenido el dato de cada identificador publico y privado (variables métodos y funciones) , pero invocar cualquiera de sus identificadores públicos carga el formulario nuevamente, es decir siguen constando en una tabla pero no tiene memoria asignada al dato que representa, y como sucede con el procedimiento al cargarse (después de descargarse), todos sus identificadores tienes valores por defecto (ya sabes, un long vale 0, un byte vale 0 un string vale "" y una constante el valor consignado, cuando se cierra el proyecto se descarga todo...

Ahora vamos a hablar someramente de las 'cosas raras'... de entrada mencionamos las variables declaradas Static. En un procedimiento a veces puedes querer que una variable conseve su valor y al mismo tiempo que sea inaccesible desde fuera,  es decir que sólo pueda modificarse desde el procedimiento pero que su valor no se pierda al salir del mismo... ese es el caso de las variables static, una variable static de un procedimiento tiene el alcance del procedimiento pero la vida de su contenedor (si es un formulario, la de éste, si es un módulo hasta que se cierre el proyecto, si es una clase mientras esta exista, etc... Para que entiendasesto te pongo un ejemplo... práctico..

abre un nuevo proyecto, coloca un botón y pega el siguiente código y ejecútalo.... después que veas el resultado, para el proyecto, cambia  Static Total as long'  por  Dim Total as long'  y ejecútalo nuevamente.... verás la diferencia... en un caso y otro...
Código: Visual Basic
  1.  
  2. ' ejecuta el ejemplo:
  3. Private Function SumasParciales(byval Valor as long, optional totalizar as boolean=false,  optional PonerACero as boolean =false) as long
  4.      static Total as long
  5.  
  6.      if poneracero=true then
  7.            Total=0
  8.      end if
  9.      total=total + valor
  10.     if totalizar=true then
  11.          SumasParciales = total
  12.     end if
  13. end function
  14.  
  15. '  llamamos 32 veces a la función anterior
  16. Private Sub Command1_Click()
  17.      call  SumasParciales(10,,true)
  18.      for k= 1 to 30
  19.              call  SumasParciales(k)
  20.       next
  21.      msgbox sumasparciales(222,true)
  22.    
  23.     ' con dim devolverá 222, con static devolverá 10 + (el sumatorio de 1-30) + 222, porque la variable Total conserva su valor entre llamadas.
  24. end sub
  25.  
  26.  

A un formulario no se le puede hacer el harakiri, por ejemplo ahora tenemos  2 formulario paraeste nuevo proyecto, el 1 tiene 3 botones llamados: Abrir, Eliminar y Listar en el otro tenemos uno llamado Cerrar... Copia y ejecuta elcódigo: fíjate que el último código de botón serefiere al del formulario 2
Código: Visual Basic
  1.  
  2. ' en el formulario 1
  3. ' abrir
  4. Private Sub Command1_Click()
  5.     Form2.Show
  6. End Sub
  7. ' eliminar
  8. Private Sub Command2_Click()
  9.     Set Form2 = Nothing
  10. End Sub
  11. ' listar
  12. Private Sub Command3_Click()
  13.     Dim f As Form
  14.    
  15.     On Local Error Resume Next
  16.     For Each f In Forms
  17.         f.BackColor = vbYellow
  18.     Next
  19.     Form2.BackColor = vbRed
  20. End Sub
  21.  
  22. ' en el formulario 2
  23. Private Sub Command2_Click()
  24.     Unload Me
  25. End Sub
  26.  
  27.  

 Si le damos al botón abrir 5 veces seguidas, verás que sólo se abre una vez, pulsasobre él en el botón cerrar, repite, sólo se abre una vez... pero ahora lo eliminamos 'set form1= nothing', pulsandoen botón eliminar, ahora pulsa en el botón abrir, verás que se ha abierto '''otro''' form2, vuelve a pulsar eliminar y vuelve a pulsar abrir, aparecerá otronuevo formulario copia siempre del primero... si pulsas varias veces seguidas en abrir, verás que no se abren más, sólo cuando es eliminado... Qué ha pasado ? ...  un formulario no se aniquila desde el exterior, sino es descargado previamente, sin embargo al eliminar, lo que sucede es que lo elimina de alguna tabla, el  identificador desaparece, está fuera de proceso y no se ejecutan los eventos Terminate, ni Unload, pero sigue constando una referencia en la colección Forms del proyecto, al solicitar de nuevo abrir, como el no encuentra el identificador form2, carga una instancia de form2 (una instancia es una copia), sin siquiera haber declarado una nueva variable... esto se debe a que el proyecto siempre mantiene una referencia de cada formulario, ya que si se destruyera real y totalmente en un momento dado form2 no existiría y y en consecuencia, nunca más podríamos volverlo a abrir estando el proyecto en marcha, porque no sabría ni que objetos tiene ni cual es su código, etc... De hecho para comprobar que todo es correcto puedes pulsar (con varias copias de form2) en el botón listar del form1. En teoría la  única manera de crear instancias de form2 sería el siguiente código:
Código: Visual Basic
  1.  
  2. ' abrir
  3. Private Sub Command1_Click()
  4.     dim f as form
  5.     set f= form2
  6.     F.Show
  7. End Sub
  8.  
  9.  
De hecho este código funciona exactamente igual que el anterior, en cambio si hubiéramos puesto 'set f= new form2' cada vez que pulsemos se creará una NUEVA instancia distinta de la anterior... antes all listar form2 siempre se pintaba de rojo, ahora no hay form2 abierto son instancias (con NEW),  por eso todos son amarillos.
Ahora lo bueno, si hemos dicho que todas las variables creadas en un procedimiento se destryen al salir del mismo porqué no se cierra y elimina el formulario al salir del mismo... la respuesta es que sólo sucede con las variables intrínsecas del entorno, los objetos se almacenan en la Tabla de Objetos en Ejecución, estos deben específicamente ser eliminados con Nothing y aún así los formulario deben previamente ser descargados para que éste libere sus referencias y el  proyecto lo retire de la colección forms. Un objeto sólo se descarga definitivamente cuando no quedan referencias al mismo.

Es posible llamar a un objeto de diferentes maneras, a esto se llama referencia. Imagina una persona que se llama Juan, algunos amigos le pueden llamar 'El bruto' y quizás sus padres le llamen 'Juanillo' en todos casos es la misma persona... un código de ejemplo:
Código: Visual Basic
  1.  
  2. ' añade a unnuevo proyecto 2 botones,copia el siguiente código y pulsa (sin prisas) varias veces el botón 1 verás como el botón 2 se va moviendo con la referencia c y cada 3 veces lo movemos con la referencia command2
  3. Private Sub Command1_Click()
  4.     Static izq As Long, tope As Long
  5.     Dim c As CommandButton
  6.        
  7.     Set c = Me.Command2
  8.    
  9.     izq = izq + 50: tope = tope + 150
  10.     Call c.Move(600 + izq, tope)
  11.     c.Caption = "NuevoControl"
  12.     If tope > 450 Then
  13.         Command2.left = 330
  14.         Command2.Top = 1800
  15.         izq= 600: tope=0
  16.     End If
  17. End Sub
  18.  
  19.  

Bueno, es bastante para este mensaje... ya tienes algunos conceptos más que espero te sirvan...
Si tienes más dudas, esponlas, pero mejor siconcretas ya que sino resulta una respuesta muy dispersa....

Sobre lo del manual ya en otro momento te respondo...
«Ma non troppo»
----> ModoVacaciones = False<----

joko1220

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: error procedimiento demasiado largo
« Respuesta #6 en: Jueves 17 de Septiembre de 2009, 06:49 »
0
bueno gracias por la explicacion de las variables y comenze aplicar eso y tengo alguna preguntas

tengo esta variable llamada Varo y esta declarada digamos anivel de formulario.

Código: Visual Basic
  1. Dim VectorItemAvance(1000) As Integer
  2. Dim VectorItemAvanceMO(1000) As Integer
  3. Dim VectorItemAvanceCR(1000) As Integer
  4. Dim VectorItemAvanceIA(1000) As Integer
  5. Dim Varo As Integer
  6. Dim VaroMO As Integer
  7. Dim TempMO As Integer
  8. Dim VaroCR As Integer
  9. Dim TempCR As Integer
  10. Dim VaroIA As Integer
  11. Dim TempIA As Integer
  12. Dim l As Integer
  13. Dim S As Integer
  14. Dim AvanceTMO As Integer
  15. Private ApExcel As Excel.Application
  16.  
  17. Private Sub Form_Load()
  18. Avancepro1
  19. End Sub
  20.  
  21.  
  22.  
  23.  
  24.     Private Sub Avancepro1()
  25.     Dim VarVrTotalItem As Double
  26.     Dim VarPorEjecutado As Double
  27.     'Dim Selection As Object
  28.     'Dim xlGeneral As Object
  29.     Dim ContCantidad As Double
  30.     'bExcel = False
  31.     'Set ApExcel = GetObject(, "Excel.Application") 'Obtiene el objeto aplication de Excel, si no está abierto ocurre un error
  32.  
  33.     Set ApExcel = CreateObject("Excel.application")
  34.     ' Hace que Excel se vea
  35.     'bExcel = True
  36.     ApExcel.Visible = True
  37.     'Agrega un nuevo Libro
  38.     ApExcel.Workbooks.Add
  39.     'Poner Titulos
  40.     ApExcel.Cells(2, 1).Formula = "INGESOFT LTDA - CARBONES DEL CERREJON LIMITED"
  41.     'ApExcel.Cells(3, 1).Formula = "PROY:"
  42.     'ApExcel.Cells(3, 2).Formula = FrmCrearCotizacion.TxtDescripcionCotizacion.Text
  43.     ApExcel.Cells(4, 1).Formula = "CUADRO DE CANTIDADES DE OBRA Y PRECIOS UNITARIOS"
  44.     ApExcel.Cells(5, 1).Formula = "CONTRATO CON-002482007 - CONSTRUCCIÓN OBRAS ELECTRICAS Y SERVICIOS TÉCNICOS AFINES"
  45.     ApExcel.Cells(6, 1).Formula = "TRABAJOS PREDEFINIDOS - TARIFAS POR PRECIOS UNITARIOS"
  46.     ApExcel.Cells(7, 1).Formula = "CENTRO DE COSTO:"
  47.     ApExcel.Cells(7, 3).Formula = FrmCrearCotizacion.TxtCentrodeCosto.Text
  48.     ApExcel.Cells(8, 1).Formula = "No. Orden de trabajo"
  49.     ApExcel.Cells(8, 3).Formula = FrmCrearCotizacion.TxtNoCotizacion
  50.     ApExcel.Cells(8, 5).Formula = "Plazo:"
  51.     ApExcel.Cells(8, 6).Formula = TxtDiasCalendario & " Dias "
  52.     ApExcel.Cells(10, 1).Formula = "Objeto de la Orden:"
  53.     ApExcel.Cells(10, 3).Formula = FrmCrearCotizacion.TxtDescripcionCotizacion.Text
  54.     ApExcel.Cells(11, 1).Formula = "Administrador de la orden de Trabajo:"
  55.     ApExcel.Cells(11, 3).Formula = FrmCrearCotizacion.TxtNombreElaboraCotizacion.Text
  56.     ApExcel.Cells(12, 1).Formula = "Persona que elaboro la cotizacion:"
  57.     ApExcel.Cells(12, 3).Formula = "RICARDO ANTURI"
  58.     'ApExcel.Cells(4, 1).Formula = "COD:"
  59.     'ApExcel.Cells(4, 2).Formula = "IELEC-CAMP"
  60.     'ApExcel.Cells(4, 3).Formula = "FECHA:"
  61.     'ApExcel.Cells(4, 4).Formula = FrmCrearCotizacion.TxtFechaCotizacion.Text
  62.     ApExcel.Columns("A:A").ColumnWidth = 8.43
  63.     ApExcel.Columns("B:B").ColumnWidth = 33.57
  64.     ApExcel.Columns("C:C").ColumnWidth = 8.29
  65.     ApExcel.Columns("D:D").ColumnWidth = 9.71
  66.     ApExcel.Columns("E:E").ColumnWidth = 15.14
  67.     ApExcel.Columns("F:F").ColumnWidth = 17.57
  68.  
  69.     ApExcel.Range("A2:F3").HorizontalAlignment = xlCenter
  70.     ApExcel.Range("A2:F3").VerticalAlignment = xlBottom
  71.     ApExcel.Range("A2:F3").WrapText = False
  72.     ApExcel.Range("A2:F3").Orientation = 0
  73.     ApExcel.Range("A2:F3").AddIndent = False
  74.     ApExcel.Range("A2:F3").IndentLevel = 0
  75.     ApExcel.Range("A2:F3").ShrinkToFit = False
  76.     ApExcel.Range("A2:F3").ReadingOrder = xlContext
  77.     ApExcel.Range("A2:F3").MergeCells = False
  78.     ApExcel.Range("A2:F3").Merge
  79.    
  80.     ApExcel.Range("A4:F4").HorizontalAlignment = xlCenter
  81.     ApExcel.Range("A4:F4").VerticalAlignment = xlBottom
  82.     ApExcel.Range("A4:F4").WrapText = False
  83.     ApExcel.Range("A4:F4").Orientation = 0
  84.     ApExcel.Range("A4:F4").AddIndent = False
  85.     ApExcel.Range("A4:F4").IndentLevel = 0
  86.     ApExcel.Range("A4:F4").ShrinkToFit = False
  87.     ApExcel.Range("A4:F4").ReadingOrder = xlContext
  88.     ApExcel.Range("A4:F4").MergeCells = False
  89.     ApExcel.Range("A4:F4").Merge
  90.    
  91.     ApExcel.Range("A5:F5").HorizontalAlignment = xlCenter
  92.     ApExcel.Range("A5:F5").VerticalAlignment = xlBottom
  93.     ApExcel.Range("A5:F5").WrapText = False
  94.     ApExcel.Range("A5:F5").Orientation = 0
  95.     ApExcel.Range("A5:F5").AddIndent = False
  96.     ApExcel.Range("A5:F5").IndentLevel = 0
  97.     ApExcel.Range("A5:F5").ShrinkToFit = False
  98.     ApExcel.Range("A5:F5").ReadingOrder = xlContext
  99.     ApExcel.Range("A5:F5").MergeCells = False
  100.     ApExcel.Range("A5:F5").Merge'CODIGO DE MATERIALES
  101.    
  102.     Call CodigoMateriales(Varo)
  103.  
pero en este procedimiento:
Código: Visual Basic
  1. Public Function ItenExiste6() As String
  2. Dim i As Integer
  3. ItenExiste6 = False
  4. For i = 0 To Varo
  5.     If VectorItemAvance(i) = TxtItem6 Then
  6.         ItenExiste6 = True
  7.         Ind = Varo
  8.         Exit Function
  9.     End If
  10. Next i
  11.  
  12. End Function
  13.  

 cuando entra al el se reinicia la variable Varo vuelve hacer cero yo necesito que mantenga el valor si la estoy declarando bueno segun la vida de las variables.
hacer si me puede ayudar te lo agradeceria ya que esta declarada a nivel de formulario.

Código: Visual Basic
  1. Private Sub CodigoMateriales(ByVal Varo As Integer)
  2.     Dim VarSumatoria As Double
  3.     Dim VarSumatoria2 As Double
  4.     Dim indi As String
  5.     Dim i As Long, l As Long, S As Long, Z As Long, ex As Long
  6.     Dim cor As Long, Valorcorte As Long, VarStop As Long, VarCantCortes As Long
  7.     Dim NumeroCorte2 As Long, VarIdCorte As Long
  8.    
  9.     i = 1
  10.  
  11.     VarSumatoria = 0
  12.     VarSumatoria2 = 0
  13.     VarStop = 0
  14.     VarCantCortes = 0
  15.     NumeroCorte2 = FrmCrearCotizacion.ObtenerNumero(TxtDescripcionCorte6)
  16.     NumeroCorte2 = NumeroCorte2 - 1
  17.     VarIdCorte1 = TxtIdCorte
  18.     Varo = 0
  19.     Valorcorte = ObtenerNumero(FrmCrearCotizacion.CmboxCortes.Text)
  20.  
  21.     l = 7
  22.     S = 8
  23.     Z = 18
  24.     ex = 1
  25.  
  26.     For cor = 1 To Valorcorte
  27.         indi = cor
  28.         Limpiavec
  29.         Z = 18
  30.         Adodc6.Recordset.MoveFirst
  31.         Do While Not Adodc6.Recordset.EOF
  32.             If TxtIdCotizacion6 = FrmCrearCotizacion.TxtIdCotizacion Then
  33.                 If ItenExiste6 = False Then
  34.                     VectorItemAvance(Varo) = TxtItem6
  35.                     ApExcel.Cells(Varo + 18, 1).Formula = Val(TxtItem6) 'TxtItem6
  36.                    ApExcel.Cells(Varo + 18, 2).Formula = TxtNOmbreItem6 'TxtNOmbreItem6
  37.                    ApExcel.Cells(Varo + 18, 3).Formula = TxtUnidadItem6 'TxtUnidadItem6
  38.                    ApExcel.Cells(Varo + 18, 4).Formula = TxtCantidadPresupuestada6 'cant
  39.                    ApExcel.Cells(Varo + 18, 5).Formula = Val(TxtVrInitItem6) 'Precio unitario
  40.                    ApExcel.Cells(Varo + 18, 6).Formula = TxtVrInitItem6 * TxtCantidadPresupuestada6 'Vr total
  41.                  
  42.                     If indi = ex Then
  43.                         ApExcel.Cells(17, l).Formula = "CANT"
  44.                         ApExcel.Cells(17, S).Formula = "Vr,TOTAL"
  45.                         ApExcel.Cells(16, l).Formula = "AVANCE " + indi
  46.                        
  47.                         'Unir Celdas
  48.                      
  49.                         ApExcel.Range("G16:N16").HorizontalAlignment = xlCenter
  50.                         ApExcel.Range("G16:N16").VerticalAlignment = xlBottom
  51.                         ApExcel.Range("G16:N16").WrapText = False
  52.                         ApExcel.Range("G16:N16").Orientation = 0
  53.                         ApExcel.Range("G16:N16").AddIndent = False
  54.                         ApExcel.Range("G16:N16").IndentLevel = 0
  55.                         ApExcel.Range("G16:N16").ShrinkToFit = False
  56.                         ApExcel.Range("G16:N16").ReadingOrder = xlContext
  57.                         ApExcel.Range("G16:N16").MergeCells = False
  58.                        
  59.                         ApExcel.Range("G16:H16").Merge
  60.                         ApExcel.Range("I16:J16").Merge
  61.                         ApExcel.Range("K16:L16").Merge
  62.                         ApExcel.Range("M16:N16").Merge
  63.                        
  64.                         ex = ex + 1
  65.                     End If
  66.                    
  67.                     Do While Not Adodc1.Recordset.EOF
  68.                         If TxtItem6 = TxtItem1 And TxtIdCotizacion1 = TxtIdCotizacion6 And TxtDescripcionCorte1 = "Corte No " + indi Then
  69.                             If FrmCrearCotizacion.FechaMayor(TxtFecIngresoCant1, TxtFechaInicio1) = True Then
  70.                                 If FrmCrearCotizacion.FechaMayor(TxtFechaFin1, TxtFecIngresoCant1) = True Then
  71.                                     VarSumatoria = TxtCantidadEjecutada1 + VarSumatoria 'cant eje
  72.                                End If
  73.                             End If
  74.                         End If
  75.                         Adodc1.Recordset.MoveNext
  76.                     Loop
  77.                    
  78.                     Adodc1.Recordset.MoveFirst
  79.                     ApExcel.Cells(Varo + Z, l).Formula = VarSumatoria 'cant eje
  80.                    ApExcel.Cells(Varo + Z, S).Formula = TxtVrInitItem6 * VarSumatoria 'Precio unitario
  81.                    SUMATOAVA = TxtVrInitItem6 * VarSumatoria
  82.                     Varo = Varo + 1
  83.                 End If
  84.             End If
  85.             Adodc6.Recordset.MoveNext
  86.             VarSumatoria = 0
  87.         Loop
  88.         Adodc6.Recordset.MoveFirst
  89.         l = l + 2
  90.         S = S + 2
  91.         Z = Z + 1
  92.     Next cor
  93. End Sub
  94.  
esta es la otra parte donde utilizo la variable

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: error procedimiento demasiado largo
« Respuesta #7 en: Viernes 18 de Septiembre de 2009, 04:01 »
0
Te aclaro....

Cuando declaras la variable Varo a nivel de formulario, de entrada tiene el valor 0, hasta que le asignes un valor distinto. Varo está disponible sólo para el formulario, es decir si ese procedimiento está en un módulo o en otro formulario 'aquí' (en el formulario que lo utilizas) no se vé, nadie lo  conoce... Esto significa que puedes tener diferentes variables llamadas varo, una en un formulario, otra en un módulo e incluso  una dentro de un procedimiento dentro del mismo formulario... Puedes preguntarte, cómo especifico la que quiero usar, y cómo sabe VB6 cuál uso...?, te lo explico con ejemplos comentados in situ...

Código: Visual Basic
  1.  
  2. ' en un módulo  (.bas)
  3. public Varo as integer
  4.  
  5. ' Ahora en el formulario
  6. ' Ejemplo 1: una var aquí tiene el mismo nombre que en un módulo...
  7. Private Varo As Integer
  8. Private Sub Form_Load()
  9.     Varo = 25                           ' siempre se reconoce al de ámbito más reducido (como en la familia, juanito es el nuestro, otros juanitos serán... juanito el vecino, juanito el de China, juanito el loco... es decir se le califica para reconocerle, sino entendemos que es el más cercano, el más familiar
  10.     Module1.Varo = 20            ' este varo debe calificarse, con module1, para  que el entorno sepa que es ése, si se ignora creerá que es el de aquí, del formulario...
  11.     Varo = 25
  12.     MsgBox Module1.Varo     ' vemos cómo el valor no ha cambiado de 20
  13. End Sub
  14.  
  15.  
  16. 'ejemplo 2: hay un varo (público) en un módulo , un varo en este formulario también público y un varo más dentro del procedimiento.... la regla es la misma, el más 'familiar' es el reconocido, los identificadores se lovcalizan en la tabla de 'dentro hacia afuera' si el procedimiento no tuviera una variable varo, buscaría en la tabla del formulario si no lo encontrara, lo buscaría en la tabla global, si tampoco lo localiza interpretará que es una variable nueva, no declarada (por loque al no saber su tipo lo interpreta como variant, pero además al tener que localizarlo en varias tablas para ver que no se encuentra declarado es más lento, por estas 2 razones siempre deben declararse todas las variables...
  17.  
  18. Public Varo As Integer
  19. Private Sub Form_Load()
  20.     Dim Varo As Integer           ' cómo está en un procedimiento, varo sin calificadores dentro del procedimiento se refiere a esta variable, si existen otras del mismonombre
  21.     Me.Varo = 25                   ' para referirme al varo del formulario tengo que usar el calificador ME (sólo si es pública, si es privada, no se verá, se dice que la variable del procedimiento enmascara (ensombrece) a la del formulario
  22.     Module1.Varo = 20          '  finalmente debo hacer lo mismo con la variable del módulo especificar el  calificador...
  23.     Varo = 12                       ' soy varo, el de la familia, el que nace y muere dentro del procedmiento load
  24.     MsgBox Module1.Varo
  25. End Sub
  26. private Function Añadir(byval a as integer) as long
  27.        Añadir = varo + a   ' aquí varo se refiere al varo del formulario, no es obligatorio el calificador Me, porque no hay otro varo, más familiar en este alcance...
  28. End Function
  29.  
  30.  

Igualmente, si tuviera un 2º formulario, con el código del ejemplo 1º...
Código: Visual Basic
  1.  
  2.   ' formulario 2
  3.  
  4. private sub Form_Load
  5.         Varo=Varo + 5    ' se refiere alvaro del módulo, porque el formulario 2 no ve el varo del formulario 1
  6.         form1.Varo= Form1.varo +7    ' Esto dará error, como varo en elformulario 1 es privado (en el ejemplo 1), no puede 'verse' desde fuera del formulario, indicará error
  7.  
  8. private sub Añadir(Byval a as integer) as long
  9.       Static Varo as integer         ' este varo es el familiar, el reconocido
  10.      Añadir= Varo + a                ' sumo elvalor recibido al que ya tenía
  11.      Varo=a                             ' guardo el nuevo valor para sumarlo con el próximo que reciba
  12.      msgbox module1.Varo      ' el varo del módulo, debe calificarse, porque el de aquí tiene precedencia...
  13. end Sub
  14.  
  15.  

Sobre los manuales que me preguntaste el otro día... supongo que tienes instalado además el MSDN de VB6, bién auqnue la gente, no lo suele utilizar (desconozco por qué), lo cierto es que trae algo más de 200 libros para manejar   en formato CHM, los hay específicos sobre temas muy concretos por ejemplo hay uno específico sobre el control Winsock.... los nombres no son muy aparentes ya que están abreviados, te indico los que interesan para empezar....
Se encuentran en la ruta equivalente en tu ordenador a: C:Archivos de programaMicrosoft Visual StudioMSDN9898VS3082

- VB98.CHM : Referencia de controles estándar de VB, los controles que por defecto te aparecen en la barra de herramientas....
- VBENLR98.CHM :  Referencia del lenguaje de Visual Basic , contantes, tipos de datos, funciones, instrucciones, objetos... del lenguaje
- VBREF98.CHM : Referencia de los controles de Visual Basic, éste es  referencia del lenguaje por orden alfabético, de controles, de asistentes, errores y proyectos de ejemplo completos... éste manual invoca a los anteriores y a otros más, por ello es más completo, pero en los otros aparecen detalles no reflejados en éste... por esta razón de referencias cruzadas entre archivos no conviene cambiarles el nombre.
- VBDEF98.CHM : Definiciones del lenguaje, por ejemplo que es un 'argumento con nombre', un 'procedimiento de evento', la 'negociación de interfaz de usuario', etc.... definiciones que podrán aparecer en cualquier manual y no sabes exactamente a que se refiere... para novatos es bueno tener esto al alcance.

y el más importante para ti de momento es éste:
- VBCON98.CHM : Manual del Programador... en los libros que trae, el último pone 'Usar Visual Basic', despliega ese y el primero es 'Manual del Programador'....



Importante: Si copias alguno de dichos manuales y lo pegas a otra carpeta, tienes también que copiar el archivo del mismo nombre que tiene por extensión CHI, lo mismo sucede si le cambias el nombre cuando lo pegues en otra carpeta, ambos deben tener el mismo nombre.

Ojo: no cambies los nombres ni muevas de sitio los manuales de VB, sino al  invocar la ayuda (pulsando F1 ) no lo encontraría (una base de datos mantiene las referencias por los nombres asociados a los temas, etc...  El archivo Chi, contiene los temas y el índice de donde localizar los temas en el archivo CHM, que el visor de CHM utiliza (en la TOC, Tabla de Contenidos).

Todavía: los mnauales que copies aparte si les cambias el nombre, al tener referencias cruzadas entre archivos puede no encontrar el tema solicitado, lo mismo sucederá si el archivo al que se llama no se localiza en la misma carpeta. A pesar de ello siempre es buena idea tener algunos donde uno pueda consultarlos en cualquier parte en cualquier momento... todos los libros de ayuda son unos 600 MB. por lo que hoy día tener una copia en una memoria USB, no supone el mismo problema que hace 10 años...
«Ma non troppo»
----> ModoVacaciones = False<----

barbatusasf

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re:error procedimiento demasiado largo
« Respuesta #8 en: Miércoles 6 de Agosto de 2014, 04:42 »
0
Hola muy buenas, lo primero es decir que no tengo ni idea de VBA para excel, pero aun asi estoy intentando hacer una pequeña aplicacion en la que me facilite un poco el curro, haber hos cuento haber si alguien me puede hechar una mano, apesar de mi torpeza e creado un cuadrante donde se controla a 25 tios con los dias que trabajan, los dias que se encuentran de baja y asi 25 posibilidades distintas cada uno, hasta aqui bien, lo tengo hecho a base de contadores y me funciona a la perfeccion, acontinuacion puse unos botones los cuales representarian a los dias del mes y cuando pulso por ejemplo el dia uno me transfiere a otra hoja de excel los datos de todo el personal del dia 1, digamos para hacer un parte de trabajo de ese dia, es decir luis trabaja en el grupo 1, pepe en el grupo 1, ernesto en el grupo 2, maria esta librando por dias moscosos, antonio esta por baja laboral, etc... volvemos a los mismo hasta aqui bien, el problema viene cuando pongo los IF THEN para que si esa celda no esta vacia pase a la que esta justo debajo, ya que al ser tanto personal y tantas opciones las que tiene cada uno que me dice proceso demasiado extenso y para solucionarlo o mejor dicho para que por lo menos funcione lo que he tenido que hacer es, en la primera hoja de excel en el codigo como cada uno de los 25 tios puede estar en grupo 1 a cada uno le he puesto en una celda, una debajo de la otra y asi con todas las opciones, y en la segunda hoja se queda una hoja de trabajo grandisima ya que tengo que tengo que dejar 25 filas entre cada grupo, abria alguna forma para poder solucionarlo, esto es parte del codigo que tengo puesto, haber si me podeis hechar una mano.

Private Sub CommandButton1_Click()
   Dim maria As String
   Dim diego As String
   Dim dani As String
   Dim santi As String
   maria = Range("n7").Value
   diego = Range("n8").Value
   dani = Range("n9").Value
   santi = Range("n10").Value
Select Case maria
    Case Is = 3

‘ en principio lo había puesto de esta manera, pero claro cuando termine de poner todas las opciones de cada uno me dijo que procedimiento demasiado extenso

        ChDir "c:\TURNO DE NOCHE\Partes de servicio\"
        Workbooks.Open Filename:="c:\TURNO DE NOCHE\Partes de servicio\agosto.xls"
        Sheets("dia 1").Select

            If ActiveSheet.Range("b4").Value = "" Then
            ActiveSheet.Range("b4").Value = 3
            Else
            If ActiveSheet.Range("b5").Value = "" Then
            ActiveSheet.Range("b5").Value = 3
            End If
            End If

‘ pero luego lo tube que solucionar de esta manera.

        ChDir "c:\TURNO DE NOCHE\Partes de servicio\"
        Workbooks.Open Filename:="c:\TURNO DE NOCHE\Partes de servicio\agosto.xls"
        Sheets("dia 1").Select
        ActiveSheet.Range("b4").Value = 3
‘ asi con cada opcion de las 25 que hay para cada uno cambiando solo en Range("b5"), b6, b7, etc...   

TheBlackJoker

  • Nuevo Miembro
  • *
  • Mensajes: 7
  • Nacionalidad: mx
    • Ver Perfil
Re:error procedimiento demasiado largo
« Respuesta #9 en: Martes 12 de Agosto de 2014, 20:53 »
0
Para barbatusaf: Si tienes un codigo muy largo podrias poner algo asi, te reemplaza la comprobacion individual por una en un bucle for
Código: [Seleccionar]
        ChDir "c:\TURNO DE NOCHE\Partes de servicio\"
        Workbooks.Open Filename:="c:\TURNO DE NOCHE\Partes de servicio\agosto.xls"
        Sheets("dia 1").Select
        for i = 1 to 25
            If ActiveSheet.Range("b" & i).Value = "" Then
            ActiveSheet.Range("b" & i).Value = 3
        next i
siento tardar en responder, pero apenas vi tu mensaje :suerte:
Prefiero arrepentirme de haber echo un millón de cosas, que arrepentirme de no haber hecho ninguna.
-TheBlackJoker