Microsoft 365 Obtenir le numéro de ligne de la prochaine cellule non vide dans une colonne

bioteau

XLDnaute Nouveau
Bonjour à tous,

Dans une feuille, je dois mettre en forme un tableau avec ligne et totaux. Les données du tableau proviennent d'un TCD d'une autre feuille, le remplissage est donc variable sauf la ligne 2 préremplie et donc fixe.
Je dois donc déterminer l'emplacement de certaines données dans ce tableau afin d'encadrer correctement celui-ci.
Pour vérifier la bonne valeur de mes variables j'ai fait apparaître des messages box tout au long de ma macro. Cela m'a permis de voir qu'elle variable était mal renseignée donc mal définie.
2 variables sont mal définies mais en fait correspondent à la même recherche savoir : DETERMINER LA PROCHAINE CELLULE NON VIDE DE LA COLONNE B
J'utilise :
Range("B2").End(xldown).Row
En fait, cela donne la dernière cellule non vide en partant du haut et non la prochaine cellule non vide en partant du haut.
J'ai essayé avec Find sans succès.
J'ai joint un fichier simplifié pour plus de commodité et vision sur la macro, j'ai enlevé la boucle puisque le problème est ciblé.

Normalement je devrais avoir les valeurs suivantes pour les variables:
DERLIGNE1 = 9 (ok)
LIGDEP = 3 --> j'ai actuellement 4
LIGDEP = 4 --> j'ai actuellement 6
BAS = 3 --> j'ai actuellement 5

Merci d'avance pour votre aide
 

Pièces jointes

  • TEST1.xlsm
    26.9 KB · Affichages: 15
Solution
Bonjour bioteau, le forum,
il faut que je fasse la somme du poids par client dans la colonne E.
Voyez ce fichier (2) et la macro complétée :
VB:
Sub Fusionner()
Dim a As Range, i&
With [B2].CurrentRegion
    .UnMerge 'défusionne
    If Application.CountBlank(.Columns(1)) Then
        For Each a In .Columns(1).SpecialCells(xlCellTypeBlanks).Areas
            With Union(a.Cells(0, 1), a)
                .Merge 'fusionne en colonne B
                Intersect(.EntireRow, [E:E]).Merge 'fusionne en colonne E
            End With
        Next
    End If
    '---somme et bordures---
    .Borders.LineStyle = xlNone 'RAZ
    For i = 1 To .Rows.Count
        If .Cells(i, 1) <> "" Then
            With Intersect(.Cells(i...

soan

XLDnaute Barbatruc
Inactif
@bioteau, le fil,

Merci beaucoup Soan et bravo pour la mise en forme, c'est très agréable et rend la lecture ludique. Cela donne envie de lire le prochain épisode 😉.

merci pour ton retour ! 😊



il faut que je fasse la somme du poids par client dans la colonne E.

c'est fait dans le fichier joint. 🙂 bien sûr, y'a une colonne de plus !

➯ pour la 1ère partie du code VBA que j'ai déjà expliquée dans mon post #10,
j'ai modifié With Range("B3:D" & n) en With Range("B3:E" & n)

ouvre le nouveau fichier joint ci-dessous, et fais Ctrl e 😊

après exécution de la macro, tu auras ceci :

Image.jpg


tu peux voir que le poids total pour un client est en colonne E,
sur la 1ère ligne de chaque client.



voici le nouveau code VBA :

VB:
Option Explicit

Sub TEST()
  If ActiveSheet.Name <> "TEST" Then Exit Sub
  Dim n&: n = Cells(Rows.Count, 3).End(3).Row: If n = 2 Then Exit Sub
  Dim a&, b&, k&, i As Byte: a = n + 1: Application.ScreenUpdating = 0
  With Range("B3:E" & n)
    For i = 7 To 11
      If i <> 8 Then .Borders(i).LineStyle = 1
    Next i
  End With
  Do
    a = a - 1: b = a
    Do While IsEmpty(Cells(a, 2)): a = a - 1: Loop
    If a > 3 Then Cells(a, 2).Resize(, 4).Borders(8).LineStyle = 1
    If a = b Then
      Cells(a, 5) = Cells(a, 4)
    Else
      k = b - a + 1
      With Cells(a, 2).Resize(k)
        .VerticalAlignment = 2: .Merge
        Cells(a, 5) = Application.Sum(.Offset(, 2).Resize(k))
      End With
    End If
  Loop Until a = 3
End Sub



comme la solution de job75 te convient parfaitement, ce n'est plus la peine que j'explique la suite de mon code VBA, alors ? ou tu as quand même envie que je continue mes explications de code ?​

soan
 

Pièces jointes

  • TEST2.xlsm
    23 KB · Affichages: 2
Dernière édition:

job75

XLDnaute Barbatruc
Les fusions se font plus simplement avec ce fichier (3) :
VB:
            With Union(a.Cells(0, 1), a)
                .Merge 'fusionne en colonne B
                .Columns(4).Merge 'fusionne en colonne E
            End With
 

Pièces jointes

  • TEST(3 ).xlsm
    26.1 KB · Affichages: 1

soan

XLDnaute Barbatruc
Inactif
Bonsoir bioteau, le fil,

voici une 3ème version. 😊

en colonne E aussi, y'a des cellules fusionnées avec centrage vertical :

Image.jpg


mais si ça peut arriver qu'un client aie par exemple 50 produits, c'est mieux d'utiliser ma version précédente où le total des poids sera sur la 1ère ligne du client ; ainsi, on pourra voir ce total sans devoir faire défiler l'écran vers le bas ; d'ailleurs, pour la même raison, ce serait peut-être mieux de ne pas faire de fusion avec centrage pour les noms de clients ? le nom de client serait alors juste sous le trait haut de sa case, sur la 1ère ligne aussi ; donc sur la même ligne que le total poids, en 1ère ligne aussi. :)



code VBA correspondant à l'image ci-dessus :

VB:
Option Explicit

Sub TEST()
  If ActiveSheet.Name <> "TEST" Then Exit Sub
  Dim n&: n = Cells(Rows.Count, 3).End(3).Row: If n = 2 Then Exit Sub
  Dim a&, b&, k&, i As Byte: a = n + 1: Application.ScreenUpdating = 0
  With Range("B3:E" & n)
    For i = 7 To 11
      If i <> 8 Then .Borders(i).LineStyle = 1
    Next i
  End With
  Do
    a = a - 1: b = a
    Do While IsEmpty(Cells(a, 2)): a = a - 1: Loop
    If a > 3 Then Cells(a, 2).Resize(, 4).Borders(8).LineStyle = 1
    If a = b Then
      Cells(a, 5) = Cells(a, 4)
    Else
      k = b - a + 1
      With Cells(a, 2).Resize(k): .VerticalAlignment = 2: .Merge: End With
      With Cells(a, 5)
        .Value = Application.Sum(.Offset(, -1).Resize(k))
        With .Resize(k): .VerticalAlignment = 2: .Merge: End With
      End With
    End If
  Loop Until a = 3
End Sub

soan
 

Pièces jointes

  • TEST3.xlsm
    23.3 KB · Affichages: 4

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 847
dernier inscrit
Djigbenou