Boucle VBA Excel 2013

Bonjour,

Je suis nouveau sur VBA et j'ai comme mission au travail d'automatiser une feuille de calcul. J'ai donc fait l'enregistrement automatique en plaçant les commentaires qui vont bien.

Et depuis hier je tente de placer une boucle qui se déplace vers le bas pour répéter le processus jusqu'à rencontrer une ligne vide

Le but de mon travail est de copier les valeur dans les cellules GHI (Diamétre Ext, Inter et longueur) dans la feuille (Feuil1) et de faire calculer le devis

J'ai cherché sur divers forum dont le votre comment faire cela mais je n'arrive pas a intégrer la boucle comme je le souhaite.

Malheureusement pour des questions de confidentialité je ne peut pas vous joindre le fichier excel

Donc voilà je veux juste répéter en boucle cette opération de copier coller jusqu'a la première ligne vide

Merci

Sub TARIFTUBE()
'
' TARIFTUBE Macro
'
' Touche de raccourci du clavier: Ctrl+Shift+W

'Début code pour copie des valeurs
Range("G2").Select.

Selection.Copy
Sheets("Feuil1").Select
Range("C2").Select
ActiveSheet.Paste

'Copy diamétre intérieur
Sheets("tube (BC08)").Select
Range("H2").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Feuil1").Select
Range("C3").Select
ActiveSheet.Paste

'Copy diamétre extérieur
Sheets("tube (BC08)").Select
Range("I2").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Feuil1").Select
Range("C4").Select
ActiveSheet.Paste 'Copy longueur
ActiveWindow.SmallScroll Down:=24
Range("C32").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("tube (BC08)").Select
Range("J2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False

'Copy prix du tube
Sheets("Feuil1").Select
ActiveWindow.SmallScroll Down:=-30
Range("C2:C4").Select
Application.CutCopyMode = False
Selection.ClearContents

'Effacement des informations du devis (Diémtre inter, ext et longueur)
Sheets("tube (BC08)").Select
Range("J1").Select
'Fin du code pour la copie des valeurs
End Sub

Bonjour,

L'enregistreur de macro est un aide qui génère un code informatif qu'il faut entièrement réviser.

Pas sûr d'avoir compris ton problème, mais pour copier des valeurs, ça donnerait :

Option Explicit
Sub TARIFTUBE()
  With Worksheets("Feuil1")
    .Range("C2").Value = Worksheets("tube (BC08)").Range("G2").Value
    .Range("C3").Value = Worksheets("tube (BC08)").Range("H2").Value
    .Range("C4").Value = Worksheets("tube (BC08)").Range("I2").Value
    .Range("J2").Value = Worksheets("tube (BC08)").Range("C32").Value
  End With
End Sub

Oh d'accord, en faites l'enregistrement ne sert a rien, je dois revoir entièrement le code et mettre la boucle pour automatiser le tout ?

Je vais voir ce que je peux faire...

Bonjour,

Bon j'ai revu le code entièrement mais je n'arrive toujours pas a faire répéter l'opération.

L'idée c'est que la première partie, qui copie les donnée pour le calcul du devis puis ensuite copie le résultat vers la feuille tube, se répètent en se décalant d'une ligne vers le bas a chaque fois puis s'arrêtent une fois qu'il rencontre une ligne vide sur la feuille "tube"

Pour l'instant j'ai fait ce code et j'ai mit un exemple du fichier pour être plus clair

Sub
Dim i As Integer 'Pour la boucle

For i = 1 To 4800 'Nombre de répétition total

 With Worksheets("Devis")
    .Range("C2").Value = Worksheets("tube (BC08)").Range("G2").Value 'Copie diamétre intérieur "tube" vers "Devis"
    .Range("C3").Value = Worksheets("tube (BC08)").Range("H2").Value 'Copie diamétre exterieur "tube" vers "Devis"
    .Range("C4").Value = Worksheets("tube (BC08)").Range("I2").Value 'Copie longueur "tube" vers "Devis"
End With

With Worksheets("Tube")
    .Range("J2").Value = Worksheets("Devis").Range("C32").Value 'Copie  prix total "Devis" vers "Tube"
  End With

With Worksheets("Devis")
    .Range("C2:C4").Clear 'Effacement des données sur le devis
End With

ActiveCell.Offset(1, 0).Select 'Décalage d'une ligne vers le bas

Next i
End sub

Bonjour à tous,

Quel est objectif concrètement car on ne comprend pas bien ?

Voici un essai basé sur une intuition où :

- on détermine la dernière ligne de tube ;

- on alimente un tableau en mémoire par le produit, pour chacune des lignes allant de 2 à cette dernière ligne, des cellules en G à I ;

- on restitue toutes ces données d'un coup en colonne J (à partir de la ligne 2) retaillée au nombre d'items du tableau :

Sub boucletest()

With Worksheets("Tube")
    dl = .cells(.rows.count, "G").end(xlup).row 'dernière ligne en colonne G de feuille tube
    redim t(1 to dl - 1, 1 to 1) 'tableau accueillant données
    For i = 2 To dl
        t(i, 1) = application.product(.range("G:I").rows(i)) 'MODIFIER PAR CALCUL PERMETTANT D'OBTENIR C32 DEVIS A COLLER EN Ji DE TUBE
    next i
    .range("J2").resize(ubound(t), 1) = t
end with

End sub

Si mon intuition était bonne, il faudrait savoir qu'une simple formule aurait pu suffire...

Cdlt,

Si mon intuition était bonne, il faudrait savoir qu'une simple formule aurait pu suffire...

En faite non; dans la partie devis, il y a toute une partie du calcul (Avec des formules indépendantes) que j'ai supprimé pour confidentialité, donc une simple formule excel n'aurai pas suffit

Mon but est d'automatiser le calcul du devis et chaque fois qu'un nouveau produit est rentré ou modifié dans la feuille "Tube", j'utilise la macro pour calculer automatiquement la valeur finale du produit à l'aide de la feuille "Devis"

Et mon problème est le suivant : Ajouter une boucle à mon code qui calcul automatiquement tout les tubes et s'arrête à la première ligne vide rencontré

Là j'essaie d'adapter ton code pour automatiser le tout, je verrai bien au final

Bonjour,

En fait, comme vous passez par VBA, l'idéal est de réaliser les calculs en mémoire et de ne pas passer par Excel (car ça prend beaucoup de temps, surtout si vous avez 4800 itérations !).

Donc il faudrait connaitre les étapes de calcul pour les réaliser dans le code car le fait de transiter par la feuille DEVIS n'est pas du tout nécessaire à mon avis...

Comme je vois qu'il s'agit de longueur et de diamètre, je me dis qu'il faut donc calculer un volume, qui permettrait d'obtenir un prix à partir d'un coefficient dont l'unité serait prix/L par exemple. Si c'est bien ça, ce n'est pas compliqué de le faire dans le code, on peut même définir une fonction personnalisée. Et ce serait tout à fait possible de le faire uniquement par formule.

Mais bon, ce sont des suppositions que j'émets sans avoir connaissance du fichier...

Cdlt,

A la limite je peut te donner les formules excel sans les intitulés

Bonjour,

Comme c'est un peu le foutoir votre onglet DEVIS, je reviens sur mon idée de départ (que je n'écarte pas totalement non plus) et propose ce code :

Sub boucletest()
application.screenupdating = false
With Worksheets("Tube")
    dl = .cells(.rows.count, "G").end(xlup).row 'dernière ligne en colonne G de feuille tube
    For i = 2 To dl
        sheets("Devis").Range("C2:C4").Value = application.transpose(.Range("G:I").rows(i).Value)
        .Range("J" & i).Value = Worksheets("Devis").Range("C32").Value
    next i
end with
sheets("Devis").Range("C2:C4").value = ""
application.screenupdating = true
End sub

De cette manière, on effectue l'opération en bouclant : on copie les diamètres et la longueur de chaque ligne de TUBE en C2:C4 de DEVIS puis on copie C32 de DEVIS sur la ligne en cours de TUBE.

Il est possible que ça prenne du temps quand même avec un grand nombre de lignes...

Cdlt,

Bonjour,

Merci pour la solution, effectivement cela marche même si celle ci est bien plus complexe que ce j'imaginais à la base

Bonne Journée

Rechercher des sujets similaires à "boucle vba 2013"