Duda macros!
Hola, tengo un problema y espero me puedas ayudar; tengo un textbox, en el cual voy a escribir una cadena de 4 números, para eso tengo que validar que solo me permita escribir números y ningún otro caracter; los números en el text box son una clave de producto, entonces con esa clave cuando pulse un botón necesito que me busque todos los registros que lo contengan y ese resultado se vea en hoja de excel; no se si hacer esto sea posible, tengo entendido que se puede hacer con las funciones buscarv y vlookup pero no se como funcionen realmente. Muchas gracias por tu respuesta.
2 respuestas
Respuesta de inforvago
1
1
Solo recordemos que Excel no es una base de datos, es una hoja de calculo. Y no tiene las funciones propias de un MBD, así que c tendrán que fabricar a mano...
Primeramente en las propiedades el text box.
Llena la propiedad MaxLength=4
Para garantizar que no sea mayor de 4 posiciones.
Ahora en el control:
Private Sub TextBox_Change()
If Len(Trim(TextBox.Text)) > 0 Then 'Verificamos que el campo tenga algo
If IsNumeric(TextBox.Value) = False Then 'Si es numero lo que teclearon
Titulo = "Error"
Mensaje = "Es un dato númerico"
Respuesta = MsgBox(Mensaje, vbOKOnly, Titulo)
TextBox.SetFocus 'le regresa el control al mismo textbox
End If
End If
End Sub
Por otra parte la busqueda...
Esta función t regresa la fila donde esta lo que buscas...
Public BasedeDatos As Workbook
BaseDatos.name= nombre del archivo en excel.
Para usar la siguiente función deber tener tu hoja de búsqueda activa.
Workbooks(BasedeDatos. Name). Worksheets(Hojas). Activate
Ordenada por la columna en la que buscas...
Para ordenar:
Workbooks(BasedeDatos. Name). Worksheets(Hojas). Activate
Cells.Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Key2:=Range("B1") _
, Order2:=xlAscending, Key3:=Range("C1"), Order3:=xlAscending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Cells(1, 1).Select
Regresa el rango que coincidio...=GeneraRangoRem( TextBox, "A1:A2000")
Function GeneraRangoRem(Pedido As String, Rango As Variant) As Variant
Direccion = ""
firstAddress = ""
With Workbooks(BasedeDatos.Name).Worksheets("Remi").Range(Rango)
Set C = .Find(Pedido, LookIn:=xlValues)
If Not C Is Nothing Then
firstAddress = C.Address
Do
'C.Interior.Pattern = xlPatternGray50
Direccion = C.Address
Set C = .FindNext(C)
Loop While Not C Is Nothing And C.Address <> firstAddress
End If
End With
If Direccion <> "" Then
Direccion = Mid(Direccion, 4, Len(Direccion) - 2)
GeneraRangoRem = CStr(firstAddress) + ":" + CStr(Direccion)
End If
End Function
Seleccionas el área y la puedes copiar en otra hoja...
Primeramente en las propiedades el text box.
Llena la propiedad MaxLength=4
Para garantizar que no sea mayor de 4 posiciones.
Ahora en el control:
Private Sub TextBox_Change()
If Len(Trim(TextBox.Text)) > 0 Then 'Verificamos que el campo tenga algo
If IsNumeric(TextBox.Value) = False Then 'Si es numero lo que teclearon
Titulo = "Error"
Mensaje = "Es un dato númerico"
Respuesta = MsgBox(Mensaje, vbOKOnly, Titulo)
TextBox.SetFocus 'le regresa el control al mismo textbox
End If
End If
End Sub
Por otra parte la busqueda...
Esta función t regresa la fila donde esta lo que buscas...
Public BasedeDatos As Workbook
BaseDatos.name= nombre del archivo en excel.
Para usar la siguiente función deber tener tu hoja de búsqueda activa.
Workbooks(BasedeDatos. Name). Worksheets(Hojas). Activate
Ordenada por la columna en la que buscas...
Para ordenar:
Workbooks(BasedeDatos. Name). Worksheets(Hojas). Activate
Cells.Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Key2:=Range("B1") _
, Order2:=xlAscending, Key3:=Range("C1"), Order3:=xlAscending, Header:= _
xlYes, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Cells(1, 1).Select
Regresa el rango que coincidio...=GeneraRangoRem( TextBox, "A1:A2000")
Function GeneraRangoRem(Pedido As String, Rango As Variant) As Variant
Direccion = ""
firstAddress = ""
With Workbooks(BasedeDatos.Name).Worksheets("Remi").Range(Rango)
Set C = .Find(Pedido, LookIn:=xlValues)
If Not C Is Nothing Then
firstAddress = C.Address
Do
'C.Interior.Pattern = xlPatternGray50
Direccion = C.Address
Set C = .FindNext(C)
Loop While Not C Is Nothing And C.Address <> firstAddress
End If
End With
If Direccion <> "" Then
Direccion = Mid(Direccion, 4, Len(Direccion) - 2)
GeneraRangoRem = CStr(firstAddress) + ":" + CStr(Direccion)
End If
End Function
Seleccionas el área y la puedes copiar en otra hoja...
Este código es el que estoy ingresando en un commandbutton, por que según yo quiero que cuando lo pulsen haga esa búsqueda y si esos campos en el text box no están llenados como se debe pues que envíe esos mensajes de error.
If Len(TextBox1.Value) < 1 Then
TextBox1 = MsgBox("INGRESA NUMERO DE LÍNEA", vbOKOnly, "ERROR")
TextBox1 = Empty
End If
If Len(TextBox1.Value) < 4 Then
TextBox1 = MsgBox("RECUERDA QUE DEBES INGRESAR 4 NUMEROS", vbOKOnly, "ERROR!!!!")
TextBox1 = Empty
End If
Por otra parte; los resultados de esa búsqueda me los tiene que mandar a la hoja de excel de otro libro que se supone cree antes (ese macro ya lo tengo funcionando), funciona de la siguiente forma:
Un libro A tiene algunos datos a los cuales se les hace una sumatoria, después se crea un libro C, en el libro C pego mi resultado del libro A, luego automático abro un libro B, en el cual también hago una sumatoria y ese resultado también lo pego en el libro C, una vez que están pegados los resultados de A y B, hago una resta de ambos;digamos que eso funciona solo por columnas enteras y funciona a la perfeccion; pero también necesito que se busque de forma "individual" y haga lo mismo, pero que se active cuando pulso el botón que te digo.
If Len(TextBox1.Value) < 1 Then
TextBox1 = MsgBox("INGRESA NUMERO DE LÍNEA", vbOKOnly, "ERROR")
TextBox1 = Empty
End If
If Len(TextBox1.Value) < 4 Then
TextBox1 = MsgBox("RECUERDA QUE DEBES INGRESAR 4 NUMEROS", vbOKOnly, "ERROR!!!!")
TextBox1 = Empty
End If
Por otra parte; los resultados de esa búsqueda me los tiene que mandar a la hoja de excel de otro libro que se supone cree antes (ese macro ya lo tengo funcionando), funciona de la siguiente forma:
Un libro A tiene algunos datos a los cuales se les hace una sumatoria, después se crea un libro C, en el libro C pego mi resultado del libro A, luego automático abro un libro B, en el cual también hago una sumatoria y ese resultado también lo pego en el libro C, una vez que están pegados los resultados de A y B, hago una resta de ambos;digamos que eso funciona solo por columnas enteras y funciona a la perfeccion; pero también necesito que se busque de forma "individual" y haga lo mismo, pero que se active cuando pulso el botón que te digo.
No es conveniente darle las validacines al mismo botón ya que su finalidad se pude ver afectda...
Pero es tu desión...
El usuario al ver que la hoja no le permite el ingreso de más de 4 dígitos en el text box intuirá por default el motivo...
La función que te mande la puedes lamdar a través del botón listo...
Texbox <- Controla por si mismo los eventos que le acontesen.
De hecho el si puede activar o descativa l botón para que sea opeable unicamente cuando se ha llenado el text box...
Pero es tu desión...
El usuario al ver que la hoja no le permite el ingreso de más de 4 dígitos en el text box intuirá por default el motivo...
La función que te mande la puedes lamdar a través del botón listo...
Texbox <- Controla por si mismo los eventos que le acontesen.
De hecho el si puede activar o descativa l botón para que sea opeable unicamente cuando se ha llenado el text box...
- Compartir respuesta
- Anónimo
ahora mismo
Respuesta de Carlos Serrano
1
1
Carlos Serrano, 7 Años de experiencia en manejo de hojas de cálculo Excel y en...
Vos me dices que es un textbox, por ende presumiré que estás trabajando en un campo dentro de un formulario, dado esto entonces vamos por partes, primero tendrás que validar que el usuario este introduciendo adecuadamente la información, para esto emplearemos los condicionales IF.
haciendo dobleclick en el editor del formulario, sobre el text box te aparecera por default algo como
private sub textbox1_change()
end sub
vas a cambiarlo por
private sub textbox1_update()
end sub
Para que luego de que se actualize es decir el usuario salga del campo se ejecute el código validador.
CODIGO VALIDADOR:
Function Comprobar_Tipo(valor As String, tipo As String) As Boolean
Dim Valido As Boolean
Valido = True
Select Case tipo
'Comprueba si es un valor numérico válido
Case "N"
If Not IsNumeric(valor) Then
Valido = False
End If
End Select
Comprobar_Tipo = Valido
End Function
Ésto lo pegas en la parte superior del código NO DENTRO DE UN SUB
luego ahora si dentro de tu casilla de texto cuando le hagas doble clic entonces te aperecera el update, dentro del update pegas:
If Not Comprobar_Tipo(TEXTBOX1, "N") Then
MsgBox Prompt:="Verifique la fecha en formato dd/mm/aaaa", Title:="CORRIJA O LA OPERACIÓN NO CONTINUARÁ"
FECHA.SetFocus
else
msgbox prompt:="Dato valido, continue",Title:="Continúe"
end if
en el boton para buscar pegas:
columna =(pones el numero de la columna donde estan los datos)
fila = (la fila donde empiezan los datos)
encontrado = false
do while encontrado = false
cells(fila, columna).activate
if activecell.value = "" then
msgbox prompt:="Se buscó y no se encontro",Title:="Mensaje"
encontrado = true
else
if activecell.value = textbox1.value then
msgbox prompt:="ENCONTRADO",Title:="Continúe"
range("b1").value = val(activecell.value) 'aqui pone que le escriba el dato en una celda o no lo pone esto es relativo.
encontrado = true
else
fila = fila + 1
end if
end if
loop
Espero te sirva, sinm embargo si tienes dudas o quieres aprender a hacer macros te recomiendo la siguiente página que ofrece este tipo de cursos o aplicativos en excel a un bajísimo costo: http://www.ayconcol.com/foro te puedes registrar y mirar los cursos. Saludos!
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">http://ayconcol.com/foro/viewforum.php?f=61</div>
haciendo dobleclick en el editor del formulario, sobre el text box te aparecera por default algo como
private sub textbox1_change()
end sub
vas a cambiarlo por
private sub textbox1_update()
end sub
Para que luego de que se actualize es decir el usuario salga del campo se ejecute el código validador.
CODIGO VALIDADOR:
Function Comprobar_Tipo(valor As String, tipo As String) As Boolean
Dim Valido As Boolean
Valido = True
Select Case tipo
'Comprueba si es un valor numérico válido
Case "N"
If Not IsNumeric(valor) Then
Valido = False
End If
End Select
Comprobar_Tipo = Valido
End Function
Ésto lo pegas en la parte superior del código NO DENTRO DE UN SUB
luego ahora si dentro de tu casilla de texto cuando le hagas doble clic entonces te aperecera el update, dentro del update pegas:
If Not Comprobar_Tipo(TEXTBOX1, "N") Then
MsgBox Prompt:="Verifique la fecha en formato dd/mm/aaaa", Title:="CORRIJA O LA OPERACIÓN NO CONTINUARÁ"
FECHA.SetFocus
else
msgbox prompt:="Dato valido, continue",Title:="Continúe"
end if
en el boton para buscar pegas:
columna =(pones el numero de la columna donde estan los datos)
fila = (la fila donde empiezan los datos)
encontrado = false
do while encontrado = false
cells(fila, columna).activate
if activecell.value = "" then
msgbox prompt:="Se buscó y no se encontro",Title:="Mensaje"
encontrado = true
else
if activecell.value = textbox1.value then
msgbox prompt:="ENCONTRADO",Title:="Continúe"
range("b1").value = val(activecell.value) 'aqui pone que le escriba el dato en una celda o no lo pone esto es relativo.
encontrado = true
else
fila = fila + 1
end if
end if
loop
Espero te sirva, sinm embargo si tienes dudas o quieres aprender a hacer macros te recomiendo la siguiente página que ofrece este tipo de cursos o aplicativos en excel a un bajísimo costo: http://www.ayconcol.com/foro te puedes registrar y mirar los cursos. Saludos!
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">http://ayconcol.com/foro/viewforum.php?f=61</div>
Ok, gracias por la respuesta, te copio el código que llevo hasta el momento:
Private Sub CommandButton2_Click()
If Len(TextBox1.Value) < 1 Then 'aqui valido que el textbox tenga datos
TextBox1 = MsgBox("INGRESA NUMERO DE LÍNEA", vbOKOnly, "ERROR")
TextBox1 = Empty
End If
If Len(TextBox1.Value) < 4 Then 'aqui valido que sean los 4 caracteres que necesito
TextBox1 = MsgBox("RECUERDA QUE DEBES INGRESAR CUATRO NUMEROS", vbOKOnly, "ERROR")
TextBox1 = Empty
End If
Solo me falta lo de buscar los registros y validar que solo se ingresen números, o tu que piensas de mi código de pobre aficionado
Private Sub CommandButton2_Click()
If Len(TextBox1.Value) < 1 Then 'aqui valido que el textbox tenga datos
TextBox1 = MsgBox("INGRESA NUMERO DE LÍNEA", vbOKOnly, "ERROR")
TextBox1 = Empty
End If
If Len(TextBox1.Value) < 4 Then 'aqui valido que sean los 4 caracteres que necesito
TextBox1 = MsgBox("RECUERDA QUE DEBES INGRESAR CUATRO NUMEROS", vbOKOnly, "ERROR")
TextBox1 = Empty
End If
Solo me falta lo de buscar los registros y validar que solo se ingresen números, o tu que piensas de mi código de pobre aficionado
Bueno en las primeras lineas te dice que tenga una longitud de caracteres, no de valores numéricos. En la 6ta linea le dices que tiene que tener 4 caracteres. Más no números, es preciso que invoque la función que te mande para validar que sea un numero o te arrojara error si ponen texto a la hora de comparar que es la función o utilidad más bien que se emplea para encontrar un valor
Y listo ya luego entonces pegas el código que te di en el else y listo! Sin embargo creo que si deberías estudiar un poco más sobre macros aprovechando que estas muy interesado en el tema, es una herramienta muy buena, yo esoy en alemania y la uso 100% y mis jefes les gusta! Entonces super... no descartes la opción de la página que te mande saludos!
Y listo ya luego entonces pegas el código que te di en el else y listo! Sin embargo creo que si deberías estudiar un poco más sobre macros aprovechando que estas muy interesado en el tema, es una herramienta muy buena, yo esoy en alemania y la uso 100% y mis jefes les gusta! Entonces super... no descartes la opción de la página que te mande saludos!
La función era la primera la que dice function esa la pegas bien arriba, y fuera de cualquier sub ya creado.
Luego en el else que tienes que ponerlo que te queda así
If Len(TextBox1.Value) < 4 Then 'aqui valido que sean los 4 caracteres que necesito
TextBox1 = MsgBox("RECUERDA QUE DEBES INGRESAR CUATRO NUMEROS", vbOKOnly, "ERROR")
TextBox1 = Empty
ELSE
'aqui pegas el codigo de buscar el registro
End If
Y listo
Luego en el else que tienes que ponerlo que te queda así
If Len(TextBox1.Value) < 4 Then 'aqui valido que sean los 4 caracteres que necesito
TextBox1 = MsgBox("RECUERDA QUE DEBES INGRESAR CUATRO NUMEROS", vbOKOnly, "ERROR")
TextBox1 = Empty
ELSE
'aqui pegas el codigo de buscar el registro
End If
Y listo
En vez de fecha pones el nombre del campo es decir textbox1 o como se llame el campo, es que estoy respondiendo otra pregunta parecida pero validando FECHA entonces se me debió ir, escribir el código es a veces confuso en variables.
jajaja claro que si sin duda alguna, muchas veces son las variables, si pienso tomar el curso, de hecho me apena decirlo, soy estudiante de informática, casi a punto de graduarme y nunca había escuchado siquiera de las macro hasta que inicie mis practicas, siempre con java según pues y ni eso nos enseñaron bien. Gracias
- Compartir respuesta
- Anónimo
ahora mismo