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)
NextB) 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/z où z 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 WithMerci 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 SubCe 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 FunctionCordialement
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
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
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:FP2. 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:=FalseBonsoir
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