選択範囲のアルファベットを小文字にする
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までをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。
これをステップインで順番に見ていきたいと思います。
まず、セル範囲を選択します。(コレクション=選択されている箇所の複数セル)
そしてステップインを途中まで進めます。
矢印のように、左上のセルから右へ1セルずつ処理されていきます。
そして右下のセルの処理が終わったら、For Each Nextを抜けます。(コレクションのすべての要素(この例ではセル)について繰り返しが終わった)
すなわち、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を開いてプロジェクトエクスプローラーを見てみましょう。
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 ̄;)