0
votes

Placez la valeur dans différentes lignes

S'il vous plaît aider ma pensée ci-dessous, je voudrais obtenir la valeur place dans différentes lignes en fonction de la valeur. Je pense que mon code présente des problèmes de boucle, mais je ne comprends pas pourquoi.

L'action est très simple, la ligne A est un ensemble de valeurs, if range ("A2"). Value + 50 placez la réponse sur B2.value , sinon placez la valeur sur C2.value et etc.

 entrez la description de l'image ici

Sub ttest()

Dim item, lastR, itemplus As Integer
Dim i, j As Integer
i = 2
j = 2
item = Cells(i, 1).value
lastR = Cells(Rows.Count, 1).End(xlUp).row
itemplus = item + 50

For i = 2 To lastR
If itemplus <= 100 Then
Cells(i, j).value = itemplus
Else
Cells(i, j + 1).value = itemplus
End If
item = Cells(i, 1).value
Next i
End Sub


3 commentaires

Auriez-vous besoin de VBA? Cela se fait également avec une simple formule Excel.


Comme JvdV le dit, vous n'avez pas besoin de VBA pour cela, mais je pense que votre problème est que vous ne mettez jamais à jour itemplus . Votre boucle est inutilement compliquée.


Oui, je sais que cela peut être fait avec une simple formule Excel, ce que je recherche vraiment, c'est le concept d'écriture d'une boucle appropriée. Ce n'est que l'exemple, mon projet a besoin de VBA. Merci quand même. :)


3 Réponses :


2
votes

Modifiez simplement l'ordre des devoirs:

Sub ttest()

Dim item, lastR, itemplus As Integer
Dim i, j As Integer
i = 2
j = 2
item = Cells(i, 1).Value
lastR = Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lastR
   item = Cells(i, 1).Value
   itemplus = item + 50
   If itemplus <= 100 Then
       Cells(i, j).Value = itemplus
   Else
       Cells(i, j + 1).Value = itemplus
   End If
Next i
End Sub


1 commentaires

Merci, son travail! Je peux maintenant identifier mon erreur de code avec votre réponse.



3
votes

Comme le dit @SJR, vous travaillez en partie en dehors de votre boucle et en partie à l'intérieur de votre boucle, en vous comparant constamment à la même variable exacte.

Puis-je suggérer une alternative pour travailler avec la mémoire à la place (et éviter les appels plus lents à votre feuille de calcul aussi souvent):

Sub Test()

Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim lr As Long, x As Long
Dim arr As Variant

With ws
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    arr = .Range("A2:C" & lr).Value
    For x = LBound(arr) To UBound(arr)
        If arr(x, 1) < 50 Then
            arr(x, 2) = arr(x, 1)
        Else
            arr(x, 3) = arr(x, 1)
        End If
    Next
    .Range("A2:C" & lr).Value = arr
End With

End Sub

Comme vous le remarquerez peut-être, nous n'avons pas besoin d'ajouter 50 à chaque valeur pour comparer si son à 100 . Cela impliquerait que la valeur initiale doit simplement être inférieure à 50.

Cela étant dit, la même chose est obtenue rapidement grâce aux fonctions Excel natives si vous voulez éviter VBA.


1 commentaires

C'est du travail! C'est la manière intelligente d'exécuter la boucle. Merci!



1
votes
Sub test()
Set Rng = Range("A2", Range("A2").End(xlDown))
For Each cell In Rng
Sum = cell.Value + 50
If Sum <= 100 Then cell.Offset(0, 1).Value = Sum
If Sum > 100 Then cell.Offset(0, 2).Value = Sum
Next
End Sub

1 commentaires

Merci pour votre temps, mais cela montre l'erreur de compilation de la variable non définie.