Pythonにおいて、openpyxlでエクセルを制御するとエクセルグラフや図形が消えてしまいます。
この記事では、この問題についての解決法をお伝えします。
- プログラミングの独学で心配になる点
-
- 学習方法は合ってる?
- 上達しない、遅い
- 将来稼げるか不安
- 独学は実際の企業で通用しない?
- そのような心配に対しての解決策を下記にまとめていますのでご覧ください。
.
症状「openpyxlでエクセルのシートコピーしたときにグラフや図形や画像が消える」
openpyxlでエクセル制御をし、エクセルのシートをコピーすると「グラフ・画像・図形・テキストボックスが消えてしまう」症状がでます。
現仕様では避けられない症状のようです。
今回は、この問題の対処法として、
「pythonのwin32com.client と エクセルVBAを組み合わせる」ことで、エクセルのシートをコピーしてもグラフや図形が消えないようにpython制御するコードを作りました。
そのコードについて紹介させていただきます。
win32com.client と エクセルVBAでの対処法
今回解決のために行ったことは、
「エクセルシートコピーのプログラム命令を、pythonで実行するのではなく、エクセルVBAで実行すること」です。
「win32com.client」をimportすると、pythonでエクセルVBAを実行できます。
今回の症状は、「pythonのopenpyxlでシートコピーする際に、シート内の文字や数字は問題なくコピーできるが、シート内のグラフや画像やテキストボックスなど、オブジェクトに関わるコピーはできない」というものでした。つまり、openpyxlでは、オブジェクト入りのシートコピーはうまく対応できないということです。そこで、エクセルVBAでシートをまるごとコピーすれば、この問題を回避できるのではと考えたからです。
実際に、トライしてみたところ、グラフや画像は消えずに、エクセルシートコピーをすることができました。
そのときのPythonコードと、エクセルVBAコードの例を紹介させていただきます。
コード : Python
まずpythonのコード例をご紹介いたします。
import win32com.client
import os
filename = r"C:\Users\mmiya\Desktop\format.xlsm"
#元エクセル(フォーマット)
filename2 = r"C:\Users\mmiya\Desktop\test1.xlsm"
#保存先エクセル
app = win32com.client.Dispatch("Excel.Application")
#win32をappと定義
wb = app.Workbooks.Open(filename, ReadOnly=1)
#元エクセル(フォーマット)を開く
app.Visible = 0
#非表示 0、表示 1
sheet = wb.Worksheets("sheet1").Activate()
#エクセルシート"sheet1"をアクティブ化
app.Application.Run('シート複製マクロ')
#エクセルVBA「シート複製マクロ」を実行
app.DisplayAlerts = False
#エクセルVBAでエラー発生しても、止まらずにそのまま進めるコード
wb.SaveAs(filename2) #ファイル名指定保存
wb.Close
#wbを閉じる
app.Application.Quit()
#アプリケーション終了
pythonでVBAを動かすため、openpyxlではなく、win32com.clientを用います。
エクセルシートをコピーする箇所は、app.Application.Run(‘シート複製マクロ’)です。ここでVBAを実行しています。
また、VBAは、エクセルファイルに事前に組み込んでおく必要があります。私の場合は、フォーマット用のエクセルファイルを準備しておき、そこにVBAを事前に作成しています。
つまり、下記のような手順となります。
・フォーマット用のエクセルファイルを準備する
・フォーマット用のエクセルファイルに、VBA(“シート複製マクロ”)を作成しておく
・pythonで一連のプログラムになかで、エクセルシートコピーする際には、フォーマット用のエクセルファイルをwin32com.clientで開きにいく
・pythonのwin32com.clientで、エクセルVBA(“シート複製マクロ”)を実行し、シートコピーを行う
・pythonで、エクセルを別名で保存する
コード : エクセルVBA
次にエクセルVBAのコードを紹介します。
シートをコピーするだけなので簡単です。
Sub シート複製マクロ()
Dim Sheetname As String 'シート名の定義
Sheetname = ActiveWorkbook.name 'アクティブエクセルシートを定義
Sheets(1).Activate 'シート1をアクティブ化
Sheets(1).Copy After:=Sheets(1) 'シート1の後ろに複製
End Sub
pythonは、エクセルシート内のオブジェクトを制御するのが苦手な可能性があります。
このため、エクセルシートのコピー以外でも、例えば、エクセルのグラフ主軸の最大最小数値やグラフ自体のサイズを変更したいときも、私はpythonで制御するのではなく、「win32com.client」を使ってVBAで処理しています。
下記のような順でプログラムをつくっています。
・pythonのwin32com.clientで、最大値と最小値の必要数値などを、エクセルの任意セルに代入
・pythonのwin32com.clientで、エクセルVBA(“グラフ軸の変更マクロ”)を実行
・エクセルVBA(“グラフ軸の変更マクロ”)によって、エクセルの任意セルに代入された数値を読み取りにいき、グラフの軸数値を変更する
・pythonにてエクセルファイル保存
プログラミングをマスターするには
プログラミングを学び始めたけど、勉強の仕方があっているか心配。。。
このように悩んでいる方は多いとおもいます。
この一番の解決策はプログラミングスクールに通ってIT企業に就職することです。
独学でひとりで学習するのは限界があります。おそらく自分自身でもそのように感じ取られているのではないでしょうか。
とはいえ、スクール代は高いので、なかなかふんぎりが付かないというのが正直な気持ちかと思います。
プログラミングスクールは良い点がたくさんあります。
- プログラミングスクールの良い点
-
- 正しい構文が学べる
- 3カ月で実力がつく
- 同じ境遇の仲間と知り合える
- 疑問を何度も相談できる
- 就職支援してもらえる
現役のプロ講師に正しい勉強法を教えてもらえます。IT業界へのパイプも強いのでほぼ確実にIT企業に就職できます。
最短で言うと、プログラミングスクールで3カ月学習したのち、すぐにIT企業に就職できます。
その2~3年後にはフリーランスとして独立も見えてきます。独学ではここまでのスピードで成長することは難しいです。
またIT企業に就職することは下記の良いステータスが得られます。
- IT企業に就職して良いこと
-
- 実績と経験を積める
- IT業界に知り合いが増える
- 顧客と知り合える
- 超優良企業に転職できる
- リモートワークしやすい
- フリーランスとして独立しやすい
現在、IT企業の人手不足は深刻な課題です。IT企業で実績と経験をつめば、働くことにまず困らなくなります。また、グーグルなどのIT企業だけでなく、一般企業のSIも求人数が常に高い状況であり、超優良企業へのステップアップ転職も可能性がでてきます。
さらにリモートワークもしやすい仕事であり、フリーランスとして独立を目指せる職業です。実力次第では個人で数千万円の年収を得ることもできます。サイドFIREして、好きなときだけ働くこともでき、40歳以降でも自由度の高い選択ができます。
以上より、
プログラミングスクールで正しく短期間で学習を行い、IT企業で実績と経験を積むことが一番の近道です。プログラミングスクール代ははっきり言ってすぐに取り返せます。
あと、プログラミングスクールもどこを選ぶかが大事です。
現在はテックアカデミーがかなり強いです。
》テックアカデミーのプログラミングコース
- テックアカデミーが強い理由
-
-
- 3か月でエンジニアを目指せるコースがある
-
- 受講したカリキュラムはオンラインで完結できる
-
- 受講生1人に対して現役エンジニアがサポート
-
- 週2回マンツーマンのビデオチャットで質問ができる
-
- 毎日15〜23時チャットサポート可能
-
- 様々な言語に対応して学習が可能
-
ぜひ一番の近道でプログラミングを学び、自分自身の将来に活用していただけたらと思います。