【関数・メソッド・プロパティ設定をつかう】

4 三つのブラケットスライス書式をつかう

5 文字列の指定位置から1文字を取得

6 文字列の文字数を取得

7 文字列のループで1文字ずつ分解

8 文字が入っているセルの最大行を取得

9 文字が入っているセルの最大列を取得

10 行のループで複数の文字列を連続分解

文字列のループで1文字ずつ分解

 今回は、Pythonで対象文字列を1文字ずつ分解する処理をループ処理で一つにまとめてみます。


1. 文字列のループで1文字ずつ分解

 予め、次のようなExcelシート『sheet2』を用意して、Excelブック名を『WkBook2.xlsx』として保存します。

Img7_2_21

 この『WkBook2.xlsx』の『sheet2』を読みこみます。

 xlwingsをつかいPythonで既存Excelを読みこみ操作するときは、

 Workbookファイルをメモリ上に読みこむと同時にWorkbookオブジェクトを生成、

 ( 『xlwingsをつかい既存Workbookを読みこみファイル保存』参照 )

 更に、sheetオブジェクトを生成して、そのsheetを操作します。

 Workbookオブジェクト名を『wb』、sheetオブジェクト名を『st』とします。


 ソースコードパネルに

import xlwings

wb = xlwings.Book('WkBook2.xlsx')

st = wb.sheets['sheet2']

 と記述しておきます。


 書込行:『行番号』を『3』に、最大文字数:『最大文字数』を『13』に固定して、

 書込列を変数『列番号』、切り取り位置のインデックスを変数『idx』とします。

 1文字目から『最大文字数』まで1文字ずつカウントアップしていきながら、

 そのつどセルA3の値を1文字ずつ読みとり、

 セル(行番号, 列番号)に書きこんでみます。


 『行番号』に『3』、『最大文字数』に『13』を代入、

 行番号 = 3

 最大文字数 = 13

 と記述します。


 次に、1文字目から『最大文字数』まで1文字ずつ『idx』をカウントアップしていきながら、

 そのつどセルA3の値を1文字ずつ読みとり、セル(行番号, 列番号)に書きこみます。


 ここで、切り取り位置のインデックス『idx』と『列番号』の等式を整理してみます。

 切り取り位置のインデックス『idx』が 『1』文字目のとき、列番号はB列つまり 『2』列

 切り取り位置のインデックス『idx』が 『2』文字目のとき、列番号はC列つまり 『3』列

 切り取り位置のインデックス『idx』が 『3』文字目のとき、列番号はD列つまり 『4』列

 切り取り位置のインデックス『idx』が 『4』文字目のとき、列番号はE列つまり 『5』列

 切り取り位置のインデックス『idx』が 『5』文字目のとき、列番号はF列つまり 『6』列

 切り取り位置のインデックス『idx』が 『6』文字目のとき、列番号はG列つまり 『7』列

 切り取り位置のインデックス『idx』が 『7』文字目のとき、列番号はH列つまり 『8』列

 切り取り位置のインデックス『idx』が 『8』文字目のとき、列番号はI列つまり 『9』列

 切り取り位置のインデックス『idx』が 『9』文字目のとき、列番号はJ列つまり『10』列

 切り取り位置のインデックス『idx』が『10』文字目のとき、列番号はK列つまり『11』列

 切り取り位置のインデックス『idx』が『11』文字目のとき、列番号はL列つまり『12』列

 切り取り位置のインデックス『idx』が『12』文字目のとき、列番号はM列つまり『13』列

 切り取り位置のインデックス『idx』が『13』文字目のとき、列番号はN列つまり『14』列

 ということは、

列番号idx + 2という等式が成り立ちます。


for idx in range(0,最大文字数):

列番号idx + 2

st.range(行番号, 列番号).value = st.range('A3').value[idx]

と記述します。


 【ソースコードパネル】

import xlwings

wb = xlwings.Book('WkBook2.xlsx')

st = wb.sheets['sheet2']

行番号 = 3

最大文字数 = 13

for idx in range(0,最大文字数):

列番号 = idx + 2

st.range(行番号, 列番号).value = st.range('A3').value[idx]


 それでは、そのPythonプログラムを実行してみましょう。

Img7_2_22

 セルB3~N3に『セ』『ル』『を』『思』『い』『の』『ま』『ま』『に』『動』『か』『そ』『う』

 が、書きこまれました。



2. 文字列の文字数を取得後、文字列のループで1文字ずつ分解

 先ほど、対象文字列を1文字ずつ分解する処理をループ処理で一つにまとめてみましたが、

 ループの終了値つまり『最大文字数』を『13』に固定していました。

 ループの終了値を毎回人が数えていては手間がかかるし時間もかかるので、

 Pythonに計算してもらうようにします。

 いったん全てのセルB3~N3の値をクリアします。

Img7_2_21

 ループの終了値つまり最大文字数:MaxStrを取得するために、len関数をつかってみます。

 引数としてセルA3から取得した文字列を渡してから、

 文字数を受け取り、変数『最大文字数』に格納してみます。

 最大文字数 = len(st.range('A3').value)

 ループ処理の前処理として、これをループ処理より先に記述します。


 【ソースコードパネル】

import xlwings

wb = xlwings.Book('WkBook2.xlsx')

st = wb.sheets['sheet2']

行番号 = 3

最大文字数 = len(st.range('A3').value)

for idx in range(0,最大文字数):

列番号 = idx + 2

st.range(行番号, 列番号).value = st.range('A3').value[idx]


 それでは、そのPythonプログラムを実行してみましょう。

Img7_2_22

 セルB3~N3に『セ』『ル』『を』『思』『い』『の』『ま』『ま』『に』『動』『か』『そ』『う』

 が、書きこまれました。



 試しに、対象文字列:セルA3の値を13文字以内の適当な文字に書きかえて、Pythonプログラムを実行して、

 ある文字列が左端から右端まで順に1文字ずつ分解できることを確かめてみてください。




目 次

1. ワークブックを作成する
ワークブックを作成する

2. セルの位置を指定する
セルの位置を指定する

3. ループ処理でセルに値を書きこむ
ループ処理でセルに値を書きこむ

4. ループ処理でセルの値を読みとる
ループ処理でセルの値を読みとる

5. ループ処理でセルからセルへ値を代入する
ループ処理でセルからセルへ値を代入する

6. 条件分岐処理でセルの操作を分ける
条件分岐処理でセルの操作を分ける

7. 関数・メソッド・プロパティ設定をつかう
関数・メソッド・プロパティ設定をつかう

8. 他のレンジ/シート/ブックを更新する(未公開)
他のレンジ/シート/ブックを更新する
(未公開)

1 他のレンジを更新

2 他のシートを更新

3 逆Z式並びで更新

4 複数シートを更新

5 他のブックを更新

6 他のブックをオープン・クローズ

7 新規ブックを作成し更新






YouTube

Excelマクロの実用版とデモ版


ブログ