Microsoft 365 Offset.resize

eric72

XLDnaute Accro
Bonjour à tous,
Me revoilou avec un nouveau petit probleme, en effet j'aimerai (fichier ci-joint), lorsque une cellule de la colonne "C" est <>"", effacer les valeurs de colonne "E" à colonne "AO", puis fusionner de colonne "E" à "I", et cela pour chaque ligne, à l'origine j'ai 130 lignes
J'ai bien essayé avec un Offset.resize mais sans résultat.
Auriez-vous une petite idée?
Merci beaucoup pour votre aide et bonne journée.
Eric
 

Pièces jointes

  • TEST.xlsm
    25.1 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
Bonjour @eric72
après 4ans au près de nous tes questions sont toujours aussi claires 🤣 🤣 🤣

1°tu veux effacer tout les lignes a partir de la ligne 8 si la ligne (8,"c") est vides

2°tu veux effacer les lignes a partir de la ligne 8 si chaque ligne en colonne "c" est vide

par ce que c'est pas la même chose
 

eric72

XLDnaute Accro
Bonjour Patrick,
Je m'explique j'aimerais pour les lignes de 8 à 14, a chaque fois que la colonne "C" est non vide, effacer les valeurs de la colonne "E" à "AO", dans mon exemple j'arrive à le faire pour effacer la colonne "E" avec ce code:
VB:
Dim NomReprise As Integer


    Application.ScreenUpdating = False

Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
 For NomReprise = 1 To 7
  
            FusionnerNomReprise NomReprise
Next NomReprise

    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True


End Sub
Sub FusionnerNomReprise(NomReprise As Integer)
'
Dim OffsetLig As Long, OffsetCol As Long
    OffsetLig = 1 * (NomReprise - 1)
    OffsetCol = 3

    Application.ScreenUpdating = False
    If Devis.Cells(8 + OffsetLig, OffsetCol).Value <> "" Then
                Devis.Cells(8 + OffsetLig, 2 + OffsetCol).ClearContents
                
     End If
                
                
    
    Application.ScreenUpdating = True

End Sub
mais je voudrais l'étendre à la plage plutôt qu'à une cellule
J'espère avoir été plus clair.
Merci
 

patricktoulon

XLDnaute Barbatruc
re
perso encoder le range me prend la tête
il faut savoir que la propriété rows(et j'insiste sur le "s")n'est pas que pour la feuille mais aussi le range
voila comment j'aurais fait
VB:
Sub test()
    Dim i&
    Application.ScreenUpdating = False
    With Feuil1
        For i = 8 To .Range("A" & Rows.Count).End(xlUp).Row
            If .Range("C" & i) <> "" Then
                .Range("E:AO").Rows(i).Value = ""
                .Range("E:I").Rows(i).Merge
            End If
        End With
    Next i
End Sub
edit ; vu pour le merge
 
Dernière édition:

eric72

XLDnaute Accro
oui j'ai vu phil merci
mais je suis casiment certain qu'en premiere édition ca n'y était pas
mais je peux me tromper
cela dit je réitère mon invitation au regard de l'encodage du range
c'est bien plus propre et explicite
je rejoins @TooFatBoy aussi sur le point de la fusion (est elle vraiment utile )
je prends bonne note de
.Rows(i).Value
Merci de votre aide et bonne journée à tous
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :),

Un autre code sans indice numérique de boucle (pour illustrer différemment les propos de @patricktoulon que je salue ;)) :
VB:
Sub test()
Dim x
   For Each x In Feuil1.Range("a8:a" & Feuil1.Range("A" & Rows.Count).End(xlUp).Row).Rows
      If x.Range("c1") <> "" Then x.Range("e1:ao1") = "": x.Range("e1:ao1").Merge
   Next x
End Sub
 
Dernière édition:

eric72

XLDnaute Accro
Bonjour à tous :),

Un autre code sans indice numérique de boucle (pour illustrer différemment les propos de @patricktoulon que je salue ;)) :
VB:
Sub test()
Dim x
   For Each x In Feuil1.Range("a8:a" & Feuil1.Range("A" & Rows.Count).End(xlUp).Row).EntireRow.Rows
      If x.Range("c1") <> "" Then x.Range("e1:ao1") = "": x.Range("e1:ao1").Merge
   Next x
End Sub
Bonjour mapomme,
Merci pour cette variante
Bonne journée
 

patricktoulon

XLDnaute Barbatruc
Bonjour à tous :),

Un autre code sans indice numérique de boucle (pour illustrer différemment les propos de @patricktoulon que je salue ;)) :
VB:
Sub test()
Dim x
   For Each x In Feuil1.Range("a8:a" & Feuil1.Range("A" & Rows.Count).End(xlUp).Row).EntireRow.Rows
      If x.Range("c1") <> "" Then x.Range("e1:ao1") = "": x.Range("e1:ao1").Merge
   Next x
End Sub
Bonjour @mapomme
métode non universelle si la plage ne commence pas en A
il faudrait peu être préciser que tu utilise un adressage relatif
tout le mone de connait pas ;)
conclusion même si c'est une jolie demo je la déconseille aux nons avertis
 

mapomme

XLDnaute Barbatruc
Supporter XLD
méthode non universelle si la plage ne commence pas en A
On utilise alors EntireRow et la plage x commencera toujours en A.

Le petit avantage, c'est que les colonnes ont les mêmes lettres que ce qu'on voit sur la feuille Excel. Pas besoin de Offset et de comptage de déplacement. On "lit" directement les références des colonnes sur la feuille.
Mais je reconnais que pour les non avertis c'est un peu déroutant. C'était pour le fun.

VB:
Sub test()
Dim x
   For Each x In Feuil1.Range("a8:a" & Feuil1.Range("A" & Rows.Count).End(xlUp).Row).EntireRow.Rows
      If x.Range("c1") <> "" Then x.Range("e1:ao1") = "": x.Range("e1:ao1").Merge
   Next x
End Sub
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
313 317
Messages
2 097 119
Membres
106 845
dernier inscrit
astra25