VBAの勉強を始めてみた

色々試しています。

選択範囲のアルファベットを小文字にする

For Each Nextでいろいろ作ってみた その2

選択範囲のアルファベットを小文字にするマクロです。

 

***************************************

Sub 選択範囲のアルファベットを小文字にする()
   
    Dim myRange As Range

    For Each myRange In Selection
        myRange.Value = StrConv(myRange.Value, vbLowerCase)
    Next myRange
   
End Sub

***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

選択範囲のアルファベットを大文字にする

さて、せっかくFor Each Next文を勉強したので、いろいろ作ってみたいと思います。

選択範囲のアルファベットを大文字に変換するマクロです。

 

***************************************

Sub 選択範囲のアルファベットを大文字にする()
   
    Dim myRange As Range

    For Each myRange In Selection
        myRange.Value = StrConv(myRange.Value, vbUpperCase)
    Next myRange
   
End Sub

***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

For Each Next文について

今回は、For Each Next文について勉強してみます。

実はこれ、自分の中であまり理解できていないステートメントです・・・。
For Each Nextとは何を繰り返すのか?


For Each オブジェクト変数 In コレクション

処理

Next


オブジェクト変数 In コレクションの行では、コレクションの要素のうちの一つが変数に格納される・・・具体的にいうとコレクションの要素がコレクション(1)~コレクション(9)まであったとすると、まずコレクション(1)が変数に格納されることになります。

次の行で処理を実行してから、Next(次の要素)に行きます。

再びオブジェクト変数 In コレクションで、次の要素のコレクション(2)が変数に格納され、次の行で処理を実行してNext・・・

これがコレクション(9)まで続く訳です。

 

では、そもそもコレクションとは何ぞや?

 

書籍によると、同じ種類のオブジェクトの集まりをコレクションと言うそうです。
Workbooks
Worksheets
複数のセル(Range("A1:C3")やSelection・・・等々、複数のセルを表現するものはたくさんある)
などです。

 

For Each オブジェクト変数 In Worksheets

 

であれば、オブジェクト変数への要素の格納がWorksheets(1)~Worksheets(n)まで順番に繰り返されることになります。

では複数セルの場合は、どのように繰り返されるのでしょうか?

前回、投稿した「選択範囲の金額を百万円単位にする」をFor Each Next文で作ってみたいと思います。


***************************************
Sub 選択範囲の金額を百万円単位にする()
   
    Dim myRange As Range

    For Each myRange In Selection
        If myRange.Value <> 0 And myRange.Value <> "" And _
        TypeName(myRange.Value) <> "String" And TypeName(myRange.Value) <> "Date" Then
        'セルの値が0,空白,文字列,日付のいづれかの場合は処理をしない
            myRange.Value = Application.RoundUp(myRange.Value / 1000000, 2)    '小数点第三位以下切り上げ
        End If
    Next myRange
   
End Sub
***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

 

これをステップインで順番に見ていきたいと思います。

まず、セル範囲を選択します。(コレクション=選択されている箇所の複数セル)

f:id:kouten0430:20170517144257j:plain

 

そしてステップインを途中まで進めます。

f:id:kouten0430:20170517144357j:plain

 

矢印のように、左上のセルから右へ1セルずつ処理されていきます。
そして右下のセルの処理が終わったら、For Each Nextを抜けます。(コレクションのすべての要素(この例ではセル)について繰り返しが終わった)

f:id:kouten0430:20170517152139j:plain

 

すなわち、Selection(1)※左上のセル ~ Selection(18)※右下のセル までの1つずつのセルが順番にオブジェクト変数に格納され、処理を実行し、繰り返しを終了したということです。

 

説明が下手くそですいません。


ところで、Eachってどういう意味なんでしょうか?ググってみたところ、
それぞれの、一つ一つの、めいめいの
って意味なんですね・・・腑に落ちました。

個人用マクロブックの削除

さて、前回、個人用マクロブックを作成した訳ですが・・・。個人用マクロブックとは何処に保存されてるんじゃい!

ということで調べてみます。

個人用マクロブックとは、実体はPERSONAL.xlsbというバイナリ形式で保存されたブックで

\Users\ユーザー名\AppData\Roaming\Microsoft\Excel\XLSTART(バージョンによって異なる場合あり)

に保存されています。

このExcel\XLSTARTというフォルダ・・・名前から推察するに、EXCELのスタートアップフォルダのようなもので、このフォルダにあるブックはEXCELの起動と同時に開かれるようになっています。

ためしに、test.xlsxなど適当なブックを入れてみると、EXCELの起動と同時に開かれることが確認できました・・・はい。

ということで、個人用マクロブックを削除するにはXLSTARTフォルダにあるPERSONAL.xlsbを削除すればいいということになります。

個人用マクロブックの作成

マクロは通常、ブックごとに保存されます。・・・ですが、複数のブックで共通して使用するマクロは「個人用マクロブック」に保存しておくと便利です。

この個人用マクロブックの作成方法ですが・・・

 

1.開発タブの「マクロの記録」ボタンを押してマクロの記録を開始する
2.確認ダイアログでマクロの保存先を「個人用マクロブック」にする→OK
3.記録を終了する
4.EXCELを終了する際に、個人用マクロブックの変更を保存しますか?と聞かれるので、保存を選択

 

これで、個人用マクロブックが作成されます。(何も操作をせずに記録を終了すれば、中身の無い空の個人用マクロブックが作成されます)

さて・・・これで次回からEXCELを起動すると、常に個人用マクロブックが(非表示で)立ち上がり、マクロが共通で使用できるわけです。

VBEを開いてプロジェクトエクスプローラーを見てみましょう。

f:id:kouten0430:20170514142742j:plain

VBAProject(Book1)とは別にVBAProject(PERSONAL)が増えていることがわかります。これはBook1とPERSONALという名前のブックを現在開いていることを意味しています。

EXCELに戻って、表示タブの→再表示を押すと一覧にPERSONAL.xlsbが表示されるので・・・非表示でこっそり起動していることが確認できると思います。

選択範囲の金額を百万円単位に変換する

前回のコードをちょっといじっただけです。
タイトルのとおり選択範囲の金額を百万円単位に変換します。”金額”と表現しましたが単純に選択範囲の数値を1,000,000で割るだけです。
前回と同じく「セルの値が0,空白,文字列,日付のいずれかの場合は処理をしない」という条件判断を追加しました。
選択範囲に文字列などが含まれているとエラーになってしまうからです。
ちなみに1,000,000で割った後の数値は小数点第三位以下を切り上げします。

 

***************************************
Sub 選択範囲の金額を百万円単位にする()
   
    Dim i As Long
    Dim j As Long

    For i = Selection.Row To Selection.Rows(Selection.Rows.Count).Row
        For j = Selection.Column To Selection.Columns(Selection.Columns.Count).Column
            If Cells(i, j).Value <> 0 And Cells(i, j).Value <> "" And _
            TypeName(Cells(i, j).Value) <> "String" And TypeName(Cells(i, j).Value) <> "Date" Then
            'セルの値が0,空白,文字列,日付のいづれかの場合は処理をしない
                Cells(i, j).Value = Application.RoundUp(Cells(i, j).Value / 1000000, 2)    '小数点第三位以下切り上げ
            End If
        Next j
    Next i
   
End Sub

***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

 

選択範囲の金額を千円単位に変換する

というわけで、今日もVBAの勉強がてらマクロを作ってみます。
タイトルのとおり選択範囲の金額を千円単位に変換します。”金額”と表現しましたが単純に選択範囲の数値を1,000で割って小数点以下を切り上げるだけです。
「形式を選択して貼り付け→除算」でもできますが・・・VBAの勉強のために、あえてやります!(´ 3`)
さすがにこれだけでは面白くないので「セルの値が0,空白,文字列,日付のいずれかの場合は処理をしない」という条件判断を追加しました。
選択範囲に文字列などが含まれているとエラーになってしまうからです。
ちなみに1,000で割った後の小数点以下は切り上げします。

 

***************************************
Sub 選択範囲の金額を千円単位にする()
   
    Dim i As Long
    Dim j As Long

    For i = Selection.Row To Selection.Rows(Selection.Rows.Count).Row
        For j = Selection.Column To Selection.Columns(Selection.Columns.Count).Column
            If Cells(i, j).Value <> 0 And Cells(i, j).Value <> "" And _
            TypeName(Cells(i, j).Value) <> "String" And TypeName(Cells(i, j).Value) <> "Date" Then
            'セルの値が0,空白,文字列,日付のいづれかの場合は処理をしない
                Cells(i, j).Value = Application.RoundUp(Cells(i, j).Value / 1000, 0)    '小数点以下は切り上げ
            End If
        Next j
    Next i
   
End Sub

***************************************

 ※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。


( ̄q ̄;)