Grafics63

Macro Excel pour vérifier instantanément le statut des entreprises françaises

Mar 30th, 2025
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VBScript 10.98 KB | Source Code | 0 0
  1. Function CheckCompanyStatus(companyName As String, postalCode As String, Optional address As String = "") As String
  2.     Dim http As Object, url As String, response As String
  3.     Dim companyStatus As String, dateFermeture As String, etabsOuverts As String
  4.     Dim matchingAdress As Boolean, newAddress As String, sirenValue As String
  5.     Dim formattedAddress As String
  6.    
  7.     ' Créer l'objet HTTP
  8.    Set http = CreateObject("MSXML2.XMLHTTP")
  9.    
  10.     ' Construire l'URL de l'API
  11.    url = "https://recherche-entreprises.api.gouv.fr/search?q=" & _
  12.           WorksheetFunction.EncodeURL(companyName) & _
  13.           "&code_postal=" & postalCode & _
  14.           "&per_page=1"
  15.    
  16.     ' Exécuter la requête API
  17.    On Error Resume Next
  18.     http.Open "GET", url, False
  19.     http.send
  20.     On Error GoTo 0
  21.    
  22.     ' Vérifier si la requête a réussi
  23.    If http.status = 200 Then
  24.         response = http.responseText
  25.        
  26.         ' Extraction des informations de base
  27.        companyStatus = ExtractValue(response, """etat_administratif"":""", """")
  28.         sirenValue = ExtractValue(response, """siren"":""", """")
  29.         etabsOuverts = ExtractValue(response, """nombre_etablissements_ouverts"":", ",")
  30.         Dim totalEtabs As String
  31.         totalEtabs = ExtractValue(response, """nombre_etablissements"":", ",")
  32.        
  33.         ' Vérifier si l'établissement spécifique est ouvert ou fermé
  34.        Dim matchingEstablishment As String
  35.         matchingEstablishment = ExtractBetween(response, """matching_etablissements"":[", "]")
  36.        
  37.         If matchingEstablishment <> "" Then
  38.             ' Vérifier si l'établissement correspondant est fermé
  39.            Dim matchingStatus As String, matchingDateFermeture As String
  40.             matchingStatus = ExtractValue(matchingEstablishment, """etat_administratif"":""", """")
  41.             matchingDateFermeture = ExtractValue(matchingEstablishment, """date_fermeture"":""", """")
  42.            
  43.             ' Information sur l'adresse
  44.            Dim matchingAdresseComplete As String
  45.             matchingAdresseComplete = ExtractValue(matchingEstablishment, """adresse"":""", """")
  46.            
  47.             ' Vérifier le statut de l'établissement
  48.            If matchingStatus = "F" Or matchingDateFermeture <> "" And matchingDateFermeture <> "null" Then
  49.                 ' L'établissement est fermé, mais l'entreprise peut être active
  50.                If companyStatus = "A" Then
  51.                     ' Récupérer l'adresse du siège
  52.                    Dim siegeInfo As String, siegeAdresse As String, siegeCP As String, siegeVille As String
  53.                     siegeInfo = ExtractBetween(response, """siege"":{", "},")
  54.                     siegeAdresse = ExtractValue(siegeInfo, """adresse"":""", """")
  55.                     siegeCP = ExtractValue(siegeInfo, """code_postal"":""", """")
  56.                     siegeVille = ExtractValue(siegeInfo, """libelle_commune"":""", """")
  57.                    
  58.                     ' Format de retour détaillé
  59.                    CheckCompanyStatus = "ENTREPRISE ACTIVE mais ETABLISSEMENT FERMÉ" & vbCrLf & _
  60.                                          "Date fermeture: " & matchingDateFermeture & vbCrLf & _
  61.                                          "Adresse siège: " & siegeAdresse & vbCrLf & _
  62.                                          "SIREN: " & sirenValue & vbCrLf & _
  63.                                          "Etablissements ouverts: " & etabsOuverts & "/" & totalEtabs
  64.                 Else
  65.                     ' L'entreprise est aussi fermée
  66.                    CheckCompanyStatus = "ENTREPRISE FERMÉE" & vbCrLf & _
  67.                                          "Date fermeture: " & matchingDateFermeture & vbCrLf & _
  68.                                          "SIREN: " & sirenValue
  69.                 End If
  70.             Else
  71.                 ' L'établissement est ouvert (normalement ne devrait pas arriver dans matching si l'adresse est la même)
  72.                CheckCompanyStatus = "ACTIF" & vbCrLf & _
  73.                                      "SIREN: " & sirenValue & vbCrLf & _
  74.                                      "Etablissements ouverts: " & etabsOuverts & "/" & totalEtabs
  75.             End If
  76.         Else
  77.             ' Pas d'établissement correspondant à cette adresse, mais vérifier le siège
  78.            Dim siegeSection As String
  79.             siegeSection = ExtractBetween(response, """siege"":{", "},")
  80.            
  81.             If siegeSection <> "" Then
  82.                 Dim siegeStatus As String, siegeDateFermeture As String, siegeAdress As String
  83.                 siegeStatus = ExtractValue(siegeSection, """etat_administratif"":""", """")
  84.                 siegeDateFermeture = ExtractValue(siegeSection, """date_fermeture"":""", """")
  85.                 siegeAdress = ExtractValue(siegeSection, """adresse"":""", """")
  86.                
  87.                 ' Décider du statut global
  88.                If companyStatus = "A" Then
  89.                     CheckCompanyStatus = "ENTREPRISE ACTIVE" & vbCrLf & _
  90.                                          "Adresse siège: " & siegeAdress & vbCrLf & _
  91.                                          "SIREN: " & sirenValue & vbCrLf & _
  92.                                          "Etablissements ouverts: " & etabsOuverts & "/" & totalEtabs
  93.                 Else
  94.                     CheckCompanyStatus = "ENTREPRISE FERMÉE" & vbCrLf & _
  95.                                          "SIREN: " & sirenValue
  96.                 End If
  97.             Else
  98.                 ' Aucune information de siège disponible
  99.                CheckCompanyStatus = "STATUT INDÉTERMINÉ (informations partielles)"
  100.             End If
  101.         End If
  102.     Else
  103.         ' Erreur API
  104.        CheckCompanyStatus = "ERREUR API: " & http.status
  105.     End If
  106. End Function
  107.  
  108. ' Fonction pour extraire une valeur entre deux marqueurs
  109. Function ExtractValue(jsonText As String, startTag As String, endTag As String) As String
  110.     Dim startPos As Long, endPos As Long
  111.    
  112.     startPos = InStr(jsonText, startTag)
  113.     If startPos > 0 Then
  114.         startPos = startPos + Len(startTag)
  115.         endPos = InStr(startPos, jsonText, endTag)
  116.         If endPos > startPos Then
  117.             ExtractValue = Mid(jsonText, startPos, endPos - startPos)
  118.         Else
  119.             ExtractValue = ""
  120.         End If
  121.     Else
  122.         ExtractValue = ""
  123.     End If
  124. End Function
  125.  
  126. ' Fonction pour extraire une section complète entre deux marqueurs
  127. Function ExtractBetween(jsonText As String, startTag As String, endTag As String) As String
  128.     Dim startPos As Long, endPos As Long, nestedCount As Long
  129.     Dim i As Long, char As String
  130.    
  131.     startPos = InStr(jsonText, startTag)
  132.     If startPos > 0 Then
  133.         startPos = startPos + Len(startTag)
  134.        
  135.         ' Gestion des accolades/crochets imbriqués
  136.        If Right(startTag, 1) = "[" Then
  137.             nestedCount = 1
  138.             endPos = startPos
  139.            
  140.             For i = startPos To Len(jsonText)
  141.                 char = Mid(jsonText, i, 1)
  142.                 If char = "[" Then
  143.                     nestedCount = nestedCount + 1
  144.                 ElseIf char = "]" Then
  145.                     nestedCount = nestedCount - 1
  146.                     If nestedCount = 0 Then
  147.                         endPos = i - 1
  148.                         Exit For
  149.                     End If
  150.                 End If
  151.             Next i
  152.            
  153.             If endPos > startPos Then
  154.                 ExtractBetween = Mid(jsonText, startPos, endPos - startPos)
  155.             Else
  156.                 ExtractBetween = ""
  157.             End If
  158.         Else
  159.             ' Méthode simple pour les sections sans imbrication
  160.            endPos = InStr(startPos, jsonText, endTag)
  161.             If endPos > startPos Then
  162.                 ExtractBetween = Mid(jsonText, startPos, endPos - startPos)
  163.             Else
  164.                 ExtractBetween = ""
  165.             End If
  166.         End If
  167.     Else
  168.         ExtractBetween = ""
  169.     End If
  170. End Function
  171.  
  172. ' Fonction pour ajouter à Excel
  173. Sub ImplementCompanyStatusChecker()
  174.     Dim ws As Worksheet
  175.     Dim lastRow As Long, i As Long
  176.     Dim companyName As String, postalCode As String, address As String
  177.     Dim result As String
  178.    
  179.     ' Définir la feuille active
  180.    Set ws = ActiveSheet
  181.    
  182.     ' Vérifier que les colonnes nécessaires existent
  183.    If ws.Cells(1, 2).Value <> "Société" Then
  184.         MsgBox "La colonne B doit contenir le nom de la société (Société)", vbExclamation
  185.         Exit Sub
  186.     End If
  187.    
  188.     If ws.Cells(1, 4).Value <> "cp" Then
  189.         MsgBox "La colonne D doit contenir le code postal (cp)", vbExclamation
  190.         Exit Sub
  191.     End If
  192.    
  193.     ' S'assurer que la colonne statut existe
  194.    If ws.Cells(1, 6).Value <> "Statut" Then
  195.         ws.Cells(1, 6).Value = "Statut"
  196.     End If
  197.    
  198.     ' Trouver la dernière ligne
  199.    lastRow = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row
  200.    
  201.     ' Activer la barre de statut
  202.    Application.DisplayStatusBar = True
  203.     Application.StatusBar = "Initialisation..."
  204.     Application.ScreenUpdating = False
  205.    
  206.     ' Parcourir chaque ligne
  207.    For i = 2 To lastRow
  208.         ' Mettre à jour la barre de progression
  209.        Application.StatusBar = "Traitement: " & i - 1 & "/" & lastRow - 1 & " (" & Format((i - 1) / (lastRow - 1), "0%") & ")"
  210.        
  211.         ' Récupérer les données
  212.        companyName = Trim(ws.Cells(i, 2).Value)
  213.         postalCode = Trim(ws.Cells(i, 4).Value)
  214.         address = Trim(ws.Cells(i, 3).Value) ' Adresse en colonne C
  215.        
  216.         ' Vérifier l'entreprise
  217.        If companyName <> "" And postalCode <> "" Then
  218.             result = CheckCompanyStatus(companyName, postalCode, address)
  219.             ws.Cells(i, 6).Value = result
  220.            
  221.             ' Mise en forme conditionnelle
  222.            If InStr(1, result, "ACTIF", vbTextCompare) > 0 Then
  223.                 ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206) ' Vert
  224.            ElseIf InStr(1, result, "FERMÉ", vbTextCompare) > 0 Then
  225.                 ws.Cells(i, 6).Interior.Color = RGB(255, 199, 206) ' Rouge
  226.            Else
  227.                 ws.Cells(i, 6).Interior.Color = RGB(255, 235, 156) ' Jaune/Orange pour indéterminé
  228.            End If
  229.            
  230.             ' Ajuster la hauteur de ligne pour accommoder le texte multilignes
  231.            ws.Rows(i).RowHeight = 60
  232.            
  233.             ' Formater pour le texte multiligne
  234.            ws.Cells(i, 6).WrapText = True
  235.            
  236.             ' Pause pour éviter de surcharger l'API
  237.            Sleep 300
  238.         End If
  239.     Next i
  240.    
  241.     ' Ajuster les colonnes
  242.    ws.Columns("F:F").AutoFit
  243.     ws.Columns("F:F").ColumnWidth = 50 ' Largeur fixe pour accommoder le texte
  244.    
  245.     ' Réinitialiser
  246.    Application.StatusBar = False
  247.     Application.ScreenUpdating = True
  248.    
  249.     MsgBox "Traitement terminé!", vbInformation
  250. End Sub
  251.  
  252. ' Fonction Sleep (pause en millisecondes)
  253. Sub Sleep(milliseconds As Long)
  254.     Dim start As Double
  255.     start = Timer
  256.     Do While Timer < start + (milliseconds / 1000)
  257.         DoEvents
  258.     Loop
  259. End Sub
Tags: excel vba
Advertisement
Add Comment
Please, Sign In to add comment