Macro Excel remplir cellules automatiquement

chrismichel -  
michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je suis confronté à un soucis avec un tableau Excel qui comporte des milliers d'entrées, je cherche donc une solution automatique pour régler ce problème mais comme je suis totalement inculte en macro Excel je m'en remets au savoir de la communauté ;-)

Je voudrais remplir une cellule avec le contenu de la cellule la plus proche située au-dessus (dans la même colonne) et qui contient une donnée. Dis comme cela c'est un peu compliqué mais voici un exemple avant/après de ce que je voudrais :

TABLEAU AVANT :

Nom1
0 Poste1
0 Poste2
Nom2
0 Poste1
0 Poste2
0 Poste3
Nom3
0 Poste1

TABLEAU APRES :

Nom1
Nom1 Poste1
Nom1 Poste2
Nom2
Nom2 Poste1
Nom2 Poste2
Nom2 Poste3
Nom3
Nom3 Poste1

Donc voilà, les 0 sont remplacés par le Nom situé au-dessus (Nom1, Nom2, Nom3).

PS : Le nombre de ligne par Nom est variable.

D'avance merci pour votre aide.

4 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    des milliers de lignes, c'est combien? la macro sera complètement différente selon le nombre de milliers (rapidité d'exécution)!
    dans l'attente
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      tout compte fait qqsoit le nombre de lignes:

      Option Explicit  
      
      Const Col As Byte = 1 'colonne à traiter  
      Const Deplig As Byte = 1 'ligne départ  
      Const col_r As Byte = 3 'colonne de restitution  
      
      Sub donner_prefixe_poste()  
      Dim Derlig As Long, Nbre As Long, Lig As Long  
      Dim tablo  
      Dim cptr As Long, nom As String  
      
      Derlig = Cells(Cells.Rows.Count, 1).End(xlUp).Row  
      tablo = Application.Transpose(Range(Cells(Deplig, Col), Cells(Derlig, Col)))  
      
      For cptr = 1 To UBound(tablo)  
          If tablo(cptr) Like "Nom*" Then  
              nom = tablo(cptr)  
          Else  
              tablo(cptr) = nom & Replace(tablo(cptr), 0, "")  
          End If  
      Next  
      
      Application.ScreenUpdating = False  
      Range(Cells(Deplig, col_r), Cells(30000, col_r)).Clear  
      Cells(Deplig, col_r).Resize(UBound(tablo), 1) = Application.Transpose(tablo)  
      
      End Sub  
      

      tu adaptes les constantes col, deplig et col_r à la disposition de ton classeur (col_r peut être égal à col pour transformer la colonne initiale)

      Mais quelque chose me dit qu'on pourrait le faire par formule...
      0
    2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour,

      si en fait on a Toto à la place de nom1, Bidochon -nom2 etc
      remplacer:
      If tablo(cptr) Like "Nom*" Then  

      par
       If Not tablo(cptr) Like "0*" Then
      0
  2. m@rina Messages postés 27713 Date d'inscription   Statut Modérateur Dernière intervention   11 567
     
    Bonjour, (coucou michel ! ;))

    Plus simplement peut être :

    Supposant que la dernière ligne à compter en colonne B puisque par défaut la première colonne n'est pas complète.

    sub remplir() 
    Dim ligne, DL 
    Dim texte 
    DL = Range("B65536").End(xlUp).Row 'dernière ligne de la col B 
    
    For ligne = 1 To DL 
        If Cells(ligne, 1) <> "" Then 
            texte= Cells(ligne, 1) 
        Else 
            Cells(ligne, 1) = texte 
        End If 
     Next ligne 
    end sub


    Sur 3000 lignes, ça prendra 1 seconde.

    m@rina

    - "Sur le forum bureautique, on pose des questions concernant la bureautique..."
    - "Ah bon ???"
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      bonjour M@rina,

      je viens de tester sur 3000 lignes aussi: 0,047 seconde...(ram: 512)

      mais il me semble que dans le résultat, il faut le nomN puis le nomN en cours et le numéro de poste tant qu'on a zéro avant posteX ?
      peut ^tre sur 2 colonnes d'ailleurs! moi j'ai tout regroupé dand la m^ colonne

      cordialement
      0
    2. m@rina Messages postés 27713 Date d'inscription   Statut Modérateur Dernière intervention   11 567
       
      J'ai peut être lu la question "un peu" en diagonale ??
      C'est l'une de mes spécificité !! ;))

      Merci pour ta réponse ! ;)
      m@rina
      0
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour tou(te)s
    Beh moi je trouve qu'avant de se décarcassés vaudrait mieux avoir des explications un peu (beaucoups) plus "explicite".
    Et remplace tes 0 par des noms ce serras plus simple, parce que des zéro partout j'y comprend rien.
    A+
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour à tous,
      En fait, la demande originale date de juin 2009 et restée sans réponse jusqu'à ce que Li relance ce jeudi avant d'aller au dodo et apparemment elle ne s'est pas réveillée depuis ...
      Enfin, ca nous aura permis de jouer au petit train électrique vba!
      0