Kako poslati Excel stike v Brevo z VBA makrom (in alternativa Office Scripts)

Delujoč VBA makro, ki pošlje stike iz Excelovega lista v Brevo API z enim klikom. Plus, kdaj namesto tega uporabiti Office Scripts + Power Automate, in kompromisi proti rešitvi z Google Apps Script.

Featured image for article: Kako poslati Excel stike v Brevo z VBA makrom (in alternativa Office Scripts)

Imate stike v Excelu in jih želite imeti v Brevo. Hiter in umazan odgovor je shraniti datoteko kot .csv in jo uvoziti, kar je v redu enkrat. Za karkoli, kar počnete večkrat (tedenska prodajna predaja, delovni zvezek, ki ga vaša ekipa dnevno posodablja, partnerski seznam, ki se osvežuje), želite gumb prav v Excelu, ki opravi sinhronizacijo.

Ta vodnik pokriva dve poti, ki za to dejansko imata smisel:

  1. VBA makro vstavljen v delovni zvezek. Brez licenciranja, brez oblaka, deluje brez povezave, teče v trenutku, ko uporabnik klikne na gumb. Pravi odgovor za približno 80 % primerov „Excel v Brevo”.
  2. Office Scripts + Power Automate. TypeScript namesto VBA, teče v oblaku, podpira načrtovane sprožilce. Pravi odgovor, če delovni zvezek živi v OneDrive/SharePoint in želite nenadzorovano sinhronizacijo, vendar bodite pozorni na licenciranje Power Automate.

Če iščete Google Sheets ekvivalent, si oglejte spremljevalni članek o Apps Script. In če želite samo enkratni CSV uvoz iz skripte na vašem laptopu, ima vodnik za uvoz CSV različice v Pythonu, Node.js in cURL.

Kaj makro počne

Ko uporabnik klikne na gumb „Sync to Brevo” na listu:

  1. Prebere vsako vrstico iz aktivnega delovnega lista (najprej vrstica glave, en stik na vrstico).
  2. Zgradi polje JSON v obliki za parameter jsonBody Brevo.
  3. Pošlje na https://api.brevo.com/v3/contacts/import z API ključem, shranjenim v delovnem zvezku.
  4. Pokaže okno s sporočilom z rezultatom.

To je vse. Približno 120 vrstic VBA. Spodaj je celoten delujoč modul.

Postavitev lista, ki jo makro pričakuje

emailfirstNamelastNamecompanycity
[email protected]JaneDoeAcmeBerlin
[email protected]JohnSmithGlobexParis

email je obvezen. Vsak drug stolpec postane Brevo atribut stika, mapiran prek glave stolpca (z velikimi črkami) na ime atributa. Tako firstName postane FIRSTNAME, company postane COMPANY. Lastni atributi (karkoli onstran standardnega niza) morajo najprej obstajati v vašem računu Brevo. Definirajte jih pod Contacts → Settings → Contact attributes.

1. korak: odprite VBA urejevalnik

V Excelu: pritisnite Alt + F11. Odpre se VBA urejevalnik. V plošči Project levo z desnim klikom na vaš delovni zvezek izberite Insert → Module. Pojavi se prazen Module1.

2. korak: prilepite celoten makro

Vsebino Module1 zamenjajte s tem:

' ===========================================================================
' Brevo contact sync for Excel
' Reads the active sheet's rows and POSTs them to Brevo's import API.
' ===========================================================================
Option Explicit
Private Const BREVO_API_BASE As String = "https://api.brevo.com/v3"
Private Const BREVO_LIST_ID As Long = 42 ' <- your Brevo list ID
Private Const BATCH_SIZE As Long = 1000
' --- Public entry points (the ones you assign to ribbon buttons) -----------
Public Sub SyncSheetToBrevo()
Dim apiKey As String
apiKey = GetApiKey()
If apiKey = "" Then
MsgBox "No API key configured. Run ConfigureApiKey first.", _
vbExclamation, "Brevo Sync"
Exit Sub
End If
Dim ws As Worksheet
Set ws = ActiveSheet
Dim emailCol As Long
emailCol = FindEmailColumn(ws)
If emailCol = 0 Then
MsgBox "Sheet must have an 'email' column in row 1.", _
vbExclamation, "Brevo Sync"
Exit Sub
End If
Dim lastRow As Long, lastCol As Long
lastRow = ws.Cells(ws.Rows.Count, emailCol).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
If lastRow < 2 Then
MsgBox "No contact rows found.", vbInformation, "Brevo Sync"
Exit Sub
End If
Dim contacts As Collection
Set contacts = New Collection
Dim r As Long, c As Long
For r = 2 To lastRow
Dim email As String
email = LCase(Trim(CStr(ws.Cells(r, emailCol).Value)))
If email <> "" And InStr(email, "@") > 0 Then
Dim json As String
json = "{""email"":""" & EscapeJson(email) & """,""attributes"":{"
Dim attrFirst As Boolean
attrFirst = True
For c = 1 To lastCol
If c <> emailCol Then
Dim val As String
val = CStr(ws.Cells(r, c).Value)
If val <> "" Then
If Not attrFirst Then json = json & ","
Dim attrName As String
attrName = UCase(Trim(CStr(ws.Cells(1, c).Value)))
json = json & """" & attrName & """:""" & EscapeJson(val) & """"
attrFirst = False
End If
End If
Next c
json = json & "}}"
contacts.Add json
End If
Next r
If contacts.Count = 0 Then
MsgBox "No valid contact rows found.", vbInformation, "Brevo Sync"
Exit Sub
End If
Dim totalSent As Long
Dim batchNum As Long
Dim okCount As Long, failCount As Long
Dim batchStart As Long
For batchStart = 1 To contacts.Count Step BATCH_SIZE
batchNum = batchNum + 1
Dim batchEnd As Long
batchEnd = batchStart + BATCH_SIZE - 1
If batchEnd > contacts.Count Then batchEnd = contacts.Count
Dim payload As String
payload = "{""jsonBody"":["
Dim i As Long
For i = batchStart To batchEnd
If i > batchStart Then payload = payload & ","
payload = payload & contacts(i)
Next i
payload = payload & "],""listIds"":[" & BREVO_LIST_ID & _
"],""updateExistingContacts"":true,""emptyContactsAttributes"":false}"
Dim ok As Boolean
ok = PostToBrevo(apiKey, payload)
If ok Then
okCount = okCount + 1
totalSent = totalSent + (batchEnd - batchStart + 1)
Else
failCount = failCount + 1
End If
Next batchStart
MsgBox "Sent " & totalSent & " contact(s) in " & batchNum & " batch(es)." _
& vbCrLf & "Successful batches: " & okCount _
& vbCrLf & "Failed batches: " & failCount, _
vbInformation, "Brevo Sync"
End Sub
Public Sub ConfigureApiKey()
Dim key As String
key = InputBox("Paste your Brevo API key (xkeysib-...):", "Brevo API Key")
If key = "" Then Exit Sub
key = Trim(key)
If Left(key, 8) <> "xkeysib-" Then
MsgBox "That doesn't look like a Brevo API key (should start with xkeysib-).", _
vbExclamation, "Brevo API Key"
Exit Sub
End If
On Error Resume Next
ThisWorkbook.CustomDocumentProperties("BrevoApiKey").Delete
On Error GoTo 0
ThisWorkbook.CustomDocumentProperties.Add _
Name:="BrevoApiKey", _
LinkToContent:=False, _
Type:=msoPropertyTypeString, _
Value:=key
ThisWorkbook.Save
MsgBox "API key saved inside the workbook.", vbInformation, "Brevo API Key"
End Sub
' --- Private helpers --------------------------------------------------------
Private Function GetApiKey() As String
On Error Resume Next
GetApiKey = ThisWorkbook.CustomDocumentProperties("BrevoApiKey").Value
On Error GoTo 0
End Function
Private Function FindEmailColumn(ws As Worksheet) As Long
Dim lastCol As Long, c As Long
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
For c = 1 To lastCol
If LCase(Trim(CStr(ws.Cells(1, c).Value))) = "email" Then
FindEmailColumn = c
Exit Function
End If
Next c
FindEmailColumn = 0
End Function
Private Function PostToBrevo(apiKey As String, payload As String) As Boolean
Dim http As Object
Set http = CreateObject("MSXML2.XMLHTTP")
http.Open "POST", BREVO_API_BASE & "/contacts/import", False
http.SetRequestHeader "api-key", apiKey
http.SetRequestHeader "Content-Type", "application/json"
http.SetRequestHeader "Accept", "application/json"
http.Send payload
PostToBrevo = (http.Status = 202)
If Not PostToBrevo Then
Debug.Print "Brevo error " & http.Status & ": " & http.responseText
End If
End Function
Private Function EscapeJson(s As String) As String
Dim r As String
r = Replace(s, "\", "\\")
r = Replace(r, """", "\""")
r = Replace(r, vbCrLf, "\n")
r = Replace(r, vbLf, "\n")
r = Replace(r, vbCr, "\n")
r = Replace(r, vbTab, "\t")
EscapeJson = r
End Function

3. korak: shranite delovni zvezek kot .xlsm

VBA makri obstajajo samo v delovnih zvezkih z omogočenimi makri. Shrani kot, izberite Excel Macro-Enabled Workbook (.xlsm). Navadna oblika .xlsx makre tiho odstrani. Mnogi ljudje tako prvič izgubijo kodo.

4. korak: nastavite svoj API ključ

Zaženite ConfigureApiKey enkrat. Bodisi:

  • V VBA urejevalniku kliknite kjerkoli znotraj sub ConfigureApiKey in pritisnite F5, ali
  • V Excelu Developer → Macros, izberite ConfigureApiKey, Run.

Prilepite svoj xkeysib-... ključ. Makro ga shrani kot lastno lastnost dokumenta znotraj samega delovnega zvezka. Ni v izvorni kodi, ni v registru in potuje z datoteko (zato bodite pozorni: če nekomu pošljete .xlsm po e-pošti, gre API ključ z njim).

Če bi raje dali ključ izven delovnega zvezka, zamenjajte shranjevanje na register sistema Windows:

' Replace the body of ConfigureApiKey with:
SaveSetting "Brevo", "Sync", "ApiKey", key
' And GetApiKey with:
GetApiKey = GetSetting("Brevo", "Sync", "ApiKey", "")

SaveSetting/GetSetting zapisuje pod HKCU\Software\VB and VBA Program Settings\Brevo\Sync, na uporabnika, ne na delovni zvezek. Uporabite to, če mora več delovnih zvezkov deliti en ključ, ali če nočete ključa v datoteki.

5. korak: dodajte gumb na list

To je tisto, kar pretvori v izkušnjo z enim klikom za netehnične uporabnike.

Insert → Shapes → Rectangle, spustite enega na list, označite ga „Sync to Brevo.” Z desnim klikom na obliko, Assign Macro, izberite SyncSheetToBrevo. Končano.

Ali pa, za bolj poliran vmesnik, dodajte zavihek po meri prek Office Custom UI Editor. Toda za večino notranjih orodij je oblika kot gumb obilo.

6. korak: zaženite

Kliknite gumb. Makro prebere vrstice, jih razdeli na pakete, vsak paket pošlje v Brevo in pokaže povzetek v oknu sporočila. Brevo uvoz je asinhron, zato sporočilo o uspehu pomeni „Brevo je sprejel paket”. Sama izdelava stikov se zgodi na strani strežnika v naslednjih nekaj sekundah. Dobili boste povzetek po e-pošti od Brevo, ko bo končal (razen če ste nastavili disableNotification: true).

Pogoste pasti

Gumb ne naredi nič in ni napake. Makri so onemogočeni. Poglejte rumeno varnostno vrstico na vrhu lista in kliknite Enable Content. Če vaša organizacija blokira makre, si oglejte spodaj pot prek trust centra in podpisovanja kode.

Compile error: User-defined type not defined. Ste na Mac Excelu, ki nima MSXML2.XMLHTTP. Mac VBA ne more izvajati HTTPS zahtev neposredno. Namesto tega uporabite spodnjo pot Office Scripts.

400 Bad Request iz Brevo brez očitnega razloga. Skoraj vedno ena izmed: (a) lastni atribut v vašem listu še ne obstaja v Brevo, najprej ga ustvarite; (b) napaka pri ubežanju JSON, narekovaji ali poševnice nazaj v vrednostih celic, ki se niso ubežali. Funkcija EscapeJson v kodi obravnava standardne primere. Če imajo vaši podatki nenavadne znake, zabeležite payload v okno Immediate (Debug.Print payload) in si ga oglejte.

401 Unauthorized. Napačna glava. Je api-key (male črke, vezaj), ne Authorization. Makro uporablja pravilno, vendar če ste izrezek skopirali drugod, dvakrat preverite.

Excel zamrzne pri velikih uvozih. Makro teče sinhrono na UI niti. Za 50.000+ vrstic boste opazovali, kako Excel visi 10 do 30 sekund, medtem ko gradi JSON in čaka na Brevo. Ali to sprejmete, ali pa preklopite MSXML2.XMLHTTP na njegovo asinhrono različico. Toda pri tej skali vam je bolje v Power Automate (naslednji odsek).

Ko VBA ni dovolj: Office Scripts + Power Automate

VBA ne more izvajati načrtovane oblačne sinhronizacije. Če potrebujete:

  • Da se delovni zvezek sinhronizira v Brevo vsako uro, ne da bi ga kdorkoli odprl
  • Delovni zvezek v OneDrive/SharePoint, urejan iz spleta
  • IT oddelek, ki prepoveduje namizne makre

…potem želite Office Scripts (Microsoftov oblačni ekvivalent Apps Script) plus Power Automate (njihov načrtovalec in HTTP plast).

Razdelitev: Office Scripts prebere list in vrne podatke o stikih. Power Automate vzame te podatke in jih ob sprožilcu pošlje v Brevo.

Office Script (Excel za splet, Automate → New Script):

function main(workbook: ExcelScript.Workbook): {email: string, attributes: Record<string, string>}[] {
const sheet = workbook.getActiveWorksheet();
const range = sheet.getUsedRange();
if (!range) return [];
const values = range.getValues() as string[][];
if (values.length < 2) return [];
const headers = values[0].map(h => String(h).trim());
const emailIdx = headers.findIndex(h => h.toLowerCase() === "email");
if (emailIdx === -1) throw new Error("Sheet must have an 'email' column");
const contacts: {email: string, attributes: Record<string, string>}[] = [];
for (let r = 1; r < values.length; r++) {
const row = values[r];
const email = String(row[emailIdx] ?? "").trim().toLowerCase();
if (!email || !email.includes("@")) continue;
const attributes: Record<string, string> = {};
for (let c = 0; c < headers.length; c++) {
if (c === emailIdx) continue;
const v = row[c];
if (v === null || v === "") continue;
attributes[headers[c].toUpperCase()] = String(v);
}
contacts.push({ email, attributes });
}
return contacts;
}

Power Automate tok:

  1. Trigger: Recurrence (vsako 1 uro), ali ročni gumb, ali „When a row is modified”, če želite sinhronizacijo, ki jo poganjajo spremembe.
  2. Action: Excel Online → Run script. Usmerite ga na vaš delovni zvezek in zgornjo skripto. Shranite njegovo vrnjeno vrednost kot contacts.
  3. Action: HTTP (to je Premium konektor, glejte spodaj opombo o licenciranju).
    • Method: POST
    • URI: https://api.brevo.com/v3/contacts/import
    • Headers: api-key: xkeysib-..., Content-Type: application/json
    • Body:
      {
      "jsonBody": @{outputs('Run_script')?['body/result']},
      "listIds": [42],
      "updateExistingContacts": true
      }
  4. Action: Condition. Če statusna koda ni 202, pošljite Teams/e-poštno opozorilo.

Realnostni pregled licenciranja: akcija HTTP je Premium konektor Power Automate. Na načrtih Microsoft 365 Business Basic/Standard dobite standardne konektorje, vendar ne Premium. Najcenejša obhodna pot je dodatek Power Automate Premium (približno 15 USD/uporabnika/mesec v času pisanja), ali pa premaknite HTTP v majhno Azure Function, ki jo lahko pokliče standardni tok. Če ste že na E3/E5 z vključenim Premium, ste pripravljeni.

To je glavni razlog, zakaj je zgodba Apps Script čistejša: UrlFetchApp v Apps Script je brezplačen in neomejen, medtem ko Microsoftov ekvivalent postavlja omrežni klic za plačan nivo konektorja.

VBA proti Office Scripts proti Apps Script: kdaj izbrati kaj

PotrebaNajboljša možnost
Gumb z enim klikom v delovnem zvezku, ki ga vaša ekipa že dnevno odpiraVBA makro (ta vodnik, zgornja polovica)
Delovni zvezek v OneDrive/SharePoint, urna samodejna sinhronizacijaOffice Scripts + Power Automate (potrebuje Premium za HTTP)
Samo Mac Excel, ne morete uporabiti VBAOffice Scripts + Power Automate
Podatki živijo v Google Sheets, ne v ExceluApps Script (brezplačno, načrtovani sprožilci vgrajeni)
Enkratni uvoz, nikoli več ne bo potrebenSave As → CSV in uporabite skripto za uvoz CSV
Množični uvoz iz datoteke >10 MBCSV s fileUrl, glejte CSV vodnik

Zakaj to premaga Zapier in no-code platforme

Za ponavljajoče se delo Excel-v-Brevo orodja za avtomatizacijo tretjih oseb (Zapier, Make, n8n) zaračunavajo na nalogo in postavljajo tretjo osebo med vaše podatke in Brevo. Pristop VBA ima ničelne tekoče stroške, nobenega toka podatkov tretje osebe in živi znotraj datoteke. Ko se delovni zvezek premakne, se z njim premakne tudi integracija. Office Scripts + Power Automate je podobno, vendar z Microsoftom kot tretjo osebo (že v vašem stacku, če ste na M365).

Celotni smisel Brevo endpointa POST /v3/contacts/import je, da ne potrebujete platforme za lepljenje. Vaša orodja že vedo, kako izvajati HTTP zahteve.

Nadaljnje branje

Frequently Asked Questions

Ali lahko VBA makro res kliče Brevo API iz Excela?
Da. VBA lahko izvaja HTTP zahteve prek MSXML2.XMLHTTP, ki je vključen v vsako sodobno namestitev sistema Windows. Makro pošlje JSON na api.brevo.com/v3/contacts/import, isti endpoint, kot bi ga zadel Python ali Node skript. Mac Excel to lahko prav tako prek Office Scripts + Power Automate, vendar namizni Mac VBA tega ne more (brez MSXML).
Ali lahko to izvajam po urniku, kot časovne sprožilce v Apps Script?
Iz samega VBA ne. Excel mora biti odprt, da se sproži Application.OnTime. Za nenadzorovano sinhronizacijo po urniku imate dve možnosti: (1) Windows Task Scheduler, ki odpre delovni zvezek in zažene makro, ali (2) Office Scripts, ki jih sproži Power Automate načrtovani tok (pokrito kasneje v tem vodniku).
Ali je VBA varen? Moje podjetje blokira makre.
VBA makri tečejo z dostopom do datotečnega sistema in registra, zato je njihovo privzeto blokiranje smiselna politika. Dve poti okoli tega: (1) podpišite makro s certifikatom za podpisovanje kode in delovni zvezek dajte v Trusted Location, ali (2) preskočite VBA v celoti in uporabite Office Scripts (TypeScript, sandbox, brez dostopa do datotečnega sistema). Office Scripts je sodobna od Microsofta blagoslovljena pot.
Kako se to primerja s pristopom Google Apps Script?
Apps Script je bližje pristopu „nastavi in pozabi”: teče v Googlovem oblaku, načrtovani sprožilci so vgrajeni, brez licenc Excel ali Power Automate. VBA zmaga pri delu brez povezave in ročni sinhronizaciji z enim klikom iz delovnega zvezka, ki ga vaša ekipa že ima odprtega. Office Scripts + Power Automate je oblak/načrtovani ekvivalent na Microsoftovi strani, vendar Power Automate pogosto potrebuje plačan premium konektor za odhodni HTTP.
Začnite brezplačno z Brevo