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.
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:
- 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”.
- 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:
- Prebere vsako vrstico iz aktivnega delovnega lista (najprej vrstica glave, en stik na vrstico).
- Zgradi polje JSON v obliki za parameter
jsonBodyBrevo. - Pošlje na
https://api.brevo.com/v3/contacts/importz API ključem, shranjenim v delovnem zvezku. - 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
| firstName | lastName | company | city | |
|---|---|---|---|---|
| [email protected] | Jane | Doe | Acme | Berlin |
| [email protected] | John | Smith | Globex | Paris |
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 IDPrivate 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 0End 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 = 0End 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 IfEnd 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 = rEnd Function3. 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
ConfigureApiKeyin pritisniteF5, 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:
- Trigger: Recurrence (vsako 1 uro), ali ročni gumb, ali „When a row is modified”, če želite sinhronizacijo, ki jo poganjajo spremembe.
- Action: Excel Online → Run script. Usmerite ga na vaš delovni zvezek in zgornjo skripto. Shranite njegovo vrnjeno vrednost kot
contacts. - 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}
- Method:
- 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
| Potreba | Najboljša možnost |
|---|---|
| Gumb z enim klikom v delovnem zvezku, ki ga vaša ekipa že dnevno odpira | VBA makro (ta vodnik, zgornja polovica) |
| Delovni zvezek v OneDrive/SharePoint, urna samodejna sinhronizacija | Office Scripts + Power Automate (potrebuje Premium za HTTP) |
| Samo Mac Excel, ne morete uporabiti VBA | Office Scripts + Power Automate |
| Podatki živijo v Google Sheets, ne v Excelu | Apps Script (brezplačno, načrtovani sprožilci vgrajeni) |
| Enkratni uvoz, nikoli več ne bo potreben | Save As → CSV in uporabite skripto za uvoz CSV |
| Množični uvoz iz datoteke >10 MB | CSV 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.