2017-08-16 2 views
0

Contexte:groupant cellules au cours d'une boucle ne répond pas comme prévu

J'ai une feuille nommée RM que je tire des données d'étape de à une feuille nommée Finance via une boucle (boucle est par feuilles ("RM")). Une fois que les données sont tirées vers l'avant, la feuille est censée regrouper des éléments dans deux sous-totaux:

1) Groupe des activités d'étape

2) Groupe du tout ce qui a été tiré sur pendant la boucle

Voici le code:

Dim i As Integer 
Dim LR As Long, FR As Long 
    FR = Sheets("Finance").Cells(Sheets("Finance").Rows.Count, 1).End(xlUp).Row 
    Sheets("Finance").Cells(FR + 1, 1).Value = "Raw Materials" 
    Sheets("Finance").Cells(FR + 1, 7).Value = Sheets("RM").Cells(12, 2).Value 
    For i = 16 To 358 Step 18 
     LR = Sheets("Finance").Cells(Sheets("Finance").Rows.Count, 1).End(xlUp).Row 
     If Sheets("RM").Cells(i, 4) > 0 And Sheets("RM").Cells(i, 2) = "Fixed" Then 
      'Milestone row 
      Sheets("Finance").Cells(LR + 1, 1).Value = Sheets("RM").Cells(i, 1).Value 
      Sheets("Finance").Cells(LR + 1, 7).Value = Sheets("RM").Cells(i, 4).Value 
      Sheets("Finance").Rows(LR + 1).Font.Bold = True 
      'Number 
      Sheets("Finance").Range(Sheets("Finance").Cells(LR + 2, 1), Sheets("Finance").Cells(LR + 9, 1)).Value = Sheets("RM").Cells(i, 1).Value 

      'Removed middle section, which pulls over data from different columns 

      'Group Milestone subactivities 
      If Sheets("Finance").Cells(LR, 1).Value = Sheets("Finance").Cells(LR - 2, 1).Value Then 
       Sheets("Finance").Range(Sheets("Finance").Cells(LR + 2, 1), Sheets("Finance").Cells(LR + 9, 1)).EntireRow.Group 
      Else 
      End If 
     Else 
     End If 
    Next i 
    Sheets("Finance").Rows(FR + 1).Font.Bold = True 
    If LR - FR > 1 Then 
     Sheets("Finance").Range(Sheets("Finance").Rows(FR + 2), Sheets("Finance").Rows(LR)).EntireRow.Group 
    Else 
    End If 

Problème:

Le regroupement des événements jalons ne se déroule pas correctement. Lorsque le code s'exécute, seuls certains des jalons obtiennent leur regroupement, bien que le regroupement global se produise.

Dans une liste de 10 jalons, 1 et 10 n'ont pas de groupement de jalons, mais 2 à 9 groupent.

Je pensais que j'avais un problème avec l'instruction if elle-même, que si LR-FR> 2 alors, mais en passant, j'ai trouvé quelque chose d'étrange. Comme je l'ai fait avec F8, j'ai réalisé que les données que je .copy/.pastespecial n'apparaissent qu'après qu'une ou deux boucles se sont produites. Le regroupement apparaît ensuite pour les dernières données visuellement ajoutées qui ont été collées. Ensuite, les données suivantes apparaissent jusqu'au dernier bit.


Question:

Y at-il un moyen de forcer la pâte à afficher les données? Y at-il autre chose qui causerait cette activité d'Excel/VBA?

Toute aide à la résolution serait appréciée.

+1

Je diviserais la tâche en 1) copier/coller, 2) grouper. Une fois que vous savez qu'il fonctionne comme vous le souhaitez, retournez-y et optimisez-le.Vous dépendez de l'indexation des lignes dans la boucle et avec tout le collage et le regroupement, il serait utile d'éliminer que les indices ne sont pas fiables pendant la boucle. –

+1

Comme vous collez juste les valeurs, il serait beaucoup plus rapide (et peut-être plus clair) d'utiliser '_.Value = _.Value' au lieu de copier/coller des valeurs. Puisque vous ne connaissez pas la taille de la plage de copie, vous pouvez tirer parti de la fonction 'resize', comme indiqué dans le sous-élément' Test2' de [cette réponse] (https://stackoverflow.com/a/17241661/ 3978545) – Wolfie

+0

@Wolfie Je suis retourné et modifié pour montrer avec output.value = input.value. Oui, c'est plus propre, bien que je rencontre toujours le problème que les valeurs n'apparaissent pas pendant la boucle. Modifier le code dans le post momentanément. – Cyril

Répondre

0

Deux choses se sont passées à travailler autour de la question:

1) J'ai dû ajouter une autre ligne de sorte que les groupes d'étape ne se termine pas sur la même ligne que le regroupement de la section (dans ce cas, après la boucle le sous-programme affiché dans la question). 2) J'ai tiré tout le groupe jusqu'à la fin, après les boucles.

Le code pour le regroupement finit par ressembler à:

Dim a as Integer 

LR = Sheets("Finance").Cells(Sheets("Finance").Rows.Count, 7).End(xlUp).Row 
For i = 5 To LR 
    If Sheets("Finance").Cells(i, 1).Font.Bold = False Then 
     Sheets("Finance").Rows(i).EntireRow.Group 
    Else 
    End If 
Next i 
'Group between sheets 
a = Sheets("Finance").Columns(1).Find(What:="Not Raw Materials", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False).Row 
Sheets("Finance").Range(Sheets("Finance").Rows(4), Sheets("Finance").Rows(a - 1)).EntireRow.Group 

En fin de compte, je devais assurer que le groupe était des plus petits incréments aux plus grands incréments pour faire en sorte que je ne perdais pas la fonctionnalité du regroupement de masse (sous-total) bascule. Je perdais souvent la bascule subtotale du dernier jalon.