【図解!】xlwingsの使い方 | pythonでExcelを操作③セル操作編
xlwings
を使用すると、Excelを開きながら、PythonでExcelを操作することができます。
xlwings
では、シートやブック、セルなどは全てオブジェクトとして扱います。
今回は、セルの基本操作について紹介します。
xlwings便利な使い方
xlwings
の便利な使い方としては次のようなものがあります:
- アクティブブック内のアクティブシートを操作
- ブック、シートオブジェクトを作成して操作
- Excel用の関数をPythonで作成
どの使い方でも、ブック、シート、セルを自由に操作できることが重要です!
今回は、セルを操作するためのRange
オブジェクトの基本操作を紹介していきます。
Book
, Sheet
オブジェクトについては、こちらの記事でまとめています。
Rangeオブジェクトの基本的な考え方
Range
オブジェクトは、単一セルだけでなく、セル範囲を取り扱うこともできます。
各Range
オブジェクトは、下図のようにセルやセル範囲に対応しています。
セル操作の流れは次のようになります:
- 操作したいセルの
Range
オブジェクトを作成 Range
オブジェクトのプロパティやメソッドでセルを操作
では、Range
オブジェクトの基本操作について見ていきましょう!
この記事では、
Book
インスタンス⇒wb
Sheet
インスタンス⇒sht
と記述しています。
Rangeオブジェクトの作成
セル操作の第一歩は、操作したいセルのRange
オブジェクトを作成することです。
以下の操作について、紹介していきます。
- セル番地で指定:
sht.range("A1")
- 行番号、列番号で指定:
sht.range( (1,1) )
- Rangeオブジェクトで範囲指定:
sht.range(rng1, rng2)
- アクティブシートのセル指定:
xw.Range()
- 選択中のセルの取得:
wb.selection
- オフセットセルの取得:
rng.offset()
セル番地で指定:sht.range("A1")
セル番地とは、A1やA1:C2などのことです。
Sheet
オブジェクトのrange()
メソッドでは、セル番地でセルを指定できます。
次の手順で作成します:
- 操作したいシートの
Sheet
オブジェクトを作成 Sheet
のrange()
メソッドでセルを指定
このとき、セルまたはセル範囲のセル番地を文字列として引数に与えます。
- 単一のセルの場合:
sht.range("A1")
- セル範囲の場合:
sht.range("A1:C2")
セル番地指定でRange
オブジェクトを作成して、セル番地を出力してみます。
セル番地の出力には、address
プロパティを参照します。
# シートオブジェクトの作成
wb = xw.Book()
sht = xw.sheets[0]
# セルの指定
rng = sht.range("A1")
print(rng.address)
# $A$1
# セル範囲の指定
rng = sht.range("A1:C2")
print(rng.address)
# $A$1:$C$2
セル番地を使用して、Range
オブジェクトが作成できましたね。
行番号、列番号で指定:sht.range( (1, 1) )
range()
メソッドでは引数として、(行番号, 列番号)
のタプルを与えることもできます。
セル範囲の場合は、左上と左下のセルの(行番号, 列番号)
を与えます。
- 単一のセルの場合:
sht.range((1, 1))
- セル範囲の場合:
sht.range((1, 1), (2,3))
sht.range((1, 1))
形式でRange
オブジェクトを作成して、セル番地を出力してみます。
セル番地の出力には、address
プロパティを参照します。
# シートオブジェクトの作成
wb = xw.Book()
sht = xw.sheets[0]
# セルの指定
rng = sht.range("A1")
print(rng.address)
# $A$1
# セル範囲の指定
rng = sht.range("A1:C2")
print(rng.address)
# $A$1:$C$2
(行番号, 列番号)
形式で、Range
オブジェクトが作成できましたね。
rngオブジェクトで範囲指定:sht.range(rng1, rng2)
range()
メソッドでは、既に作成したRange
オブジェクトをもとにセル範囲を指定できます。
次のようにセルのRange
オブジェクトを与えます。
range(左上のセル, 右下のセル)
例として、A1とC2のRange
オブジェクトから、A1:C2のRange
オブジェクトを作成します。
rng1 = sht.range("A1")
rng2 = sht.range("C2")
rng = sht.range(rng1, rng2)
print(rng.address)
# $A$1:$C$2
2つのRange
オブジェクトから、セル範囲のRange
オブジェクトが作成できましたね。
アクティブシートのセル指定:xw.Range()
アクティブシート内のセルを指定する場合、シートオブジェクトの作成を省略できます。
xw.Range()
で、Range
オブジェクトを作成するとアクティブシートのセルを指定できます。
指定方法は、sht.range()
と同じです:
- セル番地で指定:
xw.Range("A1")
- 行番号、列番号で指定:
xw.Range((1, 1))
- rngオブジェクトで範囲指定:
xw.Range(rng1, rng2)
# セル番地
rng = xw.Range("A1")
print(rng.address)
# $A$1
# 行番号、列番号
rng = xw.Range((2,3))
print(rng.address)
# $C$2
# Rangeオブジェクトで範囲指定
rng = xw.Range(rng1, rng2)
print(rng.address)
# $A$1:$C$2
これは、アクティブブックを操作する際に便利ですね。
選択中のセルの取得:wb.selection
Book
オブジェクトのwb.selection
プロパティで選択中のセルを取得することができます。
次のように、B1:D4まで選択した状態で参照してみます。
wb = xw.books.active
rng = wb.selection
print(rng.address)
# $B$2:$D$4
セルを選択するには、Range
オブジェクトのselect()
メソッドを使用します。
xw.Range("A1:B2").select()
# 選択中のセルの表示
rng = wb.selection
print(rng.address)
# $A$1:$B$2
セルの選択はマクロの作成で役に立ちます。
オフセットセルの取得:rng.offset()
offset()
メソッドを使用すると、特定のRangeオブジェクトから、行方向、列方向にずらしたセルのRangeオブジェクトを取得できます。
引数として、ずらしたい行数、列数を与えます。
列方向に、ずらさない場合には、列数を省略できます。
rng.offset(行数, 列数)
rng.offset(行数)
:列方向にずらさない場合
1行、1列ずつずらす場合には、次の図のように引数を与えます。
C3セルを基準にして、オフセットセルの例を見てみましょう。
rng = xw.Range("C3")
offset_rng = rng.offset(1, 0) # 1個下のセル
print(offset_rng.address)
# $C$4
offset_rng = rng.offset(1, 1) # 右下のセル
print(offset_rng.address)
# $D$4
offset_rng = rng.offset(0, -1) # 1個左のセル
print(offset_rng.address)
# $B$3
オフセットセルは、for文
でセルを処理するときなどに便利な機能です。
セルの値の読み書き
Range
オブジェクトを用いて、セルの内容を操作する方法について紹介してきます。
- 値の読み書き:
rng.value
- 数式の読み書き:
rng.formula
値の読み書き(単一のセル):rng.value
セルの値を読み書きするには、Range
オブジェクトのvalue
プロパティにアクセスします。
- 代入すると書き込み
- 出力すると読み込み
になります。
xw.Range("A1").value = 100
print(xw.Range("A1").value)
# 100.0
xw.Range("A2").value = "文字列の例"
print(xw.Range("A2").value)
# 文字列の例
xw.Range("A3").value = "2010/10/05"
print(xw.Range("A3").value)
# 2010-10-05 00:00:00
日付を入力すると、Excelでは自動で日付として認識されます。
また、日付を読み込むと自動でdatetime
型に型変換してくれます。
値の読み書き(複数セル):rng.value = [リスト]
複数セルにデータを書き込む場合には、リストを代入します。
リストを代入すると、指定したセルを始点に行方向にデータを入力します。
xw.Range("C3").value = ["Apple", "Banana", "Carotte"]
列方向に入力する場合は、transpose=True
を指定します。
xw.Range("B2", transpose=True).value = [10, 20, 30]
リスト内リストを与えると、表形式のデータを入力できます。
xw.Range("A1").value = [["Apple", "Banana", "Carotte"],
["10", "20", "30"]]
数式の読み書き:rng.formula
数式を記述する場合には、formula
プロパティに文字列として書き込みます。
# 式を入れる
xw.Book()
xw.Range("A1").value = 1
xw.Range("A2").value = 2
xw.Range("A3").formula = "=sum(A1+A2)"
print(xw.Range("A3").formula)
# =SUM(A1+A2)
print(xw.Range("A3").value)
# 3.0
読み込みの際には、
value
を指定 ⇒ 計算結果formula
を指定 ⇒ 数式そのもの
を出力するという違いがあります。
おわりに
今回は、Range
オブジェクトの操作を紹介しました!
セルの操作にあわせて、ブック、シートの操作も抑えておきたいですね。
このシリーズでは、xlwings
の操作方法を紹介していますが、pythonでExcelを操作する選択肢は他にもあります。
- Excelファイルを開かずにPythonで操作したい場合にはopenpyxlがおススメ
- データ分析を行う場合には
pandas
で直接Excelを読み込む方が便利!
状況によって便利なライブラリは変わってきますので、柔軟に使用していきましょう!
Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。
気楽にツイートしているので、気軽にフォローしてください!