YutaKa Notebook | Python徹底図解ブログ!

Python の文法やモジュール、Python関連のAPIについて画像・ソースコード付きで徹底解説!

【図解!】xlwingsの使い方 | pythonでExcelを操作④セル操作編

【図解!】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オブジェクトを作成
  • Sheetrange()メソッドでセルを指定

このとき、セルまたはセル範囲のセル番地を文字列として引数に与えます。

  • 単一のセルの場合: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を操作する選択肢は他にもあります。

 

状況によって便利なライブラリは変わってきますので、柔軟に使用していきましょう!

Twitter@YutaKaでは、ほぼ毎日pythonに関する情報を発信しています。

気楽にツイートしているので、気軽にフォローしてください!