Programación General > Visual Basic 6.0 e inferiores

 error procedimiento demasiado largo

<< < (2/2)

Nebire:
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 ---dim v as longv= formExcel.Valor 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 --- ' ejecuta el ejemplo: Private Function SumasParciales(byval Valor as long, optional totalizar as boolean=false,  optional PonerACero as boolean =false) as long     static Total as long      if poneracero=true then           Total=0     end if     total=total + valor    if totalizar=true then         SumasParciales = total    end ifend function '  llamamos 32 veces a la función anterior Private Sub Command1_Click()     call  SumasParciales(10,,true)     for k= 1 to 30             call  SumasParciales(k)      next      msgbox sumasparciales(222,true)        ' con dim devolverá 222, con static devolverá 10 + (el sumatorio de 1-30) + 222, porque la variable Total conserva su valor entre llamadas.end sub  
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 --- ' en el formulario 1' abrirPrivate Sub Command1_Click()    Form2.ShowEnd Sub' eliminarPrivate Sub Command2_Click()    Set Form2 = NothingEnd Sub' listarPrivate Sub Command3_Click()    Dim f As Form        On Local Error Resume Next    For Each f In Forms        f.BackColor = vbYellow    Next    Form2.BackColor = vbRedEnd Sub ' en el formulario 2Private Sub Command2_Click()    Unload MeEnd Sub  
 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 --- ' abrirPrivate Sub Command1_Click()    dim f as form    set f= form2    F.ShowEnd Sub  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 --- ' 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 command2Private Sub Command1_Click()    Static izq As Long, tope As Long    Dim c As CommandButton            Set c = Me.Command2       izq = izq + 50: tope = tope + 150    Call c.Move(600 + izq, tope)    c.Caption = "NuevoControl"    If tope > 450 Then        Command2.left = 330        Command2.Top = 1800        izq= 600: tope=0    End IfEnd Sub  
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...

joko1220:
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 ---Dim VectorItemAvance(1000) As IntegerDim VectorItemAvanceMO(1000) As IntegerDim VectorItemAvanceCR(1000) As IntegerDim VectorItemAvanceIA(1000) As IntegerDim Varo As IntegerDim VaroMO As IntegerDim TempMO As IntegerDim VaroCR As IntegerDim TempCR As IntegerDim VaroIA As IntegerDim TempIA As IntegerDim l As IntegerDim S As IntegerDim AvanceTMO As IntegerPrivate ApExcel As Excel.Application Private Sub Form_Load()Avancepro1End Sub        Private Sub Avancepro1()    Dim VarVrTotalItem As Double    Dim VarPorEjecutado As Double    'Dim Selection As Object    'Dim xlGeneral As Object    Dim ContCantidad As Double    'bExcel = False    'Set ApExcel = GetObject(, "Excel.Application") 'Obtiene el objeto aplication de Excel, si no está abierto ocurre un error     Set ApExcel = CreateObject("Excel.application")    ' Hace que Excel se vea    'bExcel = True    ApExcel.Visible = True    'Agrega un nuevo Libro    ApExcel.Workbooks.Add    'Poner Titulos    ApExcel.Cells(2, 1).Formula = "INGESOFT LTDA - CARBONES DEL CERREJON LIMITED"    'ApExcel.Cells(3, 1).Formula = "PROY:"    'ApExcel.Cells(3, 2).Formula = FrmCrearCotizacion.TxtDescripcionCotizacion.Text    ApExcel.Cells(4, 1).Formula = "CUADRO DE CANTIDADES DE OBRA Y PRECIOS UNITARIOS"    ApExcel.Cells(5, 1).Formula = "CONTRATO CON-002482007 - CONSTRUCCIÓN OBRAS ELECTRICAS Y SERVICIOS TÉCNICOS AFINES"    ApExcel.Cells(6, 1).Formula = "TRABAJOS PREDEFINIDOS - TARIFAS POR PRECIOS UNITARIOS"    ApExcel.Cells(7, 1).Formula = "CENTRO DE COSTO:"    ApExcel.Cells(7, 3).Formula = FrmCrearCotizacion.TxtCentrodeCosto.Text    ApExcel.Cells(8, 1).Formula = "No. Orden de trabajo"    ApExcel.Cells(8, 3).Formula = FrmCrearCotizacion.TxtNoCotizacion    ApExcel.Cells(8, 5).Formula = "Plazo:"    ApExcel.Cells(8, 6).Formula = TxtDiasCalendario & " Dias "    ApExcel.Cells(10, 1).Formula = "Objeto de la Orden:"    ApExcel.Cells(10, 3).Formula = FrmCrearCotizacion.TxtDescripcionCotizacion.Text    ApExcel.Cells(11, 1).Formula = "Administrador de la orden de Trabajo:"    ApExcel.Cells(11, 3).Formula = FrmCrearCotizacion.TxtNombreElaboraCotizacion.Text    ApExcel.Cells(12, 1).Formula = "Persona que elaboro la cotizacion:"    ApExcel.Cells(12, 3).Formula = "RICARDO ANTURI"    'ApExcel.Cells(4, 1).Formula = "COD:"    'ApExcel.Cells(4, 2).Formula = "IELEC-CAMP"    'ApExcel.Cells(4, 3).Formula = "FECHA:"    'ApExcel.Cells(4, 4).Formula = FrmCrearCotizacion.TxtFechaCotizacion.Text    ApExcel.Columns("A:A").ColumnWidth = 8.43    ApExcel.Columns("B:B").ColumnWidth = 33.57    ApExcel.Columns("C:C").ColumnWidth = 8.29    ApExcel.Columns("D:D").ColumnWidth = 9.71    ApExcel.Columns("E:E").ColumnWidth = 15.14    ApExcel.Columns("F:F").ColumnWidth = 17.57     ApExcel.Range("A2:F3").HorizontalAlignment = xlCenter    ApExcel.Range("A2:F3").VerticalAlignment = xlBottom    ApExcel.Range("A2:F3").WrapText = False    ApExcel.Range("A2:F3").Orientation = 0    ApExcel.Range("A2:F3").AddIndent = False    ApExcel.Range("A2:F3").IndentLevel = 0    ApExcel.Range("A2:F3").ShrinkToFit = False    ApExcel.Range("A2:F3").ReadingOrder = xlContext    ApExcel.Range("A2:F3").MergeCells = False    ApExcel.Range("A2:F3").Merge        ApExcel.Range("A4:F4").HorizontalAlignment = xlCenter    ApExcel.Range("A4:F4").VerticalAlignment = xlBottom    ApExcel.Range("A4:F4").WrapText = False    ApExcel.Range("A4:F4").Orientation = 0    ApExcel.Range("A4:F4").AddIndent = False    ApExcel.Range("A4:F4").IndentLevel = 0    ApExcel.Range("A4:F4").ShrinkToFit = False    ApExcel.Range("A4:F4").ReadingOrder = xlContext    ApExcel.Range("A4:F4").MergeCells = False    ApExcel.Range("A4:F4").Merge        ApExcel.Range("A5:F5").HorizontalAlignment = xlCenter    ApExcel.Range("A5:F5").VerticalAlignment = xlBottom    ApExcel.Range("A5:F5").WrapText = False    ApExcel.Range("A5:F5").Orientation = 0    ApExcel.Range("A5:F5").AddIndent = False    ApExcel.Range("A5:F5").IndentLevel = 0    ApExcel.Range("A5:F5").ShrinkToFit = False    ApExcel.Range("A5:F5").ReadingOrder = xlContext    ApExcel.Range("A5:F5").MergeCells = False    ApExcel.Range("A5:F5").Merge'CODIGO DE MATERIALES        Call CodigoMateriales(Varo) pero en este procedimiento:

--- Código: Visual Basic ---Public Function ItenExiste6() As StringDim i As IntegerItenExiste6 = FalseFor i = 0 To Varo    If VectorItemAvance(i) = TxtItem6 Then        ItenExiste6 = True        Ind = Varo        Exit Function    End IfNext i End Function 
 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 ---Private Sub CodigoMateriales(ByVal Varo As Integer)    Dim VarSumatoria As Double    Dim VarSumatoria2 As Double    Dim indi As String    Dim i As Long, l As Long, S As Long, Z As Long, ex As Long    Dim cor As Long, Valorcorte As Long, VarStop As Long, VarCantCortes As Long    Dim NumeroCorte2 As Long, VarIdCorte As Long       i = 1     VarSumatoria = 0    VarSumatoria2 = 0    VarStop = 0    VarCantCortes = 0    NumeroCorte2 = FrmCrearCotizacion.ObtenerNumero(TxtDescripcionCorte6)    NumeroCorte2 = NumeroCorte2 - 1    VarIdCorte1 = TxtIdCorte    Varo = 0    Valorcorte = ObtenerNumero(FrmCrearCotizacion.CmboxCortes.Text)     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 corEnd Sub esta es la otra parte donde utilizo la variable

Nebire:
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 --- ' en un módulo  (.bas)public Varo as integer ' Ahora en el formulario' Ejemplo 1: una var aquí tiene el mismo nombre que en un módulo...Private Varo As IntegerPrivate Sub Form_Load()    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     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...    Varo = 25     MsgBox Module1.Varo     ' vemos cómo el valor no ha cambiado de 20End Sub  '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... Public Varo As IntegerPrivate Sub Form_Load()    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    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     Module1.Varo = 20          '  finalmente debo hacer lo mismo con la variable del módulo especificar el  calificador...    Varo = 12                       ' soy varo, el de la familia, el que nace y muere dentro del procedmiento load    MsgBox Module1.VaroEnd Subprivate Function Añadir(byval a as integer) as long       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...End Function   
Igualmente, si tuviera un 2º formulario, con el código del ejemplo 1º...

--- Código: Visual Basic ---   ' formulario 2 private sub Form_Load        Varo=Varo + 5    ' se refiere alvaro del módulo, porque el formulario 2 no ve el varo del formulario 1        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 private sub Añadir(Byval a as integer) as long      Static Varo as integer         ' este varo es el familiar, el reconocido     Añadir= Varo + a                ' sumo elvalor recibido al que ya tenía     Varo=a                             ' guardo el nuevo valor para sumarlo con el próximo que reciba     msgbox module1.Varo      ' el varo del módulo, debe calificarse, porque el de aquí tiene precedencia... end Sub  
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...

barbatusasf:
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:
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: ---        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
--- Fin del código ---
siento tardar en responder, pero apenas vi tu mensaje :suerte:

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa