Diviser les valeurs des lignes d'une plage par un nombre à partir d'une cel

Bonjour le forum,
je viens vous exposer mon projet.
J'ai un tableau sous forme d'une matrice (A1:JA56)

  • Des Symboles sur la première colonne
  • Des dates sur la première ligne
  • et dans la matrice des nombres

Je voudrais à l'aide d'une macro

  1. Pour chaque ligne de la première colonne (PALZ...…SVOZ) de la matrice
  2. Repérer la date de l'opération (sur la colonne JE) sur la première ligne de la matrice (A1:JA1)
  3. Ensuite diviser toutes les nombres pour par le coefficient à de la deuxième colonne jusqu'à la date l'opération.

Par exemple pour le symbole PALZ, la macro va fractionner toutes les valeurs de la avant la date du 03/11/2017 (plage B2:HL2) par le coef correspondant (ici 2 sur la colonne JD)

NB le bouton MULTIPLIER pourra servir de retour aux valeurs initiales avant le split

7split-test.xlsx (76.32 Ko)

Salut BidExcel,

quelque chose ainsi ?
J'ai juste (je suis emm..., je sais !) changé tes boutons de formulaire par des contrôles ActiveX.
Le bouton "Multiplier" est codé également.

Private Sub cmdSPLIT_Click()
'
Dim tData, tTab
'
With Worksheets("Opérations")
    tData = .Range("B1:JA55").Value
    tTab = .Range("JD1:JE55").Value
    For x = 2 To UBound(tTab, 1)
        If tTab(x, 2) <> "" Then
            For y = 1 To UBound(tData, 2)
                If CDate(tData(1, y)) = CDate(tTab(x, 2)) Then Exit For
                If Trim(tData(x, y)) <> "" Then tData(x, y) = CDbl(CLng(tData(x, y)) / CInt(tTab(x, 1)))
            Next
        End If
    Next
    .Range("B1:JA55").Value = tData
End With
'
End Sub
9bidexcel.xlsm (86.72 Ko)


A+

Merci beaucoup curulis57 ca fonctionne bien.

Oui je sais que (tu es emm...que tu sais) .

Merci

11split-test-2.xltm (81.56 Ko)

Salut curulis57

Pour raison de mise en forme et avoir plus de données à droite de la matrice, j'ai dû réadapter mon fichier. J'ai dû mettre les date et coef de split en début de la matrice.

nouveau

J'ai essayé de réadapter le code en remplaçant par les anciennes références par les nouvelles mais je me plante au niveau des variables x et y dans le code

Private Sub cmdSPLIT_Click()
'
Dim tData, tTab
'
'Nom de la feuille
With Worksheets("Cours_split")
'Tableau allant de D2:HFK
    tData = .Range("D2:HFK").Value
    tTab = .Range("JD1:JE55").Value
    'ligne 2 pour moi le x correspondrait à la 2e ligne
    For x = 2 To UBound(tTab, 1)
    'colonne 4 (changer 2 en 4) pour parler de la colonne
        If tTab(x, 4) <> "" Then
        'colonne 4 (changer 2 en 4) pour parler de la colonne
            For y = 1 To UBound(tData, 4)
                If CDate(tData(1, y)) = CDate(tTab(x, 4)) Then Exit For
                If Trim(tData(x, y)) <> "" Then tData(x, y) = CDbl(CLng(tData(x, y)) / CInt(tTab(x, 1)))
            Next
        End If
    Next
    .Range("B1:JA55").Value = tData
End With
'
End Sub

Du coup je sais plus qui est ce qu'il faut modifier ou pas. Stp peux tu m'aider une fois de plus? Désolé pour ce changement

Salut BidExcel,

voilà ton fichier.

Private Sub cmdSPLIT_Click()
'
Dim tData, tTab, iRow%, iCol%
'
With Worksheets("Cours_Split")
    iRow = Range("A" & Rows.Count).End(xlUp).Row
    iCol = .Cells(1, Columns.Count).End(xlToLeft).Column
    tData = .Range("D1").Resize(iRow, iCol - 3).Value
    tTab = .Range("A1:B" & iRow).Value
    For x = 2 To UBound(tTab, 1)
        If tTab(x, 1) <> "" And tTab(x, 2) <> "" Then
            For y = 1 To UBound(tData, 2)
                If CDate(tData(1, y)) = CDate(tTab(x, 1)) Then Exit For
                If Trim(tData(x, y)) <> "" Then tData(x, y) = CDbl(CLng(tData(x, y)) / CInt(tTab(x, 2)))
            Next
        End If
    Next
    .Range("D1").Resize(iRow, iCol - 3).Value = tData
End With
'
End Sub

Faut-il une protection, histoire de ne pas cliquer deux fois sur le même bouton, ou cela est-il entièrement géré par l'utilisateur ?

14bidexcel-v2.xlsm (85.95 Ko)


A+

Bonjour curulis57

espère que la journée débuté bien. Merci beaucoup pour ton retour.

J'ai mis le code dans mon fichier final mais il me mets le message suivant quand je veux exécuter le code.

Mon fichier final comporte plus de 5000 colonnes et il est très lourd donc raison pour laquelle j'ai dû couper une partie. Dois je changer quelque chose dans le code?

Cdt

capture1

Cordialement

Salut BidExcel,

probablement, d'après mes lectures, un problème de RAM insuffisante pour stocker le tableau complet, sans certitude...
Combien de lignes et de colonnes (5000 évolutives sans doute?) en tout ?


A+

Une autre façon de faire, un peu plus lente, certainement...

Private Sub cmdSPLIT_Click()
'
Dim tData, tTab, iRow%, iCol%
'
Application.ScreenUpdating = False
'
iRow = Range("A" & Rows.Count).End(xlUp).Row
iCol = Cells(1, Columns.Count).End(xlToLeft).Column
tTab = Range("A1:B" & iRow).Value
On Error Resume Next
For x = 2 To UBound(tTab, 1)
    If tTab(x, 1) <> "" And tTab(x, 2) <> "" Then
        iTCol = Rows(1).Find(what:=CDate(tTab(x, 1)), lookat:=xlWhole, LookIn:=xlFormulas, searchdirection:=xlNext).Column - 4
        If Not iTCol Is Nothing Then
            tData = Range("D" & x).Resize(1, iTCol).Value
            For y = 1 To UBound(tData, 2)
                If Trim(tData(1, y)) <> "" Then tData(1, y) = CDbl(CLng(tData(1, y)) / CInt(tTab(x, 2)))
            Next
            Range("D" & x).Resize(1, iTCol).Value = tData
        End If
    End If
Next
On Error GoTo 0
'
Application.ScreenUpdating = True
'
End Sub
11bidexcel-v3.xlsm (86.77 Ko)


A+

Bonjour curulis57 merci beaucoup je vais opter pour la seconde solution.

Bon weekend à toi.

Rechercher des sujets similaires à "diviser valeurs lignes plage nombre partir cel"