XL 2010 Fonction matricielle en vba...

jeanba

XLDnaute Occasionnel
Bonjour à tous et à toutes!
Meilleurs voeux pour 2017!

Je suis à la recherche du code pour cette formule qui marche très bien sous excel mais qui bouffe énormément de ressources et du coup ralentit mon projet.

upload_2017-1-4_10-4-1.png


- La feuille RECAP est celle de la formule. Les seules références utiles dans cette feuille sont 2 références absolues ( une fixe en $A$1 et l'autre mobile en fonction de la colonne de calcul, mais la ligne figée est $5 à partir de la colonne C).

- Centralisation est le tableau de recherche

Je voudrais renseigner mon tableau avec du code pour gagner en temps d'exec..
Merci beaucoup!

Jeanba
 

Pièces jointes

  • upload_2017-1-4_9-57-28.png
    upload_2017-1-4_9-57-28.png
    40 KB · Affichages: 40

jeanba

XLDnaute Occasionnel
Ouais, j'ai dû faire avec, mais ça se positionne pas là où je veux (voir fichier envoyé).
J'ai cherché partout les moyens mais j'y arrive pas. Pourtant, sur les éditions de logiciels tels que Sage, ça se fait bien...
:(
...
 

gosselien

XLDnaute Barbatruc
re,

j'ai trouvé ceci dans mes archives, tu peux peut être démarrer de là :)

VB:
Function NumeroPage() As Variant
'Adapté d'une procédure de
'Laurent Longre
Dim VPC As Integer, HPC As Integer
Dim VPB As VPageBreak, HPB As HPageBreak
Dim Ws As Worksheet
Dim Col As Integer, Ligne As Long

Set Ws = Application.Caller.Worksheet
Ligne = Application.Caller.Row
Col = Application.Caller.Column

If Ws.PageSetup.Order = xlDownThenOver Then
   HPC = Ws.HPageBreaks.Count + 1
   VPC = 1
Else
   VPC = Ws.VPageBreaks.Count + 1
   HPC = 1
End If

NumeroPage = 1
For Each VPB In Ws.VPageBreaks
   If VPB.Location.Column > Col Then Exit For
   NumeroPage = NumeroPage + HPC
Next VPB

For Each HPB In Ws.HPageBreaks
   If HPB.Location.Row > Ligne Then Exit For
   NumeroPage = NumeroPage + VPC
Next HPB

NumeroPage = "Page " & NumeroPage
End Function
 

jeanba

XLDnaute Occasionnel
J'essaie d'exploiter tes archives, en faisant un Call NumeroPage dans ma procédure ImprimerRecap.
Mais, avant, je suis embêter avec cette expression:
VB:
Set Ws = Application.Caller.Worksheet
Caller ici est une procédure ou une propriété VB s'il te plaît?
Et comment puis-je insérer cette procédure dans la mienne (j'ai essayé ceci:

VB:
Sub ImprimerRecap()
    With Sheets("RECAP")
        .Visible = True
        .Select
        DeverrouillerFeuille
        Range("A1").Value = i
        'Call CalculerRecap
        Range("B3").Value = Range("parametres!Y2").Value & " " & Range("parametres!Y3").Value
        Range("H3").Value = "Date de tirage " & Now
        NumeroPage
        Range("O3").Value = NumeroPage
        EntetePied_Page
        '.ExportAsFixedFormat Type:=xlTypePDF, OpenAfterPublish:=True, Filename:=ThisWorkbook.Path & "\Récap de Caisse du mois" & Format(1, "00") & " " & Range("parametres!B2") & ".pdf"
        ImprimerFeuilleActive
    '    .Visible = False
    End With
End Sub
 

jeanba

XLDnaute Occasionnel
Au sujet de ma question sur Caller...

Je viens de voir que c'est le fameux Call + procedure ou fonction
Mais, pourquoi ta procédure bute là-dessus?

(Je rappelle que suis vraiment débutant en vba et n'ai aucune méthodologie. C'est de l'apprentissage sur le tas, donc, merci d'excuser mes questions idiotes..)
 

Lolote83

XLDnaute Barbatruc
Salut JeanBa, Gosselin, Dranreb, et les autres.
Comme je te l'ai dit dans le post#2, on peut utiliser une formule sommeprod.
Voici donc le résultat.

De plus, une copie de l'onglet Centralisation et Récap sont faites car il y a deux méthodes.
- Méthode 1 = utilisation de sommeprod avec indirect + n° ligne (W1)
- Méthode 2 = utilisation d'un tableau + sommeprod

Si je n'ai pas répondu plus tôt, ce que je n'ai reçu aucun mail concernant le suivi de cette discution et ce n'est qu'aujourd'hui, qu'en me connectant, j'ai pris connaissance de toutes les réponses.
Voili voilà.
Cordialement
Lolote83
 

Pièces jointes

  • Copie de JEANBA - Formule matricielle vba.xlsm
    168.8 KB · Affichages: 31

jeanba

XLDnaute Occasionnel
Bonjour Dranreb,

Pourrais-tu regarder à nouveau ton code ci-dessus et m'aider à le comprendre par des commentaires s'il te plaît, car je n'arrive pas à l'adpater à une situation qui se présente à moi...
(le code est celui-ci)

Code:
Sub CalculerRecap()
Dim TE(), LE&, TS(1 To 31, 1 To 15), LS&, CS&, Mois#
TE = Centralisation.UsedRange.Value
Mois = RecapMois.[A1].Value
For LE = 3 To UBound(TE, 1)
   If TE(LE, 1) = Mois Then
      LS = TE(LE, 2): CS = TE(LE, 5)
      TS(LS, CS) = TS(LS, CS) + TE(LE, 6) - TE(LE, 7)
      End If: Next LE
RecapMois.[C6:Q36].Value = TS
End Sub
 

jeanba

XLDnaute Occasionnel
Ah d'accord!
Donc, si je comprends bien, l'instruction ci-dessous peut être lue ainsi :

TE = Centralisation.UsedRange.Value
Mois = RecapMois.[A1].Value ' Donner à Mois, la valeur de la cellule A1 de la feuille "RecapMois"
For LE = 3 To UBound(TE, 1) ' Dire que LE c à d Ligne Entrée comprend les valeurs de la ligne 3 _
' à la dernière cellule de la colonne 1 de la feuille Centralisation,
If TE(LE, 1) = Mois Then ' ?
LS = TE(LE, 2): CS = TE(LE, 5) ' alors, LS c à d cellule "Ligne Sorties" correspondante =
' ??? colonne 2 et CS, c à d colonne de Sortie
TS(LS, CS) = TS(LS, CS) _ ' ???
+ TE(LE, 6) _ ' ???
- TE(LE, 7) ' ???
End If: Next LE
RecapMois.[C6:Q36].Value = TS ' RecapMois reçoit les valeurs du tableau TS c-à-d de Sorties dans l'intervalle _
' C6 à Q36

Tu l'auras compris, c'est pas très clair. Comment seul le TS est finalement considéré, où est passé le TE???
(Le plus intriguant, c'est que ça fonctionne sur le fichier test envoyé à l'époque...!!)
 

Dranreb

XLDnaute Barbatruc
' à la dernière cellule de la colonne 1 de la feuille Centralisation,
C'est plutôt à l'intersection de la colonne 1 et de la plage utilisée de la feuille.
Apparemment pour chaque ligne d'entrée il fallait cumuler ce qu'il y avait en colonne 6 - ce qu'il y avait en colonne 7 dans un emplacement dont la ligne était donnée par la colonne 2 et la colonne par la colonne 5 (déductions faites du nombre de lignes et de colonnes qui précèdent la cellule à partir de laquelle on le déchargera, bien sûr)
 

Discussions similaires

Statistiques des forums

Discussions
312 204
Messages
2 086 198
Membres
103 155
dernier inscrit
lombrik