Thanks to this question (and answers), I discovered an easy way to get at the exact NumberFormat string for virtually any format that Excel has to offer.
How to Obtain the NumberFormat String for Any Excel Number Format
Step 1: In the user interface, set a cell to the NumberFormat you want to use.
In my example, I selected the Chinese (PRC) Currency from the options contained in the «Account Numbers Format» combo box.
Step 2: Expand the Number Format dropdown and select «More Number Formats…».
Step 3: In the Number tab, in Category, click «Custom».
The «Sample» section shows the Chinese (PRC) currency formatting that I applied.
The «Type» input box contains the NumberFormat string that you can use programmatically.
So, in this example, the NumberFormat of my Chinese (PRC) Currency cell is as follows:
_ [$¥-804]* #,##0.00_ ;_ [$¥-804]* -#,##0.00_ ;_ [$¥-804]* "-"??_ ;_ @_
If you do these steps for each NumberFormat that you desire, then the world is yours.
I hope this helps.
Thanks to this question (and answers), I discovered an easy way to get at the exact NumberFormat string for virtually any format that Excel has to offer.
How to Obtain the NumberFormat String for Any Excel Number Format
Step 1: In the user interface, set a cell to the NumberFormat you want to use.
In my example, I selected the Chinese (PRC) Currency from the options contained in the «Account Numbers Format» combo box.
Step 2: Expand the Number Format dropdown and select «More Number Formats…».
Step 3: In the Number tab, in Category, click «Custom».
The «Sample» section shows the Chinese (PRC) currency formatting that I applied.
The «Type» input box contains the NumberFormat string that you can use programmatically.
So, in this example, the NumberFormat of my Chinese (PRC) Currency cell is as follows:
_ [$¥-804]* #,##0.00_ ;_ [$¥-804]* -#,##0.00_ ;_ [$¥-804]* "-"??_ ;_ @_
If you do these steps for each NumberFormat that you desire, then the world is yours.
I hope this helps.
In this Article
- Formatting Numbers in Excel VBA
- How to Use the Format Function in VBA
- Creating a Format String
- Using a Format String for Alignment
- Using Literal Characters Within the Format String
- Use of Commas in a Format String
- Creating Conditional Formatting within the Format String
- Using Fractions in Formatting Strings
- Date and Time Formats
- Predefined Formats
- General Number
- Currency
- Fixed
- Standard
- Percent
- Scientific
- Yes/No
- True/False
- On/Off
- General Date
- Long Date
- Medium Date
- Short Date
- Long Time
- Medium Time
- Short Time
- Dangers of Using Excel’s Pre-Defined Formats in Dates and Times
- User-Defined Formats for Numbers
- User-Defined Formats for Dates and Times
Formatting Numbers in Excel VBA
Numbers come in all kinds of formats in Excel worksheets. You may already be familiar with the pop-up window in Excel for making use of different numerical formats:
Formatting of numbers make the numbers easier to read and understand. The Excel default for numbers entered into cells is ‘General’ format, which means that the number is displayed exactly as you typed it in.
For example, if you enter a round number e.g. 4238, it will be displayed as 4238 with no decimal point or thousands separators. A decimal number such as 9325.89 will be displayed with the decimal point and the decimals. This means that it will not line up in the column with the round numbers, and will look extremely messy.
Also, without showing the thousands separators, it is difficult to see how large a number actually is without counting the individual digits. Is it in millions or tens of millions?
From the point of view of a user looking down a column of numbers, this makes it quite difficult to read and compare.
In VBA you have access to exactly the same range of formats that you have on the front end of Excel. This applies to not only an entered value in a cell on a worksheet, but also things like message boxes, UserForm controls, charts and graphs, and the Excel status bar at the bottom left hand corner of the worksheet.
The Format function is an extremely useful function in VBA in presentation terms, but it is also very complex in terms of the flexibility offered in how numbers are displayed.
How to Use the Format Function in VBA
If you are showing a message box, then the Format function can be used directly:
MsgBox Format(1234567.89, "#,##0.00")
This will display a large number using commas to separate the thousands and to show 2 decimal places. The result will be 1,234,567.89. The zeros in place of the hash ensure that decimals will be shown as 00 in whole numbers, and that there is a leading zero for a number which is less than 1
The hashtag symbol (#) represents a digit placeholder which displays a digit if it is available in that position, or else nothing.
You can also use the format function to address an individual cell, or a range of cells to change the format:
Sheets("Sheet1").Range("A1:A10").NumberFormat = "#,##0.00"
This code will set the range of cells (A1 to A10) to a custom format which separates the thousands with commas and shows 2 decimal places.
If you check the format of the cells on the Excel front end, you will find that a new custom format has been created.
You can also format numbers on the Excel Status Bar at the bottom left hand corner of the Excel window:
Application.StatusBar = Format(1234567.89, "#,##0.00")
You clear this from the status bar by using:
Application.StatusBar = ""
Creating a Format String
This example will add the text ‘Total Sales’ after each number, as well as including a thousands separator
Sheets("Sheet1").Range("A1:A6").NumberFormat = "#,##0.00"" Total Sales"""
This is what your numbers will look like:
Note that cell A6 has a ‘SUM’ formula, and this will include the ‘Total Sales’ text without requiring formatting. If the formatting is applied, as in the above code, it will not put an extra instance of ‘Total Sales’ into cell A6
Although the cells now display alpha numeric characters, the numbers are still present in numeric form. The ‘SUM’ formula still works because it is using the numeric value in the background, not how the number is formatted.
The comma in the format string provides the thousands separator. Note that you only need to put this in the string once. If the number runs into millions or billions, it will still separate the digits into groups of 3
The zero in the format string (0) is a digit placeholder. It displays a digit if it is there, or a zero. Its positioning is very important to ensure uniformity with the formatting
In the format string, the hash characters (#) will display nothing if there is no digit. However, if there is a number like .8 (all decimals), we want it to show as 0.80 so that it lines up with the other numbers.
By using a single zero to the left of the decimal point and two zeros to the right of the decimal point in the format string, this will give the required result (0.80).
If there was only one zero to the right of the decimal point, then the result would be ‘0.8’ and everything would be displayed to one decimal place.
Using a Format String for Alignment
We may want to see all the decimal numbers in a range aligned on their decimal points, so that all the decimal points are directly under each other, however many places of decimals there are on each number.
You can use a question mark (?) within your format string to do this. The ‘?’ indicates that a number is shown if it is available, or a space
Sheets("Sheet1").Range("A1:A6").NumberFormat = "#,##0.00??"
This will display your numbers as follows:
All the decimal points now line up underneath each other. Cell A5 has three decimal places and this would throw the alignment out normally, but using the ‘?’ character aligns everything perfectly.
Using Literal Characters Within the Format String
You can add any literal character into your format string by preceding it with a backslash ().
Suppose that you want to show a particular currency indicator for your numbers which is not based on your locale. The problem is that if you use a currency indicator, Excel automatically refers to your local and changes it to the one appropriate for the locale that is set on the Windows Control Panel. This could have implications if your Excel application is being distributed in other countries and you want to ensure that whatever the locale is, the currency indicator is always the same.
You may also want to indicate that the numbers are in millions in the following example:
Sheets("Sheet1").Range("A1:A6").NumberFormat = "$#,##0.00 m"
This will produce the following results on your worksheet:
In using a backslash to display literal characters, you do not need to use a backslash for each individual character within a string. You can use:
Sheets("Sheet1").Range("A1:A6").NumberFormat = "$#,##0.00 mill"
This will display ‘mill’ after every number within the formatted range.
You can use most characters as literals, but not reserved characters such as 0, #,?
Use of Commas in a Format String
We have already seen that commas can be used to create thousands separators for large numbers, but they can also be used in another way.
By using them at the end of the numeric part of the format string, they act as scalers of thousands. In other words, they will divide each number by 1,000 every time there is a comma.
In the example data, we are showing it with an indicator that it is in millions. By inserting one comma into the format string, we can show those numbers divided by 1,000.
Sheets("Sheet1").Range("A1:A6").NumberFormat = "$#,##0.00,m"
This will show the numbers divided by 1,000 although the original number will still be in background in the cell.
If you put two commas in the format string, then the numbers will be divided by a million
Sheets("Sheet1").Range("A1:A6").NumberFormat = "$#,##0.00,,m"
This will be the result using only one comma (divide by 1,000):
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More
Creating Conditional Formatting within the Format String
You could set up conditional formatting on the front end of Excel, but you can also do it within your VBA code, which means that you can manipulate the format string programmatically to make changes.
You can use up to four sections within your format string. Each section is delimited by a semicolon (;). The four sections correspond to positive, negative, zero, and text
Range("A1:A7").NumberFormat = "#,##0.00;[Red]-#,##0.00;[Green] #,##0.00;[Blue]”
In this example, we use the same hash, comma, and zero characters to provide thousand separators and two decimal points, but we now have different sections for each type of value.
The first section is for positive numbers and is no different to what we have already seen previously in terms of format.
The second section for negative numbers introduces a color (Red) which is held within a pair of square brackets. The format is the same as for positive numbers except that a minus (-) sign has been added in front.
The third section for zero numbers uses a color (Green) within square brackets with the numeric string the same as for positive numbers.
The final section is for text values, and all that this needs is a color (Blue) again within square brackets
This is the result of applying this format string:
You can go further with conditions within the format string. Suppose that you wanted to show every positive number above 10,000 as green, and every other number as red you could use this format string:
Range("A1:A7").NumberFormat = "[>=10000][Green]#,##0.00;[<10000][Red]#,##0.00"
This format string includes conditions for >=10000 set in square brackets so that green will only be used where the number is greater than or equal to 10000
This is the result:
Using Fractions in Formatting Strings
Fractions are not often used in spreadsheets, since they normally equate to decimals which everyone is familiar with.
However, sometimes they do serve a purpose. This example will display dollars and cents:
Range("A1:A7").NumberFormat = "#,##0 "" dollars and "" 00/100 "" cents """
This is the result that will be produced:
Remember that in spite of the numbers being displayed as text, they are still there in the background as numbers and all the Excel formulas can still be used on them.
Date and Time Formats
Dates are actually numbers and you can use formats on them in the same way as for numbers. If you format a date as a numeric number, you will see a large number to the left of the decimal point and a number of decimal places. The number to the left of the decimal point shows the number of days starting at 01-Jan-1900, and the decimal places show the time based on 24hrs
MsgBox Format(Now(), "dd-mmm-yyyy")
This will format the current date to show ’08-Jul-2020’. Using ‘mmm’ for the month displays the first three characters of the month name. If you want the full month name then you use ‘mmmm’
You can include times in your format string:
MsgBox Format(Now(), "dd-mmm-yyyy hh:mm AM/PM")
This will display ’08-Jul-2020 01:25 PM’
‘hh:mm’ represents hours and minutes and AM/PM uses a 12-hour clock as opposed to a 24-hour clock.
You can incorporate text characters into your format string:
MsgBox Format(Now(), "dd-mmm-yyyy hh:mm AM/PM"" today""")
This will display ’08-Jul-2020 01:25 PM today’
You can also use literal characters using a backslash in front in the same way as for numeric format strings.
VBA Programming | Code Generator does work for you!
Predefined Formats
Excel has a number of built-in formats for both numbers and dates that you can use in your code. These mainly reflect what is available on the number formatting front end, although some of them go beyond what is normally available on the pop-up window. Also, you do not have the flexibility over number of decimal places, or whether thousands separators are used.
General Number
This format will display the number exactly as it is
MsgBox Format(1234567.89, "General Number")
The result will be 1234567.89
Currency
MsgBox Format(1234567.894, "Currency")
This format will add a currency symbol in front of the number e.g. $, £ depending on your locale, but it will also format the number to 2 decimal places and will separate the thousands with commas.
The result will be $1,234,567.89
Fixed
MsgBox Format(1234567.894, "Fixed")
This format displays at least one digit to the left but only two digits to the right of the decimal point.
The result will be 1234567.89
Standard
MsgBox Format(1234567.894, "Standard")
This displays the number with the thousand separators, but only to two decimal places.
The result will be 1,234,567.89
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Percent
MsgBox Format(1234567.894, "Percent")
The number is multiplied by 100 and a percentage symbol (%) is added at the end of the number. The format displays to 2 decimal places
The result will be 123456789.40%
Scientific
MsgBox Format(1234567.894, "Scientific")
This converts the number to Exponential format
The result will be 1.23E+06
Yes/No
MsgBox Format(1234567.894, "Yes/No")
This displays ‘No’ if the number is zero, otherwise displays ‘Yes’
The result will be ‘Yes’
True/False
MsgBox Format(1234567.894, "True/False")
This displays ‘False’ if the number is zero, otherwise displays ‘True’
The result will be ‘True’
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
On/Off
MsgBox Format(1234567.894, "On/Off")
This displays ‘Off’ if the number is zero, otherwise displays ‘On’
The result will be ‘On’
General Date
MsgBox Format(Now(), "General Date")
This will display the date as date and time using AM/PM notation. How the date is displayed depends on your settings in the Windows Control Panel (Clock and Region | Region). It may be displayed as ‘mm/dd/yyyy’ or ‘dd/mm/yyyy’
The result will be ‘7/7/2020 3:48:25 PM’
Long Date
MsgBox Format(Now(), "Long Date")
This will display a long date as defined in the Windows Control Panel (Clock and Region | Region). Note that it does not include the time.
The result will be ‘Tuesday, July 7, 2020’
Medium Date
MsgBox Format(Now(), "Medium Date")
This displays a date as defined in the short date settings as defined by locale in the Windows Control Panel.
The result will be ’07-Jul-20’
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Short Date
MsgBox Format(Now(), "Short Date")
Displays a short date as defined in the Windows Control Panel (Clock and Region | Region). How the date is displayed depends on your locale. It may be displayed as ‘mm/dd/yyyy’ or ‘dd/mm/yyyy’
The result will be ‘7/7/2020’
Long Time
MsgBox Format(Now(), "Long Time")
Displays a long time as defined in Windows Control Panel (Clock and Region | Region).
The result will be ‘4:11:39 PM’
Medium Time
MsgBox Format(Now(), "Medium Time")
Displays a medium time as defined by your locale in the Windows Control Panel. This is usually set as 12-hour format using hours, minutes, and seconds and the AM/PM format.
The result will be ’04:15 PM’
Short Time
MsgBox Format(Now(), "Short Time")
Displays a medium time as defined in Windows Control Panel (Clock and Region | Region). This is usually set as 24-hour format with hours and minutes
The result will be ’16:18’
AutoMacro | Ultimate VBA Add-in | Click for Free Trial!
Dangers of Using Excel’s Pre-Defined Formats in Dates and Times
The use of the pre-defined formats for dates and times in Excel VBA is very dependent on the settings in the Windows Control Panel and also what the locale is set to
Users can easily alter these settings, and this will have an effect on how your dates and times are displayed in Excel
For example, if you develop an Excel application which uses pre-defined formats within your VBA code, these may change completely if a user is in a different country or using a different locale to you. You may find that column widths do not fit the date definition, or on a user form the Active X control such as a combo box (drop down) control is too narrow for the dates and times to be displayed properly.
You need to consider where the audience is geographically when you develop your Excel application
User-Defined Formats for Numbers
There are a number of different parameters that you can use when defining your format string:
Character | Description |
Null String | No formatting |
0 | Digit placeholder. Displays a digit or a zero. If there is a digit for that position then it displays the digit otherwise it displays 0. If there are fewer digits than zeros, then you will get leading or trailing zeros. If there are more digits after the decimal point than there are zeros, then the number is rounded to the number of decimal places shown by the zeros. If there are more digits before the decimal point than zeros these will be displayed normally. |
# | Digit placeholder. This displays a digit or nothing. It works the same as the zero placeholder above, except that leading and trailing zeros are not displayed. For example 0.75 would be displayed using zero placeholders, but this would be .75 using # placeholders. |
. Decimal point. | Only one permitted per format string. This character depends on the settings in the Windows Control Panel. |
% | Percentage placeholder. Multiplies number by 100 and places % character where it appears in the format string |
, (comma) | Thousand separator. This is used if 0 or # placeholders are used and the format string contains a comma. One comma to the left of the decimal point indicates round to the nearest thousand. E.g. ##0, Two adjacent commas to the left of the thousand separator indicate rounding to the nearest million. E.g. ##0,, |
E- E+ | Scientific format. This displays the number exponentially. |
: (colon) | Time separator – used when formatting a time to split hours, minutes and seconds. |
/ | Date separator – this is used when specifying a format for a date |
– + £ $ ( ) | Displays a literal character. To display a character other than listed here, precede it with a backslash () |
User-Defined Formats for Dates and Times
These characters can all be used in you format string when formatting dates and times:
Character | Meaning |
c | Displays the date as ddddd and the time as ttttt |
d | Display the day as a number without leading zero |
dd | Display the day as a number with leading zero |
ddd | Display the day as an abbreviation (Sun – Sat) |
dddd | Display the full name of the day (Sunday – Saturday) |
ddddd | Display a date serial number as a complete date according to Short Date in the International settings of the windows Control Panel |
dddddd | Displays a date serial number as a complete date according to Long Date in the International settings of the Windows Control Panel. |
w | Displays the day of the week as a number (1 = Sunday) |
ww | Displays the week of the year as a number (1-53) |
m | Displays the month as a number without leading zero |
mm | Displays the month as a number with leading zeros |
mmm | Displays month as an abbreviation (Jan-Dec) |
mmmm | Displays the full name of the month (January – December) |
q | Displays the quarter of the year as a number (1-4) |
y | Displays the day of the year as a number (1-366) |
yy | Displays the year as a two-digit number |
yyyy | Displays the year as four-digit number |
h | Displays the hour as a number without leading zero |
hh | Displays the hour as a number with leading zero |
n | Displays the minute as a number without leading zero |
nn | Displays the minute as a number with leading zero |
s | Displays the second as a number without leading zero |
ss | Displays the second as a number with leading zero |
ttttt | Display a time serial number as a complete time. |
AM/PM | Use a 12-hour clock and display AM or PM to indicate before or after noon. |
am/pm | Use a 12-hour clock and use am or pm to indicate before or after noon |
A/P | Use a 12-hour clock and use A or P to indicate before or after noon |
a/p | Use a 12-hour clock and use a or p to indicate before or after noon |
Description
FormatNumber is a property of the Range object of Excel. The Range object can be considered as a cell or a group of cells — be that a single cell, a column in an Excel table, or the UsedRange of an Excel sheet.
The FormatNumber property can be used to format time, date, currency/accounting format, and many others. There is a constant need when working in Excel to set the cell’s number format in a way that relays information in the best way to the reader.
For example, long numbers could really benefit from having some commas in them. Similarly, numbers with long decimals are very distracting, rounding them up (or down) to the nearest 2 or 3 decimals usually makes your data much more presentable.
Furthermore, FormatNumber can be used to set a custom format that opens up a whole array of possibilities. It’s important to remember that all numerical values are stored in Excel as serial numbers. So even date and time are stored as serial numbers.
Syntax
Range.NumberFormat
The following tables show the symbols for the most common formatting.
Format | Format Code | Example | Result |
Number (decimals) | #.# | 122.333 | 122.3 |
Currency | $# | 122 | $122 |
Percentage | %# | 122 | %122 |
Fraction | # ?/? | 122.3 | 122 1/3 |
Separators | #-#-# | 122.333 | 1-2-2 |
Commas/decimals if applicable | #,##0.00 | 122333.444 | 122,333.444 |
Thousands (with commas if applicable) | #,##0, “K” | 1223334 | 1,223 k |
Millions | #,##0.00,, “M” | 1223334 | 1.22M |
Special Characters in Format Code
Code | Format Code | Example | Result |
The Zero (0): Ensures that a number will be placed, if not, then it places zero. If you want the space to be empty, then use ? instead of 0. | 0000.00 | 122.1 | 0122.10 |
The Pound/Hashtag (#): If there is a number to be displayed then it will, if not, then nothing. | #000.0## | 122.1 | 122.1 |
The Quotes (“”): Anything between the quotes will be appended to the number. When used in VBA, an additional set of double quotations should surround them. | ###, “K” In VBA: “###, “”K””” | 122333 122333 | 122K 122K |
The Commas: Aside from being used as a Thousand Separator, commas are used to blank out 3 digits to their right (Number scaling). Placing two commas in this example removes 6 digits to their right. | #,###,, “M” #,###, “M” #,### “M” | 123456789 123456789 123456789 | 123 M 123,456 M 123,456,789 M |
$ / + – ( ) { } < > : ^ ‘ space: These symbols are considered literal characters. They are displayed exactly as they are typed in the formatting code (in the same position). You don’t need wrap them in double quotations as they are considered literal by default. | +# (#) | 123 123 | +123 (123) |
; (semicolon): semi-colons are used to separate conditions areas as [display of positive values] ; [display of negative values] ; [display of zero values] ; [display of text values] | [Green]0.0;[Red]-0.0;[Blue]0.0;[Magenta]@ | 1 -1 0 text | 1.0 -1.0 0.0 text |
= < > <= >= <>: comparison symbols are used to specify conditions based on which the formatting code would be executed. | [Green][>=70]0.0;[Blue] [>=20]0.0;[Red]0.0 | 80 50 10 | 80.0 50.0 10.0 |
d m y (day month year): date symbols are used for date formatting | d dd ddd m mm mmm mmmm mmmmm yy yyyy | 9/19/2020 9/9/2020 9/9/2020 9/9/2020 9/9/2020 9/9/2020 9/9/2020 9/9/2020 9/9/2020 9/9/2020 | 19 09 Wed 9 09 Sep September S 20 2020 |
h m s (hours minutes seconds): time symbols are used for time formatting. | h hh | 10:15:20 AM 8:15:20 AM | 10 08 |
Double quotations in VBA
Using the format coding above can be done either through the Excel interface directly or through VBA. A very important difference in the way that the codes are written is that double quotations need to be enclosed in another set of double quotations, as we will see in the examples below.
Using # vs ###
You can get away with a single “#” symbol instead of listing an (unseparated) number of then (ex. ###) because Excel will convert a single one to the appropriate number of hashtags.
For example, you can write #,#,, "M"
instead of #,###,, "M"
. This doesn’t apply to the zeroes though because the zeroes clearly indicate that a digit must be placed in this position, and instructing Excel to place a zero if there’s no actual value there. This means that using the formatting code “00
” will format “5” as “05”. Furthermore, “?00
” will format “5” as “ 05”.
Example 1: Formatting Cells Using the Excel Interface Instead of VBA
Right click the cell that you want to format, then click “Format Cells..”
In the left menu, go to “Custom”.
In the Type field, insert the formatting code, press OK and you’re done!
If we are to implement the same formatting code using VBA, we would write it as
“#,###,, “"M"””
The outer double quotations must be written because the code is a string (characters). The M needs to be surrounded by double quotations naturally. But in order to indicate to VBA that we want those double quotations literally (meaning we’re not just using them in a functional way, but that we actually want them as part of our string), we surround them with another pair of double quotations. The code we would use in VBA is as follows:
Sub format() Range(“A1”).NumberFormat = "#,##0.00,, ""M""" End Sub
We start with the range that we want to set the NumberFormat property of. We then add NumberFormat and set the property equal to the formatting code that we want. Note the bolded double quotations, which indicate that the double quotations around M are literal.
Example 2: Basic VBA Formatting
This is a simple example to demonstrate utilizing the NumberFormat property in VBA. In this example, we want to set the number of decimal points to 2 for Range(“A1”) and add commas for Range(“A2”) to make them more readable. Currently, our cells A1 and A2 look like this
Let’s see how we can make them more readable. We’ll start with writing down the cell range we want to work with.
Next, we specify the value of the NumberFormat property.
Sub Example_2() Range("A1").NumberFormat = "#.##" Range("A2").NumberFormat = "#,#" End Sub
The results are shown below:
We probably want to add commas to the cell A1 for easier readability. For A2, we want to remove the six digits on the right and have “M” instead, and we don’t want any decimals in there.
Sub Example_2() Range("A1").NumberFormat = "#,##0.##" Range("A2").NumberFormat = "#,##0,, ""M""" End Sub
Example 3: Conditional Formatting
Sometimes you might want to turn the font red if the number is negative. Maybe you want to display a particular string (set of characters) when the value of the cell is zero.
You might want to set something up to handle a situation where the data stored in the cell is text value, which could ruin your formulas if they are set up with the expectation that the cell would contain numerical data. The syntax for handling these types of exceptions would look like this:
[display of positive values] ; [display of negative values] ; [display of zero values] ; [display of text values]
Within each of these square brackets, you can specify the formatting code that gets the job done. Let’s take a look at an example. Here, we have a list of positive and negative decimal numbers:
The list will look much neater if we apply the following formatting:
- Have the negative numbers easily distinguished by having them in red
- Set the decimal points in a uniform way
- Set the whole list to have 2 decimal places
- Add commas
- Replace zeroes with “-“
Here’s the code that would get this done for us:
Sub Example_3() Range("A1:A9").NumberFormat = "#,0.00;[red]-#,0.00;””-“”" End Sub
Let’s break down the formatting code. We have 2 semicolons. This means we have code for the positive value, and then code for the negative value, then the code for zero values.
Positive values formatting
- “.00” ensures that we have two decimal places.
- “0.00” ensures that we have at least one digit to the left of the decimal, if there isn’t then a zero will be placed there.
- “#,0” ensures that commas are added if applicable. Note that we’re using hashtag symbol instead of zero because if we only have a single digit to the left of the decimal, then we wouldn’t want to add a zero to its left.
The output is as follows:
Summary
This was an introduction to the Number Format property in Excel that can be implemented through the Excel interface or VBA. The formatting code was explained with examples to get you started with creating and understanding customized formats.
We also saw that there is conditional formatting within the Number Format property that can be used to set specified formats for specified conditions. We also saw how we can combine text with numbers when formatting.
Custom Number Formats, Date & Time Formats in Excel & VBA; NumberFormat property
—————————————————————————
Contents:
Custom Number Formats in Excel / VBA
Excel Home Tab, Format Cells dialog box
VBA, NumberFormat property
Number Codes
Text Codes
Specify Font Color
Four Sections of Code
Specify Conditions
Custom Date & Time Formats in Excel / VBA
Display Date Format in Days, Months and Years
Display Time Format as Hours, Minutes and Seconds
Examples of Date & Time Formats
—————————————————————————
Custom Number Formats in Excel / VBA
In excel, default format for a cell is «General». When you first enter a number in a cell, Excel tries to guess an appropriate format, viz. if you type $5 in a cell, it will format the cell to Currency; if you type 5%, it will format to a percentage. However, many times you will need to select or add an appropriate format, especially if you want a customized display. It is important to note that formatting a cell only effects its display and does not change or effect its actual or true value (which is used by Excel for calculations) ie. if you select a formatted cell, the formula bar will display the value which was typed before it was formatted (Note: in a percentage format, if you type 0.75 in a cell, it is displayed as 75% after applying the format). In excel, by default, text is left aligned and non-text (viz. numbers, percentage, date/time, …) are right aligned, unless you specifically change this. We show how to create Custom Number Formats: (i) in Excel Spreadsheet, in the Format Cells dialog box; and (ii) in VBA, using the NumberFormat property.
Excel Home Tab, Format Cells dialog box
On the Home Tab, Format menu, click Format Cells (or Cells) and select the Number tab; OR On the Home tab, click the Dialog Box Launcher Button image next to Number. After this, in the Category list, select Custom, and all built-in and custom number formats will be displayed. In the «Type» box, type the number format code.
The built-in number formats cannot be changed or deleted. You can type in to add a custom number format, which will get added at the bottom of the list. You can delete a custom number format by clicking on the Delete button. If you edit a custom number format, the original is retained and the new format also gets added to the list. It is therefore advisable to delete the custom number formats which are not required.
Custom number formats are specific to the workbook they are created in and will be saved and available only in that specific workbook. You can save the original workbook and use the custom number formats in additional workbooks.
Example: Enter Format Code in Excel (Home Tab) Format Cells dialog box:
Select the cells / range in your worksheet in which to apply the format, and then in the «Type» box type the number format code. Note that the number format code is not required to be enclosed in double quotation marks like in VBA. Type below format code:
_(#,###.00_);[Red](#,###.00);0.00
VBA, NumberFormat property
Use the NumberFormat Property to set or return the number format for the specified object, in VBA. You can apply the NumberFormat property to set the format code of a Range object, CellFormat object, PivotField object (only for a data field), DataLabel object, DataLabels Object, and so on. Syntax: expression.NumberFormat. It is necessary to specify an expression, which returns an object (say, Range object) for which you want to set or return the format code. If the number format for all cells in the specified range is not the same, this property will return Null.
NumberFormat property sets the number format in VBA. Use this property to format numbers and how they appear in cells. You can define a number format by using the same format code strings as Microsoft Excel (in the Format Cells dialog box). The NumberFormat property uses different code strings than the Format function.
Examples of VBA Code, with NumberFormat property:
ActiveSheet.Columns(«D»).NumberFormat = «#,###.00;[Red](#,###.00);0.00»
ActiveSheet.Rows(2).NumberFormat = «hh:mm:ss.00»
ActiveSheet.Range(«A5»).NumberFormat = «General»
The three codes set the number format in the Active Worksheet, for Column D, Row 2 and Cell A5 respectively. Note that the number format code is required to be enclosed in double quotation marks unlike when you enter in Excel,Home Tab, Format Cells dialog box.
————————————————————————————————————————
Number Codes
Format Character | Description | Format Code | Number | Formatted Display |
0 (zero) | Digit placeholder. If the number has lesser number of digits than zeros in the format code, the insignificant zeros are displayed. This means that the minimum number of digits are determined by the position of zero at the extreme left before decimal and position of zero at extreme right after decimal, in the format code. | |||
If the number has more digits than zeros to the left of the decimal point in the format code, the extra digits are displayed. | ||||
The number of zeros to the right of the decimal point in the format code, determine the round off digits. The «00» format code rounds off to the nearest digit preceding the decimal point. | ||||
0.00 | 5.6 | 5.60 | ||
00.00 | 5.6 | 05.60 | ||
0.0 | 5.6 | 5.6 | ||
0 | 0.6 | 1 | ||
00.00 | 456.789 | 456.79 | ||
00 | 45.445 | 45 | ||
# (number character) | Digit placeholder. This follows the same rules as 0 (zero), except that, if the number has lesser number of digits than «#» characters in the format code, the insignificant zeros are NOT displayed, even though it may be the only digit. | |||
If the number has more digits than # characters to the left of the decimal point in the format code, the extra digits are displayed. | ||||
The number of # to the right of the decimal point in the format code, determine the round off digits. The «##» format code rounds off to the nearest digit preceding the decimal point. | ||||
###.## | 456.6 | 456.6 | ||
# | 456.68 | 457 | ||
Where x is a numerical digit => | (###) ### — #### | 123456xxxx | (123) 456 — xxxx | |
##.# | 456.689 | 456.7 | ||
## | 45.678 | 46 | ||
? (question mark) | Digit placeholder. This follows the same rules as 0 (zero), except that, the character «?» leaves (ie. adds) a space for insignificant zeros either side of the decimal, while character zero displays «0» for them. It is particulalry useful to align decimal points in a column — you can align numbers decimally by adding spaces on either side of a number as required . | |||
If the number has more digits than ? characters to the left of the decimal point in the format code, the extra digits are displayed. | ||||
The number of ? to the right of the decimal point in the format code, determine the round off digits. The «??» format code rounds off to the nearest digit preceding the decimal point. | ||||
???.?? | 45.64 | 45.64 | ||
???.?? | 5.6 | 5.6 | ||
000.00 | 45.64 | 045.64 | ||
000.00 | 5.6 | 005.60 | ||
??.? | 456.689 | 456.7 | ||
?? | 45.678 | 46 | ||
. (period) | Decimal point. The decimal point (ie. the «.» character) in the format code determines the decimal place. | |||
The number of Digit Placeholders to the right of the decimal point in the format code, determine the round off digits. The «00» or «##» or «??» format codes round off to the nearest digit preceding the decimal point. | ||||
00.000 | 456.123456 | 456.123 | ||
00.00 | 456.789567 | 456.79 | ||
##.# | 456.789567 | 456.8 | ||
##.# | 0.65 | .7 | ||
, (comma) | Thousand separator and number scaling | |||
Thousand separator: In the format code, placing comma between two digit placeholders and to the left of decimal, will act as a thousand separator. | ||||
Number Scaling: If comma is placed to the immediate left of the decimal point (in the format code), the number is divided by 1,000, n number of times wherein n is the number of characters «,». The format string «0,,» will scale down the number 100 million to 100 (divides 100 million by 1,000 * 1,000); and the format code «0,,,» will divide the number by 1,000 * 1,000 * 1,000. Note that this number scaling will not apply the thousand separator, which will have to be done separately after the number scaling. | ||||
# | 123456 | 123456 | ||
#,### | 123456 | 123,456 | ||
#,#00 | 123456 | 123,456 | ||
#,###.## | 4567.234 | 4,567.23 | ||
0, | 10000 | 10 | ||
#,##0,, | 1000000 | 1 | ||
#,###.#, | 12345.678 | 12.3 | ||
% (percent sign) | Percentage indicator. Numbers are displayed as a percentage of 100 with this. The percent sign in the format code multiplies the number by 100, before it is formatted. The symbol «%» is displayed at the same position at which it is inserted in the format code. | |||
#.0% | 0.00625 | .6% | ||
0.000% | 0.00625 | 0.625% | ||
#.##% | 0.00625 | .63% | ||
%# | 0.5625 | %56 | ||
/ (forward slash) | Fraction format. The forward slash displays number in a fraction format (ie. non-decimal format). The extent of accuracy of the fraction is determined by the number of digit placeholders on the right of the «/» character. | |||
#/# | 1.237 | 5/4 | ||
#/## | 1.237 | 47/38 | ||
#/### | 1.237 | 1023/827 |
Text Codes
Format Character | Description | Format Code | Number | Formatted Display |
E+ E- e+ e- | Scientific notation (exponential format). «E+» and «E-» followed by atleast one «0» character (in format code), displays the number in scientific notation, with the character «E» mentioned between the number and the exponent. The number of «0» characters determine the minimum number of exponent digits. «E+» indicates that the sign character (plus or minus) will always precede the exponent, whereas «E-» indicates that the sign character (minus) precedes only negative exponents. | |||
The E stands for exponent. To avoid writing extremely long numbers, use scientific notation (SN), ie. a numeric value containing the letter E followed by a number. To convert a SN number say 5.0E+3 to the actual number, move the decimal position 3 positions to the right OR multiply the number to the left of E by 10 raised to the powerof 3 viz. the actual number is 5000. If the exponent is negative, like in 5.25E-3, move the decimal position 3 positions to the left OR multiply the number to the left of E by 10 raised to the power of -3 viz. the actual number is -0.00525. |
||||
0.00E+0 | 4560000 | 4.56E+6 | ||
#0.0E+00 | 4560000 | 4.6E+06 | ||
0.###E+0 | 123.456 | 1.235E+2 | ||
##E+0 | 0.0001234 | 1E-4 | ||
##E-0 | 123456 | 12E4 | ||
##E-0 | 0.0001234 | 1E-4 | ||
$ / + — ( ) space | Literal characters. These are displayed as literals (exactly as typed) as per their position in the format code. Use these to display currency, to differentiate positive and negative numbers and for a more user-friendly display. | |||
$ +#,###.00 | 1456.7 | $ +1,456.70 | ||
(backslash) | Backslash. Any character appearing after backslash () will display as a literal, even though it may be reserved as an operator (say, %). The number 0.75 with the format code #.00% will format to 75.00%, but with the format code #.00% it will format to .75%, ie. format code will not use % as operator but as a literal. To display several characters as literals enclose these in double quotation marks (» «) or in case of a single character, precede it with a backslash (). | |||
On typing any of the characters { } = < > : ! ^ & ‘ ~ backslash () is automatically inserted before the character and it gets displayed as a literal. Hence these characters, alongwith the literal characters mentioned above, are displayed exactly as typed without the use of quotation marks or backslash (refer Table 1). | ||||
#.00% | 0.75 | .75% | ||
#.00% | 0.75 | 75.00% | ||
_ (underscore) | Add spaces. An underscore followed by a character in the format code, creates a space which is equivalent to the width of that character. A usual format is an underscore followed by left or right paranthesis viz. _( _), which aligns the decimal points of positive numbers with negative numbers that are enclosed in paranthesis. | #,###.00;[Red](#,###.00);0.00 | 567 | 567.00 |
_(#,###.00_);[Red](#,###.00);0.00 |
567 | 567.00 | ||
_(#,###.00_);[Red](#,###.00);0.00 |
-567 | (567.00) | ||
* (asterik) | Repeat characters. An asterik followed by a character in the format code, will repeat that character to fill the column width. Only one asterik can be included in a section. Use asterik to fill in dashes after a number, to fill in lead spaces before a number (which will right align it) or lead zeros before a number. | |||
0.0*- | 1.23 | 1.2——— | ||
* 0.0 | 1.23 | 1.2 | ||
*00.0 | 1.23 | 00000 1.2 | ||
@ (at character) | Text placeholder. Insert the @ character in the text section (the last & fourth section), to display text which you type in a cell. If you want to always display a specified text in addition to the text you type in a cell, insert this ‘always display text’ within double quotation marks (» «) and insert the @ character in the text section viz. «Text»@. Text will not be displayed if the «@» character is not inserted in this section. | |||
Text Section Format, in both Excel Format Cells dialog box and VBA with NumberFormat property: => | «[Blue]#,###.00; [Red](0.0#); [Green]0.00; [Magenta]@» | Jack | Jack | |
Text Section Format, in Excel Format Cells dialog box: => |
[Blue]#,###.00;[Red] (0.0#);[Green] 0.00;[Magenta] «Hello «@ |
Jack | Hello Jack | |
£ € ¥ | Currency symbols. In VBA, use the Chr function to insert currency symbols though their ANSI / ASCII code. Note that $ can be entered as a literal character, as mentioned above. | |||
Enter Currency symbols, in VBA with NumberFormat property: => | Chr(163) & «0.00» | 123 | £123.00 | |
Enter Currency symbols, in VBA with NumberFormat property: => | Chr(128) & «0.0» | 123 | €1.2 | |
Enter Currency symbols, in VBA with NumberFormat property: => | «#,### » & Chr(165) | 123 | 1.234 ¥ | |
Enter Currency symbols, in both Excel Format Cells dialog box and VBA with NumberFormat property: «£0.00», «€0.0», «#,### ¥», «£#,###», … => | «£#,###» | 123 | £123 |
———————————————————————————————————————————————
———————————————————————————————————————————————
Specify Font Color
Format Character | Description | Format Code | Number | Formatted Display |
[Black] [White] [Red] [Green] [Blue] [Yellow] [Magenta] [Cyan] | Font color. Enter color name (viz. Red) or color index (viz. Color 3) in square brackets (in the format code) to determine font color. Enter color as the first item in the section. Supported colors are the first 8 colors in the palette: Black (Color 1), White (Color 2), Red (Color 3), Green (Color 4), Blue (Color 5), Yellow (Color 6), Magenta (Color 7), Cyan (Color . | |||
[Red]#0.0 | 456 | 456.0 | ||
[Color 5]#0.0 | 456 | 456.0 |
Four Sections of Code
Format Character | Description | Format Code | Number | Formatted Display |
; (semicolon) | Section separator. There can be upto four sections of code in a custom number format, wherein each section is separated by a semicolon. These sections determine the display of positive numers, negative numbers, zero value and text, in that order. If only one section is specified in the format code, it applies to all the four sections; if two sections are specified, the first applies to positive and zero values and the second section applies to negative numbers. If all four sections are specified, only then is the text affected by the fourth section. | |||
You can also skip a section and specify code for the following or preceding section, but then you must enter the ending semicolon for the skipped section. Skipping a section(s) will result in a blank display for that section. If all sections are skipped ie. only 3 semicolons are entered, will mean a blank display for all numbers & text. However, if the first 3 sections are skipped and the text section (fourth section) is entered with the @ character, will mean a text display for all numbers & text (ie. for all 4 sections). | ||||
[Blue]#,###.00;[Red](0.0#);[Green]0.00;[Magenta]@ | 1456.7 | 1,456.70 | ||
[Blue]#,###.00;[Red](0.0#);[Green]0.00;[Magenta]@ |
-1456.7 | (1456.7) | ||
[Blue]#,###.00;[Red](0.0#);[Green]0.00;[Magenta]@ |
0 | 0.00 | ||
[Blue]#,###.00;[Red](0.0#);[Green]0.00;[Magenta]@ |
hello | hello |
Specify Conditions
Format Character | Description | Format Code | Number | Formatted Display |
= < > <= >= <> | Specify Conditions. You have an option to specify conditions subject to which a number format is to be applied. The condition should be enclosed in square brackets and it consists of a comparison operator and a value. Comparison operators which can be used are: = < > <= >= <>. The first three sections in the number format are by default applied to positive, negative, and zero values. However you can specify upto two of your own conditions by using comparison operators. | |||
[Green][>=70]0.00;[Blue][>=40]0.0;[Red]0;[Magenta]@ | 75 | 75.00 | ||
[Green][>=70]0.00;[Blue][>=40]0.0;[Red]0;[Magenta]@ |
51.55 | 51.6 | ||
[Green][>=70]0.00;[Blue][>=40]0.0;[Red]0;[Magenta]@ |
25.62 | 26 | ||
[Green][>=70]0.00;[Blue][>=40]0.0;[Red]0;[Magenta]@ |
hello | hello |
Custom Date & Time Formats in Excel / VBA
Display Date Format in Days, Months and Years
Code | Description | Display |
d | Day is displayed as a number, as one digit or as two digit. | 1-31 |
dd | Day is displayed as a number, as two digit, with a leading zero where applicable. | 01-31 |
ddd | Day is abbreviated to three letters, viz. Sunday is displayed as Sun. | Sun-Sat |
dddd | Day is displayed in its full format, viz. Sunday is displayed as Sunday. | Sunday-Saturday |
m | Month is displayed as a number, as one digit or as two digit. | 1-12 |
mm | Month is displayed as a number, as two digit, with a leading zero where applicable. | 01-12 |
mmm | Month name is abbreviated to three letters, viz. January is displayed as Jan. | Jan-Dec |
mmmm | Month is displayed in its full name, viz. January is displayed as January. | January-December |
mmmmm | Month is displayed as a single letter, viz. January is displayed as J. | J-D |
yy | Year is displayed as a number in two digits, viz. last 2 digits of the year are displayed. | 00-99 |
yyyy | Year is displayed as a number in four digits, viz. all digits of the year are displayed. | 1900-9999 |
Display Time Format as Hours, Minutes and Seconds
Code | Description | Display |
h | Hour is displayed as a number, as one digit or as two digit. | 0-23 |
hh | Hour is displayed as a number, as two digit, with a leading zero where applicable. | 00-23 |
[h] or [hh] | Elapsed time in hours is displayed. Format code «[h]:mm:ss» displays elapsed time in hours, minutes & seconds. Ex. Code «[h]:mm:ss» will display as => | 37:18:32 |
m | Minute is displayed as a number, as one digit or as two digit. Note that the «m» code is also used for displaying month. To use this code as minute(s), it should appear immediately after the h or hh code or immediately before the s or ss code, such as «m:ss». | 0-59 |
mm | Minute is displayed as a number, as two digit, with a leading zero where applicable. Note that the «mm» code is also used for displaying month. To use this code as minute(s), it should appear immediately after the h or hh code or immediately before the s or ss code, such as «h:mm». | 00-59 |
[m] or [mm] | Elapsed time in minutes is displayed. Format code «[mm]:ss» displays elapsed time in minutes & seconds. Ex. Code «[mm]:ss» will display as => | 64:48 |
s | Second is displayed as a number, as one digit or as two digit. Fractions of a second can be displayed by a format like «h:m:s.00». | 0-59 |
ss | Second is displayed as a number, as two digit, with a leading zero where applicable. Fractions of a second can be displayed by a format like «h:m:ss.00». | 00-59 |
[s] or [ss] | Elapsed time in seconds is displayed. Format code «[ss].00» displays elapsed time in seconds and its fraction(s). Ex. Code «[ss].00» will display as => | 1036.80 |
AM/PM, am/pm, A/P, a/p | If these codes are included in the format, the hour is displayed using a 12-hour clock, else the hour is based on the 24-hour format. Display will include AM, am, A or a for a time before noon, and PM, pm, P or p for a time ‘from’ and ‘after’ noon. Ex. Code «hh:mm:ss AM/PM» will display as => | 01:27:50 AM |
Examples of Date & Time Formats
Format Code | Display |
mm/dd/yyyy | 01/02/2010 |
m/d/yy | 1/2/10 |
ddd, mmmm d, yyyy | Sat, January 2, 2010 |
m/dd/yyyy hh:mm:ss.00 AM/PM | 5/15/2011 12:59:02.40 PM |
h:mm:s | 1:17:2 |
hh:mm:ss | 01:17:02 |
- Implement
NumberFormat
Property on Numeric Values VBA - Get the Type of
NumberFormat
Used by a VBA Range
Numbers come in different forms in our daily lives. We have dates, prices, percentages, fractions, decimals, etc. They might all appear differently, but they all signify a value.
Same with Excel, we can deal with different formats of numbers. We can use Date
and Time
datatypes when dealing with time and dates, while we can use Percent
when dealing with percentages.
This article will demonstrate the NumberFormat
property to help us utilize and adequately deal with numbers throughout our Excel VBA practice.
Implement NumberFormat
Property on Numeric Values VBA
This section uses the NumberFormat
property to change the number formatting in a cell.
Syntax:
Range.NumberFormat = [FormatCodes]
Parameters:
Range |
The range to format |
[FormatCodes] |
Predetermined strings which will represent what type of number format to be used. |
[format codes]
Matrix:
Format Name | Format Code | Example | Description |
—————– | ——————————————————– | —————– | —————————————————— |
General | General |
1234567.89 |
display the number without specific format |
Currency | $#,##0.00 |
$1,234,567.89 |
display as general monetary values |
Number | 0 |
1234567.89 |
format will display the number exactly as it is |
Scientific | 0.00E+00 |
1.23E+06 |
convert the number to Exponential format |
Accounting | _($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_) |
$123.00 |
display the number used in Accounting |
Date | m/d/yy |
11/23/2021 |
display date and time serial numbers |
Time | [$-F400]h:mm:ss am/pm |
12:00:03 AM |
display date and time serial numbers |
Percentage | 0.00% |
5.23 % |
display the value in percentage form |
Fraction | # ?/? |
1/4 |
display the value as fractional form |
Special | ;; |
000-00-0000 |
formats used on list and database values |
The Sheet1
virtual worksheet will be the referenced values used on all examples below for the example codes below.
Sheet1:
| A | B | C |
1| 1234.56 | 11/23/2021 | 93249812 |
2| 5 | 0.00004 | 0.25 |
The code block below will output General
formatting:
Sub FormatGeneral()
Range("A1").NumberFormat = "General"
Debug.Print Range("A1").Text
End Sub
FormatGeneral
Output:
The code block below will output Currency
formatting:
Sub FormatCurrency()
Range("C1").NumberFormat = "$#,##0.00"
Debug.Print Range("C1").Text
End Sub
General
Output:
The code block below will output Scientific
formatting:
Sub FormatScientific()
Range("C1").NumberFormat = "0.00E+00"
Debug.Print Range("C1").Text
End Sub
FormatScientific
Output:
The code block below will output Accounting
formatting:
Sub FormatAccounting()
Range("A1").NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* ""-""??_);_(@_)"
Debug.Print Range("A1").Text
End Sub
FormatAccounting
Output:
The code block below will output Date
formatting:
Sub FormatDate()
Range("A2").NumberFormat = "m/d/yy"
Debug.Print Range("A2").Text
End Sub
FormatDate
Output:
The code block below will output Time
formatting:
Sub FormatTime()
Range("B2").NumberFormat = "$-F400]h:mm:ss am/pm"
Debug.Print Range("B2").Text
End Sub
FormatTime
Output:
The code block below will output Percentage
formatting:
Sub FormatPercentage()
Range("A1").NumberFormat = "0.00%"
Debug.Print Range("A1").Text
End Sub
FormatPercentage
Output:
The code block below will output Fraction
formatting:
Sub FormatFraction()
Range("C2").NumberFormat = "# ?/?"
Debug.Print Range("C2").Text
End Sub
FormatFraction
Output:
Get the Type of NumberFormat
Used by a VBA Range
We returned the formatted value of the specified range on the above examples. We will get the formatting type used in the specified range in this section.
Syntax:
Range.NumberFormat
Parameters:
Range |
The cell range to get the formatting type |
Still referring to Sheet1
, below example code blocks will demonstrate returning the formatting type used by the range specified.
Sub GetFormattingType()
Debug.Print Range("B1").NumberFormat
End Sub
GetFormattingType
Output: