Différence entre une fonction lancé sur VBA et une fonction sur Excel

Bonjour la team,

Est ce que vous sauriez quelles seraient les différences entres lancer une fonction à partir d'une feuille excel et une fonction à partir de VBA ?

Car j'ai une fonction qui fonctionne à partir de Vba mais qui plante dès le passage à excel

Function ThreeEven1() As Integer()

Dim numbers(2, 0) As Integer

numbers(0, 0) = 25
numbers(1, 0) = 2
numbers(2, 0) = 4

ThreeEven1 = numbers

End Function

Function eventFinal() As Variant()

Selection.Resize(3, 1).Select
 Selection.FormulaArray = "=ThreeEven1()"

End Function

Auriez vous une idée?

Merci par avance

Lucy

Bonjour

pour moi eventFinal est une sub, pas une function. Du reste elle ne donne pas de valeur à eventFInal comme cela devrait être le cas dans une fonction.

Function ThreeEven1() As Integer()

Dim numbers(0 To 2, 0 To 0) As Integer

numbers(0, 0) = 25
numbers(1, 0) = 2
numbers(2, 0) = 4

ThreeEven1 = numbers

End Function

Sub eventFinal()

Selection.Resize(3, 1).Select
Selection.FormulaArray = "=ThreeEven1()"

End Sub

je précise aussi que ThreeEven1 fonctionne seule en sélectionnant 3 cellules et en validant la fonction comme matricielle

3classeur1.xlsm (13.02 Ko)

complètement d'accord mais je cherche à faire une fonction excel qui a un tableau comme résultat et donc je ne peux passer par une procédure...

J'essaye donc des fonctions imbriqués meme si ça n'a pas beaucoup de sens en soit

Ce genre de fonction existe mais je n'y arrive pas pour l'instant!

auriez vous peut être une idée ?

Merci du retour!!

Lucy

Bonjour,

si tu veux utiliser une fonction personnalisée matricielle sur feuille, il faut sélectionner la plage de réception, saisir ta formule et valider avec Shift+Ctrl+Entrée.

Par exemple sélectionne B4:B6, saisi =ThreeEven1() que tu valides avec les 3 touches en même temps.
Et tu verras :

25
2
4

eric

2classeur2.xlsm (13.76 Ko)

complètement d'accord mais je cherche à faire une fonction excel qui a un tableau comme résultat et donc je ne peux passer par une procédure...

justement ta fonction ThreeEven1 donne bien un tableau en résultat comme dans le fichier que j'ai posté

je précise aussi que ThreeEven1 fonctionne seule en sélectionnant 3 cellules et en validant la fonction comme matricielle

3classeur1.xlsm (13.02 Ko)

hello,

merci de vos retours respectifs!

Selon vous est il possible d'intégrer la sélection de la plage de réception directement dans la fonction ? du genre

Function ThreeEven() As Integer()

Application.SendKeys "(^+)", True

Dim numbers(2, 0) As Integer

numbers(0, 0) = 25
numbers(1, 0) = 2
numbers(2, 0) = 4

Selection.Resize(UBound(numbers, 1)).Select

ThreeEven = numbers

Application.SendKeys "(^+)", False

End Function

Lucy

Non Lucy, une fonction donne comme résultat elle-même comme tu l'as écrit

Function ThreeEven() As Integer()
' ..........
ThreeEven = numbers

End Function

dans ce cas tu fais comme corrigé plus haut

Sub eventFinal()

Selection.Resize(3, 1).Select
Selection.FormulaArray = "=ThreeEven1()"

End Sub

ou

Selection.Resize(UBound(ThreeEven1) + 1, UBound(ThreeEven1, 2) + 1).FormulaArray = "=ThreeEven1()"

Il existe quand même quelques "passerelles" ou passoires, dans lesquelles une fonction peut agir sur des éléments autres que la cellule ou la macro qui l'appelle, par exemple créer une image, mais dans tous les cas elle donnera quand même un résultat au titre de la fonction. On exploite cette bizarrerie pour créer par exemple des QRCode ou afficher une image.https://www.excel-pratique.com/fr/telechargements/utilitaires/afficher-photo-selon-valeur-excel-no47...

Merci pour les propositions! je vais essayer exploiter les failles mais étant donné que ce genre de fonction existe( du genre les fonctions bloomberg )mais j'ai bien du mal à trouver la solution

peut être un autre langage est utilisé dans ce cas pour faire le lien

Une idée peut être ?

Lucy

du genre les fonctions bloomberg

ah ah j'aimerais voir (si les macros en sont pas protégées), si tu as un exemple (sinon je me renseignerai auprès des personnes qui les utilisent quotidiennement)

Je serai curieux de voir ça aussi.
Une fonction ne peut en aucun cas modifier d'autres cellules que celle(plusieurs si matricielle) où elle est inscrite.
eric

Les codes sont sûrement protégés mais je vais essayer de trouver ça ou un exemple similaire demain

je le poste dès que j'ai trouvé

merci en tout cas

lucy

Helloo !

Pour l'instant pas de news pour les codes bloomberg mais j'ai trouvé ceci! Cela permet à une fonction de modifier une autre cellule que celle ou elle est appelé, elle permet simplement de faire une copie vers une autre cellule

Function CopyCell(CopyFrom As Range, copyTo As Range)

CopyFrom.Parent.Evaluate "CopyOver2(" & CopyFrom.Address(False, False) _
                        & "," & copyTo.Address(False, False) & ")"
CopyCellContents2 = ""
End Function
Private Sub CopyOver2(CopyFrom As Range, copyTo As Range)
    copyTo.Value = CopyFrom.Value
End Sub

Voici voilou

Lucy

Lucy, je ne vois pas pourquoi

CopyCellContents2 = ""

on pourrait remplacer par

CopyCell = "Copié !"

sinon, tu m'en bouches un coin, quelle trouvaille ... comme quoi ne peut jamais dire jamais ! Bravo, toute ma gratitude, pftt c'est fort ...

bravo

Tout un chapitre intéressant https://wellsr.com/vba/2016/excel/how-to-change-another-cell-with-a-vba-function-udf/

Despite what others say, it is possible to change another cell with a VBA user-defined function. Microsoft even says it’s impossible for a custom function to change another cell’s value, but I’m going to show you a couple UDFs that prove all these people wrong.

mark twain

Donc, si je reprends ton exemple :

Function ThreeEven1()
    Evaluate "eventFinal(" & Application.Caller.Offset(0, 1).Address(False, False) & ")"
    ThreeEven1 = "matrice >>"
End Function

Private Sub eventFinal(CellToChange As Range)
Dim numbers(2, 0) As Integer
    numbers(0, 0) = 25
    numbers(1, 0) = 2
    numbers(2, 0) = 4
    CellToChange.Resize(3, 1) = numbers
End Sub
3lucy.xlsm (13.59 Ko)

c'est la magie d' Evaluate

Erreur de ma part donc je tentais des choses

Après je l'ai juste trouver sur internet! C'est un certain Ryan à qui revient tout le mérite

Il faut rendre a César ce qui appartient à César!

A lire absolument !!

Lucy

Super merciii!

je regarde ça toute suite pour l'adapter à ma macro d'origine

Lucy

Re !

L'exemple que je vous avais mis était pour finalité l'adapter à une macro qui doit imiter une fonction de bloomberg mais j'ai du mal à l'appliquer

Pourriez vous y jeter un œil ?

Il y a une discussion ouverte à ce propos avec toutes les explications! Une fonction avec comment argument ticker -> fichier à interroger durant un intervalle de date

https://forum.excel-pratique.com/excel/fonction-qui-recupere-des-donnees-filtres-et-sort-un-tableau-...

Mais l'idée je veux faire comme la fonction précédente !

Function histo(ticker As String, date1 As String, date2 As String)

Evaluate "getdata1(" & Application.Caller.Offset(0, 1).Address(False, False) & ticker & "," & date1 & "," & date2 & ")"
histo = "matrice >>"

End Function
Private Sub getdata1(CellToChange As Range, ticker As String, Datedebut As String, Datefin As String) '''

Application.ScreenUpdating = False

Dim FilePath As String
Dim wbTicker As Workbook
Dim wsTicker As Worksheet

Dim datas() As Variant

FilePath = "C:\" & ticker & ".xlsx"

If FichierExiste(FilePath) = False Then
        MsgBox "Le fichier " & ticker & " n'existe pas dans la base, veuillez le créer!"
        Exit Sub

Else:
    Set wbTicker = Workbooks.Open(FilePath)
    Set wsTicker = wbTicker.Sheets("Feuil1")

         With wsTicker
            .AutoFilterMode = False
            .Range("A2").AutoFilter Field:=1, Criteria1:=">=" & Format(Datedebut, "mm/dd/yyyy"), _
            Operator:=xlAnd, Criteria2:="<=" & Format(Datefin, "mm/dd/yyyy"), VisibleDropDown:=False
            On Error Resume Next
            Set Rng = .AutoFilter.Range.Cells.SpecialCells(xlCellTypeVisible)
            On Error GoTo 0
        End With
    If Not Rng Is Nothing Then
        With wbTicker.Worksheets.Add

            Rng.Copy .Range("A1")
            datas = .UsedRange.Value
            Application.DisplayAlerts = False
            .Delete
            Application.DisplayAlerts = True

        End With

    CellToChange.Resize(UBound(datas, 1), UBound(datas, 2)) = datas

    Else
        MsgBox "Filtre sans résultat"
    End If
    wbTicker.Close SaveChanges:=False

End If

Application.ScreenUpdating = True

Set wbTicker = Nothing: Set wsTicker = Nothing:

End Sub

Merci!!

Lucy

Rechercher des sujets similaires à "difference entre fonction lance vba"