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 Sub

Pierre

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)) = Entete

Dans 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 mais effectivement cela sera plus lisible et j'y passerai aussi moins de temps.

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 With

Pierre

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 Sub

Bonjour,

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 (et sous excel 2010).

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 ?

Rechercher des sujets similaires à "importation donnees insee bug"