VBA मैक्रो के साथ Excel कॉन्टैक्ट्स को Brevo में कैसे पुश करें (और Office Scripts विकल्प)
एक काम करने वाला VBA मैक्रो जो Excel शीट से कॉन्टैक्ट्स को एक क्लिक में Brevo के API पर पोस्ट करता है, साथ ही कब इसके बजाय Office Scripts + Power Automate का उपयोग करें, और Google Apps Script सेटअप के मुकाबले ट्रेड-ऑफ़।
आपके पास Excel में कॉन्टैक्ट्स हैं और आप उन्हें Brevo में चाहते हैं। तेज़-और-गंदा जवाब है फ़ाइल को .csv के रूप में सेव करें और इसे इम्पोर्ट करें, जो एक बार के लिए ठीक है। कुछ भी जो आप बार-बार कर रहे हैं, साप्ताहिक सेल्स हैंडऑफ़, एक वर्कबुक जिसे आपकी टीम रोज़ अपडेट करती है, एक पार्टनर लिस्ट जो रिफ़्रेश होती रहती है, के लिए आप सीधे Excel के अंदर एक बटन चाहते हैं जो सिंक करे।
यह गाइड उन दो रास्तों को कवर करती है जो वास्तव में इसके लिए सही हैं:
- वर्कबुक में एम्बेडेड एक VBA मैक्रो, कोई लाइसेंसिंग नहीं, कोई क्लाउड नहीं, ऑफ़लाइन काम करता है, उस पल चलता है जब उपयोगकर्ता एक बटन क्लिक करता है। “Excel-to-Brevo” मामलों के लगभग 80% के लिए सही उत्तर।
- Office Scripts + Power Automate, VBA के बजाय TypeScript, क्लाउड में चलता है, शेड्यूल्ड ट्रिगर्स को सपोर्ट करता है। सही उत्तर यदि वर्कबुक OneDrive/SharePoint पर रहती है और आप अनअटेंडेड सिंक चाहते हैं, लेकिन Power Automate लाइसेंसिंग के बारे में सावधान रहें।
यदि आप Google Sheets समतुल्य की तलाश में हैं, तो Apps Script पर साथी आर्टिकल देखें। और यदि आप बस अपने लैपटॉप पर एक स्क्रिप्ट से वन-शॉट CSV इम्पोर्ट चाहते हैं, तो CSV इम्पोर्ट गाइड में Python, Node.js, और cURL वर्शन्स हैं।
मैक्रो क्या करता है
जब उपयोगकर्ता शीट पर “Sync to Brevo” बटन क्लिक करता है:
- एक्टिव वर्कशीट से हर रो पढ़ें (हेडर रो पहले, एक कॉन्टैक्ट प्रति रो)।
- Brevo के
jsonBodyपैरामीटर के लिए शेप्ड एक JSON ऐरे बनाएँ। - इसे वर्कबुक के स्टोर्ड API key के साथ
https://api.brevo.com/v3/contacts/importपर पोस्ट करें। - परिणाम के साथ एक मैसेज बॉक्स दिखाएँ।
बस इतना ही। लगभग 120 लाइनें VBA। नीचे पूरा, काम करने वाला मॉड्यूल है।
मैक्रो जो शीट लेआउट अपेक्षा करता है
| firstName | lastName | company | city | |
|---|---|---|---|---|
| [email protected] | Jane | Doe | Acme | Berlin |
| [email protected] | John | Smith | Globex | Paris |
email अनिवार्य है। हर दूसरा कॉलम Brevo कॉन्टैक्ट एट्रिब्यूट बन जाता है, कॉलम हेडर (अपरकेस्ड) द्वारा एट्रिब्यूट नाम पर मैप किया जाता है। तो firstName -> FIRSTNAME, company -> COMPANY। कस्टम एट्रिब्यूट्स (स्टैंडर्ड सेट से परे कुछ भी) को पहले आपके Brevo अकाउंट में मौजूद होना चाहिए, उन्हें Contacts -> Settings -> Contact attributes के तहत डिफ़ाइन करें।
स्टेप 1: VBA एडिटर खोलें
Excel में: Alt + F11 दबाएँ। VBA एडिटर खुलता है। बाईं ओर Project पैन में, अपनी वर्कबुक पर राइट-क्लिक करें और Insert -> Module चुनें। एक खाली Module1 दिखाई देता है।
स्टेप 2: पूरा मैक्रो पेस्ट करें
Module1 के कंटेंट को इससे रिप्लेस करें:
' ===========================================================================' 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 Functionस्टेप 3: वर्कबुक को .xlsm के रूप में सेव करें
VBA मैक्रोज़ केवल मैक्रो-इनेबल्ड वर्कबुक्स में बने रहते हैं। Save As -> Excel Macro-Enabled Workbook (.xlsm) चुनें। साधारण .xlsx फ़ॉर्मेट चुपचाप मैक्रोज़ को हटा देता है, बहुत से लोग पहली बार इस तरह कोड खो देते हैं।
स्टेप 4: अपनी API key कॉन्फ़िगर करें
ConfigureApiKey को एक बार चलाएँ। या तो:
- VBA एडिटर में,
ConfigureApiKeyसब के अंदर कहीं भी क्लिक करें औरF5दबाएँ, या - Excel में, Developer -> Macros,
ConfigureApiKeyचुनें, Run।
अपनी xkeysib-... key पेस्ट करें। मैक्रो इसे वर्कबुक के अंदर एक कस्टम डॉक्यूमेंट प्रॉपर्टी के रूप में स्टोर करता है, यह सोर्स कोड में नहीं है, रजिस्ट्री में नहीं है, और फ़ाइल के साथ यात्रा करता है (इसलिए सावधान रहें: यदि आप .xlsm को किसी को ईमेल करते हैं, तो API key इसके साथ जाती है)।
यदि आप key को वर्कबुक के बाहर रखना पसंद करेंगे, तो स्टोरेज को Windows रजिस्ट्री में स्वैप करें:
' Replace the body of ConfigureApiKey with:SaveSetting "Brevo", "Sync", "ApiKey", key
' And GetApiKey with:GetApiKey = GetSetting("Brevo", "Sync", "ApiKey", "")SaveSetting/GetSetting HKCU\Software\VB and VBA Program Settings\Brevo\Sync के तहत लिखता है, प्रति-उपयोगकर्ता, प्रति-वर्कबुक नहीं। इसका उपयोग करें यदि कई वर्कबुक्स को एक key साझा करनी चाहिए, या यदि आप नहीं चाहते कि key फ़ाइल में हो।
स्टेप 5: शीट पर एक बटन जोड़ें
यह वही है जो इसे ग़ैर-तकनीकी उपयोगकर्ताओं के लिए एक-क्लिक अनुभव में बदलता है।
Insert -> Shapes -> Rectangle, एक को शीट पर ड्रॉप करें, इसे “Sync to Brevo” लेबल दें। शेप पर राइट-क्लिक करें -> Assign Macro -> SyncSheetToBrevo चुनें। हो गया।
या, अधिक पॉलिश्ड UI के लिए, Office Custom UI Editor के माध्यम से एक कस्टम रिबन टैब जोड़ें, लेकिन अधिकांश आंतरिक टूल्स के लिए, शेप-एज़-बटन काफी है।
स्टेप 6: इसे चलाएँ
बटन क्लिक करें। मैक्रो रोज़ पढ़ता है, उन्हें बैच करता है, हर बैच को Brevo में पोस्ट करता है, और एक सारांश मैसेज बॉक्स दिखाता है। Brevo का इम्पोर्ट asynchronous है, इसलिए सक्सेस मैसेज का अर्थ है “Brevo ने बैच स्वीकार कर लिया”, वास्तविक कॉन्टैक्ट निर्माण अगले कुछ सेकंड में सर्वर साइड पर होता है। जब यह समाप्त हो जाएगा तो आपको Brevo से एक ईमेल सारांश मिलेगा (जब तक आप disableNotification: true सेट नहीं करते)।
सामान्य गलतियाँ
बटन कुछ नहीं करता और कोई एरर नहीं है. मैक्रोज़ डिसेबल्ड हैं। शीट के शीर्ष पर पीली सिक्योरिटी बार देखें, Enable Content क्लिक करें। यदि आपका org मैक्रोज़ ब्लॉक करता है, तो नीचे ट्रस्ट-सेंटर / कोड-साइनिंग पाथ देखें।
Compile error: User-defined type not defined. आप Mac Excel पर हैं, जिसमें MSXML2.XMLHTTP नहीं है। Mac VBA सीधे HTTPS रिक्वेस्ट नहीं कर सकता; इसके बजाय नीचे Office Scripts पाथ का उपयोग करें।
बिना स्पष्ट कारण के Brevo से 400 Bad Request. लगभग हमेशा एक: (a) आपकी शीट में एक कस्टम एट्रिब्यूट अभी तक Brevo में मौजूद नहीं है, पहले बनाएँ; (b) JSON एस्केपिंग बग, सेल वैल्यूज़ में कोट्स या बैकस्लैश जो एस्केप नहीं हुए। कोड में EscapeJson फ़ंक्शन स्टैंडर्ड मामलों को हैंडल करता है; यदि आपके डेटा में अजीब कैरेक्टर्स हैं, तो payload को Immediate विंडो (Debug.Print payload) पर लॉग करें और जाँचें।
401 Unauthorized. ग़लत हेडर। यह api-key है (छोटे अक्षर, हाइफ़न), Authorization नहीं। मैक्रो सही वाला उपयोग करता है, लेकिन यदि आपने कहीं और से स्निपेट कॉपी किया है, तो डबल-चेक करें।
Excel बड़े इम्पोर्ट्स पर फ़्रीज़ हो जाता है. मैक्रो UI थ्रेड पर सिंक्रोनस्ली चलता है। 50,000+ रोज़ के लिए, आप Excel को 10-30 सेकंड के लिए हैंग देखेंगे जबकि यह JSON बनाता है और Brevo पर इंतज़ार करता है। या तो स्वीकार करें, या MSXML2.XMLHTTP को इसके async वैरिएंट पर स्विच करें, लेकिन उस स्केल पर आप Power Automate में बेहतर हैं (अगला सेक्शन)।
जब VBA पर्याप्त नहीं है: Office Scripts + Power Automate
VBA शेड्यूल्ड क्लाउड सिंक नहीं कर सकता। यदि आपको चाहिए:
- वर्कबुक हर घंटे Brevo के साथ सिंक हो बिना कोई इसे खोले
- वर्कबुक OneDrive/SharePoint पर, वेब से एडिट किया गया
- एक IT डिपार्टमेंट जो डेस्कटॉप मैक्रोज़ को बैन करता है
…तो आप Office Scripts (Apps Script का Microsoft क्लाउड समतुल्य) प्लस Power Automate (उनकी शेड्यूलिंग और HTTP लेयर) चाहते हैं।
विभाजन: Office Scripts शीट पढ़ता है और कॉन्टैक्ट डेटा लौटाता है। Power Automate उस डेटा को लेता है और एक ट्रिगर पर Brevo पर पोस्ट करता है।
Office Script (वेब के लिए Excel -> 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 फ़्लो:
- Trigger: Recurrence (हर 1 घंटा), या मैनुअल बटन, या “When a row is modified” यदि आप परिवर्तन-संचालित सिंक चाहते हैं।
- Action: Excel Online -> Run script, इसे अपनी वर्कबुक और ऊपर की स्क्रिप्ट पर पॉइंट करें। इसकी रिटर्न वैल्यू को
contactsके रूप में सेव करें। - Action: HTTP (यह प्रीमियम कनेक्टर है, नीचे लाइसेंसिंग नोट देखें)।
- 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 -> यदि स्टेटस कोड 202 नहीं है, तो Teams/ईमेल अलर्ट भेजें।
लाइसेंसिंग वास्तविकता जाँच: HTTP एक्शन एक Power Automate प्रीमियम कनेक्टर है। Microsoft 365 Business Basic/Standard प्लांस पर आपको स्टैंडर्ड कनेक्टर्स मिलते हैं लेकिन प्रीमियम नहीं। सबसे सस्ता वर्कअराउंड है Power Automate Premium ऐड-ऑन (~$15/उपयोगकर्ता/महीना लेखन के समय), या HTTP को एक छोटे Azure Function में ले जाएँ जिसे स्टैंडर्ड फ़्लो कॉल कर सकता है। यदि आप पहले से ही Premium के साथ E3/E5 पर हैं, तो आप तैयार हैं।
यह मुख्य कारण है कि Apps Script की कहानी क्लीनर है: Apps Script का UrlFetchApp मुफ़्त और अप्रतिबंधित है, जबकि Microsoft समतुल्य नेटवर्क कॉल को पेड कनेक्टर टियर के पीछे रखता है।
VBA बनाम Office Scripts बनाम Apps Script: कब क्या चुनें
| ज़रूरत | सर्वोत्तम विकल्प |
|---|---|
| एक वर्कबुक में एक-क्लिक बटन जिसे आपकी टीम पहले से ही रोज़ खोलती है | VBA मैक्रो (यह गाइड, ऊपरी आधा) |
| OneDrive/SharePoint पर वर्कबुक, हर घंटे ऑटो-सिंक | Office Scripts + Power Automate (HTTP के लिए Premium चाहिए) |
| केवल Mac Excel, VBA उपयोग नहीं कर सकते | Office Scripts + Power Automate |
| डेटा Google Sheets में रहता है, Excel में नहीं | Apps Script (मुफ़्त, बिल्ट-इन शेड्यूल्ड ट्रिगर्स) |
| वन-ऑफ़ इम्पोर्ट, फिर कभी ज़रूरत नहीं | Save As -> CSV और CSV इम्पोर्ट स्क्रिप्ट का उपयोग करें |
| 10 MB से बड़ी फ़ाइल से बल्क इम्पोर्ट | fileUrl के साथ CSV, CSV गाइड देखें |
यह Zapier / नो-कोड प्लेटफ़ॉर्मस से बेहतर क्यों है
बार-बार होने वाली Excel-to-Brevo जॉब के लिए, थर्ड-पार्टी ऑटोमेशन टूल्स (Zapier, Make, n8n) प्रति-टास्क चार्ज करते हैं और आपके डेटा और Brevo के बीच एक थर्ड पार्टी डालते हैं। VBA दृष्टिकोण की कोई चालू लागत नहीं है, कोई थर्ड-पार्टी डेटा फ़्लो नहीं है, और यह फ़ाइल के अंदर रहता है, जब वर्कबुक चलती है, तो इंटीग्रेशन इसके साथ चलता है। Office Scripts + Power Automate समान है लेकिन Microsoft थर्ड पार्टी के रूप में (आपके स्टैक में पहले से ही है यदि आप M365 पर हैं)।
Brevo POST /v3/contacts/import एंडपॉइंट का पूरा बिंदु है कि आपको ग्लू प्लेटफ़ॉर्म की आवश्यकता नहीं है, आपके टूल्स पहले से ही जानते हैं कि HTTP रिक्वेस्ट कैसे करें।