VBA Selection de cellules non vide.

Résolu
2000Kennedy Messages postés 44 Statut Membre -  
2000Kennedy Messages postés 44 Statut Membre -
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

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    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
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  3. 2000Kennedy Messages postés 44 Statut Membre 2
     
    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
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      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
  4. 2000Kennedy Messages postés 44 Statut Membre 2
     
    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