Crééer, pour une plage de cellules données, des onglets

Bonjour,

Je suis débutant sur VBA. J'ai deux problèmes :

A) Je souhaiterais créer une macro qui me permettrait, pour toutes les données d'une plage de cellule, créer autant d'onglets qu'il y a de celulles non vides dans cette plage de données. Je souhaiterais également que ces onglets prennent automatiquement le nom des cellules de cette plage.

Exemple : j'ai une plage de données dans les cellules D4 à Dx (x étant un chiffre qui peut varier et étant défini par la dernière cellule non vide de la plage. Je souhaiterais qu'en cliquant sur un bouton (le bouton est déjà créé et permet de lancer la macro) la macro crééer autant d'onglets qu'il y a de plages non vides et que ces onglets prennent les noms des cellules D4 à Dx.

Je vous copie-colle la macro que j'ai écrite (uniquement la partie qui concerne ce problème, j'exclus donc notamment la partie relative au bouton) :

Sub Importation_donnees_bloomberg()

Dim Portefeuille As Sheets
Dim TEMP As Sheets
Dim Numero_Ligne As Integer
Dim Nom As String

Sheets("TEMP").Cells().Clear

Sheets("Portefeuille").Activate

Numero_Ligne = Range("D100").End(xlUp).Row + 1
Nom = Cells(4, Numero_Ligne)
Listeactions = Range(Cells(4, 4), "Nom")

For Each cell In Range("Listeactions")

Sheets.Add After:=Sheets(Sheets.Count)

 Next

B) Je souhaiterais également que, pour les données de la plage B4 à Bx (x étant un chiffre qui peut varier et étant défini par la dernière cellule non vide de la plage. Je souhaiterais qu'en cliquant sur un bouton (le bouton est déjà créé et permet de lancer la macro) la macro importe les données d'une page web et les copie-colle sur chacun des onglets précédents. La page web que je souhaite copier-coller correspond à l'adresse suivante : URL;http://www.bloomberg.com/quote/zz correspond aux données de chacune des cellule de la plage B4 à Bx.

Je vous copie-colle le code de l'importation des données :

Numero_Ligne1 = Range("C100").End(xlUp).Row + 1
Nom1 = Cells(3, Numero_Ligne1)
Listeactions1 = Range(Cells(3, 4), "Nom1")

For Each cell In Range("[b]Listeactions1[/b]")

    With Sheets("TEMP").QueryTables.Add(Connection:= _
        "URL;http://www.bloomberg.com/quote/"listeactions1"", Destination:=Sheets("cf point A du message").Range("$B$4"))
        .Name = "listeactions1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With

Merci beaucoup pour votre aide.

Bon dimanche !

Max

Bonjour

Pour la question 1

Ce code (trouvé sur le Forum) crée les onglets dont la liste est en colonne A de la feuille active

Option Explicit
Sub Creation()
Dim J As Long
Dim Ws As Worksheet
  Application.ScreenUpdating = False
  Set Ws = ActiveSheet
  For J = 1 To Ws.Range("A" & Rows.Count).End(xlUp).Row
    If FeuilleExiste(Ws.Range("A" & J).Value) = False Then
      Sheets.Add after:=Sheets(Sheets.Count)
      ActiveSheet.Name = Ws.Range("A" & J)
    End If
  Next J
  Ws.Select
End Sub

Ce Code permet de contrôler que le fichier ne contient pas déjà la feuille à créer.

Function FeuilleExiste(Nom As String) As Boolean
  On Error Resume Next
  FeuilleExiste = Sheets(Nom).Name <> ""
  On Error GoTo 0
End Function

Cordialement

Merci pour votre aide.

Néanmoins, Excel me précise bloque sur "Option Explicit" et me signale "instruction incorrecte dans une procédure". Pouvez vous svp m'aider ?

Merci beaucoup.

Cordialement.

Bonjour

supprime cette ligne "Option explicit" car tu as certainement dans une autre macro des variables non déclarées.

Cordialement

J'ai bien supprimé ce que tu m'as dit et pourtant ca ne marche pas Rien ne se passe. C'est comme si Excel n'appliquait que la première procédure.

Je te copie-colle mon code :

Sub Importation_donnees_bloomberg()

Dim x As Integer

Dim Portefeuille As Sheets

Dim TEMP As Sheets

Dim C4 As Range

Dim J As Long

Dim Ws As Worksheet

Sheets("TEMP").Cells().Clear

Sheets("Portefeuille").Activate

Application.ScreenUpdating = False

End Sub

'Créer autant d'onglet qu'il y a de lignes

Sub Creation()

Function FeuilleExiste(Nom As String) As Boolean

On Error Resume Next

FeuilleExiste = Sheets(Nom).Name <> ""

On Error GoTo 0

End Function

Set Ws = ActiveSheet

For J = 1 To Ws.Range("D" & Rows.Count).End(xlUp).Row

If FeuilleExiste(Ws.Range("D" & J).Value) = False Then

Sheets.Add after:=Sheets(Sheets.Count)

ActiveSheet.Name = Ws.Range("D" & J)

End If

Next J

Ws.Select

End Sub

Peux tu stp m'expliquer ce que je dois faire et pourquoi ? Merci beaucoup !

Bonjour

Pour ne pas te laisser tomber, je fais remonter ton message pour d'autres plus doués que moi en VBA.

L'exemple de code que je t'ai donné est testé et fonctionne. Pour adapter, j'avoue ne pas être asses qualifié.

Cordialement

Bonjour

Il est impératif que tu joignes une copie de ton fichier, car à la lecture de tes macros, il restent beaucoup d'inconnu

Bonjour le fil,

Je m'interroge sur le bien fondé d'un échange que j'ai fait entre Firefox et Google:

le 1er m'interdisait (à l'époque) certaines fonctionnalités avec certains sites. (non re-testé depuis)

le 2nd m'occasionne quelques soucis en copier-coller, du même type, semble t'il que ceux rencontrés sur le post de maxs, à savoir :

lors d'un copier-coller, Google rajoute des espaces insécables à chaque ligne; soit en 1er caractère, soit en fin (invisibles sous Excel

sauf en cliquant dans la fin de barre de formule ou à son début)

dans ce post, il semblerait que tous les espaces aient été transformés en insécables, d'où non fonctionnement probable.

Par ailleurs, s'agissant de trois macros distinctes, il manquerait les 2 à 5 premières lignes Option explicit, ainsi que le End Sub pour la macro de création (l'autre ne fait que vérifier l'existant)

EDIT : de même pour la seconde (placée en 1er ???) dont il faudrait retirer la ligne Sub Creation() (c'est celle de vérif)

Je suis toujours aussi nul en VBA, donc veuillez pardonner cette intervention si elle s'avère erronée.

Bonne suite

Cordialement

Bonjour Banzai,

Ci-joint, le fichier Excel. A ta dispo pour toute précision.

Merci pour ton aide.

Cdt,

Bonsoir

Si j'ai bien compris

Tu veux une page total dans laquelle on récupère URL;http://www.bloomberg.com/quote/FP:FP.

Ensuite tu veux les pages BNP Paribas, Veolia, Vivendi, Peugeot et France Telecom dans lequelles on copie URL;http://www.bloomberg.com/quote/NEO:FP.

Tu t'occupes de récupérer les données issues de ces différentes page pour les placer dans ta page "Portefeuille" ?

Si ce n'est pas ça expliques bien ce que attends, parce que j'ai des doutes

tu as tout compris.

Bonsoir

A vérifier

Bonjour Banzai64,

Désolé pour le délai de réponse, j'ai eu pas mal de boulot cette semaine.

La macro que tu as faite correspond tout à fait à ce que je souhaitais à deux choses près :

1. je souhaiterais que, dans chaque onglet créé (BNP, Vivendi, etc), la macro aille chercher les données du site web de l'action concernée à partir des codes apparaissant dans la colonne C.

exemple :

-pour Neopost, la macro devrait aller chercher les données du site suivant :

http://www.bloomberg.com/quote/NEO:FP

-pour Veolia, la macro devrait aller chercher les données du site suivant :

http://www.bloomberg.com/quote/VIE:FP

2. L'onglet "TEMP" ne sert plus à rien dans la mesure où, au départ, je l'avais utilisé comme test.

Encore merci pour ton aide !

cdt,

Bonjour

Je ne comprends pas trop

Ce que la macro est sensée faire

Elle crée les pages (Total,BNP ......) et elle copie les données issues des sites

Pour TOTAL du site FP:FP

et pour BNP Paribas et suivant du site NEO:FP

reprends ton fichier et tu verras que Total est associé à FP:FP (colonne C "Code Bloomberg")

et les autres sont associés à NEO:FP (colonne C "Code Bloomberg")

Je ne sais même pas d'où tu sors "VIE:FP" (pas marqué dans le fichier)

Pour la feuille Temp ce n'est pas le plus gènant, on peut la créer au départ et la supprimer à la fin

Excuse moi, je suis parti d'une autre version du fichier.

Puis, il faudrait que la macro récupère les données et les mette dans les colonnes AD à AN de l'onglet "portefeuille" (tu auras remarqué que je l'avais fait pour Total. Or, je ne sais le "généraliser" quelle que soit l'action.)

Merci !

Bonjour

Pourtant j'avais posé la question : Faut lire les messages

Banzai64 a écrit :

Tu t'occupes de récupérer les données issues de ces différentes page pour les placer dans ta page "Portefeuille" ?

Je veux bien essayer

Il faut que tu fasses un tableau en indiquant pour telle cellule, ce que tu cherches exactement et ce que tu veux comme résultat

Exemple

colonne AD on recherche"......." et on récupère la cellule à droite ( ou 3 cellules à gauche ou .... etc..)

Colonne AE ......

Une fois les données récupérées tu gardes les pages avec les données du site ?

Salut Banzai,

D'abord, merci beaucoup pour le temps que tu as consacré à m'aider.

Comme je me débrouille pas mal sur Excel, j'ai essayé d'utiliser au maximum mes compétences Excel. J'ai donc pris les données qui m'intéressaient dans mon onglet test "TEMP" puis je les ai collées dans les colonnes AD à AN de la feuille "Portefeuille". Puis, je retravaille les données avec des formules excel pour les intégrées dans la colonne E puis H à S. Ce que je souhaiterais c'est qu'automatiquement la macro cherchent les données des pages de chaque titre (Total, BNP, etc) et les mette dans les colonnes AD à AN. Et c'est ca que je ne réussis pas à faire. Pourrais tu stp m'aider ?

Merci beaucoup.

Bonne soirée.

 Sheets("Temp").Select
    Cells.Find(What:="As of ", after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AN4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Sheets("Portefeuille").Select
    Range("B4").Select
    Selection.Copy
     Sheets("Temp").Select
    Cells.Find(What:=Sheets("Portefeuille").Range("B4" & " "), after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Range("B63").Select
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AD4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Sheets("Temp").Select
    Cells.Find(What:="Exchange:", after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AE4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Sheets("TEMP").Select
    Cells.Find(What:="sector", after:=ActiveCell, LookIn:=xlFormulas, LookAt _
        :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AF4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Sheets("TEMP").Select
    Cells.Find(What:="industry", after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AG4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Sheets("TEMP").Select
    Cells.Find(What:="sub-ind", after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AH4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    Sheets("TEMP").Select
    Cells.Find(What:="Market Cap", after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Range("C100").Select
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AI4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False

    Sheets("TEMP").Select
    Cells.Find(What:="Price/Book", after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Range("C103").Select
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AJ4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

 Sheets("TEMP").Select
    Cells.Find(What:="Price/Sale ", after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Range("C104").Select
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AK4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

  Sheets("TEMP").Select
    Cells.Find(What:="Dividend Indicated Gross Yield", after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Range("C105").Select
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AL4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

      Sheets("TEMP").Select
    Cells.Find(What:="Cash Dividend ", after:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    Range("C106").Select
    Selection.Copy
    Sheets("Portefeuille").Select
    Range("AM4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Bonsoir

maxs a écrit :

Pourrais tu stp m'aider ?

dans les limites de me connaissances bien sur

Mais je t'ai demandé

Banzai64 a écrit :

Je veux bien essayer

Il faut que tu fasses un tableau en indiquant pour telle cellule, ce que tu cherches exactement et ce que tu veux comme résultat

Exemple

colonne AD on recherche"......." et on récupère la cellule à droite ( ou 3 cellules à gauche ou .... etc..)

Colonne AE ......

Une fois les données récupérées tu gardes les pages avec les données du site ?

Et n'as pas répondu

la balle est dans ton camp

Dans ta page tu cherches "Market Cap" mais tu récupères C100, pourquoi chercher ?

Et ce n'est pas le seul cas

Je vais prendre l'exemple de l'action totale dans l'onglet "Total" donc :

Précisions :

  • les colonnes AD à AN se trouvent dans l'onglet "portefeuille".
  • les cellules citées (B63, B56, etc) , ci-dessous, se trouvent dans les onglets des actions (total, bnp, etc)
  • chaque fois que j'écris qu'il faut prendre une donnée, il s'agit de prendre l'ensemble des données. Puis, par une formule excel dans les colonnes E et H à S de l'onglet "portefeuille", je les "retravaille".
  • pour répondre à ta question "Dans ta page tu cherches "Market Cap" mais tu récupères C100, pourquoi chercher ?", je fais cela car je ne sais pas comment "programmer" de prendre la cellule à côté. Tu as raison, ca n'a pas beaucoup de sens.

colonne AD : il faut prendre le cours de l'action. Ce cours se trouve une cellule en dessous du code de l'action (FP:FP) càd dans la cellule B63

colonne AE : il faut prendre les données de la cellule qui contient le texte "Exchange". Dans l'exemple, il s'agit de la cellule B56

colonne AF : il faut prendre les données de la cellule qui contient le texte "Sector". Dans l'exemple, il s'agit de la cellule B57

colonne AG : il faut prendre les données de la cellule qui contient le texte "Industry". Dans l'exemple, il s'agit de la cellule B58

colonne AH : il faut prendre les données de la cellule qui contient le texte "Sub-Industry". Dans l'exemple, il s'agit de la cellule B59

colonne AI : il faut prendre les données de la cellule à droite de celle qui inclue le texte "Market Cap (M EUR)". Dans l'exemple, il s'agit de la cellule C100

colonne AJ : il faut prendre les données de la cellule à droite de celle qui inclue le texte "Price/Book (mrq)". Dans l'exemple, il s'agit de la cellule C103

colonne AK : il faut prendre les données de la cellule à droite de celle qui inclue le texte "Price/Sale (ttm)". Dans l'exemple, il s'agit de la cellule C104

colonne AL : il faut prendre les données de la cellule à droite de celle qui inclue le texte "Dividend Indicated Gross Yield". Dans l'exemple, il s'agit de la cellule C105

colonne AM : il faut prendre les données de la cellule à droite de celle qui inclue le texte "Cash Dividend (EUR)". Dans l'exemple, il s'agit de la cellule C106

colonne AN : il faut prendre les données de la cellule qui contient le texte "As of". Dans l'exemple, il s'agit de la cellule B71

J'espère que j'ai été clair. Si ce n'est pas clair, n'hésite pas à me le dire. J'ai vraiment essayé d'être précis.

Merci encore !!

Bonsoir

Ça au moins c'est une réponse claire pour cette question

Alors un petit effort encore

Banzai64 a écrit :

Une fois les données récupérées tu gardes les pages avec les données du site ?

Et après ta réponse je commence la macro

Rechercher des sujets similaires à "creeer plage donnees onglets"