VBA excel numpad vba excel vba numpad vba numpad keys excel numeric keypad vba vba onkey numpad

Excel Numpad VBA — The Complete Guide to Numeric Keypad Shortcuts, OnKey Macros & Virtual Numpads (2026)

Vizan Patel
May 18, 2026
Excel Numpad VBA — The Complete Guide to Numeric Keypad Shortcuts, OnKey Macros & Virtual Numpads (2026)

Introduction

The numeric keypad on your keyboard is one of the most underused tools for Excel power users. Most people only use it for typing numbers — but with VBA, you can transform every numpad key into a custom macro trigger, build an on-screen virtual numpad for touchscreen and tablet users, fix the frustrating "numpad not working" issue in Excel, and dramatically speed up data entry across your entire team.

This guide covers everything about Excel numpad VBA that other articles miss — from the exact key codes you need for Application.OnKey, to building a fully functional virtual numpad UserForm with Backspace and Enter buttons, to fixing the most common numpad-related bugs in Excel 2026.

Whether you're a beginner who just wants to assign a macro to the numpad Enter key, or an advanced developer building a touch-friendly Excel interface for tablets — this is the guide you need.


Part 1 — Understanding How the Numpad Works Differently in VBA

This is the most important concept — and the one that trips up almost every VBA developer who tries to work with numpad keys for the first time.

The numpad uses different key codes than the regular number keys.

On your keyboard, you have two sets of number keys:

  • Alphanumeric numbers — the row of numbers across the top of the keyboard (1, 2, 3... above the letter keys)
  • Numeric keypad numbers — the separate numpad on the right side of most keyboards

In regular Windows applications, these often behave identically. But in Excel VBA — specifically with the Application.OnKey method — they are treated as completely different keys with different codes.

Key code table — Numpad vs Alphanumeric:

| Key | Alphanumeric Code | Numpad Code | | 0 | "0" | "{NUMPAD0}" | | 1 | "1" | "{NUMPAD1}" | | 2 | "2" | "{NUMPAD2}" | | 3 | "3" | "{NUMPAD3}" | | 4 | "4" | "{NUMPAD4}" | | 5 | "5" | "{NUMPAD5}" | | 6 | "6" | "{NUMPAD6}" | | 7 | "7" | "{NUMPAD7}" | | 8 | "8" | "{NUMPAD8}" | | 9 | "9" | "{NUMPAD9}" | | + | "+" | "{ADD}" | | - | "-" | "{SUBTRACT}" | | * | "*" | "{MULTIPLY}" | | / | "/" | "{DIVIDE}" | | . (decimal) | "." | "{DECIMAL}" | | Enter | "~" | "{NUMPADENTER}" (or "~" in some versions) |

This is why most "numpad not working" issues happen — developers use the alphanumeric key code when they should be using the numpad-specific code.


Part 2 — Assign a Macro to a Numpad Key Using Application.OnKey

Application.OnKey is the VBA method that lets you assign any keyboard key — including numpad keys — to run a specific macro.

Basic syntax:

vba

Application.OnKey "{NUMPAD1}", "MacroName"

Complete example — assign macros to numpad keys:

vba

Sub AssignNumpadMacros()
    ' Assign each numpad number to a different macro
    Application.OnKey "{NUMPAD1}", "RunReport1"
    Application.OnKey "{NUMPAD2}", "RunReport2"
    Application.OnKey "{NUMPAD3}", "RunReport3"
    Application.OnKey "{NUMPAD4}", "GoToDashboard"
    Application.OnKey "{NUMPAD5}", "RefreshAllData"
    Application.OnKey "{NUMPAD7}", "SaveBackup"
    Application.OnKey "{NUMPAD8}", "SendEmail"
    Application.OnKey "{NUMPAD9}", "PrintReport"
    Application.OnKey "{ADD}",      "AddNewRow"
    Application.OnKey "{SUBTRACT}", "DeleteRow"
    
    MsgBox "Numpad shortcuts activated!" & vbNewLine & _
           "Numpad 1-3: Run Reports | 4: Dashboard | 5: Refresh | " & _
           "7: Save | 8: Email | 9: Print", vbInformation
End Sub

Sub RemoveNumpadMacros()
    ' Remove all custom numpad assignments (restore default behavior)
    Application.OnKey "{NUMPAD1}"
    Application.OnKey "{NUMPAD2}"
    Application.OnKey "{NUMPAD3}"
    Application.OnKey "{NUMPAD4}"
    Application.OnKey "{NUMPAD5}"
    Application.OnKey "{NUMPAD7}"
    Application.OnKey "{NUMPAD8}"
    Application.OnKey "{NUMPAD9}"
    Application.OnKey "{ADD}"
    Application.OnKey "{SUBTRACT}"
    
    MsgBox "Numpad restored to default behavior.", vbInformation
End Sub

Where to put this code:

Place AssignNumpadMacros in the Workbook_Open event so shortcuts activate automatically when the file opens:

vba

' In ThisWorkbook module:
Private Sub Workbook_Open()
    AssignNumpadMacros
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    RemoveNumpadMacros  ' Always clean up OnKey assignments on close
End Sub

Critical rule: Always remove your OnKey assignments when the workbook closes — otherwise they may affect other Excel workbooks the user has open.


Part 3 — Fix "Numpad Not Working" in Excel VBA

This is the most commonly searched numpad VBA issue. Here are all the causes and fixes:

Issue 1 — Using wrong key codes

Wrong:

vba

Application.OnKey "1", "MyMacro"  ' This only catches the top-row "1" key

Correct:

vba

Application.OnKey "{NUMPAD1}", "MyMacro"  ' This catches the numpad "1" key

Issue 2 — Num Lock is off

When Num Lock is off, numpad keys send navigation commands (arrows, Home, End, PgUp, PgDn) instead of numbers. VBA cannot intercept these as number keys.

Fix — check Num Lock status in VBA:

vba

Function IsNumLockOn() As Boolean
    ' Uses Windows API to check Num Lock state
    IsNumLockOn = (GetKeyState(144) And 1) <> 0
End Function

' Add this declaration at the top of your module:
Declare PtrSafe Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer

Sub CheckAndEnableNumLock()
    If Not IsNumLockOn() Then
        MsgBox "Num Lock is OFF. Please press the Num Lock key on your keyboard " & _
               "to enable numeric keypad input.", vbExclamation, "Num Lock Required"
    Else
        MsgBox "Num Lock is ON — numpad is ready.", vbInformation
    End If
End Sub

Issue 3 — OnKey not working inside a UserForm

Application.OnKey does not work when a UserForm has focus. When a UserForm is active, it captures all keyboard input directly.

Fix — use the UserForm's KeyDown event instead:

vba

' In your UserForm code:
Private Sub UserForm_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
        Case 97   ' Numpad 1 (ASCII/Virtual Key code)
            Call RunReport1
        Case 98   ' Numpad 2
            Call RunReport2
        Case 99   ' Numpad 3
            Call RunReport3
        Case 107  ' Numpad +
            Call AddNewRow
        Case 109  ' Numpad -
            Call DeleteRow
    End Select
End Sub

Numpad virtual key codes for UserForm KeyDown:

| Numpad Key | Virtual Key Code | | Numpad 0 | 96 | | Numpad 1 | 97 | | Numpad 2 | 98 | | Numpad 3 | 99 | | Numpad 4 | 100 | | Numpad 5 | 101 | | Numpad 6 | 102 | | Numpad 7 | 103 | | Numpad 8 | 104 | | Numpad 9 | 105 | | Numpad + | 107 | | Numpad - | 109 | | Numpad * | 106 | | Numpad / | 111 | | Numpad . | 110 | | Numpad Enter | 13 |

Issue 4 — Laptop without a physical numpad

Many USA laptop users — especially on smaller 13" and 14" laptops — don't have a physical numeric keypad. The solution is either:

  1. An external USB numpad (inexpensive and widely available)
  2. A virtual on-screen numpad built in VBA — covered in Part 4 below

Part 4 — Build a Virtual On-Screen Numpad in Excel VBA

This is the most unique and valuable section of this guide — a complete, ready-to-use virtual numpad UserForm that works on touchscreens, tablets, and any computer without a physical numpad.

This is perfect for:

  • Factory floor computers and industrial tablets
  • Shared workstations where physical keyboards get damaged
  • Touch-screen kiosk setups
  • Any Excel form where mouse-only or touch-only input is needed

Step 1 — Create the UserForm:

  1. Press Alt + F11 to open the VBA editor
  2. Go to Insert → UserForm
  3. Rename it NumpadForm in the Properties panel

Step 2 — Add buttons to the UserForm:

Add the following CommandButtons to your UserForm in a numpad layout:

[7] [8] [9]
[4] [5] [6]
[1] [2] [3]
[0]  [.] [⌫]
       [Enter]

Name each button: btn7, btn8, btn9, btn4, btn5, btn6, btn1, btn2, btn3, btn0, btnDecimal, btnBackspace, btnEnter

Also add a TextBox named txtDisplay at the top to show the number being entered.

Step 3 — Add the VBA code for the virtual numpad:

vba

' In NumpadForm code module:

' Variable to track which cell to write the result to
Dim targetCell As Range

' Call this sub to show the numpad and link it to a specific cell
Public Sub ShowNumpad(cell As Range)
    Set targetCell = cell
    txtDisplay.Value = ""
    Me.Show
End Sub

' Number button click handlers
Private Sub btn0_Click()
    AppendDigit "0"
End Sub

Private Sub btn1_Click()
    AppendDigit "1"
End Sub

Private Sub btn2_Click()
    AppendDigit "2"
End Sub

Private Sub btn3_Click()
    AppendDigit "3"
End Sub

Private Sub btn4_Click()
    AppendDigit "4"
End Sub

Private Sub btn5_Click()
    AppendDigit "5"
End Sub

Private Sub btn6_Click()
    AppendDigit "6"
End Sub

Private Sub btn7_Click()
    AppendDigit "7"
End Sub

Private Sub btn8_Click()
    AppendDigit "8"
End Sub

Private Sub btn9_Click()
    AppendDigit "9"
End Sub

Private Sub btnDecimal_Click()
    ' Only allow one decimal point
    If InStr(txtDisplay.Value, ".") = 0 Then
        AppendDigit "."
    End If
End Sub

Private Sub btnBackspace_Click()
    ' Remove last character
    If Len(txtDisplay.Value) > 0 Then
        txtDisplay.Value = Left(txtDisplay.Value, Len(txtDisplay.Value) - 1)
    End If
End Sub

Private Sub btnEnter_Click()
    ' Write the value to the target cell and close
    If Not targetCell Is Nothing Then
        If IsNumeric(txtDisplay.Value) Then
            targetCell.Value = CDbl(txtDisplay.Value)
        Else
            MsgBox "Please enter a valid number.", vbExclamation
            Exit Sub
        End If
    End If
    Me.Hide
End Sub

' Helper sub to append digits to display
Private Sub AppendDigit(digit As String)
    txtDisplay.Value = txtDisplay.Value & digit
End Sub

Step 4 — Launch the virtual numpad from a sheet:

vba

' In a regular Module:
Sub OpenNumpadForCell()
    ' Opens numpad for whatever cell is currently selected
    NumpadForm.ShowNumpad ActiveCell
End Sub

' Or trigger it when user double-clicks a specific range:
' In the Sheet's code module:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ' Only open numpad for column B (data entry column)
    If Target.Column = 2 Then
        Cancel = True  ' Prevent normal double-click edit mode
        NumpadForm.ShowNumpad Target
    End If
End Sub

Now whenever a user double-clicks any cell in column B, the virtual numpad pops up automatically — perfect for tablet and touchscreen users.


Part 5 — Numpad Shortcuts for Faster Data Entry in Excel

Even without any VBA, the numpad has powerful built-in behaviors in Excel that most USA users don't know about:

Built-in numpad shortcuts in Excel:

| Numpad Key | What It Does | | Numpad Enter | Confirms entry and moves down (same as regular Enter) | | Numpad / | Selects the current array (when Num Lock is on) | | Numpad * | Selects the current region (equivalent to Ctrl + Shift + *) | | Numpad + | In some Excel versions, inserts cells | | Numpad - | Deletes selected cells | | Ctrl + Numpad / | Selects the current array formula range | | Ctrl + Numpad * | Selects the current region around the active cell |

VBA macro to speed up numpad data entry:

vba

Sub FastNumpadEntry()
    ' Assign Numpad Enter to move right instead of down
    ' Useful for entering data across rows
    Application.OnKey "{NUMPADENTER}", "MoveRight"
End Sub

Sub MoveRight()
    ActiveCell.Offset(0, 1).Select
End Sub

Sub RestoreNumpadEnter()
    Application.OnKey "{NUMPADENTER}"  ' Restore default behavior
End Sub

This is incredibly useful for USA accounting teams entering financial data across columns — pressing numpad Enter moves right instead of down, speeding up data entry significantly.


Part 6 — Numpad VBA for Touchscreen and Tablet Excel Users

With more USA businesses using touchscreen laptops, Surface tablets, and iPad Excel apps, building touch-friendly interfaces is increasingly important.

Best practices for numpad VBA on touch devices:

vba

Sub ConfigureForTouchScreen()
    ' Make all buttons larger (easier to tap with finger)
    Dim ctrl As Control
    For Each ctrl In NumpadForm.Controls
        If TypeName(ctrl) = "CommandButton" Then
            ctrl.Height = 50  ' Taller buttons
            ctrl.Width = 50   ' Wider buttons
            ctrl.Font.Size = 18  ' Larger text
        End If
    Next ctrl
    
    ' Increase spacing between buttons
    ' (Do this manually in the UserForm designer for best results)
    
    MsgBox "Touch-optimized numpad ready!", vbInformation
End Sub

Detecting if Excel is running on a touchscreen:

vba

Function IsTouchScreen() As Boolean
    ' Check screen resolution and pointer type as proxy for touch
    IsTouchScreen = (Application.Width < 1024)  ' Approximation
    ' For more accurate detection, use Windows API GetSystemMetrics
End Function

Common Numpad VBA Mistakes and Fixes

Mistake 1 — Not removing OnKey assignments on workbook close Always pair every Workbook_Open OnKey assignment with a Workbook_BeforeClose removal. Otherwise your numpad macros will bleed into other workbooks.

Mistake 2 — Using alphanumeric codes for numpad keys Application.OnKey "1" catches the top-row 1 key. Application.OnKey "{NUMPAD1}" catches the numpad 1 key. They are different — use the right one.

Mistake 3 — Expecting OnKey to work inside UserForms It doesn't. Use UserForm_KeyDown with virtual key codes instead (see Part 3, Issue 3).

Mistake 4 — Not checking Num Lock state If Num Lock is off, numpad number keys send arrow/navigation commands. Add a Num Lock check at the start of your macro and warn the user if it's off.

Mistake 5 — Building a numpad UserForm without a Backspace button Always include a Backspace button — without it, users who make a mistake have to close and reopen the form. It's the most important usability feature of any virtual numpad.


Frequently Asked Questions

How do I assign a macro to a numpad key in Excel VBA?

Use Application.OnKey "{NUMPAD1}", "YourMacroName" in VBA. The numpad uses different key codes from the regular number keys — use {NUMPAD0} through {NUMPAD9}, {ADD}, {SUBTRACT}, {MULTIPLY}, {DIVIDE}, and {DECIMAL} for the respective numpad keys.

Why is my numpad not working in Excel VBA?

The most common causes are: (1) using alphanumeric key codes instead of numpad-specific codes, (2) Num Lock being off, (3) trying to use Application.OnKey inside a UserForm where it doesn't work. See Part 3 of this guide for all fixes.

How do I use numpad keys inside a VBA UserForm?

Application.OnKey doesn't work inside UserForms. Use the UserForm_KeyDown event instead, with virtual key codes: Numpad 1 = 97, Numpad 2 = 98 ... Numpad 9 = 105, Numpad 0 = 96. Full key code table is in Part 3 of this guide.

How do I build a virtual numpad in Excel for touchscreen users?

Create a VBA UserForm with CommandButtons arranged in a 3×4 numpad layout, a TextBox for display, and a Backspace and Enter button. See Part 4 of this guide for complete ready-to-use code.

What is the VBA key code for numpad Enter?

In Application.OnKey, use "~" for regular Enter and numpad Enter both. In UserForm_KeyDown, both Enter keys send KeyCode 13. Some Excel versions also support "{NUMPADENTER}" in OnKey.

How do I make the numpad Enter key move right instead of down in Excel?

Use Application.OnKey "{NUMPADENTER}", "MoveRight" with a simple Sub MoveRight() that calls ActiveCell.Offset(0, 1).Select. This is extremely useful for entering data across rows.

Does the Excel VBA numpad work on Mac?

On Mac, Application.OnKey supports fewer special keys and numpad behavior varies. The {NUMPAD0} through {NUMPAD9} codes may not work on all Mac keyboard layouts. The virtual numpad UserForm approach (Part 4) works reliably on both Mac and Windows.


Quick Reference — Excel Numpad VBA Cheat Sheet

| Task | Code | | Assign macro to Numpad 1 | Application.OnKey "{NUMPAD1}", "MacroName" | | Remove numpad assignment | Application.OnKey "{NUMPAD1}" | | Numpad + key | Application.OnKey "{ADD}", "MacroName" | | Numpad - key | Application.OnKey "{SUBTRACT}", "MacroName" | | Numpad * key | Application.OnKey "{MULTIPLY}", "MacroName" | | Numpad / key | Application.OnKey "{DIVIDE}", "MacroName" | | Numpad . key | Application.OnKey "{DECIMAL}", "MacroName" | | Numpad key in UserForm | UserForm_KeyDown with KeyCode 96–105 | | Make numpad Enter move right | Application.OnKey "{NUMPADENTER}", "MoveRight" | | Check Num Lock state | GetKeyState(144) And 1 |


Final Thoughts

The Excel numpad is far more powerful than most users realize. With VBA, you can turn every numpad key into a custom macro shortcut, fix the frustrating issues that prevent numpad keys from being recognized, build a complete virtual numpad for tablet and touchscreen users, and dramatically speed up data entry for your entire team.

The key things to remember in 2026:

  • Numpad keys use different codes from regular number keys in Application.OnKey
  • OnKey does not work inside UserForms — use UserForm_KeyDown instead
  • Always check Num Lock before assuming the numpad is broken
  • Build a virtual numpad for any Excel tool used on tablets or touchscreens
  • Always clean up OnKey assignments when your workbook closes

Don't want to write VBA yourself? Try our free tools:

Tags

excel numpad vba, excel vba numpad, vba numpad keys, excel numeric keypad vba, vba onkey numpad, excel vba numpad not working, application onkey numpad, excel vba numpad enter, virtual numpad excel vba, excel userform numpad, vba numpad key codes, excel numpad shortcut, excel vba onkey, numpad not working excel, excel touch numpad vba, excel vba keyboard shortcut, excel numpad data entry, vba userform keydown, vba macro generator, mergeexcelfiles.org

Need to merge files safely?

Our tool processes everything locally in your browser. No data ever leaves your computer.

Try Merge Excel Files