Función de Búsqueda en VBA

19/12/2006 - 14:01 por javivi | Informe spam
Buenos días,

Existe programada entre las funciones de VBA de excel una función de
búsqueda que haga de forma más eficiente lo programado por mi en la
siguiente función a partir de dos funciones de excel.

Busca el elemento fila y columna (strings) de un rango que yo defina,
pero se ralentiza mucho el cálculo (necesita mucha memoria si tiene
que hacer la búsqueda muchas veces).

Javivi




Public Function B(hoja As Range, ElementoFila As Variant, ElementoCol
As Variant) As Variant

Dim nfila As Integer
Dim ncol As Integer
'Dim BPrevio As Double

nfila = Application.WorksheetFunction.Match(ElementoFila,
hoja.Columns("A:A"), 0)
ncol = Application.WorksheetFunction.Match(ElementoCol,
hoja.Rows("1:1"), 0)

B = Application.WorksheetFunction.Index(hoja, nfila, ncol, 1)
If (Application.WorksheetFunction.IsNumber(B) = False Or
Application.WorksheetFunction.IsError(B) = True) Then
B = ""
Else
B = Application.WorksheetFunction.Index(hoja, nfila, ncol, 1)
End If

End Function

Preguntas similare

Leer las respuestas

#1 zz
19/12/2006 - 20:35 | Informe spam
crea un formulario

e inserta

1 textbox llamado textbox1
un listbox llamado listbox1
y un commandbutton llamado commandbutton1

y pega este codigo

Option Compare Text

Private Sub find_in_all_sheets()
Dim c As Range, i As Integer
Set c = Cells.Find(TextBox1.Text, LookIn:=xlValues)
For Each c In ActiveSheet.UsedRange' para que no busque en toda la hoja

If c.Value = TextBox1 Then
i = 0
ListBox1.AddItem "Value: " & "'" & TextBox1 & "'" & " Found in cell :" &
Replace(c.Address, "$", ""), i
ListBox1.Column(2, i) = (Replace(c.Address, "$", ""))
i = i + 1
End If
me.caption="Resultados para : " & TextBox1
Next
End Sub

Private Sub CommandButton1_Click()
ListBox1.Clear
TextBox1 = ""
End Sub

Private Sub ListBox1_Click()
Dim i As Integer
i = ListBox1.ListIndex
With ActiveSheet
.Range(ListBox1.Column(2, i)).Activate
End With
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)
If KeyCode = 13 Then
find_in_all_sheets
Else
Exit Sub
End If
End Sub

Private Sub UserForm_Initialize()
me.caption="Buscar"
ListBox1.ColumnHeads = True
ListBox1.ColumnCount = 2
End Sub



espero que te sirva

zz [MX]
cuasi-musico,semi-poeta y loco


"javivi" wrote in message
news:
Buenos días,

Existe programada entre las funciones de VBA de excel una función de
búsqueda que haga de forma más eficiente lo programado por mi en la
siguiente función a partir de dos funciones de excel.

Busca el elemento fila y columna (strings) de un rango que yo defina,
pero se ralentiza mucho el cálculo (necesita mucha memoria si tiene
que hacer la búsqueda muchas veces).

Javivi




Public Function B(hoja As Range, ElementoFila As Variant, ElementoCol
As Variant) As Variant

Dim nfila As Integer
Dim ncol As Integer
'Dim BPrevio As Double

nfila = Application.WorksheetFunction.Match(ElementoFila,
hoja.Columns("A:A"), 0)
ncol = Application.WorksheetFunction.Match(ElementoCol,
hoja.Rows("1:1"), 0)

B = Application.WorksheetFunction.Index(hoja, nfila, ncol, 1)
If (Application.WorksheetFunction.IsNumber(B) = False Or
Application.WorksheetFunction.IsError(B) = True) Then
B = ""
Else
B = Application.WorksheetFunction.Index(hoja, nfila, ncol, 1)
End If

End Function
Respuesta Responder a este mensaje
#2 javivi
20/12/2006 - 12:48 | Informe spam
Gracias, pero creo que no me sirve. Lo que busco es una función
(posiblemente ya creada) que replique lo que yo he escrito en VBA. Es
para aplicarla a un libro excel y poder hacer búsquedas eficientes y
no para utilizarla en formularios.

Gracias de nuevo


zz ha escrito:

crea un formulario

e inserta

1 textbox llamado textbox1
un listbox llamado listbox1
y un commandbutton llamado commandbutton1

y pega este codigo

Option Compare Text

Private Sub find_in_all_sheets()
Dim c As Range, i As Integer
Set c = Cells.Find(TextBox1.Text, LookIn:=xlValues)
For Each c In ActiveSheet.UsedRange' para que no busque en toda la hoja

If c.Value = TextBox1 Then
i = 0
ListBox1.AddItem "Value: " & "'" & TextBox1 & "'" & " Found in cell :" &
Replace(c.Address, "$", ""), i
ListBox1.Column(2, i) = (Replace(c.Address, "$", ""))
i = i + 1
End If
me.caption="Resultados para : " & TextBox1
Next
End Sub

Private Sub CommandButton1_Click()
ListBox1.Clear
TextBox1 = ""
End Sub

Private Sub ListBox1_Click()
Dim i As Integer
i = ListBox1.ListIndex
With ActiveSheet
.Range(ListBox1.Column(2, i)).Activate
End With
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)
If KeyCode = 13 Then
find_in_all_sheets
Else
Exit Sub
End If
End Sub

Private Sub UserForm_Initialize()
me.caption="Buscar"
ListBox1.ColumnHeads = True
ListBox1.ColumnCount = 2
End Sub



espero que te sirva

zz [MX]
cuasi-musico,semi-poeta y loco


"javivi" wrote in message
news:
Buenos días,

Existe programada entre las funciones de VBA de excel una función de
búsqueda que haga de forma más eficiente lo programado por mi en la
siguiente función a partir de dos funciones de excel.

Busca el elemento fila y columna (strings) de un rango que yo defina,
pero se ralentiza mucho el cálculo (necesita mucha memoria si tiene
que hacer la búsqueda muchas veces).

Javivi




Public Function B(hoja As Range, ElementoFila As Variant, ElementoCol
As Variant) As Variant

Dim nfila As Integer
Dim ncol As Integer
'Dim BPrevio As Double

nfila = Application.WorksheetFunction.Match(ElementoFila,
hoja.Columns("A:A"), 0)
ncol = Application.WorksheetFunction.Match(ElementoCol,
hoja.Rows("1:1"), 0)

B = Application.WorksheetFunction.Index(hoja, nfila, ncol, 1)
If (Application.WorksheetFunction.IsNumber(B) = False Or
Application.WorksheetFunction.IsError(B) = True) Then
B = ""
Else
B = Application.WorksheetFunction.Index(hoja, nfila, ncol, 1)
End If

End Function
Respuesta Responder a este mensaje
#3 Ivan
20/12/2006 - 15:37 | Informe spam
hola Javivi

echa un vistazo a este dialog a ver si te sirve de algo ( no se si se
pueden usar las funciones propuestas en hoja de calculo, pero si no es
asi, creo que buscando/consultando en el foro no sera complicado)

http://tinyurl.com/y9v3cc

un saludo
Ivan
Respuesta Responder a este mensaje
#4 zz
20/12/2006 - 20:51 | Informe spam
Ok, creo que lo que no claro es que la funcion find_in_all_sheets es una
funcion de busqueda 'mas o menos generica'[si es que eso existe], lo unico
que tenias que hacer era adaptarla a tus necesidades.

ejemplo


Private Sub find_in_all_sheets(valor as string) as string
Dim c As Range
Set c = Cells.Find(valor, LookIn:=xlValues)
For Each c In ActiveSheet.UsedRange ' para que no busque en toda la hoja
If c.Value = valor Then
find_in_all_sheets =c.address
End If
Next
End Sub


esta adaptación lo que hace es que te entrega el address o la direccion de
la ultima celda que contiene el valor que buscas.

con un poco de imaginación puedes adaptarla para que te 'entregue' un array
con todos los valores encontrados.



espero que ahora si te sirva ;=)

zz [MX]
cuasi-musico,semi-poeta y loco



"javivi" wrote in message
news:

Gracias, pero creo que no me sirve. Lo que busco es una función
(posiblemente ya creada) que replique lo que yo he escrito en VBA. Es
para aplicarla a un libro excel y poder hacer búsquedas eficientes y
no para utilizarla en formularios.

Gracias de nuevo


zz ha escrito:

crea un formulario

e inserta

1 textbox llamado textbox1
un listbox llamado listbox1
y un commandbutton llamado commandbutton1

y pega este codigo

Option Compare Text

Private Sub find_in_all_sheets()
Dim c As Range, i As Integer
Set c = Cells.Find(TextBox1.Text, LookIn:=xlValues)
For Each c In ActiveSheet.UsedRange' para que no busque en toda la hoja
If c.Value = TextBox1 Then
i = 0
ListBox1.AddItem "Value: " & "'" & TextBox1 & "'" & " Found in cell :"
&
Replace(c.Address, "$", ""), i
ListBox1.Column(2, i) = (Replace(c.Address, "$", ""))
i = i + 1
End If
me.caption="Resultados para : " & TextBox1
Next
End Sub

Private Sub CommandButton1_Click()
ListBox1.Clear
TextBox1 = ""
End Sub

Private Sub ListBox1_Click()
Dim i As Integer
i = ListBox1.ListIndex
With ActiveSheet
.Range(ListBox1.Column(2, i)).Activate
End With
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)
If KeyCode = 13 Then
find_in_all_sheets
Else
Exit Sub
End If
End Sub

Private Sub UserForm_Initialize()
me.caption="Buscar"
ListBox1.ColumnHeads = True
ListBox1.ColumnCount = 2
End Sub



espero que te sirva

zz [MX]
cuasi-musico,semi-poeta y loco


"javivi" wrote in message
news:
Buenos días,

Existe programada entre las funciones de VBA de excel una función de
búsqueda que haga de forma más eficiente lo programado por mi en la
siguiente función a partir de dos funciones de excel.

Busca el elemento fila y columna (strings) de un rango que yo defina,
pero se ralentiza mucho el cálculo (necesita mucha memoria si tiene
que hacer la búsqueda muchas veces).

Javivi




Public Function B(hoja As Range, ElementoFila As Variant, ElementoCol
As Variant) As Variant

Dim nfila As Integer
Dim ncol As Integer
'Dim BPrevio As Double

nfila = Application.WorksheetFunction.Match(ElementoFila,
hoja.Columns("A:A"), 0)
ncol = Application.WorksheetFunction.Match(ElementoCol,
hoja.Rows("1:1"), 0)

B = Application.WorksheetFunction.Index(hoja, nfila, ncol, 1)
If (Application.WorksheetFunction.IsNumber(B) = False Or
Application.WorksheetFunction.IsError(B) = True) Then
B = ""
Else
B = Application.WorksheetFunction.Index(hoja, nfila, ncol, 1)
End If

End Function
Respuesta Responder a este mensaje
#5 richietj77
02/02/2007 - 03:38 | Informe spam
On 20 dic 2006, 15:51, "zz" wrote:
Ok, creo que lo que no claro es que la funcion find_in_all_sheets es una
funcion debusqueda'mas o menos generica'[si es que eso existe], lo unico
que tenias que hacer era adaptarla a tus necesidades.

ejemplo

Private Sub find_in_all_sheets(valor as string) as string
Dim c As Range
Set c = Cells.Find(valor, LookIn:=xlValues)
For Each c In ActiveSheet.UsedRange ' para que no busque en toda la hoja
If c.Value = valor Then
find_in_all_sheets =c.address
End If
Next
End Sub

esta adaptación lo que hace es que te entrega el address o la direccion de
la ultima celda que contiene el valor que buscas.

con un poco de imaginación puedes adaptarla para que te 'entregue' un array
con todos los valores encontrados.

espero que ahora si te sirva ;=)

zz [MX]
cuasi-musico,semi-poeta y loco

"javivi" wrote in message

news:

Gracias, pero creo que no me sirve. Lo que busco es una función
(posiblemente ya creada) que replique lo que yo he escrito enVBA. Es
para aplicarla a un libroexcely poder hacer búsquedas eficientes y
no para utilizarla en formularios.

Gracias de nuevo

zz ha escrito:



> crea un formulario

> e inserta

> 1 textbox llamado textbox1
> un listbox llamado listbox1
> y un commandbutton llamado commandbutton1

> y pega este codigo

> Option Compare Text

> Private Sub find_in_all_sheets()
> Dim c As Range, i As Integer
> Set c = Cells.Find(TextBox1.Text, LookIn:=xlValues)
> For Each c In ActiveSheet.UsedRange' para que no busque en toda la hoja
> If c.Value = TextBox1 Then
> i = 0
> ListBox1.AddItem "Value: " & "'" & TextBox1 & "'" & " Found in cell :"
> &
> Replace(c.Address, "$", ""), i
> ListBox1.Column(2, i) = (Replace(c.Address, "$", ""))
> i = i + 1
> End If
> me.caption="Resultados para : " & TextBox1
> Next
> End Sub

> Private Sub CommandButton1_Click()
> ListBox1.Clear
> TextBox1 = ""
> End Sub

> Private Sub ListBox1_Click()
> Dim i As Integer
> i = ListBox1.ListIndex
> With ActiveSheet
> .Range(ListBox1.Column(2, i)).Activate
> End With
> End Sub

> Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
> Shift As Integer)
> If KeyCode = 13 Then
> find_in_all_sheets
> Else
> Exit Sub
> End If
> End Sub

> Private Sub UserForm_Initialize()
> me.caption="Buscar"
> ListBox1.ColumnHeads = True
> ListBox1.ColumnCount = 2
> End Sub

> espero que te sirva
>
> zz [MX]
> cuasi-musico,semi-poeta y loco

> "javivi" wrote in message
>news:
> Buenos días,

> Existe programada entre las funciones deVBAdeexceluna función de
> búsqueda que haga de forma más eficiente lo programado por mi en la
> siguiente función a partir de dos funciones deexcel.

> Busca el elemento fila y columna (strings) de un rango que yo defina,
> pero se ralentiza mucho el cálculo (necesita mucha memoria si tiene
> que hacer la búsqueda muchas veces).

> Javivi

> Public Function B(hoja As Range, ElementoFila As Variant, ElementoCol
> As Variant) As Variant

> Dim nfila As Integer
> Dim ncol As Integer
> 'Dim BPrevio As Double

> nfila = Application.WorksheetFunction.Match(ElementoFila,
> hoja.Columns("A:A"), 0)
> ncol = Application.WorksheetFunction.Match(ElementoCol,
> hoja.Rows("1:1"), 0)

> B = Application.WorksheetFunction.Index(hoja, nfila, ncol, 1)
> If (Application.WorksheetFunction.IsNumber(B) = False Or
> Application.WorksheetFunction.IsError(B) = True) Then
> B = ""
> Else
> B = Application.WorksheetFunction.Index(hoja, nfila, ncol, 1)
> End If

> End Function- Ocultar texto de la cita -

- Mostrar texto de la cita -



ZZ:

Buscando entre los grupos encontré esta solución a mi problema. Pero,
y si quiero limitar el rango de búsqueda a una sección de la hoja,
¿que valor cambio?

Richie
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida