Selección de celdas no vacías en VBA

Resuelto
2000Kennedy Mensajes publicados 44 Estado Miembro -  
2000Kennedy Mensajes publicados 44 Estado Miembro -
Hola,

Hace una semana que empecé a trabajar con VBA, mi nivel no es muy alto, y tengo algunas dificultades... He perdido mucho tiempo buscando una solución, como no la he encontrado, aquí estoy :x.

Tengo un cierto número de celdas llenas en la columna A, simplemente me gustaría seleccionar las celdas no vacías y pegarlas en otra hoja de Excel.

Sabiendo que tengo un número variable de hojas de Excel con una columna A que me gustaría importar en una hoja única.

Esto es lo que he hecho. Por supuesto mi función no funciona como quiero, selecciona las celdas una por una sin pegarlas.

Sub test(Nb_Onglet)

For i = 1 To Nb_Onglet
Sheets(i).Activate
Range("A4").Select
Do While Not (IsEmpty(ActiveCell))
NbLigne = NbLigne + 1
Selection.Offset(1, 0).Select
Loop
Application.CutCopyMode = False
Selection.Copy
Sheets("GCE_Globale_cible").Select
Range("B4").Select
ActiveSheet.Paste
Next i

Comment effectuer cette application correctement afin que chaque donnée des colonnes de chaque feuille se colle à une colonne unique d'un portefeuille unique sans écraser les données précédentes?. :x

Merci :)

Configuration: Windows XP / Internet Explorer 6.0

4 respuestas

pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 772
 
Hola,
No te falta mucho... La sintaxis para decir: "primera celda vacía de la columna".
La última celda llena de la columna A:
Dim DerniereLigne As Integer DerniereLigne = Range("A65536").End(xlUp).Row

Entonces :
1- Tu rango a copiar (en cada hoja) es :
Dim DerniereLigne As Integer DerniereLigne = Range("A65536").End(xlUp).Row Range("A4:A" & DerniereLigne).Copy

2- La celda donde debes pegar tus datos es :
Sheets("GCE_Globale_cible").Range("B65536").End(xlUp).Offset(1, 0).Row

Sabiendo que hace falta :
- evitar las ".Select"
- hacer una prueba en el bucle para "esquivar" la hoja GCE_Globale_cible...
Tu código (annoté) se convierte entonces:

Sub test() 'Declaración de variables 'Aquí vamos a designar por Ws las diferentes hojas del libro Dim Ws As Worksheet Dim DerniereLigne As Integer 'Para todas las hojas en el libro activo For Each Ws In ThisWorkbook.Worksheets 'No hacemos nada si el nombre de la hoja es "GCE_Globale_cible" If Ws.Name = "GCE_Globale_cible" Then 'de lo contrario, si el nombre de la hoja es diferente de "GCE_Globale_cible" Else 'determina la última fila llena DerniereLigne = Ws.Range("A65536").End(xlUp).Row 'copiamos el rango de A4 a la última fila y lo pegamos 'en la primera celda vacía de la columna B de la hoja "GCE_Globale_cible" Ws.Range("A4:A" & DerniereLigne).Copy Sheets("GCE_Globale_cible").Range("B65536").End(xlUp).Offset(1, 0) End If 'Siguiente hoja por favor... Next Ws End Sub


Edit: código modificado tras respuesta de 2000kennedy
Cordialement,
-- Tout problème a sa solution. S'il n'y a pas de solution, ou quel est le problème? --
7
Polux31 Mensajes publicados 7219 Estado Miembro 1 204
 
Hola,

Prueba con esto:

Sub test(Nb_Onglet) Dim Derlig As Long Dim i As Long Dim j As Long Dim lig As Long lig = 4 For i = 1 To Nb_Onglet Derlig = Sheets(i).Range("A65536").End(xlUp).Row For j = 4 to Derlig If Sheets(i).Range("A" & j).Value <> "" Then Sheets("GCE_Globale_cible").Range("B" & lig).Value = Sheets(i).Range("A" & j).Value lig = lig + 1 End If Next j Next i End Sub


;o)
--
«Lo que concebimos bien se expresa claramente, y las palabras para decirlo llegan fácilmente.»
Nicolás Boileau
3
2000Kennedy Mensajes publicados 44 Estado Miembro 2
 
Gracias a los dos por vuestras respuestas ;)
ya funciona ahora.
Por otro lado Pijaku, me aparece un error 1004 en la línea

Range("A4:A" & DerniereLigne).Copy Sheets("GCE_Globale_cible").Range("B65536").End(xlUp).Offset(1, 0).Row

¿Hace falta declarar algo en mi función principal?
1
pijaku Mensajes publicados 13513 Fecha de registro   Estado Moderador Última intervención   2 772
 
Sí, ¡así es de no probar... Perdón... aquí está el código corregido: (en negrita las modificaciones...)
Sub test() 'Declaración de variables 'Aquí se designará por Ws las diferentes hojas del libro Dim Ws As Worksheet Dim DerniereLigne As Integer 'Para todas las hojas en el libro activo For Each Ws In ThisWorkbook.Worksheets 'No se hace nada si el nombre de la hoja es "GCE_Globale_cible" If Ws.Name = "GCE_Globale_cible" Then 'si no, si el nombre de la hoja es distinto de "GCE_Globale_cible" Else 'se determina la última fila llena DerniereLigne = Ws.Range("A65536").End(xlUp).Row 'se copia el rango de A4 a la última fila y se pega 'en la primera celda vacía col B de la hoja "GCE_Globale_cible" Ws.Range("A4:A" & DerniereLigne).Copy Sheets("GCE_Globale_cible").Range("B65536").End(xlUp).Offset(1, 0) 'aquí eliminé .Row error de imprudencia... End If 'Siguiente hoja por favor... Next Ws End Sub
0
2000Kennedy Mensajes publicados 44 Estado Miembro 2
 
Gracias. :)
Me permito molestarle un poco más :x
Imaginemos, lo que es el caso de mi nuevo problema...
lo que tengo:-----------------------------y lo que quiero obtener:

A -------------------------------------------------------A
A--------------------------------------------------------B
A -------------------------------------------------------C
A--------------------------------------------------------
B--------------------------------------------------------
B--------------------------------------------------------
B--------------------------------------------------------
B--------------------------------------------------------
C
C
C
En realidad, voilà... Pensé que lo que me explicó podría aplicarse a mi tabla de Excel. Aquí está mi problema completo:

Tengo una tabla en Excel, que tiene en la columna 2 información diferente: procedencia y fecha. En 2 filas, tengo la categoría del producto y el tipo de producto, es decir que cada categoría se divide en 3 tipos de productos. Me gustaría reunir en una sola fila toda esta información, cada columna correspondería a la procedencia, la fecha, la categoría del producto y el tipo de producto. El objetivo es facilitar la lectura al momento de transferir las informaciones a mi BD.

Por supuesto, hay valores relacionados con la tabla de origen y me gustaría poder recuperarlos en la tabla de llegada.

------------------------ Cat producto 1-----------------Cat producto 2
provenance-date---type1----type2-type3----------type1--type2-type3
francia---------ene------3--------1-----2 ----------------------2------1------3
francia---------feb------1--------5-----0 -----------------------8-----2------1
españa---------ene-----x---------x---- x-----------------------x-----x-------x
españa---------feb -----x---------x----x-----------------------x-----x------x

esa es la tabla de origen y me gustaría:

provenance---cat produit---type---ene--feb
francia--------Cat produit1-type1---3----1
francia--------Cat produit1-type2---1----5
francia--------Cat produit1-type3---2----0
francia--------Cat produit2-type1---2----8
etc------------etc----------etc

Me expreso tal vez mal :x Pero ¿existe una función VBA o una manipulación de Excel que me permita transformar la tabla 1 en la forma de la tabla 2 sabiendo que los datos están vinculados?
0