Programación General > Visual Basic 6.0 e inferiores
error procedimiento demasiado largo
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
[*] Página Anterior
Ir a la versión completa