Optimiser une fonction

Bonjour à tous !

Je dois appliquer un calcul simple à une colonne en fonction d'une autre colonne.

J'ai réussi tant bien que mal à trouver comment faire... le souci est que c'est sur 4 feuilles différentes avec entre 15000 et 25000 données chacune...

Je l'ai fait avec une boucle while mais ça prendre beaucoup... BEAUCOUP de temps à se faire . Est-ce que quelqu'un aurait une solution pour optimiser le programme suivant ?

Sub Macro3()

'

' Macro3 Macro

Dim i As Integer

For i = 1 To 4

Sheets(i).Activate

Range("H1").Select

ActiveCell.FormulaR1C1 = "F_Fi" 'je renomme juste la colonne pour qu'elle est le bon nom

Cells.Find("PX_CLOSE").Select 'c'est la colonne à partir de laquelle je dois faire mes calculs

While ActiveCell.Offset(1, 0) <> ""

ActiveCell.Offset(1, 0).Select

Set Selec = ActiveCell

ActiveCell.Offset(0, 6).Select

ActiveCell.FormulaR1C1 = (Selec - 0.375) / (Worksheets(5).Cells(i + 1, 7) + 0.25)

Selec.Select

Wend

Next i

End Sub

MERCIIII À TOUUS

Je met le fichier excel en lien

4data-vba-2018.xlsx (334.17 Ko)

Bonjour,

Un fichier xlsm (avec macro) serait plus logique !

Un fichier avec une Worksheets(5) non vide serait aussi mieux venu !

A part ça il faut te persuader que tout code reposant sur des Select, Selection, ActiveCell, etc. est forcément mauvais , aléatoire et lent, te fait passer par des chemins détournés au lieu d'aller directement là où tu dois, et plus précisément pour approfondir la métaphore, te fait aller alors que le mieux est d'ordonner sans bouger !

Cordialement.

bonjour,

une proposition d'adaptation de ton code.

Sub Macro3()
'
' Macro3 Macro
    Dim i As Long, re As Range, j As Long, dl As Long

    For i = 1 To 4

        With Sheets(i)
            .Range("H1") = "F_Fi"  'je renomme juste la colonne pour qu'elle ait le bon nom

            Set re = .Cells.Find("PX_CLOSE", lookat:=xlWhole)    'c'est la colonne à partir de laquelle je dois faire mes calculs
            If re Is Nothing Then
                MsgBox "colonne PX_CLOSE non trouvée dans la feuille " & .Name
            Else
                dl = .Cells(Rows.Count, re.Column).End(xlUp).Row
                For j = re.Row + 1 To dl

                    .Cells(j, re.Column).Offset(0, 6) = (.Cells(j, re.Column) - 0.375) / (Worksheets(5).Cells(i + 1, 7) + 0.25)
                Next j
            End If
        End With

    Next i

End Sub

Re, salut h2so4 !

Ma contribution...

Sub MacroX()
    Dim aa, param, hh(), f%, k%, d%, i&
    param = Worksheets(5).Range("G2:G5").Value
    For i = 1 To 4
        param(i, 1) = param(i, 1) + 0.25
    Next i
    For f = 1 To 4
        With Worksheets(f)
            d = 1: k = 2
            Do While .Cells(d, 1) <> "Dates"
                d = d + 1
            Loop
            Do While .Cells(d, k) <> "PX_CLOSE" And .Cells(d, k) <> "PX_LAST"
                k = k + 1
            Loop
            i = .Cells(.Rows.Count, k).End(xlUp).Row
            aa = .Range(.Cells(d, k), .Cells(i, k)).Value
            ReDim hh(1 To UBound(aa, 1), 0)
            hh(1, 0) = "F_Fi"
            For i = 2 To UBound(aa, 1)
                hh(i, 0) = (aa(i, 1) - 0.375) / param(f, 1)
            Next i
            .Cells(d, 8).Resize(UBound(aa, 1)).Value = hh
        End With
    Next f
End Sub

Moins de 50 millisecondes sur ton fichier. (toutefois incomplet)

Merci beaucoup h2so4 et MFerrand, j'ai essayé vos deux codes et ils fonctionnent (et pas en plusieurs heures ahaha).

Merci beaucoup à vous deux, car j'allais galérer !

[quote=h2so4 post_id=649534 time=1526124865 user_id=22904]

Re bonjour h2so4,

J'ai essayé de réadapter ton code pour poursuivre mon exercice et faire la loi normale inverse, pour trouver les quantiles de distribution... malheureusement ça ne fonctionne pas, car il me dit "membre de méthode ou de donnée introuvable"... est-ce que tu aurais une idée pourquoi ?

 Sub Quantile()

    Dim i As Long, re As Range, j As Long, dl As Long

    For i = 1 To 4

        With Sheets(i)
            .Range("I1") = "F_Zi"  'je renomme juste la colonne pour qu'elle est le bon nom

            Set re = .Cells.Find("F_Fi", lookat:=xlWhole)    'c'est la colonne à partir de laquelle je dois faire mes calculs
            If re Is Nothing Then
                MsgBox "colonne F_Fi non trouvée dans la feuille " & .Name
            Else
                dl = .Cells(Rows.Count, re.Column).End(xlUp).Row
                For j = re.Row + 1 To dl

                    .Cells(j, re.Column).Offset(0, 1) = WorksheetFunction.NormInv(.Cells(j, re.Column), (Worksheets(5).Cells(i + 1, 3)), (Worksheets(5).Cells(i + 1, 4)))
                Next j
            End If
        End With

    Next i

End Sub

Bonjour,

sur quelle instruction as-tu ce message ?

peux-tu mettre un fichier dans lequel on peut reproduire le problème ?

Bonjour,

sur quelle instruction as-tu ce message ?

peux-tu mettre un fichier dans lequel on peut reproduire le problème ?

Merci de ton intérêt, en fait le code marche, c'est juste que j'avais rentré un mauvais truc (du texte ) dans une des cases. Merci encore et désolé du dérangement !!

Rechercher des sujets similaires à "optimiser fonction"