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

Désolé pour les espacements!

Ben, j'essaierai de mon côté !

Comment décide t'on de la quantité de guillemets qu'il faut mettre ?

J'imagine que c'est pour le faire connaitre un string mais je ne saisis pas la chose

Voilà, tu as compris, il faut mettre l'onglet entre guillemets, mais comme evaluate demande aussi à mettre en guillemets, il faut alors les doubler, puis les tripler pour y passer les valeurs. Enfin bref cela m'a surpris et j'avoue que je reste perplexe, mais c'est comme cela que ça marche.

En javascript on n'a pas ce problème car apostrophes et guillemets se valent et donc peut être utilisés alternativement sans cette gymnastique. Idem php on peut les omettre.

tu as oublié 1 après remplace

Function recopie1(copieDE As Range, copieVERS As Range)

    Dim ongletDE As String, ongletVERS As String
    Dim classeurDE As String, classeurVERS As String

    ongletDE = copieDE.Parent.Name
    ongletVERS = copieVERS.Parent.Name

    classeurDE = copieDE.Parent.Parent.Name
    classeurVERS = copieVERS.Parent.Parent.Name

    Evaluate "remplace1(" & copieDE.Address(False, False) & ",""" & ongletDE & """,""" & classeurDE & """," _
                        & copieVERS.Address(False, False) & ",""" & ongletVERS & """,""" & classeurVERS & """)"
    recopie1 = Now

End Function

Private Sub remplace1(copieDE As Range, ongletDE As String, classeurDE As String, copieVERS As Range, ongletVERS As String, classeurVERS As String)

    For i = 1 To Workbooks(classeurDE).Sheets(ongletDE).Range(copieDE.Address).Rows.Count
        For j = 1 To Workbooks(classeurDE).Sheets(ongletDE).Range(copieDE.Address).Columns.Count
            Workbooks(classeurVERS).Sheets(ongletVERS).Range(copieVERS.Address).Offset(i - 1, j - 1) = Workbooks(classeurDE).Sheets(ongletDE).Range(copieDE.Address).Cells(i, j)
        Next
    Next

End Sub
5ladestination.xlsm (15.60 Ko)
5masource.xlsx (7.92 Ko)

Petite question! Comment décide t'on de la quantité de guillemets qu'il faut mettre ?

Pour comprendre ce point, remplace evaluate par debug.print, et dans mon cas on a ceci

remplace1(C3:D4,"Feuil1","masource.xlsx",B2,"Feuil1","ladestination.xlsm")

Helloo Steelson,

Finalement j'ai réussi !!!

J'ai changer mon approche et j'ai utilisé le modèle ADO

Function flute(ticker As String, champs As String, dateDebut As String, dateFin As String)

    rngFunction = Application.Caller.Address(False, False)
    Evaluate "extraction(""" & ticker & """,""" & champs & """,""" & dateDebut & """,""" & dateFin & """," & rngFunction & ")"
    flute = ticker

End Function
Sub extraction(ticker As String, champs As String, dateD As String, dateF As String, rng As Range)
    Dim Source As ADODB.Connection
    Dim Rst As ADODB.Recordset
    Dim ADOCommand As ADODB.Command
    Dim Fichier As String, Feuille As String

    Feuille = "Feuil1$"

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

    Set Source = New ADODB.Connection
    Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Fichier + ";Extended Properties=Excel 12.0;"

    Set ADOCommand = New ADODB.Command
    With ADOCommand
        .ActiveConnection = Source
        .CommandText = "SELECT DateValue,[" & champs & "] FROM [" & Feuille & "] WHERE DateValue>= #" & dateD & "# And DateValue <= #" & dateF & "# GROUP BY DateValue,[" & champs & "]"
    End With

    'DateValue corresponds au nom de la colonne contenant les dates 

    Set Rst = New ADODB.Recordset
    Rst.Open ADOCommand, , adOpenKeyset, adLockOptimistic

    Set Rst = Source.Execute("SELECT DateValue,[" & champs & "] FROM [" & Feuille & "] WHERE DateValue>= #" & dateD & "# And DateValue <= #" & dateF & "# GROUP BY DateValue,[" & champs & "]")

    rng.Offset(1, 0).CopyFromRecordset Rst

    Rst.Close
    Source.Close
    Set Source = Nothing
    Set Rst = Nothing
    Set ADOCommand = Nothing
End Sub

il faut activer la référence Microsoft ActiveX Data Objects x.x Library

et ensuite lancer la fonction depuis excel avec les arguments entre guilletmets et on peut aussi trier par les champs( du coup les colonnes du fichier)!!

Merci encore pour tout!!!

Lucy

En effet, cela évite d'ouvrir la source ! bien vu (j n'y avais pas pensé).

Bonsoir à tous !

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

@Steelson Je trouve cette application très intéressante (Merci Lucy) mais j'avoue que je ne suis pas aussi bon que vous et j'ai du mal à comprendre tous le code et comment il interagit, est-ce possible de le commenter ?

Merci et bonne soirée !

Baboutz

Oui Baboutz, je vais essayer d'être clair.


Cette fonction est une fonction classique appelée ThreeEven1 qui se termine par ThreeEven1 = "quelque chose", donc la cellule qui appelle cette fonction recevra ce "quelque chose", en l'occurrence matrice >>, mais au passage elle lance via Evaluate une autre sub eventFinal (le choix des noms, c'est du canadien !)

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

Cette autre sub tout aussi classique effectuera un calcul ici simplifié, c'est même juste une affectation de valeurs à un tableau, et ce tableau sera appliqué à une range de 3 lignes et une colonne. Cette range est définie dans la fonction ci-dessus comme étant celle juste à droite

Application.Caller.Offset(0, 1)

de la cellule appelant la fonction ThreeEven1

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

Et voilà comment une fonction arrive aussi à écrire dans d'autres cellules que celle appelant la fonction ... ce qui ne devrait pas exister.

@Baboutz

Ce qu'i faut retenir, c'est que Lucy s'est lancée dans la recherche fondamentale excel, aux confins de l'impossible, et là elle a touché le graal en découvrant la possibilité aussi via une fonction d'ouvrir sans ouvrir un fichier excel ! Du Grand Art.

Bonjour Steelson !

Ah le Canada ! Cela explique vos messages tardifs heure française !

Merci beaucoup, c'est très clair de mon côté ! Ce n'était pas si compliqué en fait !

Merci encore et bonne journée (nuit ?),

Baboutz

J'habite (encore) le "vieux continent" !

Ahah d'accord

@Baboutz

Ce qu'i faut retenir, c'est que Lucy s'est lancée dans la recherche fondamentale excel, aux confins de l'impossible, et là elle a touché le graal en découvrant la possibilité aussi via une fonction d'ouvrir sans ouvrir un fichier excel ! Du Grand Art.

Très fort en effet ! Je vais essayer de me faire un fichier Excel avec ce qu'elle a réussi à faire, je n'en ai pas forcément besoin dans l'immédiat mais ça pourra toujours me servir par la suite.

Merci !

Bonjour à tous,

C'est avant tout grâce à vous tous merci encore! J'ai énormément apprise

Je vais continuer de tester evaluate de différente manière pour voir les limites, je ferai suivre

Bien à vous

Lucy

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