You can drop the code into a new workbook, customize the worksheet layout to suit your business, and then distribute the file together with a list of valid keys (or a single key you generate for each customer). This implementation is not meant to be a high‑security DRM system – VBA can be read and altered by a determined user. It is, however, more than enough for basic “you‑must‑enter‑a‑key before you can use the tool” scenarios typical for internal tools, small‑business add‑ins, or prototype deployments. 1️⃣ What the solution does | Feature | Description | |--------|-------------| | Invoice entry form | A user‑form ( frmInvoice ) lets you capture the main invoice fields (Date, Number, Customer, Items, Amount, Tax, Total). | | Invoice list | All entered invoices are stored in a hidden worksheet called Invoices . | | Search / edit | A second form ( frmSearch ) lets you locate an invoice by number and optionally edit it. | | Activation‑key check | When the workbook opens, a modal dialog asks for a key. The key is validated against a simple algorithm (hash‑based) and, if valid, the rest of the UI becomes usable. Invalid or missing keys keep the workbook locked. | | Key management | All valid keys are stored (obfuscated) in the hidden sheet KeyStore – you can add/remove keys without touching the code. | | Lock‑down | The VBA project itself is password‑protected (you set it yourself) and the key‑check disables the ribbon items that launch the forms until a valid key is entered. | 2️⃣ Workbook layout (what you need to create) | Sheet name | Visibility | Purpose | |------------|------------|---------| | Invoices | Very hidden (via VBA) | Stores each invoice as one row. Columns: A:Date , B:Number , C:Customer , D:Items , E:Amount , F:Tax , G:Total . | | KeyStore | Very hidden | Column A holds the obfuscated (base‑64‑encoded) list of valid keys. | | Dashboard | Visible (optional) | A simple front‑page where you can place two buttons: “New Invoice” and “Search Invoice” . The buttons are wired to the macros ShowInvoiceForm and ShowSearchForm . | Tip: If you prefer a clean workbook, you can delete any extra sheets. The code only references the three above. 3️⃣ VBA code – copy‑paste it into a standard module (e.g., modInvoiceMgr ) Option Explicit
| Control | Name | Type / Caption | Size / Position (suggested) | |---------|---------------|----------------|-----------------------------| | Label | lblDate | Caption: “Date” | top = 10, left = 10 | | TextBox | txtDate | – | top = 10, left = 80, Width = 120 | | Label | lblNo | “Invoice #” | top = 40, left = 10 | | TextBox | txtNo | – | top = 40, left = 80 | | Label | lblCust | “Customer” | top = 70, left = 10 | | TextBox | txtCust | – | top = 70, left = 80, Width = 200 | | Label | lblItems | “Items (one per line)” | top = 100, left = 10 | | TextBox | txtItems | MultiLine = True, Height = 80 | top = 100, left = 80 | | Label | lblAmt | “Amount” | top = 190, left = 10 | | TextBox | txtAmt | – | top = 190, left = 80 | | Label | lblTax | “Tax %” | top = 220, left = 10 | | TextBox | txtTax | – | top = 220, left = 80 | | Label | lblTotal | “Total” (calculated) | top = 250, left = 10 | | TextBox | txtTotal | Locked = True | top = 250, left = 80 | | CommandButton | btnSave | Caption: “Save” | top = 290, left = 80 | | CommandButton | btnCancel | Caption: “Cancel” | top = 290, left = 180 | Option Explicit invoice manager for excel activation key
Public Sub ShowSearchForm() frmSearch.Show vbModal End Sub You can drop the code into a new
'================================================================= ' KEY VALIDATION (hash + lookup in KeyStore) '================================================================= Private Function ValidateKey(ByVal plainKey As String) As Boolean Dim hash As String Dim storedHash As String '1️⃣ Basic format check If Len(plainKey) <> KEY_LENGTH Then Exit Function '2️⃣ Compute hash of the key (SHA‑256) and encode as Base64 hash = ComputeSHA256Base64(plainKey) '3️⃣ Look for the hash in the KeyStore sheet Dim ws As Worksheet, rng As Range Set ws = ThisWorkbook.Worksheets("KeyStore") Set rng = ws.Range("A:A").Find(What:=hash, LookIn:=xlValues, LookAt:=xlWhole) ValidateKey = Not rng Is Nothing End Function 1️⃣ What the solution does | Feature |
'================================================================= ' PUBLIC MACROS – called from the Dashboard buttons '================================================================= Public Sub ShowInvoiceForm() frmInvoice.Show vbModal End Sub
'================================================================= ' INITIALISATION (hide sheets, create tables if missing) '================================================================= Public Sub InitWorkbook() Dim wsInv As Worksheet, wsKey As Worksheet '--- Invoices sheet ------------------------------------------------ On Error Resume Next Set wsInv = ThisWorkbook.Worksheets("Invoices") On Error GoTo 0 If wsInv Is Nothing Then Set wsInv = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) wsInv.Name = "Invoices" wsInv.Range("A1:G1").Value = Array("Date", "InvoiceNo", "Customer", "Items", "Amount", "Tax", "Total") wsInv.Visible = xlSheetVeryHidden End If '--- KeyStore sheet ------------------------------------------------ On Error Resume Next Set wsKey = ThisWorkbook.Worksheets("KeyStore") On Error GoTo 0 If wsKey Is Nothing Then Set wsKey = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)) wsKey.Name = "KeyStore" wsKey.Visible = xlSheetVeryHidden End If End Sub
'================================================================= ' ACTIVATION KEY PROMPT '================================================================= Public Sub PromptForActivation() Dim key As String Dim ok As Boolean Do key = InputBox("Please enter your activation key to unlock the Invoice Manager:", "Activation Required") If key = vbNullString Then If MsgBox("You must provide a key to use this workbook. Close the file?", _ vbYesNo + vbQuestion, "Close?") = vbYes Then ThisWorkbook.Close SaveChanges:=False Exit Sub End If Else ok = ValidateKey(key) If ok Then Exit Do MsgBox "Invalid key – please try again.", vbExclamation, "Invalid" End If Loop 'If we got here the key is good – enable UI UnlockUI MsgBox "Welcome! The Invoice Manager is now active.", vbInformation, "Success" End Sub