動作検証バージョン:Windows 11 Home + Python 3.10.6(64-bit) + pywin32 305 + 64bit Excel
Excel VBAのRangeオブジェクトのValueプロパティでデータを取得した場合、表示形式によってはデータ型がDoubleではなくCurrencyになることを記事にしました。
pywin32・win32com.clientを使った場合、どのようなデータ型と認識されるのかが気になります。
[スポンサードリンク]
Range.Valueで取得した数値のデータ型を確認するサンプルスクリプト
Excel VBAの場合と同様に、
B1:B5セルに数値「-1234.5」を入力してさまざまな表示形式を設定したワークシートがアクティブな状態で以下のスクリプトを実行してみました。
import win32com.client as win32
xl_app = win32.GetObject(Class='Excel.Application')
for rng in xl_app.Range('B1:B5'):
print(
rng.Text,
rng.Value,
type(rng.Value),
sep='\t',
)
xl_app = win32.GetObject(Class='Excel.Application')
for rng in xl_app.Range('B1:B5'):
print(
rng.Text,
rng.Value,
type(rng.Value),
sep='\t',
)
結果は、
(1,234.50) -1234.5 <class 'float'>
▲ 1,234.50 -1234.5 <class 'float'>
(¥1,234.50) -1234.5 <class 'decimal.Decimal'>
¥-1,234.50 -1234.5 <class 'decimal.Decimal'>
¥ -1,234.50 -1234.5 <class 'decimal.Decimal'>
と出力されます。
Excel VBAでCurrencyと判定された表示形式[通貨]や[会計]は、decimal.Decimal型と判定されています。
Range.Value2で取得するとfloat
先ほどのforブロックで、以下のようにRange.Value2プロパティを使うと、
for rng in xl_app.Range('B1:B5'):
print(
rng.Text,
rng.Value2,
type(rng.Value2),
sep='\t',
)
print(
rng.Text,
rng.Value2,
type(rng.Value2),
sep='\t',
)
以下のように出力されます。
(1,234.50) -1234.5 <class 'float'>
▲ 1,234.50 -1234.5 <class 'float'>
(¥1,234.50) -1234.5 <class 'float'>
¥-1,234.50 -1234.5 <class 'float'>
¥ -1,234.50 -1234.5 <class 'float'>
Excel VBAでRange.Vlaue2で取得したデータならDoubleと判定されるのと対応しています。
[スポンサードリンク]
Home » Python » pywin32・win32comの使い方 » pywin32を使ってExcelのRange.Valueで数値を取得すると表示形式によってdecimal.Decimalに