Macrobusqueda

La siguiente macro ya funciona pero no lo hace con la velocidad que yo esperaba por que hay una parte del proceso este
Range("G2:G1000").Select
Me imagino que es por la amplitud del rango que tarda mucho ya que tengo que terminar el proceso con la tecla esc y con esto me aparece un asistente con cuatro opciones, activo la opción continuar y ahora si termina la macro, si activo la opción depurar me aparece en amarillo lo siguiente
Range("G2:G1000").Select
existe alguna forma de hacer mas rapida la macro?
Sub buscarbital()
'
' buscarbital Macro
' Macro grabada el 27/08/2004 por Check Plus
'
'
ActiveCell.FormulaR1C1 = "Plaza"
Range("G2").Select
ThisWorkbook.Activate
ActiveCell.FormulaR1C1 = _
"=+VLOOKUP(RC[-1],'G:\[plazas.xls]Hoja2'!C1:C2,2,FALSE)"
Range("G2").Select
ThisWorkbook.ActiveSheet.Range("G2").Select
Selection.AutoFill Destination:=Range("G2:G1000")
Range("G2:G1000").Copy
Selection.Copy
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("G1").Select
End Sub

4 respuestas

Respuesta
1
Todavía no la probé pero a simple vista corregiría las siguientes instruccines:
Range("G2:G1000"). Copy
Selection. Copy '! Se repite
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
por estas otras:
Range("G2:G1000").select
selection.copy
'defini el destino
Range("H2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Con esto vas a resolverlo. Si no es así, me escribis nuevamente
Respuesta
1
Intenta esto
Vamos a reemplazar estas referencias por variables. Debes tener el libro Plazas.xls activado o abierto
Dim vr1
Dim vr2
For x = 2 To 1000 '' Recorre la Hoja Activa
If ActiveSheet.Cells(x, 1).Value <> "" Then
vr1 = ActiveSheet.Cells(x, 1).Value
For w = 1 To 10000 ''Recorre la hoja2 del libro plazas.xls
If Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 1).Value <> "" Then
vr2 = Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 1).Value
If vr1 = vr2 Then
ActiveSheet.Cells(x, 2).Value = Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 2).Value ''Trae el resultado a la hoja activa
W = 10000 ''Finaliza el ciclo de búsqueda cuando encuentra el valor correspondiente a la fila por de la hoja activa
End If
ElseIf Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 1).Value = "" Then
w = 10000
End If
Next w
ElseIf ActiveSheet.Cells(x, 1).Value = "" Then
x = 1000 ''Fin del ciclo
End If
Next x
Lo que pasa es que el resultado me aparece en la columna B y yo lo quiero en la columna G, la fórmula es la siguiente
BUSCARV(F2,[plazas.xls]Hoja2!$A:$B,2,0)
Lo que pasa es que en el editor cambia
A esto
"=+VLOOKUP(RC[-1],'G:\[plazas.xls]Hoja2'!C1:C2,2,FALSE)"
Hice lo siguiente pero me marco un error de compilación me dice que esperaba function o una variable
Me puedes hacer el favor de explicarme la macro ya que se muy poco de esto
Sub buscarbital2()
Dim vr1
Dim vr2
For x = 2 To 1000 '' Recorre la Hoja Activa
If ActiveSheet.Cells(x, 1).Value <> "" Then
vr1 = ActiveSheet.Cells(x, 1).Value
For w = 1 To 10000 ''Recorre la hoja2 del libro plazas.xls
If Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 1).Value <> "" Then
vr2 = Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 1).Value
If vr1 = vr2 Then
ActiveSheet.Cells(x, 2).Value = Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 2).Value ''Trae el resultado a la hoja activa
w = 10000 ''Finaliza el ciclo de busqueda cuando encuentra el valor correspondiente a la fila x de la hoja activa
End If
ElseIf Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 1).Value = "" Then
w = 10000
End If
Next w
ElseIf ActiveSheet.Cells(x, 1).Value = "" Then
x = 1000 ''Fin del ciclo
End If
Next x
End Sub
Revise el procedimiento y esta bien, recuerda que debes tener abierto el libro Plazas.xls
Esto funciona como un VlookUp normal pero sin utilizar tanta memoria ram del procesador.
Por y w son variables que rempresentan las filas
Esto es lo que me aparece en la ayuda cuando me marca el error
Se espera Function o una variable
La sintaxis de la instrucción indica una variable o una llamada a una función. Las causas y posibles soluciones de este error son las siguientes
El nombre no es el de una variable o Function conocida.
Verifique la ortografía del nombre. También, asegúrese de que cualquier variable o función con ese nombre sea visible en la porción del programa a la que esté haciendo referencia. Por ejemplo, si la función se define como Private o la variable no se define como Public, sólo será visible dentro de su propio módulo.
Está intentando asignar de manera inadecuada un valor a un nombre de procedimiento. Por ejemplo, si MiSub es un procedimiento Sub, el siguiente código genera este error:
MiSub = 237 ' Origina un error: Se espera una función, o bien error de variable
Aunque puede utilizar la sintaxis de asignación con un procedimiento Property Let o con una Function que devuelva un objeto o una Variant que contenga un objeto, no puede utilizar la sintaxis de asignación con un procedimiento Sub, Property Get, o Property Set.
Si desea más información, seleccione el tema en cuestión y presione F1 (en Windows) o Ayuda (en Macintosh).
¿Cuál es la linea que se pone amarilla?
esta For x
''Ok Debe ser que tienes un procesador un poco bajo de capacidad de memoria virtual. Prueba lo siguiente
Sub buscarbital2()
Dim x
Dim y
Dim vr1
Dim vr2
For x = 2 To 1000 '' Recorre la Hoja Activa
If ActiveSheet.Cells(x, 1).Value <> "" Then
vr1 = ActiveSheet.Cells(x, 1).Value
For w = 1 To 10000 ''Recorre la hoja2 del libro plazas.xls
If Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 1).Value <> "" Then
vr2 = Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 1).Value
If vr1 = vr2 Then
ActiveSheet.Cells(x, 2).Value = Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 2).Value ''Trae el resultado a la hoja activa
w = 10000 ''Finaliza el ciclo de busqueda cuando encuentra el valor correspondiente a la fila x de la hoja activa
End If
ElseIf Workbooks("plazas.xls").Sheets("hoja2").Cells(w, 1).Value = "" Then
w = 10000
End If
Next w
ElseIf ActiveSheet.Cells(x, 1).Value = "" Then
x = 1000 ''Fin del ciclo
End If
Next x
End Sub
Respuesta
1
Intenta cambiar esta sentencia:
ActiveCell.FormulaR1C1 = _
"=+VLOOKUP(RC[-1],'G:\[plazas.xls]Hoja2'!C1:C2,2,FALSE)"
Por esta otra:
ActiveCell.Value = _
"=VLOOKUP(G1,'G:\[plazas.xls]Hoja2'!C1:C2,2,FALSE)"
Igual ten en cuenta que son bastantes registros, lo que lo puede hacer demorado si no tienes un buen computador.
Intenta cambiar esa sentencia y miramos a ver qué sucede.
Respuesta
1
Creo que tu macro hace muchas cosas aparte de solo seleccionar el rango g2 al g100, también creo tienes un vinculo a otra hoja. En mi opinión debieras replanterte la forma en que esta hecha la planilla y lo vínculos que pudieran existir y así puede que tu macro ande más rapido.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas