Muy buenos días. Quisiera que me colaboraran optimizando un código, pues lo realice precariamente

Tengo una hoja con 18000 filas aproximadamente y dependiendo de un código extraigo ciertos valores que se encuentran en la misma fila del código encontrado. No tengo mucha experiencia pogramando en VBA, y por esto el código que desarrollé me parece algo lento y consume muchos recursos de mi maquina.  Lo que hago es recorrer uno a uno los registros de la columna A, buscando el código almacenado en la variable "nodo".

Acá dejo el código por si alguno de ustedes, amablemente puede colaborarme.

Sheets("trafos_municipio").SelectRange("A2").Select
While Not IsEmpty(ActiveCell) And bd = 0

ActiveCell.Offset(1, 0).Select

If ActiveCell.Value = nodo Then

GC = ActiveCell.Offset(0, 11).Value

ZONA = ActiveCell.Offset(0, 1).Value

MUNICIPIO = ActiveCell.Offset(0, 2).Value

DIRECCIÓN = ActiveCell.Offset(0, 3).Value

CIRCUITO = ActiveCell.Offset(0, 4).Value bd = 1

End If

If ActiveCell.Value = Empty And bd = 0 Then

MsgBox "EL NODO NO ESTA EN LA BASE DE DATOS DE TRAFOS POR MUNICIPIO", _ vbOKOnly, "MENSAJE"

GC = "N/E"

ZONA = "N/E"

MUNICIPIO = "N/E"

DIRECCIÓN = "N/E"

CIRCUITO = "N/E" 

End If

Label8.Visible = True

Label9.Visible = True

Label10.Visible = True

Label11.Visible = True

Label12.Visible = True

Label13.Visible = True

Label14.Visible = True

Label15.Visible = True

Label12.Caption = ZONA

Label13.Caption = MUNICIPIO

Label14.Caption = DIRECCIÓN

Label15.Caption = CIRCUITO

Wend

Agradeciendo su atención.

Leonardo Aguirre Gonzalez

1 respuesta

Respuesta
1

Si puedes enviar copia del archivo a [email protected] puedo revisarlo para intentar colaborarte.

He mirado tu archivo, pero no cuento con el archivo base de registros, sin embargo creo que lo que explico a continuación puede dar solución a tu situación.

En tu proceso, lo que se pretende es evitar el desplazamiento por cada una de las celdas ya que esto implica una comparación cada vez que se efectua un movimiento. Explico algunas cosas que te pueden dar mejores luces:

1. Existen varias formas de hacer referencia a una dirección en una hoja:

Activesheet. Activecell Requiere más recursos, ya que la hoja y la celda requerida debe estar activa y seleccionada

Activesheet. Range("A1") Requiere que la hoja este activa, pero la celda es invocada por medio de su dirección

Sheets("Hoja1"). Cells(1,1) Invoca la celda A1 de la Hoja1 cells(*indice de fila*, *indice de columna*) PARA MÍ ES EL MÁS EFECTIVO, YA QUE EVITA EL HECHO DE ACTIVAR LA PAGINA O LA CELDA

2. Con el uso de las funciones COINCIDIR y CONTAR. SI se puede determinar la ubicación precisa del registro que nos interesa.

Te dejo el código que busca en el rango A:A de la Hoja1, el número de la celda D5 y trae a la celda E5 la letra de la columna B (te enviare un mensaje con el archivo como adjunto). Analizando esto y modificándolo a tus necesidades deberias logras tu éxito, si tienes dificultades, puedes consultar la ayuda de Excel o volver a preguntar. Saludos

(Trabajo desde Excel 2010)

No olvides finalizar y puntuar tu pregunta

Sub BuscarenLista()
''Creada por FSerrano para leocaluca en TodoExpertos.com
''Busca un valor en un rango y trae los datos que le correspondan
'Limpia la celda en la que se va a 'importar' la información
Sheets("Hoja1").Range("d5").Offset(0, 1).ClearContents 
'Direccion de la celda donde se insertará el valor (es una dirección fija)
Sheets("Hoja1").Range("d5").Activate
'Cuenta el número de coincidencias que existen en el listado para el valor especificado
'(si la cuenta es = 0 es porque el registro no existe)
If Application.WorksheetFunction.CountIf(Sheets("Hoja1").Range("A:A"), Sheets("Hoja1").Range(ActiveCell.Address).Value) > 0 Then
    'En caso de que el registro exista en el listado, importa los datos correspondientes 
 'determinando la fila respectiva mediante el uso de la función MATCH (Coincidir) 
    Sheets("Hoja1"). Range("D5").Offset(0, 1) = Sheets("Hoja1"). Cells(Application. WorksheetFunction. Match(Sheets("Hoja1"). Range("d5"). Value, Sheets("Hoja1").Range("A:A"), 0), 2).Value
Else
    'En caso de que el registro no exista en el listado, se muestra un mensaje
    A = MsgBox("El valor no se encuentra en la lista", vbOKOnly, "REGISTRO NO ENCONTRADO")
End If
End Sub

Hola Nefese, muchas gracias por tu respuesta.

He podido organizar mi código en los casos en los que el criterio de búsqueda es solo uno. Pero ahora tengo problemas al filtrar la búsqueda por un criterio adicional, es decir tengo un código X, que en mi caso seria la variable "nodo" ingresada en un TextBox, este nodo puede ser de tipo 1 o tipo 2 almacenada en otra celda,  mi pregunta puntual es: como hago para activar o identificar en que fila esta el registro que me cumpla ambas concisiones de búsqueda??? es decir nodo y tipo???. 

A la espera de tu colaboración.

Leocaluca

He estado pensando en tu caso y creo que una solución seria concatenar los valores de las dos (o N columnas que necesites) en una nueva columna. Es decir si en la columna A tienes los nodos y en la columna B tienes los tipos, en una columna nueva crearía la concatenación de las columnas A y B, luego mandas a buscar (por el método descrito anteriormente) la concatenación de los valores de los combobox en esa columna en la cual se hizo la combinación. De este modo se opera bajo el mismo principio con el ahorro de proceso que habíamos hablado.

Hola Nefese; he estado viajando y no he podido retomar la optimización del código, pero espero tener tiempo para realizarlo como me recomendaste. Muchas Gracias por tu tiempo y por compartir tus conocimientos.

Éxitos! y Gracias nuevamente.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas