VBA Selection de cellules non vide.

Résolu/Fermé
2000Kennedy Messages postés 40 Date d'inscription mercredi 8 septembre 2010 Statut Membre Dernière intervention 16 novembre 2010 - 8 sept. 2010 à 12:35
2000Kennedy Messages postés 40 Date d'inscription mercredi 8 septembre 2010 Statut Membre Dernière intervention 16 novembre 2010 - 8 sept. 2010 à 15:03
Bonjour,

Cela fait une semaine que je commence à travailler avec du VBA, mon niveau n'est donc pas très élevé, et j'ai quelques difficultés...J'ai perdu beaucoup de temps à chercher une solution, n'en ayant pas trouvé, me voila :x.

J'ai un certain nombre de cellules remplies dans dans ma colonne A, je souhaiterais simplement sélectionner les cellules non vides et les coller dans une autre feuille excel.

Sachant que j'ai un nombre variable de feuilles Excel avec une colonne A que je souhaiterais importé dans une feuille unique.

Voilà ce que j'ai fais. Bien sur ma fonction ne marche pas comme je le veux elle sélectionne les cellules unes par une sans les collées.


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 pour que chaque donnée des colonnes de chaque feuille se colle à une colonne unique d'unefeuille unique sans écraser les données précédente?. :x

Merci :)








4 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
Modifié par pijaku le 8/09/2010 à 14:13
Bonjour,
Il te manque pas grand chose... La syntaxe pour dire : "première cellule vide de la colonne".
La dernière cellule remplie de la colonne A :
Dim DerniereLigne As Integer 
DerniereLigne = Range("A65536").End(xlUp).Row

Donc :
1- Ta plage à copier (sur chaque feuille) est :
Dim DerniereLigne As Integer 
DerniereLigne = Range("A65536").End(xlUp).Row 
Range("A4:A" & DerniereLigne).Copy

2- La cellule ou tu dois coller tes données est :
Sheets("GCE_Globale_cible").Range("B65536").End(xlUp).Offset(1, 0).Row

Sachant qu'il faut :
- éviter les ".Select"
- faire un test dans la boucle pour "esquiver" la feuille GCE_Globale_cible...
Ton code (annoté) devient donc :

Sub test() 
'Déclaration des variables 
'Ici on va désigner par Ws les différentes feuilles du classeur 
Dim Ws As Worksheet 
Dim DerniereLigne As Integer 
'Pour toutes les feuilles dans le classeur actif 
For Each Ws In ThisWorkbook.Worksheets 
'On ne fait rien si le nom de la feuille est "GCE_Globale_cible" 
    If Ws.Name = "GCE_Globale_cible" Then 
'sinon, si le nom de la feuille est différent de "GCE_Globale_cible" 
    Else 
'on détermine la dernière ligne remplie 
        DerniereLigne = Ws.Range("A65536").End(xlUp).Row 
'on copie la plage de A4 à la dernière ligne et on la colle 
'dans la première cellule vide col B de la feuille "GCE_Globale_cible" 
        Ws.Range("A4:A" & DerniereLigne).Copy Sheets("GCE_Globale_cible").Range("B65536").End(xlUp).Offset(1, 0) 
End If 
'Feuille suivante s'il vous plait... 
Next Ws 
End Sub


Edit : code modifié suite à réponse de 2000kennedy
Cordialement,
-- Tout problème à sa solution. S'il n'y a pas de solution, ou est le problème? --
7
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
8 sept. 2010 à 13:08
Bonjour,

Essaie avec ça :

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)
3
2000Kennedy Messages postés 40 Date d'inscription mercredi 8 septembre 2010 Statut Membre Dernière intervention 16 novembre 2010 2
8 sept. 2010 à 13:56
Merci à tous les deux pour vos réponses ;)
ça marche maintenant.
Par contre Pijaku j'ai une erreur 1004 qui s'affiche pour la ligne

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

Il faut que je déclare quelque chose dans ma fonction principale?
1
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 751
Modifié par pijaku le 8/09/2010 à 14:12
Eh oui!!! C'est cela de ne pas tester... Pardon... voici le code corrigé : (en gras les modifs...)
Sub test() 
'Déclaration des variables 
'Ici on va désigner par Ws les différentes feuilles du classeur 
Dim Ws As Worksheet 
Dim DerniereLigne As Integer 
'Pour toutes les feuilles dans le classeur actif 
For Each Ws In ThisWorkbook.Worksheets 
'On ne fait rien si le nom de la feuille est "GCE_Globale_cible" 
    If Ws.Name = "GCE_Globale_cible" Then 
'sinon, si le nom de la feuille est différent de "GCE_Globale_cible" 
    Else 
'on détermine la dernière ligne remplie 
        DerniereLigne = Ws.Range("A65536").End(xlUp).Row 
'on copie la plage de A4 à la dernière ligne et on la colle 
'dans la première cellule vide col B de la feuille "GCE_Globale_cible" 
        Ws.Range("A4:A" & DerniereLigne).Copy Sheets("GCE_Globale_cible").Range("B65536").End(xlUp).Offset(1, 0) 
'ici j'ai supprimé .Row erreur d'innatention...    
End If 
'Feuille suivante s'il vous plait... 
Next Ws 
End Sub
0
2000Kennedy Messages postés 40 Date d'inscription mercredi 8 septembre 2010 Statut Membre Dernière intervention 16 novembre 2010 2
Modifié par 2000Kennedy le 8/09/2010 à 15:05
Merci bien :)
Je me permet de vous embêter encore un peu :x
Imaginons, ce qui est le cas de mon nouveau soucis...
ce que j'ai:-----------------------------et ce que je souhaite obtenir:

A -------------------------------------------------------A
A--------------------------------------------------------B
A -------------------------------------------------------C
A--------------------------------------------------------
B--------------------------------------------------------
B--------------------------------------------------------
B--------------------------------------------------------
B--------------------------------------------------------
C
C
C
En fait voilà... Je pensais que ce que vous m'avez expliquer je pourrais l'appliquer à ma table excel. Voila mon problème complet:

J'ai un Tableau sous Excel, qui possède en colonne 2 informations différente, provenance et date. Sur 2 lignes, j'ai la catégorie du produit et le type de produit, c'est à dire que chaque catégorie est divisée en 3 types de produits. Je souhaiterais retrouver sur une ligne l'ensemble de ces informations, chaque colonne correspondrait à respectivement la provenance, la date, la catégorie du produit, le type de produit. Le but étant de faciliter la lecture au moment du basculement des informations dans ma BDD.

Bien sur des valeurs sont liées au tableau de départ et je souhaiterais les retrouver dans le tableau d'arrivée.

------------------------ Cat produit 1-----------------Cat produit 2
provenance-date---type1----type2-type3----------type1--type2-type3
france---------jan------3--------1-----2 ----------------------2------1------3
france---------fev------1--------5-----0 -----------------------8-----2------1
espagne------jan-----x---------x---- x-----------------------x-----x-------x
espagne------fev -----x---------x----x-----------------------x-----x------x

ça c'est le tableau de départ et je voudrais:

provenance---cat produit---type---jan--fev
france--------Cat produit1-type1---3----1
france--------Cat produit1-type2---1----5
france--------Cat produit1-type3---2----0
france--------Cat produit2-type1---2----8
etc------------etc----------etc

Je m'exprime peut-être mal :x Mais est ce qu'il existe une fonction vba ou une manip excel qui me permettrait de transformer le tableau 1 dans la forme du tableau 2 Sachant que les données sont liées?
0