Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

Excel VBAの配列にはどんな種類があるのか - 1次元配列 -

はじめに

少し前になりますが、「Excel VBAで配列を覚える労力は報われるのか」という記事を書きました。

lbibouroku.hatenablog.com

今回は、その続きの、配列の種類について説明します。

◆目次◆

配列の種類

配列には、以下の4種類があります。

  1. . 1次元配列
  2. . 多次元配列
  3. . 静的配列
  4. . 動的配列

それぞれの配列がどんなものなのかを数回に分けて説明します。

今回は1次元配列を説明します。

1次元配列

配列は、箱の集合体のようなものを想像するとわかりやすいです。1次元配列は、横並びの箱に1つずつ値を入れていきます。

なお、配列の始まりは、指定がない場合は「インデックス:0」から始まります。

f:id:lbibouroku:20210817233638p:plain

Excel VBAで配列のコードを書くときは以下の手順で書きます。

' 1.配列を宣言する
Dim 配列名(インデックスの最大値) As データ型

' 2.宣言した配列に値を入れる
配列名(インデックス)  =

では、3つの箱に以下の値を入れて、配列を作ってみます。

  • インデックス0:Coffee
  • インデックス1:Tea
  • インデックス2:Milk

f:id:lbibouroku:20210817233703p:plain

それぞれの箱に値を入れました。この配列をコードで書いてみます。

' 開始位置を指定しない配列
Sub array1_1()

    Dim drink(2) As String
    
    drink(0) = "Coffee"
    drink(1) = "Tea"
    drink(2) = "Milk"

End Sub

このプロシージャを実行し、ローカルウィンドウで結果を見ると、意図した通り配列に値が入っています。

f:id:lbibouroku:20210817233751p:plain

ちなみに、インデックスの開始を0以外から開始することも可能です。その場合は、インデックスの範囲を指定します。

' 1.配列を宣言する
Dim 配列名(インデックスの開始の値 To インデックスの最大値) As データ型

' 2.宣言した配列に値を入れる
配列名(インデックス)  =

f:id:lbibouroku:20210817233810p:plain

たとえば、上記のように「インデックス:1」から始めたい場合のコードは以下のとおりに書きます。

' 開始位置を指定する配列
Sub array1_2()

    Dim drink(1 to 3) As String
    
    drink(1) = "Coffee"
    drink(2) = "Tea"
    drink(3) = "Milk"

End Sub

さいごに

いかがでしたか。なんとなく「配列を使うと、数字がついた箱に値を入れることができる」ということが分かったと思います。実践的な配列の使い方については、順を追って説明しますので、もうしばらくは、配列の種類のと使いかたを説明します。

次回は多次元配列について説明します。

VBAのFunctionプロシージャを「y=2x+1」を使って解説する

はじめに

Excel VBAではじめて「Functionプロシージャ」に出会ったとき、どう思いましたか?わたしは、まったく意味がわかりませんでした。
「自分で関数を作れる」ということがどういうことなのか、「引数」と「戻り値」のことも、解説を読んでも理解しにくかったです。

最近は少し慣れて自分で関数を作れるようになりました。 ふと、「Functionプロシージャを一次関数で表したらわかりやすくなるのではないか」と思い、試してみることにしました。

◆目次◆

一次関数とは

コトバンク」の一次関数の解説から抜粋します。 https://kotobank.jp/word/%E4%B8%80%E6%AC%A1%E9%96%A2%E6%95%B0-433347

a、bを定数とするときy=ax+b(a≠0)で表される関数をいう。

この記事のタイトルの一部の「y=2x+1」は一次関数です。

Functionプロシージャとは

引数と戻り値を使って、自分で関数を作ることができるプロシージャです。 (戻り値がないプロシージャも作成可能です) Subプロシージャとの違いは、戻り値の有無です。

引数と戻り値とは何なのか、一言でいうと以下のとおりです。

  • 引数
    関数に代入する値

  • 戻り値
    関数の処理結果

なお、Functionプロシージャは以下のように記述します。

Function 自分で決めた関数名(引数名 As データ型) As 戻り値のデータ型

    自分で決めた関数名 = 戻り値 

End Function

ここまでは、(Functionプロシージャをはじめて目にした人は)「引数」や「戻り値」など、聞き慣れない言葉が出てくるので、自分で関数を作るイメージがしにくいです。

では、例として一次関数の「y=2x+1」という数式を使ってFunctionプロシージャで関数を作る過程を説明します。

「y=2x+1」を例にしてFunctionプロシージャで関数を作る

yの値を求める関数(Functionプロシージャ、関数名:y)を作ります。

Function y(x As Long) As Long

    y = 2 * x + 1

End Function

なんとなくわかりやすくなりませんか。 yを求める関数は「y=2*x+1」と書けばいいのです。

この場合、引数と戻り値は以下のとおりです。

  • 引数:x
  • 戻り値 :2 * x + 1の答え(処理結果)→つまりyの値

では、引数:xに代入する値を決めます。
今回はx=3とします。

呼び出し用のsubプロシージャを用意して引数xに3を代入します。

Sub 一次関数呼び出し用プロシージャ()
    
    Debug.Print y (3) 

End Sub

上記の呼び出し用のSubプロシージャでは、yの値(y=2x+1のときにxの値が3だった場合の処理結果)がイミディエイトウィンドウに出力されます。

これで、Functionプロシージャの関数:yと、関数呼び出し用のプロシージャが完成しました。

この2つを合わせます。

Sub 一次関数呼び出し用プロシージャ()
    
    Debug.Print y (3) ' 出力結果:7

End Sub

Function y(x As Long) As Long

    y = 2 * x + 1

End Function

Functionプロシージャを使った関数作り方や、「引数」と「戻り値」の意味がわかりやすくなったのではないでしょうか。
ちなみに上記の場合、引数と戻り値は以下のとおりです。

  • 引数:x=3
  • 戻り値:y=2×3+1=7

さいごに

Functionプロシージャで関数を作るときに「どうやって組み立てたらいいのか」がわからなくなったら、一次関数を思い出してください。

「引数はx、戻り値はyの値(処理結果)」と考えていただくと、少しわかりやすくなるかもしれません。

VBAにおけるPropertyプロシージャとは何か

はじめに

今回は、Propertyプロシージャについて調べていきます。

Propertyプロシージャはクラスでよく使われるらしいのですが、私はまだExcel VBAでクラスを使ったことがありません。まずはPropertyプロシージャの概念と使い方を覚えて後日、クラスの作成に生かしたいと思います。

プロシージャとは

マクロの処理や設定の手続きを行う流れをひとまとめにしたものです。 プロシージャの種類は、以下の3つです。

  • Subプロシージャ
    戻り値なし(戻り値が不要)の手続きをまとめたプロシージャ
  • Functuinプロシージャ
    戻り値ありの手続きをまとめたプロシージャ(戻り値なしも可能)
  • Propertyプロシージャ
    プロパティの作成や設定、操作を行うプロシージャ

今回はPropertyプロシージャにクローズアップします。

Propertyプロシージャの種類

Propertyプロシージャの種類は、以下の3つです。それぞれ用途が異なるので説明します。

  • Property Letプロシージャ
  • Property Setプロシージャ
  • Property Getプロシージャ

Property Letプロシージャ

オブジェクト型以外の値を設定するプロシージャ
戻り値を返せません。

Property Setプロシージャ

オブジェクト型の参照値を設定するプロシージャ
戻り値を返せません。

Property Getプロシージャ

プロパティを取得するプロシージャ
戻り値を返せます。
(Functionプロシージャと同じです)

※Variant型はすべてのPropertyプロシージャで使用することが可能です。

Propertyプロシージャを使う

Propertyプロシージャを使って
「今日の気温を設定して、温度によって体感を回答する」
というプロシージャを作りました。

Private temperature_ As Long

' 呼び出し用のプロシージャ
Sub todays_temperature()

' 今日の気温を設定する
    Temperature = 20
    Debug.Print Experience ' 出力結果:ちょうどよい

End Sub

' Property Letプロシージャで値を設定する
' 今回の場合は、変数temperature_の値をそのまま設定する
Property Let Temperature(newTemperature As Long)
 
    temperature_ = newTemperature

End Property
 
' Property Getプロシージャで値を返す
' 今回の場合は、変数temperature_の値によって、戻り値を変更する
Property Get Experience() As String
 
    If temperature_ >= 30 Then
        Experience = "暑い"
    ElseIf temperature_ >= 15 Then
        Experience = "ちょうど良い"
    Else
        Experience = "寒い"
    End If

End Property

Propertyプロシージャの覚え方

単純に英単語の訳だと以下のようになります。

  • Let:させる
  • Set:設定する
  • Get:手に入れる
  • Property:財産、資産、特質、特性

つまり、少し強引ですが、以下のように考えれば、それぞれの用途が見えてきます。

  • Property Let/Setプロシージャは「特性に値を設定する=値は持っていない」ので、値を戻せない
  • Property Getプロシージャは「特性の値を手に入れる=値を持っている」ので値を戻せる。

おまけ1・変数におけるLetとSet

変数の宣言後に変数へ値を設定します。実はこのときに、(オブジェクト型以外は)「Let」が入っているのですが、省略されています。

' 「Let」を省略する場合
    Dim x As Long
    x = 1

' 「Let」を省略しない場合
    Dim x As Long
    Let x = 1

オブジェクト型の変数に値を設定するときは「Set」を設定しますが、こちらは省略不可です。

    Dim rng As Range
    Set rng = Sheet1.Range("A1")

変数における「LetとSet」も、Propertyプロシージャにおける「LetとSet」と同じような役割ですね。

なお、変数は「値を設定する」のみなので、変数単体では戻り値は返せません。

おまけ2・ExcelのLET関数

Excelのワークシート関数で、変数を決める「LET関数」というものがあります。

support.microsoft.com

以下一部抜粋します。

f:id:lbibouroku:20210810191339p:plain

VBAの変数と同じように、変数を宣言して値を格納し、変数を使って計算できるようですね。

ご興味のある方は、ぜひ上のリンクから記事を読んでみてください。

Excel VBAで配列を覚える労力は報われるのか

はじめに

前回は、Excel VBAでマクロが遅くなる3つの原因と解決方法について紹介しました。

lbibouroku.hatenablog.com

今回はExcel VBAの配列を覚えるのが、なぜ大変なのかを中心に紹介したいと思います。

◆目次◆

Excel VBAの配列の使い方を覚えるのが大変な理由

答えは前回の記事でお伝えしたとおり、「Excel VBAの配列は制約が多いから」です。
では、どんな制約があるのか、簡単に説明します。
(細かい説明は別の記事で行いますので、今回は「どんな制約があるのか」という観点で見ていただければと思います。)

決まりごとの多いExcel VBAの配列

  • 静的配列と動的配列がある
    Excel VBAのは配列では、配列のサイズを後から変更できない「静的配列」と、配列のサイズを後から変更できる「動的配列」の2種類があります。
    「静的配列」と「動的配列」ではコードの書き方が異なります。(動的配列の方が、決まりごとが多いです)

  • インデックスのはじまりが可変である
    プログラミングで配列を扱うときは、インデックス0からカウントしていくパターンが多いです。しかし、Excel VBAの場合はインデックスの始まりを0以外にすることが可能です。たとえば、Excelのセルに合わせて0以外の数字から始めることが多々あります。(その方が、結果的に可読性は上がるのですが)

  • 動的配列はサイズの変更ごとにReDimステートメントの宣言が必要である 以下は動的配列のコードです。

Sub test4()

'変数drinksをインデックスは空白のまま宣言する。 
    Dim drinks() As String

'「ReDim」で変数drinksの配列の数を宣言しなおす。 
    ReDim Preserve drinks(2)     
    drinks(0) = "Coffee"
    drinks(1) = "Tea"
    drinks(2) = "Milk"

'「ReDim」で変数drinksの配列の数を宣言しなおす。 
    ReDim Preserve drinks(3)
    drinks(3) = "Cocoa"
    
'「ReDim」で変数drinksの配列の数を宣言しなおす。 
    ReDim Preserve drinks(4)
    drinks(4) = "Juice"

End Sub

このように、Excel VBAでは一度配列のサイズ(インデックスの最大値)を決めてしまうと、配列のサイズを変更するたびにRedimステートメントを使って、配列のサイズを宣言しなければなりません。(実際は、セル範囲をFor~Next構文のループを使って、宣言を行うことが多いです)

  • Variant型
    Excel VBAでは変数を宣言するときに、型宣言が必要です。配列でも同様で、たとえば配列の中身が「すべて文字列」であれば、String型を宣言します。
    しかし、配列の中身の型が一致しない場合も多々あります。そんなときはVariant型を宣言しなければなりません。

  • PCのスペックによってはメモリ不足になる場合がある
    PCのスペックが低いと、大きな表を配列に格納すると、メモリ不足になってエラーが出てしまう可能性があります。その場合は、必要な範囲のみ配列に格納するなど、工夫が必要です。

それでも配列を覚えた方がいい理由

こちらも前回お伝えしたとおり、「処理速度が速くなる」からです。

どれくらい処理速度が速くなるのか

Excel VBAでマクロ処理を早くする方法はいくつかありますが、「セルの選択回数を減らす」という方法は、かなり効果が高いです。

どれくらい効果があるのでしょうか。比較のために、以下の条件でマクロを実行してみます。

  • 処理内容
    Sheet1の「セルA1からセルT10000」の範囲に数字(行数)を入れる
  • ワークシート関数
    Sheet1の「セルU1からセルU10000」の範囲に同じ行の、A~T列を足し算するSUM関数が入っている(1行目には「SUM(A1:T1)」が入っている)

f:id:lbibouroku:20210805194146p:plain

結果は以下のとおりです。

条件 処理方法 マクロが終了するまでの秒数
条件1 特になし 6.351563
条件2 ワークシート関数を手動計算に設定する 3.171875
条件3 画面表示の更新を停止する 5.351563
条件4 条件2と条件3を設定する 2.890625
条件5 配列を使う 0.2265625

なお、計測には以下のマクロを使用しました。

  • 条件1~条件4
Sub test5()

'条件1:このまま実行
'条件2:AとCのコメントを解除
'条件3:BとDのコメントを解除
'条件4:A~Dのコメントを解除

'    Application.Calculation = xlCalculationManual ' A
'    Application.ScreenUpdating = False ' B
    
    Dim start As Variant
    start = Timer
    
    Dim i As Long
    Dim j As Long
    
    For i = 1 To 10000
        For j = 1 To 20
            Sheet1.Cells(i, j) = i
        Next j
    Next i
    
    Dim finish As Variant
    finish = Timer
    
'    Application.Calculation = xlCalculationAutomatic ' C
'    Application.ScreenUpdating = True 'D
    Debug.Print finish - start

End Sub
  • 条件5
Sub test6()

Dim start As Variant
start = Timer

Dim num(1 To 10000, 1 To 20) As Long
Dim i As Long
Dim j As Long
    
    For i = 1 To 10000
        For j = 1 To 20
            num(i, j) = i
        Next j
    Next i
         
Sheee1.Range("A1:T10000") = num

Dim finish As Variant
finish = Timer

Debug.Print finish - start

End Sub

さいごに

一見、Excel VBAの配列の使い方を覚えるのが大変な理由の方が多いように見えますが・・・労力に対してのリターンはきちんとあります!

また、Excel VBAで自動化ツールが作れるようになると、だんだん複雑なコードが書けるようになるのですが、そのうちに「処理速度の問題」という壁にぶつかることがあると思います。ここで配列に手をつけざるを得ないというパターンが多いのではないでしょうか。(実は、私もそうでした。)

配列を覚えるのは難易度がやや高いですが、できるだけわかりやすいように説明しますので、お付き合いください。

次回は配列の種類について説明します。

Excel VBAでマクロが遅くなる3つの原因と解決方法

はじめに

Excel VBAのマクロを実行したときに、「処理に時間がかかる」「処理の途中でフリーズしてしまった」ということはありませんか?

処理に時間がかかる原因は、マクロの処理が多いからでしょうか。確かにそれも一理ありますが、実はもっと具体的な原因があります。

主な原因は以下の3つです。

  1. ワークシート関数の自動計算
  2. 画面表示の更新
  3. セルの選択回数

なぜこの3つが原因で処理が遅くなるのでしょうか。ここの記事では理由と、解決方法について説明します。

◆目次◆

原因1:ワークシート関数の自動計算

Excelは「表計算ソフト」です。よって、Excelファイルには、ワークシート関数(SUM関数やIF関数など)が記載されていることが多々あります。
実は、ワークシート関数は、Excel VBAのマクロを実行すると再計算されてしまう仕組みになっています。その再計算によってマクロの処理が遅くなります。

  • 解決方法
    ワークシート関数を一時的に「手動計算」に設定して自動計算を止める

プロシージャの最初と最後に以下のコードを加えてください。
たった2行のコードですが、マクロ実行時にワークシート関数の再計算がなくなり、問題は解決します。

Sub test1()
' ワークシート関数を手動計算に設定
    Application.Calculation = xlCalculationManua

' ・・・処理・・・

' ワークシート関数を自動計算に設定
    Application.Calculation = xlCalculationAutomatic
End Sub

原因2:画面表示の更新

マクロを実行すると、マクロの処理過程が画面上にリアルタイムで表示されます。この時の画面表示の更新で処理が遅くなります。

  • 解決方法
    画面表示の更新を一時的に停止する

プロシージャの最初と最後に以下のコードを加えてください。 こちらも2行のコードですが、マクロ実行時に画面表示の更新がなくなり、問題が解決します。

Sub test2()
' 画面表示の更新を無効に設定
Application.ScreenUpdating = False

' ・・・処理・・・

' 画面表示の更新を有効に設定
Application.ScreenUpdating = True
End Sub

原因3:セルの選択回数

Excel VBAでは基本的にブック・シート・セルの値やプロパティを使って操作を行います。そのときに、セルの選択回数が多いと処理に時間がかかります。

  • 解決方法 セルの選択回数を減らす

少し長くなりますが、どうすればセルの選択回数を減らすことができるのかを説明します。

たとえば以下のコードをてください。 これは「シート1のセルA1からセルJ10の中身を、シート2へ転記する」というコードです。

Sub test3()

    Dim i As Long
    Dim j As Long
   
    For i = 1 To 10
        For j = 1 To 10
            Sheet1.Cells(i, j) = Sheet2.Cells(i, j)
        Next j
    Next i

End Sub

このコードでは、Sheet1の「セルA10からセルJ10」までの範囲を、ループを使ってSheet2へ転記します。セルの選択は「シート1のセルの参照」と「シート2への転記」のときに行われるので、合計200回セルを選択します。

200回くらいであれば処理速度に大きな影響はありません。しかし、10列×10000行といった表で同じ操作を行うとどうでしょうか。200000回もセルの参照を行うので、処理速度に影響が出てきます。

セルの選択回数を減らしたい場合はどうしたらいいのでしょうか。

たとえばこんなコードではどうでしょうか。

Sub test4()

    Sheet1.Range("A1:J10000").Copy Sheet2.Range("A1")

End Sub

このコードであればセルの選択回数は2回で済みます。よって、処理の時間も短いです。

しかし、実際にExcel VBAを使う現場では、もっといろんな処理を自動化したいです。 そして、「セルの値を使って計算をしたい」「条件に一致した情報だけを抽出したい」などの処理をするときは、セルの値を参照して処理をしなければいけません。

そこで、配列の出番です!

配列を使うことによって、セルの選択回数を減らすことが可能です。 「セルの値を使って計算をしたい」「条件に一致した情報だけを抽出したい」といった処理もできます。

しかし、配列を使うには1つ大きな問題があります。それは、「Excel VBAの配列は制約が多い」ということです。正直、配列の作法を覚えるのが大変です。

配列を覚える労力は報われるのか・・・。それは、次回説明します。

VBA 戻り値の有無の処理の違いについて(引数ありSubプロシージャとFunctionプロシージャで比較)

はじめに

戻り値があることで、どんな利点があるのかを調べてみました。
VBAの場合を例に、「引数ありSubプロシージャ」と「Functionプロシージャ」で比較したいと思います。
※あくまでこの記事は、「戻り値の有無の比較」がメインとなります。

◆目次◆

登場する用語

  • 引数
    関数に代入する値

  • 戻り値
    関数の処理結果

なお、戻り値ありのプロシージャは以下のように記述します。

Function Functionプロシージャ名(引数名 As データ型) As 戻り値のデータ型

    Functionプロシージャ名 = 戻り値

End Function

戻り値の有無の処理の違いについて

  • 戻り値がある場合
    「同じ処理をしたいが、場所によって異なる引数を値に代入したい」
    というマクロを作成できます。

  • 戻り値がない場合
    引数が異なる場合は、同じ処理でもその都度処理を明記する必要があります。

なお、戻り値の有無は、VBAの場合、プロシージャの種類によって決まります。

プロシージャの種類

  • Subプロシージャ
    戻り値なしの処理を行うプロシージャ

  • Functionプロシージャ
    戻り値ありの処理を行うプロシージャ

なお、「引数なしFunctionプロシージャ」や「戻り値なしFunctionプロシージャ」も作成可能ですが、今回は省略します。

以降は「Functionプロシージャ」=「引数あり戻り値ありFunctionプロシージャ」と読みかえてください。

引数ありSubプロシージャとFunctionプロシージャの比較

では、戻り値の有無でどのような違いがあるのか見ていきたいと思います。

比較のため、例として
「「セルA1」、「セルB2」、「セルC3」に、変数xと変数yを足した値を表示する」
というマクロを、以下のプロシージャ使って作成します。

  • 引数なしSubプロシージャ
  • 引数ありSubプロシージャ
  • Functionプロシージャ

引数なしSubプロシージャ

このプロシージャだけで処理を行います。
(上から順番に処理をするのみ)

' 引数なしSubプロシージャ
Sub sub_add1()

    Dim x As Long
    Dim y As Long
    
    x = 5
    y = 10
    
    Range("A1").Value = x + y
    Range("B2").Value = x + y
    Range("C3").Value = x + y

End Sub

引数ありSubプロシージャ

引数ありのプロシージャを使用するときは、セットで呼び出し用のプロシージャが必要です。
引数ありSubプロシージャで処理を行い、呼び出し用のプロシージャで引数の値を設定します。

なお、Subプロシージャを呼び出すときは、Callステートメントを使用します。

書き方は、「Call」を明記する方法と、「Call」を明記しない方法があります。
個人的には、「Call」を明記した方が「Subプロシージャを呼び出している」ということがわかりやすい(可読性が高い)ため、「Call」を明記した方が良いと思います。

' 引数ありSubプロシージャの呼び出し(「Call」を明記した場合)

Sub sub_add2_1()
    
   Call sub_add2_3(5, 10)

End Sub
' 引数ありSubプロシージャの呼び出し(「Call」を明記しない場合)
Sub sub_add2_2()
    
    sub_add2_3 5, 10
  
End Sub
' 引数ありSubプロシージャ
Sub sub_add2_3(x As Long, y As Long)
    
    Range("A1").Value = x + y
    Range("B2").Value = x + y
    Range("C3").Value = x + y

End Sub

Functionプロシージャ

Functionプロシージャを使用するときは、セットで呼び出し用のプロシージャが必要です。
Functionプロシージャで処理を行い戻り値を返し、呼び出し用のプロシージャで戻り値の処理と、引数の値を設定します。

なお、引数ありFunctionプロシージャを呼び出すときは、Callステートメントを使用しません。
(引数なしFunctionプロシージャの呼び出すときは、Callステートメントを使用します)

' 引数ありFunctionプロシージャの呼び出し
Sub func_add1_1()
    
  Range("A1").Value = func_add1_2(5, 10)
  Range("B2").Value = func_add1_2(5, 10)
  Range("C3").Value = func_add1_2(5, 10)

End Sub
' 引数ありFunctionプロシージャ
Function func_add1_2(x As Long, y As Long) As Long

    func_add1_2 = x + y

End Function

Functionプロシージャの使いどころ

複数の箇所で、異なる引数を代入して、同じ処理(計算など)を行いたい ときに便利です。

たとえば、上記のFunctionプロシージャのコードを例にすると 「セルA1」、「セルB2」、「セルC3」で引数を変えたいときは以下のように修正すれば良いので、保守性が高いと言えます。

' 引数ありFunctionプロシージャの呼び出し
Sub func_add1_1()
    
  Range("A1").Value = func_add1_2(5, 10)
  Range("B2").Value = func_add1_2(6, 10)
  Range("C3").Value = func_add1_2(7, 10)

End Sub
' 引数ありFunctionプロシージャ
Function func_add1_2(x As Long, y As Long) As Long

    func_add1_2 = x + y

End Function

戻り値があることの利点

繰り返しになりますが、戻り値があると 複数の箇所で、異なる引数を代入して、同じ処理(計算など)を行うことができます
逆に、戻り値がない場合は、その都度処理を明記しなければならないため、保守性と可読性が低くなります。

完成したマクロでも時間がたてば補修が必要になることは多々あります。
保守性と可読性が高いマクロを最初から作成しておけば、マクロの補修も楽です。

Functionプロシージャをうまく活用できれば、保守性と可読性が高いマクロを作成することができるので、使わない手はないですね。

【Python学習中】 文字列3(フォーマット済み文字列とraw文字列)

前回に引き続き、文字列の表示方法について学習してきます。

今回は、文字列と数値を一緒に出力できる書式方法「フォーマット済み文字列」と
フォルダパスを出力するときに便利な書式方法「raw文字列」について書いていきます。

◆目次◆

フォーマット済み文字列

前回の記事で「型が異なる変数を連結することはできません。」と記載しましたが
「フォーマット済み文字列」 という書式方法を使うと、型が異なる変数を使っても連結が可能になります。

フォーマット済み文字列の書き方は、文字列リテラルの前に「f」と書いて、変数や式をを{}で囲みます。

month = 6
print(f'今日は{month}月です。' )
# 出力結果
# 今日は6月です。

これで文字列と数値を一緒に出力できるようになりました。

raw文字列

たとえばフォルダパスを出力したい場合、今までの方法だと、バックスラッシュを出力したいときは以下のように「\\」と入力する必要がありました。

print('C:\\Users\\ユーザー名\\Desktop')
# 出力結果
# C:\Users\ユーザー名\Desktop

しかし、この方法だとフォルダパスが長い場合は正直面倒です。
そんなときは、「raw文字列」を使うと、そのままフォルダパスをコピーして貼り付けるだけで、正しいパスが出力できます。

raw文字列の書き方は、文字列リテラル(今回の場合はフォルダパス)の前に「r」と書くだけです。

print(r'C:\Users\ユーザー名\Desktop')
# 出力結果
# C:\Users\ユーザー名\Desktop

これで長いパスでも簡単に正しく出力することができました。


基本的な文字列の出力についての学習は、以上とします。
他にも、組み込み関数を使って、文字列のことを調べたり、操作することは可能ですが
それは今後、リストについて学習する際に一緒に紹介したいと思います。

最後に、実際にメッセージボックスにフォーマット済み文字列とraw文字列を使って、文字列の表示をしてみたいと思います。

メッセージボックスに文字列を表示させる

メッセージボックスを表示させるにあたり、今回はtkinterモジュールを使います。
tkinterとは、Pythonに標準搭載されているGUIアプリケーションモジュールです。

tkinterの様々な使い方については、別の機会で学習したいと思います。
(あくまで、今回はメッセージボックスを使うのみです)

例 「6月17日」というタイトルのメッセージボックスにフォルダパスを表示させる

#tkinterモジュールをインポートしてtkとする 
import tkinter as tk

# tkと書かれた小窓を非表示にする
root = tk.Tk()
root.withdraw()

# 変数に月、日、フォルダパスを格納する
month = 6
day = 17
folder_path = r'C:\Users\ユーザー名\Desktop\work\2106'

# メッセージボックスに変数を含んだ文字列を表示させる
messagebox.showinfo(f'{month}月{day }日', f'フォルダ「{folder_path}」に\n入っているファイルを更新してください')

出力結果
f:id:lbibouroku:20210619231414p:plain

フォーマット済み文字列とraw文字列を使って正しくメッセージボックスに表示できました。


以上で文字列の学習を(一旦)完了とします。

【Python学習中】 文字列1(概要とスライス) - Kの備忘録(仮)
【Python学習中】 文字列2(文字列の連結とエスケープシーケンス) - Kの備忘録(仮)