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 __
... el siguiente codigo... buscar... que se ingresa en un textbox y... muestra... datos en algunos label:

Private Sub TextBox1_Change()
Dim fila As Integer
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

... en el caso de que exista mas de un registro con el mismo numero
... como decirle al codigo que... si yo veo que los datos... no corresponden con lo que yo busco
apretando una tecla (por ejemplo enter) me busque el siguiente registro coincidente [...]
Respuesta Responder a este mensaje
#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:#
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 __
> ... el siguiente codigo... buscar... que se ingresa en un textbox y...


muestra... datos en algunos label:
>
> Private Sub TextBox1_Change()
> Dim fila As Integer
> 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
>
> ... en el caso de que exista mas de un registro con el mismo numero
> ... como decirle al codigo que... si yo veo que los datos... no


corresponden con lo que yo busco
> apretando una tecla (por ejemplo enter) me busque el siguiente registro


coincidente [...]


Respuesta Responder a este mensaje
#3 Héctor Miguel
07/07/2007 - 02:41 | Informe spam
hola, Mariano !

... Como podria agregarse a ese mismo codigo... la opcion de que al apretar una tecla
(por ejemplo enter o delete) cambie la condicion que tiene el registro de uno a otro
(del registro que se esta visulaizando en los labels por supuesto).
Con el codigo anterior que yo usaba (el TextBox1_Change que puse en el primer posteo)
funcionaba con la tecla delete y el codigo 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



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.
Respuesta Responder a este mensaje
#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#
hola, Mariano !

> ... Como podria agregarse a ese mismo codigo... la opcion de que al


apretar una tecla
> (por ejemplo enter o delete) cambie la condicion que tiene el registro


de uno a otro
> (del registro que se esta visulaizando en los labels por supuesto).
> Con el codigo anterior que yo usaba (el TextBox1_Change que puse en el


primer posteo)
> funcionaba con la tecla delete y el codigo 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

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.


Respuesta Responder a este mensaje
#5 Héctor Miguel
09/07/2007 - 19:25 | Informe spam
hola, Mariano !

... la ultima parte tira un error por esta linea: Call TextBox1_Exit, False [...]
... probe eliminando la línea directamente y funciona.
Lo unico... 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. Habra 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):



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 __
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
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida