Ejemplo 2 para extraer datos de una hoja y el detalle de otra

Como dijimos en la sección anterior, en este ejemplo vamos a leer un código de cliente desde el teclado, ubicamos quién hizo el pedido en la hoja Pedidos y sacamos toda la fila hacia la hoja Consulta que ya existe y tiene sus columnas con el ancho similar al Pedidos y copia todo los datos de dicho pedido.

A continuación, debe extraer todos los pedidos que tengan ese código y que constituyen la compra realizada por el cliente.

En el primer caso usamos While en Pedidos para ubicar el código y en el segundo, usamos dos While; con el primero, ubicamos el primer código que coincide en Detalle y dentro de ese While, usamos otro para extraer todos los registros que tengan el mismo código.

Nota:

Abra entonces el archivo Pedidos.xlsm haciendo clic aquí

Abrimos el archivo Pedidos.xlsx, nos vamos al Editor, insertamos un módulo (Módulo3) y allí ingresamos el siguiente procedimiento.


Sub Consulta()
' Activamos el libro Pedidos
Workbooks("Pedidos.xlsm").Activate
' Ingresamos a la hoja Consulta
Sheets("Consulta").Select
' Como el código es numérico, debemos pasar a Valor
xCod = Val(InputBox("Ingresa el código de cliente"))
' Ingresamos el código en A2
Range("A2") = xCod
' Vamos a la hoja Pedidos para saber cuántas columnas
' de datos tiene y usar un For para copiar y pegar
Sheets("Pedidos").Select
Range("A2").Select
nCol = Selection.End(xlToRight).Column
' Buscaremos el pedido de código=xCod
'
' Si lo encontramos, ponemos a xKey en 1
' y capturamos en nRow la fila donde fue igual
' para terminar, en caso contrario, pasamos
' a la siguiente fila (ActiveCell.OffSet(1,0)
' la seleccionamos para volver a preguntar
xKey = ""
While xKey = ""
If ActiveCell = xCod Then
xKey = 1
nRow = ActiveCell.Row
Else
ActiveCell.Offset(1, 0).Select
End If
Wend
'
' Volvemos a Consulta
Sheets("Consulta").Select
' Debemos a extraer datos de una hoja y pasar a otra
' Para no usar Hoja2.Celda = Hoja1.Celda
' Usaremos la sentencia With para accesar a Pedidos
' Usando .Objeto
With Sheets("Pedidos")
' Pasaremos toda la cavecera de Pedidos a Consulta
For j = 1 To nCol
Cells(1, j) = .Cells(1, j)
Next
' Pasaremos a Consulta los datos del pedido con códgo xCod
For j = 2 To nCol
Cells(2, j) = .Cells(nRow, j)
Next
End With
'
' Ahora vamos a extraer todos los pedidos
' de código xCod de la hoja detalle y la colocar|emos
' en la hoja Consulta a partir de la fila 11
' En la fila 10 estará la cabecera de Detalle
Sheets("Detalle").Select
Range("A1").Select
' De A1 extraemos el nombre de la columna Código de Detalle
' y lo insertaremos en A1 de Consulta de forma que,
' cuando formemos el rango de criterios, tengamos en Consulta:
' En A1 nombre de columna de código (CodName)
' Y en A2 esté el código que xCod ingresado hace rato
' Estando en A1, capturamos también el nro de columnas en nCol
CodName = Range("A1")
nCol = Selection.End(xlToRight).Column
Sheets("Consulta").Select
Range("A1") = CodName
' De esta forma, el nombre de la columna A de Consulta
' Coincidirá con el nombre ed la columna A en Detalle
' Esto es necesario si usáramos Filtro Avanzado para extraer
' En este caso vamos a programar la búsqueda y extracción
' Empezamos con With, como quien dice, estando en Detalle,
With Sheets("Detalle")
For i = 1 To nCol
Cells(10, i) = .Cells(1, i)
Next
End With
'
' Procedemos a buscar el registro en Detalle
' Esto lo hace el primer While
' Una vez encontrado, el segundo While
' Extrae todos los registros del mismo código
' ya que la tabla está ordenado por código
' Como lo extrae de Detalle a Consulta, usamos el With
' pero en este caso al revés del anterior
xKey = ""
k = 10
Sheets("Detalle").Select
While xKey = ""
If ActiveCell = xCod Then
xKey = 1
With Sheets("Consulta")
While ActiveCell = xCod
k = k + 1
For j = 1 To nCol
.Cells(k, j) = Cells(ActiveCell.Row, j)
Next
ActiveCell.Offset(1, 0).Select
Wend
End With
Else
ActiveCell.Offset(1, 0).Select
End If
Wend
' Recordar que cuando se termina de usar el With,
' se debe usar End With

End Sub



Nota:

El archivo Pedidos.xlsm ya tiene toda las soluciones. Para probar lo que ha digitado, o ha cambiado algo, lo debe escribir en el Pedidos.xlsx y grabarlo como Pedidos.xlsm o con otro nombre pero habilitado para macros.


La siguiente imagen muestra este procedimiento.


La siguiente imagen muestra este procedimiento.

Vaya a la siguiente sesión haciendo aquí