EXCEL, VBA : obtenir les informations juridiques d’une société à l’aide de l’API de Pappers.fr

La collecte d’informations qualifiées sur les tiers avec lesquels une entreprise est en affaire est primordiale surtout dans le contexte de crise actuel. Par ailleurs, cette pratique répond à des obligations légales en rapport avec l’évaluation du risques de contrôle interne (PAF) ou encore la lutte contre le blanchiment, la corruption et le financement du terrorisme (loi SAPIN 2…).

Ce processus de collecte gagne à être systématisé et automatisé. Les API (Application Programming Interface ou interface de programmation applicative) aident à développer ces pratiques.

Pappers.fr API accueil

Un API assure l’interface entre deux systèmes. Par exemple, les logiciels de paye télétransmettent les Déclarations Sociales Nominatives (DSN) vers les serveurs de l’État par l’intermédiaire d’un API.

Le fonctionnement d’un API est simple. Un logiciel envoie une requête à un site internet ou à un autre logiciel par le biais de son API. Le site internet exécute la requête, interroge ses bases de données et renvoie le résultat au logiciel, qui intègre ses données dans son processus de calcul. Les API assurent ainsi l’interaction entre des logiciels d’éditeurs différents.

Excel est en capacité d’interroger un API web (protocole HTTP). A titre d’exemple, la feuille de calcul Excel (fournie en libre téléchargement) permet d’interroger, à l’aide de requêtes, la base de données d’informations juridiques Pappers.fr grâce son API.

Pour utiliser l’API Pappers.fr, il est nécessaire de s’inscrire gratuitement sur le site. Suite à cette inscription, l’utilisateur obtient un Token (identifiant unique personnel) qui sert de clef pour communiquer avec Pappers.fr. La feuille de calcul n’est utilisable qu’après insertion de ce token dans le code VBA (à la place des XXXXX de la ligne Const Pappers_Token = “api_token=XXXXX”). Pour accéder au code VBA, il faut ajouter le menu Développeur au ruban de menus d’Excel puis cliquer sur le bouton Visual Basic.

La version gratuite de l’API Pappers permet de consulter dix mille fiches entreprises par mois et mille téléchargements de documents par mois, ce qui répond aux besoins les plus usuels.

Paramètres de la requête envoyée à Pappers (QUERY PARAMETERS) et statuts de la réponse (RESPONSES) :

Pappers.fr API Requête

Exemple de requête :

https://api.pappers.fr/v1/entreprise?api_token=XXXXXXXX&siren=542065479

Réponse de l’API pour le SIREN 542 065 479 (PSA AUTOMOBILES) :

Pappers.fr PSA 542 065 479 html

La réponse de Pappers comprend quatre statuts différents. Si le SIREN existe (et que le Token est reconnu), la réponse renvoyée comprend le statut 200 et les champs de données correspondant à la fiche juridique.

Extrait des champs disponibles sur l’interface Pappers.fr :

Pappers.fr API Réponse requête

La feuille de calcul ci-après interroge la base Pappers et restitue les données suivantes :

Pappers.fr API Excel

L’utilisateur saisit un numéro SIREN et clique sur le bouton Importation. Ce bouton déclenche l’exécution d’une macro VBA qui envoie une requête (Set Req = CreateObject(“MSXML2.ServerXMLHTTP”) Req.Open “GET”, URL, False Req.Send) vers l’API et analyse la réponse reçue en retour (Réponse = Req.ResponseText).

La feuille de calcul affiche un échantillon de données contenu dans la réponse de l’API.

Le code source de la macro VBA est le suivant :

'Macro VBA d'interrogation des bases Pappers (API)
'Ecrit par Benoît RIVIERE 12/2020, benoit@auditsi.eu
'Informations : https://www.auditsi.eu/?p=9377

Option Explicit


'Constantes
'---Token Pappers : pour en obtenir un gratuitement : https://www.pappers.fr/api/register
Const Pappers_Token = "api_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
'---Adresse HTTP de l'API Pappers
Const Pappers_URL = "https://api.pappers.fr/v1/entreprise"


Function Extraction_champ(Chaîne As Variant, NomChamp)
    Dim PositionDébut As Long
    
    NomChamp = NomChamp & """:"""
    
    PositionDébut = InStr(Chaîne, NomChamp) + Len(NomChamp)

    Extraction_champ = Mid(Chaîne, PositionDébut, InStr(Right(Chaîne, Len(Chaîne) - PositionDébut + 1), """") - 1)
End Function


Sub Infos_Jur()
    Dim SIREN As String
    Dim URL As String
    Dim Réponse As String
    Dim Req As Object
    Dim i As Integer
    Dim MsgErreur As String
    Dim LibChamp As String
    Dim Champ As String
    Dim ligne As Integer
    Dim DénomSoc As String
    
    'Lecture SIREN
    SIREN = ActiveSheet.Range("B6")
    '---Si SIREN est vide sortir de la procédure
    If SIREN = "" Then Exit Sub
    
    'Constitution de l'URL à requêter
    URL = Pappers_URL & "?" & Pappers_Token & "&siren=" & SIREN
    'Envoi de la requête au site Pappers
    Set Req = CreateObject("MSXML2.ServerXMLHTTP")
    Req.Open "GET", URL, False
    Req.Send
    'Lecture de la réponse à la requête restituée par Pappers
    Réponse = Req.ResponseText
    
    'Si la réponse correspond à un message d'erreur la variable MsgErreur renvoie un message
    MsgErreur = ""
    If InStr(Réponse, "statusCode"":400,""error") > 1 Or InStr(Réponse, "statusCode"":404,""error") > 1 Then
        MsgErreur = "SIREN inconnu !"
    ElseIf InStr(Réponse, "statusCode"":401,""error") > 1 Then
        MsgErreur = "Token non reconnu ! Pour obtenir un Token valide, s'inscrire sur https://www.pappers.fr/api/register"
    End If
    
    'Restitution des données juridiques
    For i = 1 To 10 '10 champs de données restitués
        'Extraction des champs de données
        Select Case i
            Case 1:
                LibChamp = "Dénomination sociale"
                Champ = Extraction_champ(Réponse, "denomination")
                DénomSoc = Champ
            Case 2:
                LibChamp = "Forme juridique"
                Champ = Extraction_champ(Réponse, "forme_juridique")
            Case 3:
                LibChamp = "Capital social"
                Champ = Extraction_champ(Réponse, "capital")
            Case 4:
                LibChamp = "Code postal + ville"
                Champ = Extraction_champ(Réponse, "code_postal") & " " & Extraction_champ(Réponse, "ville")
            Case 5:
                LibChamp = "Latitude / Longitude"
                Champ = Extraction_champ(Réponse, "latitude") & " / " & Extraction_champ(Réponse, "longitude")
            Case 6:
                LibChamp = "Activité (NAF)"
                Champ = Extraction_champ(Réponse, "code_naf") & ". " & Extraction_champ(Réponse, "libelle_code_naf")
            Case 7:
                LibChamp = "Objet social"
                Champ = Extraction_champ(Réponse, "objet_social")
            Case 8:
                LibChamp = "Date de création"
                Champ = Extraction_champ(Réponse, "date_creation_formate")
            Case 9:
                LibChamp = "Entreprise cessée"
                Champ = Extraction_champ(Réponse, "entreprise_cessee")
            Case 10:
                LibChamp = "Numéro de TVA intracommunautaire"
                Champ = Extraction_champ(Réponse, "numero_tva_intracommunautaire")
        End Select
        'Ligne de la feuille de calcul où coller le champ en cours
        ligne = 9 + (i - 1) * 2
        'Si le SIREN est inconnu -> renvoyer un message d'erreur
        If MsgErreur <> "" Then Champ = MsgErreur
        
        'Transfert des données dans le classeur Excel
        With ActiveSheet
            .Range("A" & ligne).Value = LibChamp
            .Range("B" & ligne).Value = Champ
        End With
    Next i
    
    'Liens hypertextes
    With ActiveSheet
        If MsgErreur <> "" Then
            .Range("A" & ligne + 2).Value = ""
        Else
            .Hyperlinks.Add Anchor:=.Range("A" & ligne + 2), Address:="https://www.pappers.fr/entreprise/" & SIREN, TextToDisplay:="Cliquer ici pour accéder à la fiche juridique Pappers de l'entreprise " & DénomSoc
        End If
        .Hyperlinks.Add Anchor:=.Range("A" & ligne + 4), Address:="https://www.auditsi.eu/?p=9377", TextToDisplay:="Plus d'informations sur www.auditsi.eu"
    End With
End Sub

D’autres sites d’informations légales ou de cotation d’entreprises proposent des API, par exemple :

L’interrogation de sites internet ne disposant pas d’API peut passer par l’analyse de la restitution de simples requêtes HTTP.

Exemples de réutilisation des informations juridiques et légales : Fonctions Excel (DénominationSociale et NuméroTVAIntracommunautaire) / Intégration des informations juridiques et cotations d’entreprises dans la balance auxiliaire (projet PADoCC_Ecritures)

___

Approfondir le sujet : Informations juridiques et légales / Programmer en VBA

Share Button
API PAPPERS
API PAPPERS
API-PAPPERS.xlsm
25 KiB
57 téléchargements
Détails...
The following two tabs change content below.
Benoît RIVIERE
Après seize années passées en cabinet d’expertise-comptable et de commissariat aux comptes (où j’ai exercé comme expert-comptable et chef de mission audit), j’ai pris le poste de directeur comptable d’un groupe de distribution automobile en novembre 2014. Au cours de ma carrière, j’ai acquis une expérience significative en audit et en exploitation des systèmes d’information (analyse de données, automatisation des tâches, programmation informatique) au service de la production des comptes annuels et consolidés. C’est cette expérience personnelle et ma passion pour l’informatique que je partage sur ce blog. Mon CV / Réalisations personnelles et projets informatiques / Ma collection / Me contacter

2 commentaires

  1. Bonjour Benoit
    Félicitation pour votre site d’une richesse et d’une aide précieuse.
    J’ai utilisé votre code avec l’api pappers.

    Je souhaitais utiliser la seconde fonction de cette api qui est de fournir une liste de sociétés à partir d’un nom.
    Souvent nécessaire lors de la création d’un compte client si nous n’avons pas le siren. Débutant en vba, je reste bloqué sur la mise en forme de la réponse. comment mettre les données en forme de tableau.
    Si vous avez une piste je suis preneur.
    bonne journée
    benoist

  2. Bonsoir,
    Je ne me suis pas encore penché sur cette question parce que ce n’est pas dans mes besoins du moment. Je pense qu’il faut scinder la réponse reçue avec des Split.
    Je regarderai à l’occasion.
    Bonne soirée,
    Benoît RIVIERE

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.