Buscar siguiente registro en la función Find desde un dato ingresado en un TextBox

03/07/2007 - 02:14 por Contaduria | Informe spam
Hola Gente del Foro:

Espero esten todos bien! Tengo el siguiente código que lo que hace es buscar
un número que se ingresa en un textbox y que muestra ciertos datos en
algunos label:

Private Sub TextBox1_Change()

Dim fila As Integer

On Error Resume Next
fila = ActiveSheet.Range("B:B").Find(TextBox1, , LookIn:=xlValues,
LookAt:=xlWhole).Row

Label7 = Format(ActiveSheet.Cells(fila, 6).Value, "#,#00.00")
Label5.Caption = Format(ActiveSheet.Cells(fila, 5), "dd/mm/yyyy")
Label6 = ActiveSheet.Cells(fila, 3).Value
ActiveSheet.Range("A1") = fila

If ActiveSheet.Range("A1") = 0 Then
Label7 = ""
Label5 = ""
Label6 = ""
End If

End Sub

El código funciona perfecto. Pero en el caso de que exista más de un
registro con el mismo número siempre encuentra el primero, y lo que no se
como hacer es: como decirle al código que luego de ejecutar la secuencia, si
yo veo que los datos que se ven en el label no corresponden con lo que yo
busco, apretando una tecla (por ejemplo enter) me busque el siguiente
registro coincidente con el número en el textbox y muestre los datos de ese.

Ejemplo:

Estos son los registros en la hoja actual:

A B C D
E F G
09/11/06 103 CARGAS SOCIALES 34746 09/11/06
6,553.89 NO EN
09/11/06 104 CARGAS SOCIALES 34750 09/11/06 16,500.00
NO EN
16/11/06 104 XXX S.R.L. 35509 16/11/06
1,500.00 NO EN
17/11/06 140 XXX S.R.L. 35511 17/11/06
2,000.00 NO EN
18/08/06 538 XXX S.R.L. 29997 18/08/06
2,500.00 NO EN

En el textbox yo ingreso "104"
Resultado con el código actual: muestra en el Label7 "16,500.00", en el
Label5 "09/11/2006", y en el Label6 "CARGAS SOCIALES"

Ahora lo que yo quiero es...

En el textbox yo ingreso "104"
Resultado: muestra en el Label7 "16,500.00", en el Label5 "09/11/2006", y en
el Label6 "CARGAS SOCIALES", al darme cuenta que no es el resultado que yo
busco aprieto la tecla enter (o alguna otra) y acto seguido muestra en el
Label7 "1,500.00", en el Label5 "16/11/2006", y en el Label6 "XXX S.R.L."

Pienso que debe tener que ver con algo de poner el atributo After:= en la
función Find, pero no se como escribirlo para que funcione (ya que lo
intente y no funciona).
Espero haberme explicado bien!
Saludos y desde ya muchas gracias!

Mariano

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
03/07/2007 - 07:26 | Informe spam
hola, Mariano !

puedes consutar la ayuda en linea [vba-excel] por el metodo .FindNext, pero creo que seria mejor [p.e. si como]...
en la siguiente propuesta, *te cambio* el uso de la variable *fila* por un tipo de dato *Range*
del que puedes utilizar la propiedad .Offset(fila, col) para hacer referencia a otras columnas
y estoy suponiendo que puedes agregar [p.e.] un CommandButton2 [?] para buscar siguiente/s coincidencia/s

tambien te cambio el evento '_change' por el evento '_exit' del textbox [para no estar *machacando* la celda 'A1' :))

si cualquier duda [o informacion adicional]... comentas ?
saludos,
hector.

Dim Celda As Range, Registros As Integer, Actual As Integer
Private Sub TextBox1_Enter()
CommandButton2.Enabled = False
End Sub
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Label7 = Empty
Label5 = Empty
Label6 = Empty
Registros = Application.CountIf(Range("b:b"), TextBox1)
Actual = -(Registros > 0)
CommandButton2.Caption = "Registro " & Actual & " de " & Registros
CommandButton2.Enabled = Registros
On Error GoTo Finalizar
Set Celda = Range("b:b").Find(TextBox1, , xlValues, xlWhole)
Label7 = Format(Celda.Offset(, 4), "#,#00.00")
Label5 = Format(Celda.Offset(, 3), "dd/mm/yyyy")
Label6 = Celda.Offset(, 1)
Exit Sub
Finalizar:
MsgBox "No existe el registro solicitado !!!"
End Sub
Private Sub CommandButton2_Click()
On Error Resume Next
Actual = Actual + 1
Set Celda = Range("b:b").Find(TextBox1, Celda, xlValues, xlWhole)
CommandButton2.Caption = "Registro " & Actual & " de " & Registros
Label7 = Format(Celda.Offset(, 4), "#,#00.00")
Label5 = Format(Celda.Offset(, 3), "dd/mm/yyyy")
Label6 = Celda.Offset(, 1)
CommandButton2.Enabled = Actual < Registros
End Sub

__ la consulta original __
Mostrar la cita
#2 Contaduria
06/07/2007 - 21:06 | Informe spam
Hector Miguel:

Muchisimas Gracias por el código. Funciona de maravilla!
Ahora tengo otra pregunta: Cada registro tiene en la columna G un campo que
puede tener una de estas dos condiciones: "NO EN" o "SI EN". Como podría
agregarse a ese mismo código que vos me mandaste la opción de que al apretar
una tecla (por ejemplo enter o delete) cambie la condición que tiene el
registro de uno a otro (del registro que se esta visulaizando en los labels
por supuesto). Con el código anterior que yo usaba (el TextBox1_Change que
puse en el primer posteo) funcionaba con la tecla delete y el código era el
siguiente :

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)

On Error Resume Next
If KeyCode = 46 Then
If ActiveSheet.Cells(ActiveSheet.Range("A1"), 7) = "NO EN" Then
ActiveSheet.Cells(ActiveSheet.Range("A1"), 7) = "SI EN"
Else
ActiveSheet.Cells(ActiveSheet.Range("A1"), 7) = "NO EN"
End If
End If

Call TextBox1_Change

End Sub

Como podría incorporar esto al código nuevo?
Desde ya muchas gracias!!

Mariano


"Héctor Miguel" escribió en el mensaje
news:#
Mostrar la cita
pero creo que seria mejor [p.e. si como]...
Mostrar la cita
tipo de dato *Range*
Mostrar la cita
referencia a otras columnas
Mostrar la cita
buscar siguiente/s coincidencia/s
Mostrar la cita
[para no estar *machacando* la celda 'A1' :))
Mostrar la cita
muestra... datos en algunos label:
Mostrar la cita
LookAt:=xlWhole).Row
Mostrar la cita
corresponden con lo que yo busco
Mostrar la cita
coincidente [...]
Mostrar la cita
#3 Héctor Miguel
07/07/2007 - 02:41 | Informe spam
hola, Mariano !

Mostrar la cita
asi, *a bote pronto*... prueba aprovechando que ya esta asignado un rango a la variable Celda y modifica...
esta parte de tu codigo:

If KeyCode = 46 Then
If ActiveSheet.Cells(ActiveSheet.Range("A1"), 7) = "NO EN" Then
ActiveSheet.Cells(ActiveSheet.Range("A1"), 7) = "SI EN"
Else
ActiveSheet.Cells(ActiveSheet.Range("A1"), 7) = "NO EN"
End If
End If
Call TextBox1_Change

por esta otra:

If KeyCode = 46 Then
With Celda.Offset(, 5)
.Value = Iif(Left(.Value, 2) = "NO", "SI", "NO") & " EN"
End With
End If
Call TextBox1_Exit, False

[aunque] me da la impresion de que se va a dar *otra vuelta* cuando hagas este tipo de modificaciones -?-
comentas ?
saludos,
hector.
#4 Contaduria
09/07/2007 - 16:25 | Informe spam
Hola Héctor Miguel:

Muchas gracias nuevamente. El código anda bárbaro... execepto que la última
parte tira un error por esta linea:
Call TextBox1_Exit, False
Dice "Error en sintaxis", que se soluciona al eliminar el False, pero luego
tira el error: "El argumento no es opcional". Luego probé eliminando la
línea directamente y funciona. Lo unico que sucede es que no muestra en
pantalla "en tiempo real" cuando cambia la condición del registro (la que se
muestra en el Label6) como sucedia antes. Habrá manera de solucionar esto?
Por cierto, voy a pegar abajo todos los códigos relacionados como los estoy
usando ahora, ya que cambie alguna cosita (por ejemplo lo que muestra la
Label6, que ahora es la condicion SI EN/NO EN del campo G):

Dim Celda As Range, Registros As Integer, Actual As Integer

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)

On Error Resume Next
If KeyCode = 46 Then
With Celda.Offset(, 5)
.Value = IIf(Left(.Value, 2) = "NO", "SI", "NO") & " EN"
End With
End If

'Call TextBox1_Exit, False

End Sub

Private Sub TextBox1_Enter()
CommandButton2.Enabled = False
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Label7 = Empty
Label5 = Empty
Label6 = Empty
Registros = Application.CountIf(Range("b:b"), TextBox1)
Actual = -(Registros > 0)
CommandButton2.Caption = "Registro " & Actual & " de " & Registros
CommandButton2.Enabled = Registros
On Error GoTo Finalizar
Set Celda = Range("b:b").Find(TextBox1, , xlValues, xlWhole)
Label7 = Format(Celda.Offset(, 4), "#,#00.00")
Label5 = Format(Celda.Offset(, 3), "dd/mm/yyyy")
Label6 = Celda.Offset(, 5)
Exit Sub
Finalizar:
MsgBox "No existe el registro solicitado !!!"
End Sub

Private Sub CommandButton2_Click()
On Error Resume Next
Actual = Actual + 1
Set Celda = Range("b:b").Find(TextBox1, Celda, xlValues, xlWhole)
CommandButton2.Caption = "Registro " & Actual & " de " & Registros
Label7 = Format(Celda.Offset(, 4), "#,#00.00")
Label5 = Format(Celda.Offset(, 3), "dd/mm/yyyy")
Label6 = Celda.Offset(, 5)
CommandButton2.Enabled = Actual < Registros
End Sub

Desde ya muchas gracias!!
Saludos!

Mariano

"Héctor Miguel" escribió en el mensaje
news:#32UV#
Mostrar la cita
apretar una tecla
Mostrar la cita
de uno a otro
Mostrar la cita
primer posteo)
Mostrar la cita
ByVal Shift As Integer)
Mostrar la cita
a la variable Celda y modifica...
Mostrar la cita
este tipo de modificaciones -?-
Mostrar la cita
#5 Héctor Miguel
09/07/2007 - 19:25 | Informe spam
hola, Mariano !

Mostrar la cita
prueba en vez de *llamar* al evento '_exit' del textbox [que causaria un re-inicio del ciclo de busquedas]...
-> con una *actualizacion* [o refresco] de los cambios en la celda *afectada* de la columna 'G'

de: -> Call TextBox1_Exit, False
a: -> Label6 = Celda.Offset(, 5)

saludos,
hector.

__ el codigo expuesto __
Mostrar la cita
Ads by Google
Search Busqueda sugerida