Recupérer historiques cours de bourse & mettre dans la fiche concernée

Bonjour à toutes et à tous,

je suis depuis peu à la retraite et je souhaite apprendre le VBA par l'exemple et l'exercice... 100% Débutant !

je tiens à remercier tous les intervenants du forum pour les nombreux exemples qui m'ont permis de bidouiller mes cours de bourse.

Maintenant je me heurte a un problème (cela fait une semaine que je cherche des solutions ... avant de vous soumettre le Problème), je souhaite récupérer l'historique de mes actions sur boursorama pour les mettre dans mes fiches des actions...qui ont chacune un onglet nommé avec le code court de l'action ex: ORA = Orange, BN = Danone etc...

d'avance merci de votre aide

Ps: "C'est en forgeant que l'on devient Forgeron"

Bonjour et bienvenue

Je n'ai pas bien compris comment tu as modifié le code que j'avais proposé :

                Sheets(nOm).Range("K1", "N15") = Sheets("recup_data").Cells(2, [Data].Column) & _
                Val(Split(Split(.responseText, Sheets("recup_data").Cells(2, [Data].Column))(1), Sheets("recup_data").Cells(3, [Data].Column))(0) & _
                    Sheets("recup_data").Cells(3, [Data].Column)) 'Ecrit a partir de K1 les données récupérées du web... une fiche selectionnée après l'autre...

peux-tu expliquer quelles valeurs tu souhaits récupérer ? car voici le résultat que cela donne

capture d ecran 311

Le texte récupéré du web entre les 2 paramètres indiqués sur la euille est une table html, comme ceci

"<table ______>__________</table>"

L'astuce ici du code est d'exploiter le fait qu'excel copie correctement une table en distribuant les valeurs dans les cellules, mais pour cela il faut que la copie passe par le presse papier. On ne peut donc pas affecter comme tu le fais les valeurs à une zone.

Je te propose donc le code suivant

                nOm = Sheets("recup_data").Cells(i, [REF].Column).Value ' Récupère le nom de la feuille/action
                Sheets(nOm).Select
                Range("K1").Select
                txt = Sheets("recup_data").Cells(2, [Data].Column) & _
                    Split(Split(.responseText, Sheets("recup_data").Cells(2, [Data].Column))(1), Sheets("recup_data").Cells(3, [Data].Column))(0) & _
                    Sheets("recup_data").Cells(3, [Data].Column)
                obj.SetText txt
                obj.PutInClipboard
                ActiveSheet.Paste

Bonjour Steelson,

Merci pour ton code et merci d'avoir jeté un oeil à ma modif... cela fait 3 semaines que je construit des prog avec des morceaux de code et je suis loin de maitriser le VBA, et quand je lis tes codes, ça enrichit ma bibliothèque de connaissance...

J'ai vu plusieurs codes qui étaient trés court et imbriqués pour éviter les select et autres qui ralentissent les exe de code... et effectivement vu ce que tu me donnes comme réponse je n'avais pas fait la différence entre table et lignes ou colonnes... erreur de ma part. j'avais aussi rajouté devant les 2 split un val dans l'espoir de convertir en numérique et cela me donnais en réponse 0,00 (mais que 0,00 dans la cellule K1) alors que je n'avais pas utilisé replace pour changer le "." en "," est ce normal?

Après les résultats je les copie dans d'autres tableau que je n'ai pas mis ici mais une fois fini cela pourra se faire...et tu pourras voir pleins de morceaux de code que tu as créé. Milles Mercis.

J'ai essayé le code et la je bute pour transformer le point en virgule et mettre en numérique... comme c'est un tableau... j'ai déjà cherché sur le forum sans trouver....comment convertir tout le tableau a partir de la 2eme ligne et 2 eme colonne... telle est ma question ou comment écrire directement un chiffre avec une virgule à la française émanant d'une table ?

Merci d'avance et

à bientôt de te lire

Jack

Les select sont malheureusement ici nécessaire pour recopier les données dans chaque onglet

comment convertir tout le tableau a partir de la 2eme ligne et 2 eme colonne... telle est ma question ou comment écrire directement un chiffre avec une virgule à la française émanant d'une table ?

J'ai essayé de mettre ceci
                obj.SetText Replace(txt, ".", ",")

et cela ne fonctionne pas curieux ...

On peut ajouter ceci après la recopie mais cela va ralentir !

                For Each cel In ActiveSheet.Range("L3:N15")
                    cel.Value = (Replace(cel.Value, ".", ","))
                Next
Sub Majour()
Dim nOm As String
Dim i%, k%, URL$, obj As New DataObject
k = Cells(Rows.Count, [REF].Column).End(xlUp).Row
On Error Resume Next
For i = [debut].Row + 1 To k
    DoEvents
    URL = Sheets("recup_data").Cells(i, [www].Column).Value
    On Error Resume Next
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .Send
        If .Status = 200 Then
            If i > [debut].Row Then

                nOm = Sheets("recup_data").Cells(i, [REF].Column).Value ' Récupère le nom de la feuille/action
                Sheets(nOm).Select
                Range("K1").Select
                txt = Sheets("recup_data").Cells(2, [Data].Column) & _
                    Split(Split(.responseText, Sheets("recup_data").Cells(2, [Data].Column))(1), Sheets("recup_data").Cells(3, [Data].Column))(0) & _
                    Sheets("recup_data").Cells(3, [Data].Column)
                obj.SetText txt
                obj.PutInClipboard
                ActiveSheet.Paste

                For Each cel In ActiveSheet.Range("L3:N15")
                    cel.Value = (Replace(cel.Value, ".", ","))
                Next

            End If
        End If
    End With
Next
End Sub

On peut encore triturer le code pour enlever le % et le remplacer par une division par 100 t mettre un format numérique ou % ...

Bonjour Steelson,

Merci pour ce bout de code bien utile pour me faire avancer dans mes découvertes.

J'ai comme tu dis, trituré le code, pour arriver à mes fin

J'ai utilisé :

'Remplacer le point par une Virgule

For Each cel In ActiveSheet.Range("L3:N15")

cel.Value = (Replace(cel.Value, ".", ","))

Next

' Supprimer le signe %

For Each cel2 In ActiveSheet.Range("L3:L15")

cel2.Value = (Replace(cel2.Value, "%", ""))

Next

' Convertir le tout en Numérique

For Each cel1 In ActiveSheet.Range("L3:N15")

cel1. Value = CDbl(cel1.Value)

Next

J' ai mis la colonne L3:L15 en Format pourcentage, ou on peut aussi multiplier par 100.

IL y a peut être une méthode plus classe et plus rapide pour faire cette conversion, je ne l'ai pas encore trouvé, je fouille dans différents Forums et j'en ai retenu 2 pour le fait qu'ils sont très intéressants de par l'écriture et les Infos sur les codes, choses que j'aimerais beaucoup acquérir afin de pouvoir les partager..., Excel-Pratique et Développez. Com.

Merci d'avance pour ton avis.

Jack

Ton code est très bien, dès lors qu'il récupère bien les valeurs souhaitées, et le plus important à mon sens est que tu maîtrise du coup le code que tu as produit.

différents Forums et j'en ai retenu 2 pour le fait qu'ils sont très intéressants de par l'écriture et les Infos sur les codes, choses que j'aimerais beaucoup acquérir afin de pouvoir les partager..., Excel-Pratique et Développez. Com.

Merci d'avance pour ton avis.

Excel-Pratique est mieux je suis chauvin.

Non l'autre -comme certains autres- est très bon aussi ... je me concentre sur Excel-Pratique mais parfois je vais aussi puiser des solutions ailleurs que je n'ai pas trouvées ici, sinon je poste le sujet sur ... Excel-Pratique !

Bonjour Steelson,

J'ai fait un peu vite dans mes dires... La première fois la moulinette fonctionne bien, au 2eme passage les résultats sont erronés... Ça écris tout sur une ligne et ça formate différemment les 3 colonnes ! J'ai effacé manuellement les colonnes concernées, relancé OK, puis 2ème passage Ko...!

J'en ai déduit qu'il faut que j'efface les colonnes, mettre les formats que je souhaite, avant réécriture.

Maître Steelson, suis je dans la bonne voie ?

(je suis en déplacement, je joindrais mon fichier dès mon retour)!

Jack

Après

sheets("nOm").select

, je mettrais bien un

cells.clearcontents

qui efface les données mais conserve la mise en forme, ce qui allégera la fin de la macro aussi

J'attends ton fichier.

Bonsoir Steelson,

La moulinette a avancé et même qu'elle fait ce que je souhaitais...

Cells.clearcontents

cela aurait été pas mal...mais non ça marche pas avec ma version d'excel...2007 ou c'est peut être un autre problème...

en tous cas quand je supprime, je réécris parce que la zone est vierge, quand j'efface mes résultats ne se font plus que sur une ligne ... les titres ! c'est bizarre bizarre!

comme promis voici le code de la moulinette.

il y a peut être solution a raccourcir ou synthétiser le code ... mais la je ne sais pas encore faire et j'aimerais bien en apprendre plus!

@ Bientôt de vous lire

Jack

C'est en forgeant que l'on devient Forgeron !

quand j'efface mes résultats ne se font plus que sur une ligne ... les titres ! c'est bizarre bizarre!

J'ai fait tourner 3 fois de suite la moulinette, et j'ai toujours u un résultat impeccable.

Le problème peut venir de la vitesse de connexion internet ? Dans ce cas un ajout d etemporisation après chaque chargement est peut-être nécessaire ...

                obj.SetText txt
                obj.PutInClipboard
Application.Wait Now + TimeValue("00:00:01")
                ActiveSheet.Paste

Oups oui la version que j'ai posté est celle qui ne fait pas d'erreur, c'est facile de reproduire le défaut il suffit de mettre en commentaire la ligne 'range("K:N").delete... En tout cas ça me fait l' erreur sous Excel 2007...sans suppression de colonnes.

C'est lié à la fusion des zones de titre du tableau

Dans ce cas, mets ceci

                'Range("K:N").Delete
                Range("K1").CurrentRegion.ClearContents
                Range("K1").CurrentRegion.UnMerge

Bonjour Steelson,

Merci pour ces conseils éclairés, ça marche avec currentregion. Clearcontents, plus de problèmes.

Je vais continuer mon assemblage avec les autres parties de ma moulinette de boursicote, je vais avoir le temps car je pars en balade pour 1 an en Amérique du Sud et à mon retour je la publierai sur le forum si j'ai fini.

Jack

Bonjour Steelson, bonjour le Forum,

Je suis de retour... après quelques galères, le calme est revenu...

Je viens de remettre en route mes bidouilles et j'aimerai écrire dans 2 tableaux en même temps et la ou cela se corse,

écrire 4 cellules en ligne en fonction des données reçues de boursorama dans un tableau en colonne(ça ça marche!), feuille @web et en même temps dans la feuille "Portefeuille Horaire" les 4 cellules en ligne action par action en continu sur la même ligne à la suite des précédentes 4 cellules et ceci selon le nombre d'actions inscrites dans la feuille @web...(et la ça veut pas faire comme je veux! S.O.S., HELP, HILFE, Au Secours!)

ci joint mon fichier ou j'ai mis une sub qui démarre dès l'ouverture du classeur Private Sub Workbook_Open() qui fait appel à la sub "Maj_X" a partir de 9h00 et toute les heures jusqu'à 18h00 hormis les samedis et dimanches (Bourse fermée). Le bouton dans la feuille @web permet de lancer la sub Maj_X, pour ne pas etre obligé d'attendre la prochaine heure de mise à jour.

40bourse-horaire.xlsm (75.04 Ko)

écrire 4 cellules en ligne en fonction des données reçues de boursorama dans un tableau en colonne(ça ça marche!),

Et cela se passe où parmi les macros ?

Feuil93 :

ThisWorkbook :
ThisWorkbook  Workbook_BeforeClose
ThisWorkbook  Workbook_Open

Feuil1 :

Procedures :
Procedures    ProgressbarStatusBar
Procedures    Maj_X

Fonctions :

Outils :
Outils        outils0
Outils        outils1
Outils        outils2
Outils        CreerGraphiqueIncorpore
Outils        CreerFeuilleGraphique
Outils        NommerGraphique
Outils        CompterGraphiques
Outils        SupprimerGraphique
Outils        SupprimerGraphiques
Outils        AjouterSerie
Outils        ChoisirSerie
Outils        ListeAgences_Change

en même temps dans la feuille "Portefeuille Horaire" les 4 cellules en ligne action par action en continu sur la même ligne à la suite des précédentes 4 cellules et ceci selon le nombre d'actions inscrites dans la feuille @web...

Faudrait donc ajouter un report des données ...

ci joint mon fichier ou j'ai mis une sub qui démarre dès l'ouverture du classeur

Là je ne touche à rien ?

Malheureusement déjà, il n'y a pas de correspondance possible entre les 2 onglets car les cellules (fusionnées) ne comportent pas les mêmes infos.

Sauf à considérer que c'est dans le même ordre et que

  • la ligne 6 est reportée en colonne 2
  • la ligne 7 en colonne 6
  • la ligne 8 en colonne 10 etc.

Cherche la relation entre x,y et i,j et ajoute ceci

                For J = [Data_X].Column + 1 To [Data_X].End(xlToRight).Column
                    Cells(i, J) = Split(Split(.responseText, Cells([Data_X].Row + 1, J))(1), Cells([Data_X].Row + 2, J))(0)
                    Sheets("Portefeuille Horaire").Range(x, y) = Cells(i, J)
                Next

x étant fonction de la date et de l'horaire

y étant fonction de i et de j comme évoqué ci-avant

Bonsoir Steelson,

Sauf à considérer que c'est dans le même ordre et que

la ligne 6 est reportée en colonne 2

la ligne 7 en colonne 6

la ligne 8 en colonne 10 etc.

les actions de la feuille portefeuille horaire son exactement dans le même ordre que dans feuille @web.

Et cela se passe où parmi les macros ?

Maj_X est la macro qui fait le boulot... de récupérer les données de boursorama et afficher dans les 2 tableaux les résultats...

en plus dans la hâte j'ai pas envoyé le fichier avec la bidouille que j'avais faite. Donc comme ma bidouille ne fonctionnait pas je vais prendre tes indications.

                With Sheets("Portefeuille Horaire")
                    ' La colonne date&heure en ligne 3 est nommée [Don_X]
                    x = Cells(Rows.Count, [Don_X].Column).End(xlUp).Row ' nombre de ligne colonne date&heure
                    y = Cells(x, [Don_X].Column + 1).End(xlToRight).Column 'donne la position de la cellule ou écrire par rapport date&heure 
                    .Range(x, y) = Cells(i, J)
                End With

J'ai fait un essai avec ce bout de code ... pourquoi ya pas bon ...?

Bonjour à tous,

On peut ajouter ceci après la recopie mais cela va ralentir !

For Each cel In ActiveSheet.Range("L3:N15")

cel.Value = (Replace(cel.Value, ".", ","))

Next

Moins gras et moins sucré ;-) :
Range("L3:N15").Replace What:=".", Replacement:=",", LookAt:=xlPart

eric

Rechercher des sujets similaires à "recuperer historiques cours bourse mettre fiche concernee"