Trie + cupp ligne VBA Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
F
Francky69100
Membre dévoué
Membre dévoué
Messages : 670
Inscrit le : 30 décembre 2009
Version d'Excel : 2013

Message par Francky69100 » 19 septembre 2014, 16:52

Bonjour,
je préfère refaire un post car le trie était résolu.
j'avais un autre code qui supprime les lignes ou en colonne B était inscrit "Chambre d'accueil".
je souhaite que les deux codes puisse s'enchainer mais j'ai un bug sur la ligne surligné :
Option Explicit
Dim Lg&, c As Range, Cel
Dim firstAddress$
Sub TrieSup()
'
' Trie Macro
'

[surligner]vfeuil = ActiveSheet.Name ' repère le nom de l'onglet[/surligner] 
Range("B6:AH80").Select
 ActiveWorkbook.Worksheets(vfeuil).Sort.SortFields.Clear
 ActiveWorkbook.Worksheets(vfeuil).Sort.SortFields.Add Key:=Range("B6:B80"), _
 SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
 With ActiveWorkbook.Worksheets(vfeuil).Sort
 .SetRange Range("B5:AH80")
 .Header = xlYes
 .MatchCase = False
 .Orientation = xlTopToBottom
 .SortMethod = xlPinYin
 .Apply
 End With
 Range("B6").Select
 

  Lg = Range("b" & Rows.Count).End(xlUp).Row
  Application.ScreenUpdating = False

'  For Each Cel In Range("f1:f" & [f65000].End(xlUp).Row) 'mots à rechercher
  For Each Cel In Array("Chambre d'accueil")    'mots à rechercher
    With Range("b1:b" & Lg)
      Set c = .Find(Cel, LookIn:=xlValues, lookat:=xlPart)
      If Not c Is Nothing Then
        firstAddress = c.Address
        Do
          Range(c.Address).ClearContents
          Set c = .FindNext(c)
          If c Is Nothing Then Exit Do
        Loop While Not c Is Nothing And c.Address <> firstAddress
      End If
    End With
  Next Cel
  On Error Resume Next  'si pas de vides
  Range("b1:b" & Lg).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

 
End Sub
merci d'avance,
Francky
v
vba-new
Membre impliqué
Membre impliqué
Messages : 2'946
Appréciations reçues : 2
Inscrit le : 13 mai 2009
Version d'Excel : 2010 FR - 2013 FR

Message par vba-new » 19 septembre 2014, 17:44

Bonjour Francky,

Le fait d'écrire Option Explicit en tête de module nécessite que tu déclares tes variables.

Or ici, vfeuil n'est pas déclaré...
vba-new
F
Francky69100
Membre dévoué
Membre dévoué
Messages : 670
Inscrit le : 30 décembre 2009
Version d'Excel : 2013

Message par Francky69100 » 19 septembre 2014, 17:47

bon en fait je vais présenter les choses autrement.
je vous met les deux code qui marche et je voudrais en faire qu'un, en sachant que le "trie" se fait avant le "supp"

voici pour le tri :
Option Explicit
Dim Lg&, c As Range, Cel
Dim firstAddress$

Sub Sup()

  Lg = Range("b" & Rows.Count).End(xlUp).Row
  Application.ScreenUpdating = False

'  For Each Cel In Range("f1:f" & [f65000].End(xlUp).Row) 'mots à rechercher
  For Each Cel In Array("Chambre d'accueil")    'mots à rechercher
    With Range("b1:b" & Lg)
      Set c = .Find(Cel, LookIn:=xlValues, lookat:=xlPart)
      If Not c Is Nothing Then
        firstAddress = c.Address
        Do
          Range(c.Address).ClearContents
          Set c = .FindNext(c)
          If c Is Nothing Then Exit Do
        Loop While Not c Is Nothing And c.Address <> firstAddress
      End If
    End With
  Next Cel
  On Error Resume Next  'si pas de vides
  Range("b1:b" & Lg).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
 
End Sub
et voici pour la suppression de ligne :
Sub Trie()
'
' Trie Macro
'

vfeuil = ActiveSheet.Name ' repère le nom de l'onglet
 Range("B6:AH80").Select
 ActiveWorkbook.Worksheets(vfeuil).Sort.SortFields.Clear
 ActiveWorkbook.Worksheets(vfeuil).Sort.SortFields.Add Key:=Range("B6:B80"), _
 SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
 With ActiveWorkbook.Worksheets(vfeuil).Sort
 .SetRange Range("B5:AH80")
 .Header = xlYes
 .MatchCase = False
 .Orientation = xlTopToBottom
 .SortMethod = xlPinYin
 .Apply
 End With
 Range("B6").Select
  
End Sub
merci d'avance
Francky

bonjour vba news,
en effet, quand j'enlève la fonction explicite ça plante plus mais il m'a fait des choses bizarre, donc il vaut mieux déclarer Vfeuil, mais qu'elle est la ligne à rajouter ?
Francky

oups, désolé, vous aurez compris que j'ai inversé les codes :lol:
v
vba-new
Membre impliqué
Membre impliqué
Messages : 2'946
Appréciations reçues : 2
Inscrit le : 13 mai 2009
Version d'Excel : 2010 FR - 2013 FR

Message par vba-new » 19 septembre 2014, 18:09

Francky69100 a écrit :en effet, quand j'enlève la fonction explicite ça plante plus mais il m'a fait des choses bizarre, donc il vaut mieux déclarer Vfeuil, mais qu'elle est la ligne à rajouter ?
Francky
Déclare-le en String. Francky, je ne connais pas ton niveau de vba mais dans un programme, il est primordial de savoir comment déclarer les variables.
vba-new
F
Francky69100
Membre dévoué
Membre dévoué
Messages : 670
Inscrit le : 30 décembre 2009
Version d'Excel : 2013

Message par Francky69100 » 20 septembre 2014, 08:44

Merci de ta réponse vba news,
malheureusement je n'ai pas dû faire les choses comme il faut :
Option Explicit
Dim Lg&, c As Range, Cel
Dim firstAddress$
Dim maVariable As String



Sub TriSup()

maVariable = ("vfeuil")

vfeuil = ActiveSheet.Name ' repère le nom de l'onglet
 Range("B6:AH80").Select
 ActiveWorkbook.Worksheets(vfeuil).Sort.SortFields.Clear
 ActiveWorkbook.Worksheets(vfeuil).Sort.SortFields.Add Key:=Range("B6:B80"), _
 SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
 With ActiveWorkbook.Worksheets(vfeuil).Sort
 .SetRange Range("B5:AH80")
 .Header = xlYes
 .MatchCase = False
 .Orientation = xlTopToBottom
 .SortMethod = xlPinYin
 .Apply
 End With

  Lg = Range("b" & Rows.Count).End(xlUp).Row
  Application.ScreenUpdating = False

'  For Each Cel In Range("f1:f" & [f65000].End(xlUp).Row) 'mots à rechercher
  For Each Cel In Array("Chambre d'accueil")    'mots à rechercher
    With Range("b1:b" & Lg)
      Set c = .Find(Cel, LookIn:=xlValues, lookat:=xlPart)
      If Not c Is Nothing Then
        firstAddress = c.Address
        Do
          Range(c.Address).ClearContents
          Set c = .FindNext(c)
          If c Is Nothing Then Exit Do
        Loop While Not c Is Nothing And c.Address <> firstAddress
      End If
    End With
  Next Cel
  On Error Resume Next  'si pas de vides
  Range("b1:b" & Lg).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
 
End Sub
cordialement,
Francky
v
vba-new
Membre impliqué
Membre impliqué
Messages : 2'946
Appréciations reçues : 2
Inscrit le : 13 mai 2009
Version d'Excel : 2010 FR - 2013 FR

Message par vba-new » 20 septembre 2014, 12:28

Re,

Non c'est la variable vfeuil que tu dois déclarer :
Dim vfeuil As String
De plus, si ces variables ne sont utilisées que par ta macro, il faut les déclarer dans la macro et non pas en dehors :
Option Explicit

Sub TriSup()
Dim Lg&, c As Range, Cel
Dim firstAddress$
Dim vfeuil As String

vfeuil = ActiveSheet.Name ' repère le nom de l'onglet
.
.
.
.
Modifié en dernier par vba-new le 21 septembre 2014, 21:06, modifié 1 fois.
vba-new
F
Francky69100
Membre dévoué
Membre dévoué
Messages : 670
Inscrit le : 30 décembre 2009
Version d'Excel : 2013

Message par Francky69100 » 21 septembre 2014, 18:59

Bonjour vba-news,
merci beaucoup, et désolé si je n'avais pas tout compris pour la déclaration de la variable.
ça marche impeccable.
j'essaierai de mettre les déclarations dedans et en dehors pour voir si cela produit une différence.
bonne fin de dimanche,
Francky
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message