Microsoft 365 Creation de boucle

  • Initiateur de la discussion Initiateur de la discussion Faroyo
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Faroyo

XLDnaute Junior
Bonjour,
j'ai besoin de votre aide pour solutionner mon problème.
Je voudrais étendre un bout de code et je rame .
Voici ce bout de code.
Je voudrais pouvoir l’étendre jusqu’à la dernière cellule remplie de la colonne "G".


If UCase(Range("G4").Value) Like "*ISO*" Then
Range("O4").Value = Range("N4") + 1000
ElseIf UCase(Range("G4").Value) Like "*IBC*" Then
Range("O4").Value = Range("N4") + 500
ElseIf UCase(Range("G4").Value) Like "*SAC*" Then
Range("O4").Value = Range("N4")
ElseIf UCase(Range("G4").Value) Like "*BAG*" Then
Range("O4").Value = Range("N4")
ElseIf UCase(Range("G4").Value) Like "*ISOMIX*" Then
Range("O4").Value = Range("N4")
ElseIf UCase(Range("G4").Value) Like "*GEL*" Then
Range("O4").Value = Range("N4")
ElseIf UCase(Range("G4").Value) Like "*FUT*" Then
Range("O4").Value = Range("N4")
ElseIf UCase(Range("G4").Value) Like "*POUDRE*" Then
Range("O4").Value = Range("N4")
ElseIf UCase(Range("G4").Value) Like "*JERRYCAN*" Then
Range("O4").Value = Range("N4")
ElseIf UCase(Range("G4").Value) Like "*V5700*" Then
Range("O4").Value = Range("N4")

Merci pour votre aide.
 
Bonjour Faroyo,
essayez d'utiliser les balises </> pour le code, cela le rend plus lisible.
sans autre explications, et sans fichier test, c'est un peu au pif.
Une solution possible si tant est que j'ai tout compris :
VB:
Sub test()
' on déclare un tableau avec toutes les chaines recherchées
Chaine = Array("ISO", "IBC", "SAC", "BAG", "ISOMIX", "GEL", "FUT", "POUDRE", "JERRICAN", "V5700")
' on déclare un tableau avec toutes les valeurs à ajouter à N4
N = Array(1000, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0)
' taille de l'array
Taille = UBound(Chaine)
' nombre de cellules occupéres en colonne G
TailleG = Application.CountIf(Range("G:G"), "*")
' pour toutes les lignes de G
For Ligne = 1 To TailleG
    ' on prend la valeur en G de la ligne concernée
    Valeur = UCase(Range("G" & Ligne).Value)
    ' pour toutes les chaines recherchées
    For i = 0 To Taille
        ' si la cellule
        If Valeur Like "*" & Chaine(i) & "*" Then
            ' on met valeur col N dans col O additionné de la valeur de l'array N.
            Range("O" & Ligne).Value = Range("N" & Ligne) + N(i)
        End If
    Next i
Next Ligne
End Sub
 
Dernière édition:
Bonjour @Faroyo , le Forum

Un exemple de base de boucle sur ton code :

VB:
Option Explicit

Sub MyBoucle()
Dim WSsource As Worksheet
Dim PlageSource As Range, CellSource As Range

Set WSsource = ThisWorkbook.Worksheets("Sheet1")

Set PlageSource = WSsource.Range("G4:G" & WSsource.Range("G1000").End(xlUp).Row)


    For Each CellSource In PlageSource
    
        If UCase(CellSource.Value) Like "*ISO*" Then
            CellSource.Offset(0, 8) = CellSource.Offset(0, 7) + 1000
        ElseIf UCase(CellSource.Value) Like "*IBC*" Then
            CellSource.Offset(0, 8) = CellSource.Offset(0, 7) + 500
        ElseIf UCase(CellSource.Value) Like "*SAC*" Then
            CellSource.Offset(0, 8) = CellSource.Offset(0, 7)
        'ETC  ................
        End If
    Next CellSource

End Sub

Bonne journée
@+Thierry
 
Bonjour à tous
J'essaierais ceci (écrit à main levée et non testé) :
VB:
derlig = Range("G" & Rows.Count).End(xlUp).Row
toto = array("*ISO*", "*IBC*", "*SAC*", "*BAG*", "*ISOMIX*", "*GEL*", "*FUT*", "*POUDRE*", "*JERRYCAN*", "*JERRYCAN*", "*V5700*")
For k = 4 To derlig
  PLUS = 0
  For n = 0 To uBound(toto)
    if ucase(range("G" & k).value) like toto(n) then  exit for
  next
  select case n
    case 0: PLUS = 1000
    case 1: PLUS = 100
  end select
  range("O" & k).value = range("N" & k).value + PLUS
next
 
Bonjour à tous
J'essaierais ceci (écrit à main levée et non testé) :
VB:
derlig = Range("G" & Rows.Count).End(xlUp).Row
toto = array("*ISO*", "*IBC*", "*SAC*", "*BAG*", "*ISOMIX*", "*GEL*", "*FUT*", "*POUDRE*", "*JERRYCAN*", "*JERRYCAN*", "*V5700*")
For k = 4 To derlig
  PLUS = 0
  For n = 0 To uBound(toto)
    if ucase(range("G" & k).value) like toto(n) then  exit for
  next
  select case n
    case 0: PLUS = 1000
    case 1: PLUS = 100
  end select
  range("O" & k).value = range("N" & k).value + PLUS
next

Bonjour jmfmarques,
je viens de tester ton code.
le remplissage du tableau se fait parfaitement mais il bloque ensuite sur la dernière ligne
range("O" & k).value = range("N" & k).value + PLUS
"Run-time error "13".
Une idee du pourquoi du comment?
Merci
 
Bonjour Faroyo,
essayez d'utiliser les balises </> pour le code, cela le rend plus lisible.
sans autre explications, et sans fichier test, c'est un peu au pif.
Une solution possible si tant est que j'ai tout compris :
VB:
Sub test()
' on déclare un tableau avec toutes les chaines recherchées
Chaine = Array("ISO", "IBC", "SAC", "BAG", "ISOMIX", "GEL", "FUT", "POUDRE", "JERRICAN", "V5700")
' on déclare un tableau avec toutes les valeurs à ajouter à N4
N = Array(1000, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0)
' taille de l'array
Taille = UBound(Chaine)
' nombre de cellules occupéres en colonne G
TailleG = Application.CountIf(Range("G:G"), "*")
' pour toutes les lignes de G
For Ligne = 1 To TailleG
    ' on prend la valeur en G de la ligne concernée
    Valeur = UCase(Range("G" & Ligne).Value)
    ' pour toutes les chaines recherchées
    For i = 0 To Taille
        ' si la cellule
        If Valeur Like "*" & Chaine(i) & "*" Then
            ' on met valeur col N dans col O additionné de la valeur de l'array N.
            Range("O" & Ligne).Value = Range("N" & Ligne) + N(i)
        End If
    Next i
Next Ligne
End Sub


Bonjour sylvanu,
ta solution fonctionne parfaitement.
Merci pour tou.

Faroyo
 
Bien
Tu peux alors raccourcir mon code ainsi :
VB:
derlig = Range("G" & Rows.Count).End(xlUp).Row
toto = Array("*ISO*", "*IBC*", "*SAC*", "*BAG*", "*ISOMIX*", "*GEL*", "*FUT*", "*POUDRE*", "*JERRYCAN*", "*JERRYCAN*", "*V5700*")
lesplus = Array(1000, 100)
For k = 4 To derlig
  PLUS = 0
  For n = 0 To UBound(toto)
    If UCase(Range("G" & k).Value) Like toto(n) Then MsgBox n: Exit For
  Next
  If n < 2 Then PLUS = lesplus(n)
  Range("O" & k).Value = Range("N" & k).Value + PLUS
Next
mais c'est juste pour t'exercer car cela n'est pas vraiment une amélioration.
 
Bien
Tu peux alors raccourcir mon code ainsi :
VB:
derlig = Range("G" & Rows.Count).End(xlUp).Row
toto = Array("*ISO*", "*IBC*", "*SAC*", "*BAG*", "*ISOMIX*", "*GEL*", "*FUT*", "*POUDRE*", "*JERRYCAN*", "*JERRYCAN*", "*V5700*")
lesplus = Array(1000, 100)
For k = 4 To derlig
  PLUS = 0
  For n = 0 To UBound(toto)
    If UCase(Range("G" & k).Value) Like toto(n) Then MsgBox n: Exit For
  Next
  If n < 2 Then PLUS = lesplus(n)
  Range("O" & k).Value = Range("N" & k).Value + PLUS
Next
mais c'est juste pour t'exercer car cela n'est pas vraiment une amélioration.


Désolé pour cette réponse aussi tardive.
C'est exactement ce qu'il me faut. Je débute en VBA et j'ai un grand besoin de voir ce type de variante pour bien comprendre la logique.
Encore merci pour vos réponses
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Export données
Réponses
4
Affichages
805
Réponses
2
Affichages
898
Retour