Buscar celdas no vacias en un rango y copiar datos en otra hoja

11/12/2006 - 13:27 por weller | Informe spam
Hola a todos,

Llevo semanas intentando encontrar solución a esta duda en otro foro,
pero todavía no he podido resolverla.

Tengo un archivo con 31 hojas (1 por cada día del mes). Mi intención
es encontrar la forma de que en la hoja 32 busque las celdas que
contengan datos del rango repartido en las primeras 31 hojas y haga una
lista en la hoja 32.

Me explico: en la primera celda de la hoja 32 copia el valor de la
primera celda no vacia del rango de las hojas 1-31, en la celda de
debajo copia el valor de la segunda celda no vacia que encuentre en el
mismo rango, así sucesivamente.

Un experto de otro foro me ha enviado una macro que lo hace, pero solo
he conseguido que lo haga con el rango de una sola hoja, no de las 31
hojas:

Sub copiar() 'Título de la macro
x = 8 ' Variable inicial correspondiete a la primer fila
For Each celda In Range("'1'!B5:B29") 'Rango que abarca las filas a
validar
If celda <> 0 Then 'Si la variable "celda" es diferente de cero
entonces
Cells(x, 1) = celda 'Copia los valores mayores a cero a la
columna 2
x = x + 1 ' Va copiando de 1 en 1 las celdas con valores
mayores a cero
End If 'Fin de la condición
Next 'Sigue para la siguiente celda el mismo proceso
End Sub

A ver si en este foro encuentro una solución.

Gracias de antemano.

saludos

David

Preguntas similare

Leer las respuestas

#6 Ivan
11/12/2006 - 22:22 | Informe spam
no se como lo hago pero soy un manazas

quita esto(eliminalo)-> > Worksheets("Hoja4").[a:a].Clear


y elimina tambien las comillas ('') y la flecha (->) que hay delante de
->

->> .Cells(x, 2) = celda.Offset(0,
1)


disculpa mis torpezas
un saludo
Respuesta Responder a este mensaje
#7 weller
13/12/2006 - 10:12 | Informe spam
Hola Ivan, mil gracias por las explicaciones, pero son mucho mecanismo
para mi.

A lo mejor es más sencillo de lo que he explicado:

En la macro original, la que te confirmé que funcionaba perfectamente:

Sub copiar3()
Dim hj As Worksheet, x As Long, celda As Range
x = 8
For Each hj In ThisWorkbook.Worksheets
If hj.Name <> "Hoja4" Then
With hj
For Each celda In .Range("b5:b29")
If celda <> 0 Then
Worksheets("Hoja4").Cells(x, 1) = celda
x = x + 1
End If
Next
End With
End If
Next
End Sub

X=8 Indica la celda en la que va a copiar el primer valor encontrado en
el rango marcado.
Esta celda es la octava de la columna A. ¿Como puedo hacer para que me
copie el valor en la octava celda de la columna B? Me refiero a que no
se como se indican coordenadas de este modo. Lo he intentado con
X=8;Y=2, pero no me ha funcionado.

Gracias de nuevo.
Respuesta Responder a este mensaje
#8 Ivan
13/12/2006 - 12:00 | Informe spam
hola David

por lo que he podido ver (en una hojeada, no he tenido tiempo de mas)
en tu archivo, tienes en cada hoja de las 31 y a paratir de ,a columna
b, 2 columnas para agente y una fila para cada 1/2 hora (visita) y
quieres reflejar en la hoja 32 todas las visitas por agente (sin poner
fecha) y el nº total de visitas mensuales de cada uno. ¿el orden de
los agentes en las hojas seria siempre el mismo?

la verdad es que no acabo de entender tus explicaciones, pero dejame un
pelin de tiempo y te contesto. Y si puedes explicar claramente y paso a
paso lo que buscas, incluso alguien mas te podria ayudar.

de todas formas me parece, si es lo que pienso, bastante sencillo

dame un pelin de tiempo

un saludo
Ivan
Respuesta Responder a este mensaje
#9 Juan M
13/12/2006 - 15:29 | Informe spam
Hola a todos

En tanto regresa Ivan, te respondo para que en lugar de en la columna A te
escriba en la B debes cambiar el parametro siguiente
Codigo original
Worksheets("Hoja4").Cells(x, 1) = celda
Codigo modificado
Worksheets("Hoja4").Cells(x, 2) = celda

La notacion de cells es Cells(fila, columna). Asi que ya sabes como puedes
modificarlo para escribirlo donde quieras.

Segun el comentario anterior si lo que quieres es revisar desde el rango
C5:C29 lo que debes modificar es:
Codigo original
For Each celda In .Range("b5:b29")
Codigo modificado
For Each celda In .Range("C5:C29")

Y por ultimo mi aporte.
Prueba el codigo siguiente. Necesitara tus toques personales, mas o menos ya
sabes donde modificar el rango que debe comprobar para seleccionar y el
nombre de la hoja, tambien debes cambiar el destino donde lo pega.

Comentas si es valido?

Un saludo
Juan

Toda la conversacion
http://tinyurl.com/sg3jm

Inicio Codigo

Sub test2()
Dim hoja As Worksheet

Application.ScreenUpdating = False
'Activa la hoja donde se escriben los datos
Worksheets("Resumen").Activate
For Each hoja In ThisWorkbook.Worksheets
'Comprueba que el nombre de la hoja no sea donde
'se escriben los datos
If hoja.Name <> "Resumen" Then
With hoja
'Dentro del rango selecciona las celdas vacias y oculta la fila
.Range("B5:B29").SpecialCells(xlCellTypeBlanks).EntireRow.Hidden
= True
'Copia las celdas visibles
.Range("B5:B29").SpecialCells(xlCellTypeVisible).Copy _
Destination:=Range("A" & Rows.Count).End(xlUp).Offset(1)
'Deja el rango otra vez visible
.Range("B5:B29").EntireRow.Hidden = False
End With
End If
Next hoja

End Sub

Fin Codigo
Respuesta Responder a este mensaje
#10 Ivan
14/12/2006 - 03:54 | Informe spam
hola David (y Juan y resto de aforados)

te pongo una macro a ver si hace lo que creo que quieres.

pero 1º le explico un poco al grupo lo que veo en tu archivo y lo que
creo que quieres:

si no me equivoco, se trata de un libro con 32 hojas. En las 31 1ras
van, cada dos columnas a partir de la 'b', las visitas que realizan
cada agente de una empresa, de estas dos columnas en la 1ª va el
nombre de la visita, y en la 2ª una ref. de la visita, Pej->

columna B -> nombre de la visita ->-> columna C -> ref de la visita
de B
columna D -> nombre de la visita ->-> columna C -> ref de la visita
de E

el encabezado de cada 2 columnas (convinado) es el nombre del agente
correspondiente
y los datos comienzan en la fila 5

en la hoja 32 la estructura es similar pero los datos comienzan en la
columna A y fila 8 (en esta macro en la 9), y en los encabezados hay un
grupo de celdas convinadas en torno a la fila 5 de cada agente para
indicar el nº total de visitas mensuales por agente

si estoy en lo cierto se trata de reunir todas las visitas por agente,
asi como su nº total de visitas en la hoja 32

bueno, suponiendo que el orden de los agentes es el mismo para las 32
hojas prueba esta macro, un poco cargada y con mas formas de hacer lo
mismo y mejor, pero que para un volumen de datos no excesiv va bastante
bien (ojo-> solo vale hasta la columna z, si necesitas mas comentas).
Te he pueto algun comentario para intentar aclararte un poco como va

Sub copiar4()
Dim hj As Worksheet, x As Long, col As Byte, tt As Long
Dim celda As Range, ltCol As String, ltColTT As String
' este 1er bucle recorre todas las hojas del libro
For Each hj In ThisWorkbook.Worksheets
If hj.Name <> "TOTAL" Then
With hj
'este 2º bucle devuelve la letra de cada dos columnas
'mediante la funcion Chr (ojo, solo hasta la Z)
For col = 2 To .UsedRange.Columns.Count Step 2
ltCol = Chr(64 + col): ltColTT = Chr(64 + col - 1)
'este 3er bucle recorre cada dos columnas a partir
'de la 'b' de cada hoja y pega en las correspondientes
'columnas de la hoja Total las celdas con datos y en
'la inmediatamente posterior (si 'B' en 'C' , etc)
'la posterior correspondiente de la hoja de origen
For Each celda In .Range(ltCol & "5:" & ltCol & 29)
If celda <> 0 And celda <> "" Then
With Worksheets("TOTAL")
x = .Range(ltColTT & 65536).End(xlUp).Row + 1
If x < 9 Then x = 9
.Cells(x, col - 1) = celda
.Cells(x, col) = celda.Offset(0, 1)
End With
x = x + 1
End If
Next
'este bloque with te coloca en las celdas combinadas el
'nº de total registros(visitas) de cada agente
With Worksheets("TOTAL")
tt = .Range(ltColTT & 65536).End(xlUp).Row
If tt < 8 Then tt = 8
.Range(ltColTT & 5) = tt - 8
End With
Next
End With
End If
Next
End Sub

prueba y si quieres comentas

un saludo
ivan


explicarle un poco al grupo


weller ha escrito:

Hola Ivan, mil gracias por las explicaciones, pero son mucho mecanismo
para mi.

A lo mejor es más sencillo de lo que he explicado:

En la macro original, la que te confirmé que funcionaba perfectamente:

Sub copiar3()
Dim hj As Worksheet, x As Long, celda As Range
x = 8
For Each hj In ThisWorkbook.Worksheets
If hj.Name <> "Hoja4" Then
With hj
For Each celda In .Range("b5:b29")
If celda <> 0 Then
Worksheets("Hoja4").Cells(x, 1) = celda
x = x + 1
End If
Next
End With
End If
Next
End Sub

X=8 Indica la celda en la que va a copiar el primer valor encontrado en
el rango marcado.
Esta celda es la octava de la columna A. ¿Como puedo hacer para que me
copie el valor en la octava celda de la columna B? Me refiero a que no
se como se indican coordenadas de este modo. Lo he intentado con
X=8;Y=2, pero no me ha funcionado.

Gracias de nuevo.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida