2012-12-31 3 views
-1

Je me demande si quelqu'un pourrait m'aider s'il vous plaît. Pour que je puisse maintenir une «plage d'entrée» donnée, j'essaye de mettre en place un script qui supprime le contenu des cellules de la ou des lignes sélectionnées par l'utilisateur. Puis déplacez toutes les lignes avec des données en haut de ma feuille de calcul si la colonne "A" à partir de la ligne 7 est remplie.Shift lignes contenant des données vers le haut

J'ai rassemblé le code ci-dessous qui supprime le contenu de la cellule de la ligne, mais je ne parviens pas à déplacer le 'Shift Up' les lignes contenant des données pour s'asseoir les unes sous les autres, en omettant les lignes vides entre les données.

Sub DelRow() 
    Dim msg 

     Sheets("Input").Protect "password", UserInterFaceOnly:=True 
     Application.EnableCancelKey = xlDisabled 
     Application.EnableEvents = False 
     msg = MsgBox("Are you sure you want to delete this row?", vbYesNo) 
     If msg = vbNo Then Exit Sub 
     With Selection 
      Application.Intersect(.Parent.Range("A:R"), .EntireRow).Interior.ColorIndex = xlNone 
      Application.Intersect(.Parent.Range("S:AD"), .EntireRow).Interior.ColorIndex = 37 
      Application.Intersect(.Parent.Range("AF:AQ"), .EntireRow).Interior.ColorIndex = 42 
      Selection.SpecialCells(xlCellTypeConstants).ClearContents 
     End With 
     Application.EnableEvents = True 

End Sub 

Je l'ai mis en place un « Trier » macro illustré ci-dessous, et bien que cela fonctionne avec deux lignes consécutives contenant des données, il ne fonctionne pas pour les lignes que j'ai utilisé mon « Supprimer » macro. Par exemple, si je remplis la première et la deuxième ligne de ma «plage d'entrée», le code trie correctement la feuille de calcul en utilisant la colonne «B» comme critère de tri. Mais si je supprime le contenu de la première ligne, créant ainsi une ligne vide, le script 'Sort' ne déplace pas la deuxième ligne.

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    Application.EnableCancelKey = xlDisabled 
    With Sheets("Input") 
     If .Range("A7").Value = "" Then Exit Sub 
     .Range("B7:AS400").Sort Key1:=Range("$B$1"), _ 
     Order1:=xlAscending, _ 
     Header:=xlGuess, _ 
     OrderCustom:=1, _ 
     MatchCase:=False, _ 
     Orientation:=xlTopToBottom, _ 
     DatOption1:=xlSortNormal 
    End With 
End Sub 

Je me demandais simplement si quelqu'un pourrait peut-être jeter un oeil à cette s'il vous plaît et donner des indications sur la façon dont je dois adapter mon code afin que je puisse ajouter la fonctionnalité de tri.

Un grand merci et salutations

+0

Après avoir répondu à votre question, puis relire votre question ... vous en train d'essayer de supprimer la ligne entière, ou seulement une partie? –

+0

Bonjour @Daniel Cook, merci d'avoir pris le temps de répondre à mon message. Je ne supprime pas les lignes parce que j'ai besoin de la 'plage d'entrée' pour rester non cochée, donc je supprime le contenu de la cellule à la place. Beaucoup de mercis et de bonnes salutations – IRHM

Répondre

0

Après plus de recherche sur Internet, je trouve l'article suivant: http://www.access-programmers.co.uk/forums/showthread.php?t=178521

Avec cela, je l'ai modifié mon « Supprimer la ligne » code à la ce qui fonctionne parfaitement:

Sub DelRow() 
    Dim msg 

     Sheets("Input").Protect "handsoff", UserInterFaceOnly:=True 
     Application.EnableCancelKey = xlDisabled 
     Application.EnableEvents = False 
     msg = MsgBox("Are you sure you want to delete this row?", vbYesNo) 
     If msg = vbNo Then Exit Sub 
     With Selection 
      Application.Intersect(.Parent.Range("A:R"), .EntireRow).Interior.ColorIndex = xlNone 
      Application.Intersect(.Parent.Range("S:AD"), .EntireRow).Interior.ColorIndex = 37 
      Application.Intersect(.Parent.Range("AF:AQ"), .EntireRow).Interior.ColorIndex = 42 
      Selection.SpecialCells(xlCellTypeConstants).ClearContents 
     End With 
     Application.EnableEvents = True 
      With Range("A7:AS400" & Cells(Rows.Count, "A").End(xlUp).Row) 
      .Sort Key1:=Range("B7"), _ 
      Order1:=xlAscending, _ 
      Header:=xlNo, _ 
      OrderCustom:=1, _ 
      MatchCase:=False, _ 
      Orientation:=xlTopToBottom, _ 
      DataOption1:=xlSortNormal 
End With 

End Sub 

Merci beaucoup à tous ceux qui ont eu la gentillesse d'offrir de l'aide.

Un grand merci et une très bonne année.

Amitiés

0

Pour supprimer la ligne en fonction de votre code, votre meilleure option est la suivante:

Selection.Delete Shift:=xlUp

Si vous voulez vous assurer que la ligne entière est supprimée, vous veulent ceci:

Selection.EntireRow.Delete Shift:=xlUp

En ce qui concerne le tri plus tard, si cela est néces Sary vous devriez regarder dans Range.Sort


Edit: Si vous voulez enlever une partie de la ligne, mais être précis, vous pouvez faire quelque chose comme ceci:

Range(Cells(Selection.Row,5),Cells(Selection.Row,8)).Delete Shift:=xlUp Ce appliquerions les supprimer des colonnes E-H.

+0

Salut @ Daniel Cook, selon ma réponse de votre commentaire original. Je ne veux pas supprimer la ligne parce que je dois maintenir une «plage d'entrée» fixe. À moins qu'il y ait une autre façon de le faire, ce que je suis plus qu'heureux d'être montré, le seul que je savais pour y parvenir était d'effacer le contenu de la cellule. Mais je voudrais alors, si possible, s'il vous plaît pour toutes les lignes qui contiennent des données à déplacer vers le haut afin qu'il n'y ait pas de lignes vides entre celles qui conatinent des données. Merci beaucoup et meilleures salutations. – IRHM

+0

Bonjour @Daniel Cook, merci beaucoup d'être venu me voir à ce sujet. J'ai mis en place un script 'Sort' que j'ai inclus dans mon post original. Si j'ajoute deux lignes consécutives contenant des données, le tri fonctionne correctement en utilisant la colonne "B" comme critère de tri. Toutefois, si j'utilise ma macro 'Supprimer' comme indiqué initialement, le contenu de la cellule est correctement supprimé, créant ainsi une ligne vide, mais la fonction de tri ne déplace pas la deuxième ligne, supprimant ainsi la ligne vide. J'espère que ça aide. Merci beaucoup et bonnes salutations – IRHM

+0

Salut @ Daniel Cook, s'il vous plaît voir la réponse que j'ai posté. Cordialement – IRHM

0

Essayez de remplacer l'en-tête par xlNo au lieu de xlGuess. Excel peut "penser" que vous avez une ligne d'en-tête qu'il n'inclura pas dans les lignes à trier, ainsi votre rangée supérieure vide restera là.

C'est, le changement Header:=xlGuess-Header:=xlNo

+0

Salut @Lord Peter, merci d'avoir pris le temps de répondre à mon message. S'il vous plaît voir l'ansewer que j'ai posté. Sincères amitiés – IRHM

Questions connexes