Simplification d'un code VBA!

sebastien450

XLDnaute Occasionnel
Bonjour,

Je viens vers vous car mes faibles connaissances en VBA ne me permette pas de simplifier le code suivant:

Sub Macrocopier1000()
If Range("H15") = "5000" Then
Range("P13:Q13").Select
Selection.Copy
Sheets("1000m & reprises").Select
Range("B3").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End If

If Range("H15") = "5050" Then
Range("P13:Q13").Select
Selection.Copy
Sheets("1000m & reprises").Select
Range("B4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End If
If Range("H15") = "510" Then
Range("P13:Q13").Select
Selection.Copy
Sheets("1000m & reprises").Select
Range("B5").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End If

End Sub

Il s'agit d'un simple copier coller de la valeur en P13:Q13 vers une cellule B3.
Et le tout s'incrémente,
pour H15=5000, je met en b3
Pour h15 = 5050 je met en b4 et ainsi de suite jusqu'a H15=7000!


Merci de votre aide
 

vbacrumble

XLDnaute Accro
Re : Simplification d'un code VBA!

Bonjour

A tester

Code:
Option Explicit

Sub Macrocopier1000()
Dim i
Dim vals
Dim adr
vals = Array(5000, 5050, 510)
adr = Array("B3", "B4", "B5")
For i = 0 To 2
If Range("H15") = vals(i) Then
With Range("P13:Q13").Copy
Sheets("1000m & reprises").Range(CStr(adr(i))).PasteSpecial xlPasteValues
End With
End If
Next
End Sub
 
Dernière édition:

wamme

XLDnaute Occasionnel
Re : Simplification d'un code VBA!

Bonjour,
à tester également

Sub test()

Var = [H15]
XX = (Var - 5000) / 50
val1=[P13]
val2=[Q13]
Sheets("1000m & reprises").select
Cells(3 + XX, 2).Value = val1
Cells(3 + XX, 3).Value = val2
End Sub
 
Dernière édition:

vbacrumble

XLDnaute Accro
Re : Simplification d'un code VBA!

Re

En relisant , je vois que j'avais mal compris

Voici une nouvelle proposition



Code:
Option Explicit
Sub Macrocopier1000()
Dim i
Dim j
j = 0
    For i = 5000 To 7000 Step 50
    If Range("H15") = i Then
        With Range("P13:Q13").Copy
            Sheets("1000m & reprises").Cells(j + 3, "B").PasteSpecial xlPasteValues
        End With
    End If
j = j + 1
Next
End Sub
 

vbacrumble

XLDnaute Accro
Re : Simplification d'un code VBA!

Re



Bien Chef

Code:
'Voila le code commenté
Option Explicit[COLOR="Green"] ' pour obliger à déclarer ses variables[/COLOR]
Sub Macrocopier1000()
[COLOR="Green"]'Déclarations des variables[/COLOR]
Dim i as Long
Dim j as Long
[COLOR="Green"]'Fin des Déclaration des variables[/COLOR]
j = 0
    For i = 5000 To 7000 Step 50 [COLOR="Green"]'ici on parcours les valeurs désirées par pas [/COLOR]de 50
    If Range("H15") = i Then[COLOR="Green"] ' ici si H15 = une valeur de i[/COLOR]
        With Range("P13:Q13").Copy [COLOR="Green"]'copie /collage spécial[/COLOR]
            Sheets("1000m & reprises").Cells(j + 3, "B").PasteSpecial xlPasteValues
        End With
    End If
j = j + 1
Next
End Sub
 

sebastien450

XLDnaute Occasionnel
Re : Simplification d'un code VBA!

Niquel!
Tu peut me faire la meme simplification avec:Sinon une simplification de cette macro est t-elle possible ?
Sub Macrocond()

If Range("H15") = "5000" Then
Range("C20").Select
ActiveCell.FormulaR1C1 = _
"=IF(R15C8=5000,IF(OFFSET(RC2,,-1)>R15C8,"""",(('Moteur et boite'!R[33]C2)/3.6)/IF('Puissance restante'!R[-15]C10>'0 à 100'!R3C7,'0 à 100'!R3C7,'Puissance restante'!R[-15]C10)),""diff de 5000"")"
End If
If Range("H15") = "5050" Then
Range("C20").Select
ActiveCell.FormulaR1C1 = _
"=IF(R15C8=5050,IF(OFFSET(RC2,,-1)>R15C8,"""",(('Moteur et boite'!R[33]C2)/3.6)/IF('Puissance restante'!R[-15]C10>'0 à 100'!R3C7,'0 à 100'!R3C7,'Puissance restante'!R[-15]C10)),""diff de 5000"")"
End If
If Range("H15") = "5100" Then
Range("C20").Select
ActiveCell.FormulaR1C1 = _
"=IF(R15C8=5100,IF(OFFSET(RC2,,-1)>R15C8,"""",(('Moteur et boite'!R[33]C2)/3.6)/IF('Puissance restante'!R[-15]C10>'0 à 100'!R3C7,'0 à 100'!R3C7,'Puissance restante'!R[-15]C10)),""diff de 5000"")"
End If

C'est le meme principe avec
si H15=5000, c'est 5000 au début de la formule
Si H15 = 5050 c'est 5050 au début de la formule
et ainsi de suite (toujours jusqu'a 7000!)
 

vbacrumble

XLDnaute Accro
Re : Simplification d'un code VBA!

Re


Si c'est nickel, c'est que tu as compris comment le code fonctionne
et que tu as désormais les ressources en toi, pour essayer, tâtonner, modifier ton code existant.


Quand tu auras tenter la chose, on en recause.

Un conseil pour finir :
En plus de tes neurones, il ya le moteur de recherche du forum, et la touche F1 dans l'aide de Visual Basic Editor (alias VBE)
 

vbacrumble

XLDnaute Accro
Re : Simplification d'un code VBA!

Re


Ca ne fait qu'une heure que tu tâtonnes?

C'est un peu court jeune homme !

Bien sur tu as essayé de modifier ton code ?
Et tu as durant cet heure parcouru le forum en utilisant le moteur de recherche ?

Les gens qui répondent ici le font avec plaisir pour des gens qui s'investissent qui essayent, qui s'arrachent les cheveux.

Par contre pour ceux qui attendent une solution clé en main ,la , personnellement, je fais une violente crise d'urticaire.

Mais bon, a part cela, évites tant que faire ce peut d'utiliser les Select, Activate et tutti quanti.

Voila déjà quelque chose que tui peux faire seul.

Un exemple d'équivalence de code sans Selection
Code:
Range("C20").FormulaR1C1 = _
"=IF(R15C8=5000,IF(OFFSET(RC2,,-1)>R15C8,"""",(('Moteur et boite'!R[33]C2)/3.6)/IF('Puissance restante'!R[-15]C10>'0 à 100'!R3C7,'0 à 100'!R3C7,'Puissance restante'!R[-15]C10)),""diff de 5000"")"

Continue pour le reste de ton code.
 

Gael

XLDnaute Barbatruc
Re : Simplification d'un code VBA!

Bonjour Sebastien450, VBACrumble, Wamme,

Pour la première macro, la proposition de Wamme me paraît mieux convenir dans la mesure où la valeur de la ligne pour la colonne B est directement fonction de la valeur en H15. Une boucle n'est donc pas nécessaire et on peut écrire (code de Wamme légèrement modifié):

Code:
Sub test()
Dim i As Integer
i = ((ActiveSheet.Range("H15").Value - 5000) / 50) + 3
With Sheets("1000m & reprises")
    .Cells(i, 2) = ActiveSheet.Range("P13")
    .Cells(i, 3) = ActiveSheet.Range("Q13")
End With
End Sub

Pour la deuxième macro, la seule différence entre les formules est "=IF(R15C8=5000..." Or R15C8 correspondant à la cellule H15, je ne comprends pas le pourquoi de ce premier test dans la formule: "Si H15=5000" puisqu'on ne met cette formule que si H15=5000.

Pour moi, il suffit de mettre en C20, la formule sans le test initial. Mais je ne suis pas sûr d'avoir bien compris.

@+

Gael
 

Gael

XLDnaute Barbatruc
Re : Simplification d'un code VBA!

Re,

Mais si, on a compris la même chose:

Code:
i = ((ActiveSheet.Range("H15").Value - 5000) / 50) + 3

H15=5000 => i=((5000-5000)/50)+3 =3 => B3
H15=5050 => i=((5050-5000)/50)+3 =4 => B4
H15=5100 => i=((5100-5000)/50)+3 =5 => B5
H15=7000 => i=((7000-5000)/50)+3 =43 => B43
...

@+

Gael
 

sebastien450

XLDnaute Occasionnel
Re : Simplification d'un code VBA!

Tout a fait.
La formule à été enregistrée via l'enregistreur de macro d'excel... voila pourquoi elle avait cette forme là!

Pour la deuxième macro j'ai des difficultés à faire varier "5000" dans la formule. et lui faire comprendre que si 5000; on met 5000, si 5500 on met 5500.
 

Gael

XLDnaute Barbatruc
Re : Simplification d'un code VBA!

Re,

Sous réserve de ma remarque précédente, tu peux écrire:

Code:
"=IF(R15C8=" & ActiveSheet.Range("H15") & ",IF(OFFSET(RC2,,-1)>R15C8,"""",(('Moteur et boite'!R[33]C2)/3.6)/IF('Puissance restante'!R[-15]C10>'0 à 100'!R3C7,'0 à 100'!R3C7,'Puissance restante'!R[-15]C10)),""diff de 5000"")"

@+

Gael
 

Discussions similaires

Réponses
2
Affichages
141
Réponses
3
Affichages
261

Statistiques des forums

Discussions
312 396
Messages
2 088 054
Membres
103 709
dernier inscrit
FrrankX