2017-01-10 1 views
0

J'ai écrit un script VBA qui permet à l'utilisateur d'autoriser l'insertion d'un nouvel assemblage et son poids dans une table. L'assemblage inséré peut être l'un des deux niveaux (1 ou 2). Si la rangée insérée est un sous-ensemble (c'est-à-dire le niveau 2) alors sa position est directement au-dessous de l'ensemble de niveau supérieur. Je voudrais que le poids du niveau 1 soit égal à la somme de tous les poids du niveau 2. Je crois que la façon la plus simple de le faire serait de compter les cellules vides pour définir la plage et ensuite effectuer le calcul. Si la différence entre le poids actuellement au niveau 1 et la somme des poids du niveau 2 n'est pas 0, j'aimerais que cette valeur soit insérée comme un poids de niveau 2 dans la même rangée que l'ensemble de niveau 1. Je me rends compte que c'est assez déroutant alors j'ai joint une photo pour essayer de l'expliquer un peu mieux. Toute aide est appréciée :)Comptage du nombre de cellules vides dans une plage indéfinie et sommation des valeurs dans la colonne suivante

Excel Sheet Image

Voici le code que je suis actuellement en utilisant pour insérer les valeurs (d'un userform)

If TextBox_LevelNo.Value = 1 Then 
Cells(NextRow, 6).Value = TextBox_Weight.Value 
Cells(NextRow, 7).Value = TextBox_ExtraWeight.Value 
ElseIf TextBox_LevelNo.Value = 2 Then 
Cells(NextRow, 7).Value = TextBox_Weight.Value 
Cells(NextRow, 8).Value = TextBox_ExtraWeight.Value 
ElseIf TextBox_LevelNo.Value = 3 Then 
Cells(NextRow, 8).Value = TextBox_Weight.Value 
End If 
+0

pouvez-vous afficher votre code vba d'insertion? – EngJon

+0

au moment où les valeurs sont juste des boîtes de userfrom 'Si TextBox_LevelNo.Value = 1 Ensuite cellules (nextrow, 6) .Value = TextBox_Weight.Value cellules (nextrow, 7) .Value = TextBox_ExtraWeight.Value ElseIf TextBox_LevelNo .Value = 2 alors cellules (NextRow, 7) .Value = TextBox_Weight.Value cellules (NextRow, 8) .Value = TextBox_ExtraWeight.Value ElseIf TextBox_LevelNo.Value = 3 Alors cellules (NextRow, 8) .Value = TextBox_Weight .Valeur Fin Si –

+0

Ouf, merci pour la réponse. Pourriez-vous éditer votre question et insérer le code commenté ici? Facilite l'affichage – EngJon

Répondre

1

OK, ici il va. Utilisez cette macro. Exécutez-le une fois que vous avez terminé le travail sur les assemblages.

explications Code:

  • col1 et col2 doivent être fixés aux numéros de colonne des niveaux respectivement
  • autres variations ne devraient pas être nécessaires. Il suffit d'une grosse itération pour vérifier les valeurs des colonnes

Exécutez-le une seule fois en tant que macro. Toutes les colonnes de niveau 2 à côté des entrées de niveau 1 seront définies.

Sub SumLevelOne() 

Dim col1 As Integer 
Dim col2 As Integer 

col1 = 1 'level 1 column (1 = A) 
col2 = 2 'level 2 column (2 = B) 

Dim i As Integer 
Dim currentLevel1Row As Integer 
currentLevel1Row = -1 
Dim currentLevel1Total As Integer 
currentLevel1Total = 0 
Dim currentLevel2Sum As Integer 
currentLevel2Sum = 0 

Dim LastRow As Integer 
LastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, col2).End(xlUp).Row 

For i = 1 To LastRow 
    If Cells(i, col1) <> "" Then 'level 1 entry 
     If currentLevel1Row <> -1 Then 'level 1 entry already set 
      'sum up former level 1 entry: 
      Cells(currentLevel1Row, col2) = currentLevel1Total - currentLevel2Sum 
     End If 
     'set new level 1 entry 
     currentLevel1Row = i 
     currentLevel1Total = Cells(i, col1) 
     currentLevel2Sum = 0 
    ElseIf i = LastRow Then 
     If currentLevel1Row <> -1 Then 'level 1 entry already set 
      'sum up former level 1 entry: 
      Cells(currentLevel1Row, col2) = currentLevel1Total - currentLevel2Sum 
     End If 
    Else 
     'sum up level 2 entries 
     If Cells(i, col2) <> "" Then 'level 2 entry here 
      'add this 
      currentLevel2Sum = currentLevel2Sum + Cells(i, col2) 
     End If 
    End If 

Next i 
End Sub