Reading Data from Excel
When reading a cell’s value, using its Valueproperty, the data type that Excel provides to VBAis deter-
mined by a combination of the cell’s value and its formatting. For example, the number 3000 could reach
VBAas a Double, a Currency, or a Date(March 18, 1908). The only international issue of concern here
is if the cell’s value is read directly into a string variable—the conversion will then be done implicitly,
and you may not get what you expect (particularly if the cell contains a Boolean value).
As is the case when sending data to Excel, the translation between U.S. and local functions and formats
occurs when reading data from Excel. This means that a cell’s .Formulaor .NumberFormatproperty is
given in English, and with U.S. number and date formatting, regardless of the user’s choice of language
or regional settings.
Although for most applications it is much simpler to read and write using U.S. formulas and formats,
you will sometimes need to read exactly what the user is seeing (in their choice of language and regional
settings). This is done by using the xxxLocalversions of many properties, which return (and interpret)
strings according to the user’s settings. They are typically used when displaying a formula or number
format on a UserForm, and are discussed in the following section.
The Rules for Working with Excel
Pass values to Excel in their natural format if possible (don’t convert dates, numbers, or
Booleans to strings if you don’t have to). If you have strings, convert them yourself before pass-
ing them to Excel.
When you have to convert numbers and dates to strings for passing to Excel (such as in criteria
for AutoFilteror Formulastrings), always explicitly convert the datato a U.S.-formatted string,
using Trim(Str(MyNumber)), or the sNumToUSfunction shown previously, for all number and
date types. Excel will then use it correctly and convert it to the local number and date formats.
Avoid using Dateliterals (such as #1/3/2007#) in your code. It is better to use the VBA
DateSerialor Excel DATEfunctions, which are not ambiguous.
If possible, use the date number instead of a string representation of a date. Numbers are much
less prone to ambiguity (though not immune). 
When writing formulas in code to be put into a cell (using the .Formulaproperty), create the
string using English functions. Excel will translate them to the local Office language for you.
When setting number formats or using the Formatfunction, use U.S. formatting characters—
for example, ActiveCell.NumberFormat=“ddmmmyyyy”. Excel will translate these to the
local number format for you.
When reading information from a worksheet, using .Formula.NumberFormat, and so forth,
Excel will supply it using English formulas and U.S. format codes, regardless of the local Excel
language.
548
Chapter 25: International Issues
Pdf rotate page - rotate PDF page permanently in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Users to Change the Rotation Angle of PDF File Page Using C#
pdf rotate pages and save; rotate pdf pages
Pdf rotate page - VB.NET PDF Page Rotate Library: rotate PDF page permanently in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
PDF Document Page Rotation in Visual Basic .NET Class Application
rotate one page in pdf; rotate pages in pdf expert
Interacting with Users
The golden rule when displaying data to your users, or getting data from them, is to always respect their
choice of Windows Regional Settings and Office UI Language. They should not be forced to enter num-
bers, dates, formulas, or number formats according to U.S. settings, just because it’s easier for you to
develop.
Paper Sizes
One of the most annoying things for users is discovering that their printer does not recognize the paper
sizes used in your templates. If you use templates for your reports, you should always change the paper
size to the user’s default size. This can easily be determined by creating a new workbook and reading off
the paper size from the PageSetupobject.
Excel 2002 added the Application.MapPaperSizeproperty to automatically switch between the
equivalent common paper sizes of different countries (for example, between Letter in the U.S. and A4 in
the UK). If this is property is set to True, Excel should take care of paper sizes for you.
Displaying Data
Excel does a very good job of displaying worksheets according to the user’s selection of regional settings
and language. When displaying data in UserForms or dialog sheets, however, you have to do all the for-
matting yourself.
As discussed previously, Excel converts numbers and dates to strings according to the WRS by default.
This means that you can write code like the following and be safe in the knowledge that Excel will dis-
play it correctly:
tbNumber.Text = dNumber
There are two problems with this approach:
Dates will get the default ShortDateformat, which may not include four digits for the year,
and will not include a time component. To force a four-digit year and include a time, use the
sFormatDatefunction shown later in this chapter. It may be better, though, to use a less
ambiguous date format on UserForms, such as the “mmm dd, yyyy” format used throughout
this book.
Versions of Excel prior to Excel 97 did not use the Windows Regional Settings for their default
formats. If you are creating applications for use in older versions of Excel, you can’t rely on the
correct behavior.
The solution is simple—just use the Formatfunction. This tells VBAto convert the number to a locally
formatted string and works in all versions of Excel:
tbNumber.Text = Format(dNumber)
549
Chapter 25: International Issues
C# TIFF: How to Rotate TIFF Using C# Code in .NET Imaging
Convert Tiff to Jpeg Images. Convert Word, Excel, PowerPoint to Tiff. Convert PDF to Tiff. Move Tiff Page Position. Rotate a Tiff Page. Extract Tiff Pages. Tiff
reverse page order pdf online; how to rotate one page in a pdf file
VB.NET PDF Page Delete Library: remove PDF pages in vb.net, ASP.
XDoc.PDF ›› VB.NET PDF: Delete PDF Page. using RasterEdge.Imaging.Basic; using RasterEdge.XDoc.PDF; How to VB.NET: Delete a Single PDF Page from PDF File.
pdf rotate pages separately; how to permanently rotate pdf pages
Interpreting Data
Your users will want to type in dates and numbers according to their choice of regional settings, and
your code must validate those entries accordingly and maybe display meaningful error messages back
to the user. This means that you have to use the Cxxxconversion functions, and the IsNumericand
IsDatevalidation functions.
Unfortunately, these functions all have their problems (such as not recognizing the %sign at the end of a
number), which require some working around. An easy solution is to use the bWinToNumand
bWinToDatefunctions shown at the end of this chapter to perform the validation, conversion, and error
prompting for you. The validation code for a UserForm will typically be done in the OK button’s Click
event, and will be something like this:
Private Sub bnOK_Click()
Dim dResult As Double
‘Validate the number or display an error
If bWinToNum(tbNumber.Text, dResult, True) Then
‘It was valid, so store the number
Sheet1.Range(“A1”).Value = dResult
Else
‘An error, so set the focus back and quit the routine
tbNumber.SetFocus
Exit Sub
End If
‘All OK and stored, so hide the userform
Me.Hide
End Sub
The xxxLocal Properties
Up until now, you have had to interact with Excel using English-language functions and the default U.S.
formats. Presented now is an alternative situation, where your code interacts with the user in his or her
own language using the appropriate regional settings. How, then, can your program take something
typed in by the user (such as a number format or formula) and send it straight to Excel, or display an
Excel formula in a message box in the user’s own language?
Microsoft has anticipated this requirement and has provided us with local versions of most of the func-
tions we need. They have the same names as their U.S. equivalents, with the word “Local” on the end
(such as FormulaLocalNumberFormatLocal, and so on). When you use these functions, Excel does
not perform any language or format coercion for you. The text you read and write is exactly how it
appears to the user. Nearly all of the older functions that return strings, or have string arguments, have
local equivalents; newer objects do not. The following table lists all of the xxxLocalproperties and the
objects to which they apply.
550
Chapter 25: International Issues
VB.NET PDF Page Insert Library: insert pages into PDF file in vb.
PDF Pages. |. Home ›› XDoc.PDF ›› VB.NET PDF: Insert PDF Page. Professional .NET PDF control for inserting PDF page in Visual Basic .NET class application.
pdf reverse page order online; pdf rotate just one page
C# PDF Page Insert Library: insert pages into PDF file in C#.net
page processing functions, such as how to merge PDF document files by C# code, how to rotate PDF document page, how to delete PDF page using C# .NET, how to
how to reverse pages in pdf; rotate pdf pages in reader
Use and return locally 
Return strings according  formatted strings,and in 
to U.S. number and date  the language used for the 
Applies to
formats and English text
Office UI (or Windows version)
Number/string conversion
Str
Cstr
Number/string conversion
Val
CDbl, and so on
Name, Style, CommandBar
.Name
.NameLocal
Range, Chart Series
.Formula
.FormulaLocal
Range, Chart Series
.FormulaR1C1
.FormulaR1C1Local
Range, Style, Chart Data 
.NumberFormat
.NumberFormatLocal
Label, Chart Axes Label
Range
.Address
.AddressLocal
Range
.AddressR1C1
.AddressR1C1Local
Defined Name
.RefersTo
.RefersToLocal
Defined Name
.RefersToR1C1
.RefertToR1C1Local
Defined Name
.Category
.CategoryLocal
The Rules for Working with Your Users
When converting a number or date to a text string for displaying to your users, or setting it as
the .Captionor .Textproperty of a control, explicitly convert numbers and dates to text
according to the WRS, using Format(myNum), or CStr(MyNum).
When converting dates to strings, Excel does notrearrange the date part order, so
Format(MyDate,“dd/mm/yyyy”)will always give a DMYdate order (but will show the cor-
rect date separator). Use Application.International(xlDateOrder)to determine the cor-
rect date order—as used in the sFormatDatefunction shown at the end of this chapter—or
use one of the standard date formats (for example, ShortDate).
If possible, use locale-independent date formats, such as Format(MyDate,“mmmdd,yyyy”).
Excel will display month names according to the user’s WRS language.
When evaluating date or number strings that have been entered by the user, use CDateor CDbl
to convert the string to a date or number. These will use the WRS to interpret the string. Note
that CDbldoes not handle the percent sign (%) character if the user has put one at the end of the
number.
Always validate numbers and dates entered by the user before trying to convert them. See the
bWinToNumand bWinToDatefunctions at the end of this chapter for examples.
When displaying information about Excel objects, use the xxxLocalproperties (where they
exist) to display it in your user’s language and formats.
Use the xxxLocalproperties when setting the properties of Excel objects with text provided by
the user (which you must assume is in their native language and format).
551
Chapter 25: International Issues
C# PDF Page Delete Library: remove PDF pages in C#.net, ASP.NET
Pages. |. Home ›› XDoc.PDF ›› C# PDF: Delete PDF Page. Demo Code: How to Delete a Single PDF Page from PDF File in C#.NET. How
rotate pdf page permanently; pdf rotate all pages
VB.NET PDF - View PDF with WPF PDF Viewer for VB.NET
1. Anticlockwise rotation. Rotate PDF page 90 degree in anticlockwise. 2. Clockwise rotation. Rotate PDF page 90 degree in clockwise. 3. Zoom in.
how to rotate page in pdf and save; pdf rotate single page reader
Excel 2007’s International Options
In the Office Menu➪Excel Options dialog, the Advanced section contains Editing Options that allow the
user to specify the characters that Excel uses for the thousands and decimal separators, overriding the
Windows Regional Settings. These options can be read and changed in code, using
Application.ThousandsSeparatorApplication.DecimalSeparator, and
Application.UseSystemSeparators.
Using these properties you could, for example, print, save (as text), or publish a workbook using local
number formats, change the separators being used, print, save (as text), or publish another version for a
different target country, and then change them back to their original settings. It is a great pity, though,
that Microsoft didn’t add the ability to override the rest of the Windows Regional Settings attributes
(such as date order, date separator, whether to use (10) or -10, and so on), and it’s an omission that
makes this feature virtually useless in practice.
One problem with using this feature is that it does not change the number format strings used in the
=TEXTworksheet function., So as soon as the option is changed (either in code or through the UI), all
cells that use the =TEXTfunction will no longer be formatted correctly. See later in this chapter for a
workaround.
There is a big problem with this feature, in that while these options affect all of Excel’s xxxLocalprop-
erties and functions (including the Application.Internationalsettings), they are ignored by VBA.
Acouple examples highlight the scale of the problem:
The VBAFormatfunction—used almost every time a number is displayed to the user—
ignores these options, resulting in text formatted according to the Windows Regional Settings,
not those used by Excel.
If the user types numbers into your UserForms or InputBoxes using the override separators,
they will not be recognized as numbers by IsNumericCDbl, and so on, resulting in
TypeMismatcherrors.
The only way to work around this problem is to perform your own switching between WRS and
Override separators before displaying numbers to the users, and immediately after receiving numbers
from them, using the following two functions:
Function WRSToOverride(ByVal sNumber As String) As String
Dim sWRS As String, sWRSThousand As String, sWRSDecimal As String
Dim sXLThousand As String, sXLDecimal As String
‘Only do for Excel 2002 and greater
If Val(Application.Version) >= 10 Then
‘Only do if the user is not using System Separators
If Not Application.UseSystemSeparators Then
‘Get the separators used by the Windows Regional Settings
sWRS = Format(1000, “#,##0.00”)
sWRSThousand = Mid(sWRS, 2, 1)
552
Chapter 25: International Issues
C# WPF PDF Viewer SDK to view PDF document in C#.NET
1. Anticlockwise rotation. Rotate PDF page 90 degree in anticlockwise. 2. Clockwise rotation. Rotate PDF page 90 degree in clockwise. 3. Zoom in.
pdf rotate single page and save; pdf rotate single page
VB.NET PDF - WPF PDF Viewer for VB.NET Program
Existing PDF Pages. Page: Replace PDF Pages. Page: Move Page Position. Page: Copy, Paste PDF Pages. Page: Rotate a PDF Page. PDF Read. Text
how to reverse page order in pdf; rotate pdf page by page
sWRSDecimal = Mid(sWRS, 6, 1)
‘Get the override separators used by Excel
sXLThousand = Application.ThousandsSeparator
sXLDecimal = Application.DecimalSeparator
‘Swap from WRS’ to Excel’s separators
sNumber = Replace(sNumber, sWRSThousand, vbTab)
sNumber = Replace(sNumber, sWRSDecimal, sXLDecimal)
sNumber = Replace(sNumber, vbTab, sXLThousand)
End If
End If
‘Return the converted string
WRSToOverride = sNumber
End Function
WRSToOverrideconverts between WRS and Excel’s number formats, and returns a string using Excel’s
Override formatting. sNumberis a string containing a WRS-formatted number:
Function OverrideToWRS(ByVal sNumber As String) As String
Dim sWRS As String, sWRSThousand As String, sWRSDecimal As String
Dim sXLThousand As String, sXLDecimal As String
‘Only do for Excel 2002 and greater
If Val(Application.Version) >= 10 Then
‘Only do if the user is not using System Separators
If Not Application.UseSystemSeparators Then
‘Get the separators used by the Windows Regional Settings
sWRS = Format$(1000, “#,##0.00”)
sWRSThousand = Mid$(sWRS, 2, 1)
sWRSDecimal = Mid$(sWRS, 6, 1)
‘Get the override separators used by Excel
sXLThousand = Application.ThousandsSeparator
sXLDecimal = Application.DecimalSeparator
‘Swap from Excel’s to WRS’ separators
sNumber = Replace(sNumber, sXLThousand, vbTab)
sNumber = Replace(sNumber, sXLDecimal, sWRSDecimal)
sNumber = Replace(sNumber, vbTab, sWRSThousand)
End If
End If
‘Return the comverted string
OverrideToWRS = sNumber
End Function
553
Chapter 25: International Issues
OverrideToWRSconverts between WRS and Excel’s number formats, and returns the string using WRS’
formatting. sNumberis a string containing an Excel Override formatted number.
The final problem is that when you are interacting with users, you should be doing so using the number
formats that they are familiar with. By adding the ability to override the Windows Regional Settings,
Excel is introducing a third set of separators for you, and your users, to contend with. You are therefore
completely reliant on the users remembering that override separators have been set, and that they may
not be the separators that the users are used to seeing (that is, according to the WRS).
I strongly recommend that your application checks if Application.UseSystemSeparatorsis False
and displays a warning message to the user, suggesting that it be turned on, so number formatting is set
using Control Panel rather than Excel’s overrides:
If Not Application.UseSystemSeparators Then
MsgBox “Please set the required number formatting using Control Panel”
Application.UseSystemSeparators = True
End If
Features That Don’t Play by the Rules
The xxxLocalfunctions discussed in the previous section were all introduced during the original move
from XLM functions to VBAin Excel 5.0. They cover most of the more common functions that a devel-
oper is likely to use. There were, however, a number of significant omissions in the original conversion,
and new features have been added to Excel since then, with almost complete disregard for international
issues.
This section guides you through the maze of inconsistency, poor design, and omission that you’ll find
hidden within the following Excel 2007 features. This table shows the methods, properties, and functions
in Excel that are sensitive to the user’s locale, but that do not behave according to the rules stated in pre-
vious sections.
Applies to
U.S. Version
Local Version
Opening a text file
OpenText
OpenText
Saving as a text file
SaveAs
SaveAs
Application
.ShowDataForm
.ShowDataForm
Worksheet, Range
.Paste.PasteSpecial
PivotTable calculated fields and items
.Formula
Conditional formats
.Formula
QueryTables (Web Queries)
.Refresh
Worksheet functions
=TEXT
554
Chapter 25: International Issues
Applies to
U.S. Version
Local Version
Range
.Value.Formula
Range
.FormulaArray
Range
.AutoFilter
.AutoFilter
Range
.AdvancedFilter
Application
.Evaluate
Application
.ConvertFormula
Application
.ExecuteExcel4Macro
Fortunately, workarounds are available for most of these issues. There are a few, however, that should be
completely avoided.
The OpenText Function
Workbooks.OpenTextis the VBAequivalent of opening a text file in Excel by using Office Menu➪
Open. It opens the text file, parses it to identify numbers, dates, Booleans, and strings, and stores the
results in worksheet cells. Of relevance to this chapter is the method Excel uses to parse the data file (and
how it has changed over the past few versions).
In Excel 5, the text file was parsed according to your Windows Regional Settings when opened from the
user interface, but according to U.S. formats when opened in code. In Excel 97, this was changed to
always use these settings from both the UI and code. Unfortunately, this meant that there was no way to
open a U.S.-formatted text file with any confidence that the resulting numbers were correct. Since Excel
5, you have been able to specify the date order to be recognized, on a column-by-column basis, which
works very well for numeric dates (for example, 01/02/2007).
Excel 2000 introduced the Advanced button on the Text Import Wizard, and the associated
DecimalSeparatorand ThousandsSeparatorparameters of the OpenTextmethod. These parameters
allow you to specify the separators that Excel should use to identify numbers, and they are welcome addi-
tions. It is slightly disappointing to see that you cannot specify the general date order in the same way:
Workbooks.OpenText filename:=”DATA.TXT”, _
dataType:=xlDelimited, tab:=True, _
DecimalSeparator:=”,”, ThousandsSeparator:=”.”
While Microsoft is to be congratulated for fixing the number format problems in Excel 2000, further con-
gratulations are due for fixing the problem of month and day names in Excel 2002, and for providing a
much tidier alternative for distinguishing between U.S.-formatted and locally formatted text files.
Prior to Excel 2002, the OpenTextmethod would only recognize month and day names according to the
Windows Regional Settings, and date orders had to be specified for every date field that wasn’t in MDY
order. In Excel 2002, the OpenTextmethod was given a Localparameter, with which you can specify
whether the text file being imported uses U.S. English formatting throughout, or whether it uses locally
formatted dates, numbers, and so on:
555
Chapter 25: International Issues
If Local:=True, Excel will recognize numbers, dates, and month and day names according to
the Windows Regional Settings (and the Override DecimalSeparatorand
ThousandsSeparatorseparators, if set).
If Local:=False, Excel will recognize numbers, dates, and month and day names according to
standard U.S. English settings.
In either case, the extra parameters of DecimalSeparatorThousandsSeparator, and FieldInfocan
be used to further refine the specification (overriding the Localparameter’s defaults).
The SaveAs Function
Workbook.SaveAsis the VBAequivalent of saving a text file in Excel by using Office Menu➪Save As
and choosing a format of Text.
In all versions of Excel prior to Excel 2002, this resulted in a U.S.-formatted text file, with a DMYdate
order, English month and day names, and so on.
In Excel 2002, the SaveAsmethod was given the same Localparameter described in the OpenText
method in the previous section, resulting in a U.S.-formatted or locally formatted text file, as appropri-
ate. Note that if a cell has been given a locale-specific date format (that is, the number format begins
with a locale specifier, such as [$-814]for Norwegian), that formatting will be retained in the text file,
regardless of whether it is saved in U.S. or local format:
ActiveWorkbook.SaveAs “Data.Txt”, xlText, local:=True
The ShowDataForm Sub Procedure
Using ActiveSheet.ShowDataFormmeans exposing yourself to one of the most dangerous of Excel’s
international issues. ShowDataFormis the VBAequivalent of the pre-2007 Data➪Form menu item
(which is not available by default in the Excel 2007 Ribbon, but can be added to the QAT by selecting the
Form command from the All Commands list). It displays a standard dialog that allows the user to enter
and change data in an Excel list or database. When run from Excel, the dates and numbers are displayed
according to the WRS, and changes made by the user are interpreted according to the WRS, which fully
complies with the user interaction rules stated previously.
When used in code, ActiveSheet.ShowDataFormdisplays dates and numbers according to U.S. for-
mats but interprets them according to WRS. Hence, if you have a date of February 10, 2007, shown 
in the worksheet in the dd/mm/yyyy order of 10/02/2007, Excel will display it on the data form as
2/10/2007. If you change this to the 11th (2/11/2007), Excel will store November 2, 2007 in the sheet.
Similarly, if you are using Norwegian number formats, a number of 1-decimal-234 will be displayed on
the form as 1.234. Change that to read 1.235 and Excel stores 1235, one thousand times too big.
Because this is a rarely used feature, our suggestion is to leave it buried in the Ribbon command well
and write your own data-entry UserForm.
556
Chapter 25: International Issues
Pasting Text
When pasting text from other applications into Excel, it is parsed according to the WRS. There is no way
to tell Excel the number and date formats and language to recognize. The only workaround is to use a
DataObjectto retrieve the text from the clipboard, parse it yourself in VBA, then write the result to the
sheet. For clarity, the following example assumes that the clipboard contains a single U.S.-formatted
number and that it should be enhanced to check for U.S.-formatted dates as well:
Sub ParsePastedNumber()
Dim oDO As DataObject
Dim sText As String
‘Create a new data object
Set oDO = New DataObject
‘Read the contents of the clipboard into the DataObject
oDO.GetFromClipboard
‘Get the text from the DataObject
sText = oDO.GetText
‘If we know the text is in a US format,
‘use Val() to convert it to a number
ActiveCell.Value = Val(sText)
End Sub
PivotTable Calculated Fields and Items, and Conditional
Format and Data Validation Formulas
If you are used to using the .Formulaproperty of a range or chart series, you’ll know that it returns and
accepts formula strings that use English functions and U.S. number formats. There is an equivalent
.FormulaLocalproperty that returns and accepts formula strings as they appear on the sheet (using the
Office UI language and WRS number formats).
PivotTable calculated fields and items and conditional formats also have a .Formulaproperty, but for
these objects, it returns and accepts formula strings as they appear to the user—that is, it behaves in the
same way as the .FormulaLocalproperty of a Rangeobject. This means that to set the formula for one
of these objects, you need to construct it in the Office UI language, and according to the WRS.
Aworkaround for this is to use the cell’s own .Formulaand .FormulaLocalproperties to convert
between the formats, as shown in the following ConvertFormulaLocalefunction.
This function converts a formula string between U.S. and local formats and languages:
Function ConvertFormulaLocale(sFormula As String, bUSToLocal As Boolean) _
As String
On Error GoTo ERR_BAD_FORMULA
‘Use a cell that is likely to be empty!
557
Chapter 25: International Issues
Documents you may be interested
Documents you may be interested