Pb:Nommer une cellule variable dans une macro
Bonjour à tous,
Je vous contacte, car j'ai besoin de votre aide pour corriger une macro créée à partir de son enregistrement sous Excel (pas optimisée en fait, moche, mais fonctionnelle)…:?
Elle est fait pour demander de copier la cellule (variable) d'une première feuille, aller sur un site internet et coller dans l'URL, la valeur de la cellule copier et mettre le tableau souhaité dans une seconde feuille, une fois cette étape passée copier une cellule dans cette nouvelle feuille et la coller dans une troisième puis revenir sur la seconde feuille et effacer le contenu de celle-ci sans effacer la requête afin de recommencer avec une boucle, car il y a plusieurs cellules de la première feuille à copier tant que la cellule suivante de la colonne n'est pas vide… je crois que c'est clair comme cela non…
Mais pour plus de clarté, voilà ma macro
Sub Yahoo()
'
' Code_Classification_Yahoo Macro
'
Dim J As Integer
J = 18
If Sheets("feuille1").Cells(2, J) <> "" Then
Sheets("feuille2").Select
With ActiveSheet.QueryTables.Add(Connection:= _
"URL;http://fr.finance.yahoo.com/q/ls?s=" & Sheets("feuille1").Cells(2, J), Destination:=Range( _
"$B$3"))
.Name = "ls?s=" & Sheets("feuille1").Cells(2, J)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.saveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = """yfncsubtit"",15"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
Sheets("feuille2").Select
Range("C5").Select
Selection.Copy
Sheets("feuille3").Select
Range("$K$36").Select
ActiveSheet.Paste
Sheets("feuille2").Select
Range("B3:C9").Select
Application.CutCopyMode = False
Selection.QueryTable.Delete
Selection.ClearContents
J = J + 1
End If
End SubMerci d'avance pour votre aide
E.C
Bonsoir,
Si j'ai bien compris ton soucis, pour désigner la cellule Bj -> Sheets("feuille1").Cells(J, 2) ou J équivaut à la ligne et 2 à la colonne B.
Essaye ton code comme ceci :
Sub Yahoo()
' Code_Classification_Yahoo Macro
Dim J As Integer
J = 18
If Sheets("feuille1").Cells(J, 2) <> "" Then
With Sheets("feuille2")
.Select
With .QueryTables.Add(Connection:= _
"URL;http://fr.finance.yahoo.com/q/ls?s=" & Sheets("feuille1").Cells(2, J), Destination:=Range( _
"$B$3"))
.Name = "ls?s=" & Sheets("feuille1").Cells(2, J)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = """yfncsubtit"",15"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
.Range("C5").Copy Destination:=Sheets("feuille3").Range("K36")
End With
With .Range("B3:C9")
.ClearContents
.QueryTable.Delete
End With
J = J + 1
End If
End SubAmicalement
Dan
Bonsoir Dan,
J'ai repris tes corrections et la macro fonctionne… ta seconde partie est bien plus simple que celle que j'avais écrite via l'enregistreur Excel de macro.
J'ai changé la condition if par celle de while
Cependant, alors que j'ai essayé de faire varier le "K36" sur la partie Range("C5").Copy Destination:=Sheets("feuille3").Range("K36") remplacé par Range("C5").Copy Destination:=Sheets("feuille3").cells(11,i)
Avec i nouvelle variable qui commence a 36 et un second compteur i=i+1 et bien j'ai un problème d'affichage, car dans la feuille 3 en K36 j'ai une cellule vide, en K37 idem, K38 idem, K39 j'ai une valeur affichée et k40 cellule vide et k41 affichage de la valeur…
J'ai pensé qu'en fait la partie clearcontent effaçait avant que la macro puisse copier ce qui fait que de temps en temps la macro copie une cellule vide… c'est pourquoi j'ai tenté d'introduire la ligne de commande [Range("C5").Copy Destination:=Sheets("feuille3").cells(11,i)] a la fin de la première partie avant de mettre fin a la boucle endwith cpendant cela n'a rien changé et si ce n'est qu'il copie juste la première valeur en k36 et les autres cellules il les laisse vide…
J'ai repris la condition if mais c'est pareille… je sèche…
Tu en connais la raison de cet affichage????
Sinon comment trouves-tu la première partie (celle de la requête)? Est-elle optimale ou peut-elle être améliorée ?
Merci pour ton aide…et celle des autres a venir
E.C
Salut le forum
Tu donnes 2 exemples de cote à récupérer et je t'adapte la macro.
Car la on ne sait pas qui et quoi lire.
Mais avec le décalage horaire, tu auras surement déjà reçu une réponse, lors de ma connection.
Mytå
re,
à mon avis, tu as une instruction mal placée dans la boucle de la variable i.
Pas sûr de ce que je te propose sans voir ton fichier ou ta macro mais essaye avec :
- .Range("C5").Copy Destination:=Sheets("feuille3").Range("K" & i)
- mettre le i = 36 juste arès de J=18
- mettre i = i + 1 après l'instruction .Range("C5").Copy Destination:=Sheets("feuille3").Range("K" & i)
Amicalement
Dan
Bonjour à Dan, Bonjour Mytå et bonjour les tous les autres,
Voila je pense que se sera plus clair avec un fichier joint (https://www.excel-pratique.com/~files/doc/lgjSUSuivi_valeurs_v1.0.xlsm) … n'est pas Mytå!
Tout d'abord, j'ai utilisé MSN money (add on financier de Microsoft)
Voilà…
Sinon j'ai modifié suivant tes instructions Dan et rien de différent….Je ne comprends vraiment pas d'où vient le bug…
Merci pour votre aide a tous et surtout toi Dan
E.C
re,
Ton fichier est au format excel 2007. Aafin que je puisse le lire merci de le mettre au format .xls (excel 2003, 2000 ...)
A te relire
Dan
bonjour Dan,
le voila donc en format 2003...effectivement c'est peut etre plus facile comme cela!8)
https://www.excel-pratique.com/~files/doc/r3MyWSuivi_valeurs_v1.0.xls
Merci de ton aide Dan
E.C
re,
Pas facile sans avoir des données en feuille 2.
En regardant ton fichier, la macro ne correspond pas à cellle que je t'ai donnée...
Essaye ceci où j'ai corrigé :
Sub classsification_Yahoo()
' classsification_Yahoo Macro
Dim J As Integer, i As Integer
J = 5
i = 3
If Sheets("Feuille1").Cells(J, 3) <> "" Then
With Sheets("Feuille2")
.Select
With .QueryTables.Add(Connection:= _
"URL;http://fr.finance.yahoo.com/q/ls?s=" & Sheets("Feuille1").Cells(J, 3), Destination:=Range( _
"$B$3"))
.Name = "ls?s=" & Sheets("Feuille1").Cells(J, 3)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = """yfncsubtit"",15"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
.Range("C5").Copy Destination:=Sheets("Feuille3").Range("C" & i)
i = i + 1
End With
With Sheets("Feuille2").Range("B3:C9")
.ClearContents
.QueryTable.Delete
End With
J = J + 1
End If
end subTu peux aussi raccourci le code en supprimant toutes les instructions mises à FALSE. Enfin fais un essai pour voir si tout est correct.
Dan
Salut Dan,
En fait la feuille2 est juste la pour la requête...
Oui la macro ne correspondait pas tout a fait car j'ai voulu la mettre dans un nouveau dossier Excel pour l'exemple car mon dossier 1er était trop volumineux et n'avait trop rien a voir avec cette macro...
J'ai repris ta nouvelle macro et cela ne fonctionne pas non plus car en feuille3 on n'as pas, en colonne C la suite des codes Yahoo ...
En fait je viens de m'apercevoir que pour Alti il n'y a pas de page disponible pour Temps-Réel/ECN (le cours en temps réel), cependant en changeant l'adresse de la requête on peu récupérer les codes Yahoo qui sont en fait des codes Reuters quelque soit la valeur…
J'essaie et je te tiens au courant
E.C
voila la nouvelle macro avec la nouvelle requete et le probleme reste entier....
Sub classsification_Yahoo()
' classsification_Yahoo Macro
Dim J As Integer, i As Integer
J = 5
i = 3
If Sheets("Feuille1").Cells(J, 3) <> "" Then
With Sheets("Feuille2")
.Select
With .QueryTables.Add(Connection:= _
"URL;http://fr.finance.yahoo.com/q/pr?s=" & Sheets("Feuille1").Cells(J, 3), Destination:=Range( _
"$B$3"))
.Name = "ls?s=" & Sheets("Feuille1").Cells(J, 3)
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlSpecifiedTables
.WebFormatting = xlWebFormattingNone
.WebTables = "23"
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
.Range("C4").Copy Destination:=Sheets("Feuille3").Range("C" & i)
i = i + 1
End With
With Sheets("Feuille2").Range("B3:C8")
.ClearContents
.QueryTable.Delete
End With
J = J + 1
End If
End SubJe ne comprends pas trop pourquoi.... et toi
Merci de ton aide
E.C
re,
Ne peux tu pas me donner un fichier plus complet de manière à comprendre ce que tu fais, ce sera plus facile.
Je n'ai pas la possibilité d'utiliser le Query comme tu le fais pour avoir des données.
Dan
salut,
En fait j'ai essayé une boucle while et cela a très bien fonctionné... donc la macro tourne bien c'est OK
Si quelqu'un peut embellir cette macro en la simplifiant ce serait un vrai plus...
Merci a Tous et a Dan en particulier
E.C
re,
Pour cela, il faudrait voir la macro finale mais comme je te l'ai écrit vant tu peux déjà supprimer les instructions FALSE.
Dan
Nad-Dan a écrit :re,
Pour cela, il faudrait voir la macro finale mais comme je te l'ai écrit vant tu peux déjà supprimer les instructions FALSE.
Dan
ben non en fait... je l'ai fait mais il apparait alors des messages d'erreurs...
Autre suggestion?
E.C
Salut le forum
On va commencer avec un fichier qui fonctionne, avant d'aller plus loin.
A tester : Requête_Yahoo
Mytå
Mytå a écrit :Salut le forum
On va commencer avec un fichier qui fonctionne, avant d'aller plus loin.
A tester : Requête_Yahoo
Mytå
Salut Mytå,
je viens de checker ta macro ... elle est bien.
cependant, comme je l'ai écrit précédemment je recherche les code Yahoo ou Reuters adossé a un code Isin (exemple : ISIN=FR0000125486 Yahoo ou Reuters=DG.PA) c'est pourquoi j'indiquais a Dan qu'il y avait l'adresse suivante pour la requête qui était préférable pour trouver a tous les coups le code de correspondance adéquat qui est :
http://fr.finance.yahoo.com/q/pr?s=FR0000125486 (ce code ISIN est juste un exemple) ...
La requête alors doit interroger le net puis récupérer le bon code et le mettre dans la bonne cellule...
La macro de Dan est bonne en y intégrant une boucle tant que...
Et la tienne est intéressante pour son optimisation...mais la tienne copie les cours (regarde dans le lien choisi en exemple le tableau "CARTE D'IDENTITÉ" regroupe toutes les infos qui nous intéressent…
En tout les cas ta macro fonctionne
Merci de vos aides...
E.C
Re le forum
Tu veux récupérer
ISIN: FR0000125486
Code Reuters: DG.PA
Code Local : DG
Auditeur: Deloitte Touche Tohmatsu
Nombre employés: 158.628 ( 31/12/2007 )
142.500 ( 31/12/2006 )Mais quoi faire ensuite avec.
Plus le fils avance moins je comprends ta demande
Mytå
voila en fait j'avais un problème dans le traitement de cells() car je ne savais pas l'appeler pour m'apercevoir grâce a Dan que j'avais inversé les lignes et les colonnes.
la macro tel que faite a présent fonctionne bien (avec la boucle tant que) mais elle est trop lourde et pas belle...c'est pourquoi ton aide est la bienvenue...
c'est mieux comme explication...
Merci de ton aide
E.C
Re le forum
Si ta macro fonctionne, merci de joindre un fichier si tu veux de l'aide.
Sinon on passe par une requête avec un fichier .iqy qui lui permet de lire une page
web entière et ensuite de la traiter avec une macro du style.
Cells.Find(What:="abc", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).valueMytå
Merci aussi, d'utiliser répondre au lieu de citer les balises Quote ne servent à rien
Répondre est en bas de la ficelle.