Importation de données insee bug
Bonjour à tous,
Grace à l'article et à la vidéo : "Créer une macro pour importer des données d’un site Web" de Sébastien, j'avais bidouillé une macro qui fonctionnait bien.
Mais voilà, le site de l'Insee à changer de méthode de gestion de ses bases de données et utilise maintenant (depuis le 19/05/2017) le "SDMX" et ma macro ne fonctionne plus et je n'arrive pas à l'adapter : impossible de connaitre l'URL de la requete.
Avez vous une idée ?
Voici le code que j'utilisais :
Sub importer()
' recup base insee
'Id_Série à récupérer : 'ICH-IME : 001565183; Indice mensuel du coût horaire du travail révisé - Salaires et charges - Industries mécaniques et électriques
'ICH-M : 001565195; Indice mensuel du coût horaire du travail révisé - Salaires et charges - Activités spécialisées, scientifiques, techniques
'IPPIF-EE : 001652121; Indice de prix de production de l'industrie française pour le marché français - Équipements électriques
'BT03 : 001710951; Index du bâtiment - Maçonnerie et canalisations en béton
'BT08 : 001710954; Index du bâtiment - Plâtre et préfabriqués
'BT10 : 001710956; Index du bâtiment - Revêtements en plastiques
'BT41 : 001710974; Index du bâtiment - Ventilation et conditionnement d'air
'BT46 : 001710978; Index du bâtiment - Peinture, tenture, revêtements muraux
'BT47 : 001710979; Index du bâtiment - Électricité
'BT48 : 001710980; Index du bâtiment - Ascenseurs
'BT01 : 001710986; Index du bâtiment - Tous corps d'état
'ING : 001711010; Index divers de la construction - Ingénierie
'Connexion à la base de donnée de l'insee et rapatriement des indices
ActiveWorkbook.Worksheets.Add
ActiveSheet.Name = "Base Insee"
With Sheets("Base Insee").QueryTables.Add(Connection:= _
"URL;
" _
, Destination:=Sheets("Base Insee").Range("$A$1"))
.Name = "idbankMultiple"
.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
'Mise en forme de la feuille
compteur = 0
For ligne = 1 To 50
If Sheets("Base Insee").Cells(ligne, 1) = "Identifier" Then
compteur = ligne
Exit For
End If
Next
MsgBox ("trouvé : ligne = " & compteur)
Rows(1 & ":" & compteur - 1).EntireRow.Delete 'suppression des lignes 1 à "Identifier"
Cells.Select 'vérification de "non fusion" de cellules
Selection.UnMerge
Range("G:G,I:I,K:K,M:M,O:O,Q:Q,S:S,U:U,W:W").Select 'suppression des colonnes G I K M O Q
Selection.Delete Shift:=xlToLeft
Cells.Select
Selection.ColumnWidth = 9.38
Range("A3").Select 'création de la ligne de titre et attribution des intitulés des indices
ActiveCell.FormulaR1C1 = "Année"
Range("B3").Select
ActiveCell.FormulaR1C1 = "Mois"
Range("C3").Select
ActiveCell.FormulaR1C1 = "ICH_IME"
Range("D3").Select
ActiveCell.FormulaR1C1 = "ICH_M"
Range("E3").Select
ActiveCell.FormulaR1C1 = "IPPIF_EE"
Range("F3").Select
ActiveCell.FormulaR1C1 = "BT03"
Range("G3").Select
ActiveCell.FormulaR1C1 = "BT08"
Range("H3").Select
ActiveCell.FormulaR1C1 = "BT10"
Range("I3").Select
ActiveCell.FormulaR1C1 = "BT41"
Range("J3").Select
ActiveCell.FormulaR1C1 = "BT46"
Range("K3").Select
ActiveCell.FormulaR1C1 = "BT47"
Range("L3").Select
ActiveCell.FormulaR1C1 = "BT48"
Range("M3").Select
ActiveCell.FormulaR1C1 = "BT01"
Range("N3").Select
ActiveCell.FormulaR1C1 = "ING"
Rows("20:300").Select 'Purge des lignes 20 à fin
Selection.Delete Shift:=xlUp
'création du tableau des données
Range("A3:N19").Select
Range("N19").Activate
Sheets("Base Insee").QueryTables("idbankMultiple").Delete
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$3:$n$19"), , xlYes).Name = _
"Tableau1"
Range("Tableau1[#All]").Select
' ActiveSheet.ListObjects("Tableau1").TableStyle = "TableStyleLight12"
ActiveSheet.Name = "Base Insee"
ActiveSheet.ListObjects("Tableau1").Name = "BASE"
'mise en forme du tableau
Range("BASE[[ICH_IME]:[ING]]").Select
Range("N19").Activate
Selection.NumberFormat = "0.0"
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
End With
Range("BASE[Mois]").Select
With Selection
.HorizontalAlignment = xlRight
End With
Range("BASE[Année]").Select
With Selection
.HorizontalAlignment = xlCenter
End With
'Datage de la feuille accueil
'Range("c1").Select
Rows("1:2").Select
Rows("1:2").Insert
Range("c1").Select
ActiveCell.FormulaR1C1 = "Mise à jour du :"
Range("c1").Select
With Selection
.HorizontalAlignment = xlRight
End With
Range("d1").Select
Range("d1").FormulaLocal = "=MAINTENANT()"
Selection.NumberFormat = "m/d/yyyy"
Range("e1").Select
Range("e1").FormulaLocal = "=MAINTENANT()"
Selection.NumberFormat = "h:mm"
Range("d1:e1").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select
end sub
Merci d'avance de vos réponses.
Ivan00ff
Bonjour,
Oulà, ton code est lourd!
Par exemple (avec excel 2016), pour importer ta première série '001565183' dans la feuil1, il suffit d'écrire :
Sub Import()
Dim Site As String
Site = "https://bdm.insee.fr/series/sdmx/data/SERIES_BDM/001565183"
Application.DisplayAlerts = False
Sheets("Feuil1").UsedRange.ClearContents
ThisWorkbook.XmlImport URL:=Site, ImportMap:=Nothing, Overwrite:=True, _
Destination:=Sheets("Feuil1").Range("A1")
Application.DisplayAlerts = True
End SubPierre
Bonjour,
pour 2010 tu devrais installer MS Office Power Query.
Plus récent il s'en sortira peut-être mieux, et surtout beaucoup plus convivial pour les importations.
En paramétrant la mise à jour à l'ouverture je pense que tu peux te passer de macro.
eric
Bonjour,
Merci de vos réponses.
pierrep56 : Qu'entends tu par code lourd ? et je suis sur office 2010 pro alors est-ce que ta solution est viable ?
eriiic : je ne connaissais pas Power Query. Dans tous les cas je creuse et je reviens vers vous...
Merci encore.
ivan00ff
Bonjour,
Les 'Range(machin).select' est un exemple type de lourdeur inutile. On peut écrire plus simplement Range("A3")="Année" par exemple.
Maintenant, s'il s'agit d'écrire une ligne d'entête personnalisée on peut écrire :
Dim Entete As Variant
Entete = Array("Annéee", "Mois", "ICH_IME", "etc ...")
Sheets("Base Insee").Range(Cells(3, 1), Cells(3, UBound(Entete) + 1)) = EnteteDans cet exemple : 3 lignes au lieu de 28, ton code gagnera en lisibilité.
Pour le code proposé hier, je n'ai pas de version 2010, je ne peux donc pas assurer que c'est compatible. En revanche c'est parfaitement fonctionnel avec Excel 2016.
Pierre
Bonjour pierre,
C'est la que l'on voit le pro du bidouilleur !!! et cela veut aussi dire que j'ai un paquet de macros à modifier avec ton code
Je n'ai pas encore testé ton code pour l'importation web.
Je vous tiens au courant.
ivan
Ok, tant qu'on y est : pour horodater ton import tu insères des formules puis tu fait un copier/coller/valeurs-seules pour 'fixer' l'horodatage.
On peut aussi écrire la date et l'heure directement 'en dur' en remplaçant la quinzaine de lignes de la fin par :
With Sheets("Base Insee")
.Range("C1").Value = "Mise à jour du :"
.Range("C1").HorizontalAlignment = xlRight
.Range("D1").Value = Format(Now(), "dd/mm/yyyy")
.Range("E1").Value = Format(Now(), "hh:nn")
End WithPierre
Bonjour,
En exécutant la macro "Series()", ci-dessous, on récupère les 12 tableaux souhaités dans 12 onglets + horodatage.
Fonctionnel sous excel 2016
Sub Series()
Dim IdBank As Variant, i As Byte
IdBank = Array("001565183", "001565195", "001652121", "001710951", _
"001710954", "001710956", "001710974", "001710978", _
"001710979", "001710980", "001710986", "001711010")
For i = 0 To UBound(IdBank)
Import IdBank(i)
Next i
End Sub
Sub Import(Idbk As Variant)
Dim Site As String, Sht As Worksheet
Site = "https://bdm.insee.fr/series/sdmx/data/SERIES_BDM/" & Idbk
Application.DisplayAlerts = False
Set Sht = Sheets.Add(, ActiveSheet)
Sht.Name = Idbk
With Sheets(Idbk)
ThisWorkbook.XmlImport URL:=Site, ImportMap:=Nothing, Overwrite:=True, _
Destination:=.Range("A3")
.Range("A1").Value = "Mise à jour du :"
.Range("A1").HorizontalAlignment = xlRight
.Range("B1").Value = Format(Now(), "dd/mm/yyyy")
.Range("C1").Value = Format(Now(), "hh:nn")
End With
Application.DisplayAlerts = True
Set Sht = Nothing
End SubBonjour,
Pierre t'es génial.
J'ai testé les 2 solutions proposées une partie de la journée d'hier et je n'arrivais à rien... je reviens sur le forum ce soir et la, une soluce qui marche du premier coup
Merci encore mille fois et je passe le post en résolu.
Ivan
Bonjour a tous
La macro que pierre m'avait écrite la semaine dernière fonctionnait super et ce matin, catastrophe, elle ne fonctionne plus avec un message d'erreur "le systeme ne trouve pas l'objet spécifié" et bloque sur la ligne :
ThisWorkbook.XmlImport URL:=Site, ImportMap:=Nothing, Overwrite:=True, _
Destination:=.Range("A3")
Je ne comprends pas pourquoi, rien n'a été changé dans le code.
Une idée ou une solution ?
Ivan
(J'ai décoché le "résolut" pour rester dans le même fil...)
Je viens de réessayer et ça fonctionne de nouveau !!! Je suppose donc que cela venait du site le Insee ....
Y a t-il un moyen de détecter le pourquoi du comment ?