critique et conseil

hyo66

XLDnaute Nouveau
Bonsoirs a tous et toutes

J'aimerai avoir vos commentaires sur une ligne de code que j'ai ecrite (ca fonctionne)
ma question est simple : peut on l'écrire en moins de ligne ?
c'est pour le cas ou je devrai rajouter des colonnes de données a traiter

Private Sub CommandButton1_Click()

If ActiveCell.Row > 14 And ActiveCell.Row < Trim(Str(Range("weight").Row) - 2) Then
activerow = ActiveCell.Row + 1
Cells(activerow, 1).EntireRow.Insert
Cells(activerow, 16).FormulaR1C1 = "=IF(RC[-13]>RC[-1], 0,RC[-1]-RC[-13])"
Cells(activerow, 19).FormulaR1C1 = "=IF(RC[-14]>RC[-1], 0,RC[-1]-RC[-14])"
Cells(activerow, 22).FormulaR1C1 = "=IF(RC[-15]>RC[-1], 0,RC[-1]-RC[-15])"
Cells(activerow, 25).FormulaR1C1 = "=IF(RC[-16]>RC[-1], 0,RC[-1]-RC[-16])"
Cells(activerow, 28).FormulaR1C1 = "=IF(RC[-17]>RC[-1], 0,RC[-1]-RC[-17])"
Cells(activerow, 31).FormulaR1C1 = "=IF(RC[-18]>RC[-1], 0,RC[-1]-RC[-18])"
End If

ActiveSheet.PageSetup.PrintArea = "$A$1:$AG$" + Trim(Str(Range("weight").Row) + 2)

End Sub

Merci pour vos réponses par avance :):D:D
 

Staple1600

XLDnaute Barbatruc
Re : critique et conseil

Re


Je verrai quelque chose du genre pour la première partie de ton code

Code:
Dim t, tt, i As Byte, activerow As Long
t = Array(16, 19, 22, 25, 28, 31): tt = Array(-13, -14, -15, -16, -17, -18)
If ActiveCell.Row > 14 And ActiveCell.Row < Range("weight").Offset(-2).Row Then
activerow = ActiveCell.Row + 1
Cells(activerow, 1).EntireRow.Insert
For i = 0 To 5
Cells(activerow, CLng(t(i))).FormulaR1C1 = _
"=IF(RC[" & CStr(tt(i)) & "]>RC[-1], 0,RC[-1]-RC[" & CStr(tt(i)) & "])"
Next
End If
 

Staple1600

XLDnaute Barbatruc
Re : critique et conseil

re

sauf qu'on n'a pas gagné beaucoup de lignes :D
(sauf si on ne compte pas les déclarations de variables et les tableaux )

Mais je laisse le soin aux autres vbaistes du forum d'interpréter ton code
d'une autre façon que je devine pouvoir être plus concise ...
 

Staple1600

XLDnaute Barbatruc
Re : critique et conseil

Re

On a le temps
Rien ne presse.

Ce soir j'ai ma lessive à étendre et mon thé à préparer puis à boire tout en fumant la cigarette que je viens de me rouler.


Après si j'ai pas envie de dodo, je penserai à toi.

PS: en joignant un fichier exemple, ce serait plus facile de tester et ainsi de voir comment faire pour raccourcir ton code ou en essayer un autre
 
Dernière édition:

Fred0o

XLDnaute Barbatruc
Re : critique et conseil

Bonsoir Hyo66, Staple1600.

Une autre solution pas beaucoup moins longue que celle de Staple.

Code:
Private Sub CommandButton1_Click()
    If ActiveCell.Row > 14 And ActiveCell.Row < Trim(Str(Range("weight").Row) - 2) Then
        activerow = ActiveCell.Row + 1
        Cells(activerow, 1).EntireRow.Insert
        i = -13
        For j = 16 To 31 Step 3
            Cells(activerow, i).FormulaR1C1 = "=IF(RC[" & i & "]>RC[-1], 0,RC[-1]-RC[" & i & "])"
            i = i - 1
        Next
    End If
    ActiveSheet.PageSetup.PrintArea = "$A$1:$AG$" + Trim(Str(Range("weight").Row) + 2)
End Sub
A+
 

Fred0o

XLDnaute Barbatruc
Re : critique et conseil

Bonsoir Staple,
;)

(Tu déclares pas tes variables ? car si oui on rallonge au moins d'une ligne ;) )
Si, je les déclare !
Mais j'ai pris l'habitude de toujours les déclarer en début de module par des Public ou Private et non pas au fil de l'eau par des Dim au sein des procédures. Ayant fait de la programmation en Pascal dans ma jeunesse, c'est une vieille habitude.

A+
 

Fred0o

XLDnaute Barbatruc
Re : critique et conseil

Re-bonsoir,

Plus concis mais plus difficile à lire.

Code:
Private i As Integer
Private Sub CommandButton1_Click()
    If ActiveCell.Row > 14 And ActiveCell.Row < Trim(Str(Range("weight").Row) - 2) Then
        Cells(ActiveCell.Row + 1, 1).EntireRow.Insert
        For i = 16 To 31 Step 3
            Cells(ActiveCell.Row + 1, i).FormulaR1C1 = "=IF(RC[" & ((i - 13) / 3) & "]>RC[-1], 0,RC[-1]-RC[" & ((i - 13) / 3) & "])"
        Next
    End If
    ActiveSheet.PageSetup.PrintArea = "$A$1:$AG$" + Trim(Str(Range("weight").Row) + 2)
End Sub
A+
 

Fo_rum

XLDnaute Accro
Re : critique et conseil

Salut

une ligne de moins mais pas le même résultat que la dernière proposition de Fred0o :confused::
Code:
Sub CommandButton1_Click()
  Dim col As Byte
  If Not (ActiveCell.Row > 14 And ActiveCell.Row < Trim(Str(Range("weight").Row) - 2)) Then Exit Sub
  Cells(ActiveCell.Row + 1, 1).EntireRow.Insert
  For col = 16 To 31 Step 3
    Cells(ActiveCell.Row + 1, col).FormulaR1C1 = "=IF(RC[" & -8 - Int(col / 3) & "]>RC[-1], 0,RC[-1]-RC[" & -8 - Int(col / 3) & "])"
  Next
  ActiveSheet.PageSetup.PrintArea = "$A$1:$AG$" + Trim(Str(Range("weight").Row) + 2)
End Sub
 

tototiti2008

XLDnaute Barbatruc
Re : critique et conseil

Bonjour à tous,

c'est juste pour participer au jeu (et évidement illisisble ;))

Code:
Sub CommandButton1_Click()
  If Not (ActiveCell.Row > 14 And ActiveCell.Row < Trim(Str(Range("weight").Row) - 2)) Then Exit Sub
  Cells(ActiveCell.Row + 1, 1).EntireRow.Insert
  Range("P" & ActiveCell.Row + 1 & ",S" & ActiveCell.Row + 1 & ",V" & ActiveCell.Row + 1 & ",Y" & ActiveCell.Row + 1 & ",AB" & ActiveCell.Row + 1 & ",AE" & ActiveCell.Row + 1).FormulaR1C1 = "=MAX(0,RC[-1]-OFFSET(RC,0,-8-INT(COLUMN()/3)))"
  ActiveSheet.PageSetup.PrintArea = "$A$1:$AG$" + Trim(Str(Range("weight").Row) + 2)
End Sub
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 196
Messages
2 086 099
Membres
103 116
dernier inscrit
kutobi87