2017-03-08 3 views
0

Je suis un peu difficile avec VBA pour Excel. J'ai une table avec des produits, où les produits peuvent avoir plusieurs catégories. Les catégories associées à un produit peuvent comporter des sous-catégories, situées dans les colonnes adjacentes. Si un produit comporte plusieurs catégories, ces catégories sont situées une seule ligne sous le produit. Voir pic1.Déplacer les cellules en fonction de la valeur

enter image description here

Ce que je veux atteindre: Chaque fois que j'exécute le script, les catégories actuelles qui sont sur la ligne de l'information produit doivent être remplacées par les catégories ci-dessous, jusqu'à ce que vous atteigniez le prochain produit. S'il n'y a pas de nouvelle catégorie à remplacer, la ligne de produit peut être supprimée. (Dans cet exemple, j'ai besoin d'exécuter le script 3 fois). Donc, je finira par se retrouver avec ceci:

Exécuter le script première fois: enter image description here

script Run deuxième fois: enter image description here

script Run 3ème fois: enter image description here

Le code I » Je suis si loin est:

Sub MoveEmpty() 

Dim i as Long, j as Long 

Application.ScreenUpdating = False 
j = Range("A" & Rows.Count).End(xlUp).Row 
For i = j to 3 Step -1 
    If Range("A" & i) <> "" Then 
     Range("C" & i -1) = Range("C" & i).Resize(,3) 
     Range("A" & i).EntireRow.Delete 
    End If 
Next i 


End Sub 

Hope this sens, et merci pour aider,

Bart

+0

sous catégorie n'a pas d'importance? – Ibo

+0

C'est le cas. Ainsi, dans le premier exemple, la ligne C3: C5 doit remplacer B3: B5, E3: E5 doit remplacer D3: D5 etc. Lorsqu'il n'y a pas de ligne en dessous du produit contenant les catégories, la ligne de produit peut être supprimée. – CMBart

+0

donc si les sous-catégories sont différentes, elles ne doivent pas se chevaucher? Je crois comprendre que vous voulez faire une liste unique basée sur le produit, la catégorie et la sous-catégorie, n'est-ce pas? cellules vides dans une colonne représentent la première valeur au-dessus d'eux dans la même colonne? – Ibo

Répondre

2

Vous étiez sur la bonne voie, cela devrait faire ce que vous voulez:

Sub MoveEmpty() 

Dim i As Long, j As Long 
Dim ws As Worksheet 

Application.ScreenUpdating = False 

' Set this appropriately 
Set ws = ThisWorkbook.Worksheets("MyWorksheet") 

j = ws.Range("A" & Rows.Count).End(xlUp).Row 
For i = j To 3 Step -1 
    If ws.Range("A" & i) <> "" Then 
     ' Copy the product name to be next to the 2nd category set down, if there is a category 
     If ws.Range("A" & (i + 1)) = "" And ws.Range("C" & (i + 1)) <> "" Then 
      ' If you just want the values (i.e. no formatting copied) 
      ws.Range("A" & (i + 1)).Resize(, 2).Value = ws.Range("A" & i).Resize(, 2).Value 
      ' If you want everything, including formats 
      Call ws.Range("A" & i).Resize(, 2).Copy(ws.Range("A" & (i + 1)).Resize(, 2)) 
     End If 

     ws.Range("A" & i).EntireRow.Delete 
    End If 
Next i 
' Reset the screen to updating 
Application.ScreenUpdating = True 

End Sub 
+0

Cela a fonctionné comme un charme! Merci beaucoup! – CMBart

+0

Pas de problème. N'hésitez pas à l'accepter si vous pensez qu'il a répondu à votre question :) – SteveES