VBA(マクロ)の知って得ワザ vol. 2

VBA(マクロ)を使ってデータの中から必要の値をみつける

トルクと回転数、温度と重量など設備が連続して測定したデータの中から必要な値をみつけるVBA(マクロ)についての得ワザです


今回は測定したデータの中で一番高い温度を探し、その時の重量を求めるExcel VBA(マクロ)を VLookupとFindの2つの方法で説明します

本ページにはプロモーションが含まれています

サンプルデータ

今回は下記のようなデータから最高温度と最高温度時の重量をみつけます

本来ならデータは数百~数万行になりますが、表示しきれないので温度と重量が各5点のデータにしました

目的の値をみつけるコード

例文1

Sub Test1


Dim myMax as Double

Dim myAns1 as Double

Dim myScope as Range


Set myScope = Range("A2:A6")

myMax = Application. _

WorksheetFunction.Max(myScope)

MsgBox "Test1の最高温度は" & myMax & "℃です"


Set myScope = myScope.Resize _

(, myScope.Columns.Count + 1)

myAns1 = Application.WorksheetFunction. _

VLookup(myMax, myScope, 2, False)

MsgBox "VLookupで求める重量は" & myAns1 & "gです"


End Sub


解説1

  • 1行目:最高温度を入れる変数をmyMaxにします
  • 変数の型に「Double」を使う理由は「VBA(マクロ)の知って得ワザ vol.3」で説明しているので、そちらをご覧ください


  • 2行目:最高温度時の重量を入れる変数をmyAns1にします

  • 3行目:検索範囲を入れる変数をmyScopeにします

  • 4行目:myScopeの範囲をA列2行目からA列6行目にします

  • 5行目:検索範囲の最大値をmyMaxに入れます

  • 6行目:メッセージBoxで最高温度(myMax)を確認します

  • 7行目:myScopeの範囲をA列2行目からB列6行目にします

  • 8行目:myAns1をA列から探した最大値の右横の値にします
  • VLookupは戻り値が値(セルの中身)である為、そのまま扱えます


  • 9行目:メッセージBoxで最高温度時の重量(myAns1)を確認します


例文2

Sub Test2


Dim myMax As Double

Dim myAns2 As Double

Dim myScope As Range


Set myScope = Range("A2:A6")

myMax = Application. _

WorksheetFunction.Max(myScope)

MsgBox "Test2の最高温度は" & myMax & "℃です"


myAns2 = _

myScope.Find(myMax).Offset(0,1).Value

MsgBox "Findで求める重量は" & myAns2 & "gです"


End Sub


解説2

  • 1行目~3行目:一部変数名が変わるだけで、解説1と同じです

  • 4行目~6行目:解説1と同じです

  • 7行目:Findで見つけた最大値のセルの右横の値をmyAns2に入れます
  • Findの場合、戻り値がセルそのもの つまりRange("A4")になる為、セルとして扱う必要があります


  • 8行目:メッセージBoxで最高温度時の重量(myAns2)を確認します

まとめ

VLookupでもFindでも結果は同じになりますが、Findの方がコードが1行減り、尚且つ可読性も良くなっています


プログラムのコードを書くときに重要なのは、「少ないコード(行数)でプログラムを作成する」事なので、その点からはFindを使った方に利点があると思います


また可読性が良いとプログラムエラーを探しやすくなるので、この点からもFindに利点があると思います


後は処理速度ですが、こちらはデータ数に依存するので 両方比較して同程度ならFindでコーディングすることをおススメします


★VBA(マクロ)にも色々な書き方があるんですね~!★

コメント