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.
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 Réponses :
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
Merci, son travail! Je peux maintenant identifier mon erreur de code avec votre réponse.
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.
C'est du travail! C'est la manière intelligente d'exécuter la boucle. Merci!
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
Merci pour votre temps, mais cela montre l'erreur de compilation de la variable non définie.
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. :)