【エクセルVBA】指定した点を通過する任意長さの波形データを生成する方法

こんにちは、ヒガシです。

 

今回はエクセルVBAを使って、以下の画像のように指定した大きさを通過する任意の長さの1次元データを作成する方法をご紹介していきがいようず

任意形状の波形データを生成するという概要図

 

通過する点のデータ数や、総データ数は自由に変更可能です。

 

任意の波形データを作成したいときなどに是非ご活用ください。

 

それではさっそくやっていきましょう!

 

スポンサーリンク

VBAの実行環境を整えておく

今回はVBAを使って作業していきますので、まずはVBAの実行環境を整えておきましょう。

以下の記事にそのやり方を詳細解説しています。

エクセルマクロ(VBA)の始め方!初心者向けに画像を使って詳細解説

 

すでに環境構築済みの方は次に進みましょう。

 

スポンサーリンク

エクセルシートに情報を記入する

次に波形データの元となるデータを入力していきます。

私の場合はこんな感じで記入していきました。

2行目に書いてあるdataが、作成する波形データが通過する点になります。

また、C3セルに書いてある数値が波形データの総データ数になります。

データを入力するエクセルシートの例

この指定する場所に応じて後で紹介するプログラムは書き換える必要がありますのでご注意ください。

 

今回の場合はdataが開始する行(2行目)、開始する列(3列目)を表すstart_row とstart_col をそれぞれ

start_row = 2

start_col = 3

と設定する必要があります。

 

また、データの総数は

num_data_total = Range(“C3”)

という形で、書いてあるセル名を指定してあげる必要があります。

 

もしプログラムを書き換えるのが面倒であれば私と全く同じ場所にこれらの情報を記入するようにしてください。

 

スポンサーリンク

任意波形を生成するサンプルコード

それでは本題である任意の波形データを作成するサンプルコードをご紹介します。

Sub make_1d_date()
    Dim i As Integer
    Dim ind As Integer
    Dim start_col As Integer
    Dim start_row As Integer
    '最初に設定する項目3つ
    start_row = 2 'dataが開始する行
    start_col = 3 'dataが開始する列
    num_data_total = Range("C3") '総データ数を指定するセル
    Range(Cells(start_row + 2, start_col), Cells(start_row + 3, start_col + 10000)).ClearContents
    Cells(start_row + 2, start_col - 1) = "Index"
    Cells(start_row + 3, start_col - 1) = "Data"
    Cells(start_row + 2, start_col) = 0
    Cells(start_row + 3, start_col) = Cells(start_row, start_col)
    num_input_data = WorksheetFunction.CountA(Range(Cells(start_row, start_col), Cells(start_row, 2000)))
    num_data = num_data_total + num_data_total \ num_input_data
    ind = 1
    old_y = Cells(start_row, start_col)
    For i = 0 To num_data_total - 1
        a = (Cells(start_row, ind + start_col) - Cells(start_row, ind + start_col - 1)) / (num_data_total / (num_input_data - 1))
        b = old_y - (i * a)
        y = a * (i + 1) + b
        If a > 0 And y >= Cells(start_row, ind + start_col) Then
            ind = ind + 1
        ElseIf a < 0 And y <= Cells(start_row, ind + start_col) Then
            ind = ind + 1
        End If
        ind = WorksheetFunction.Min((num_data_total) - 1, ind)
        Cells(start_row + 2, start_col + i + 1) = i + 1
        Cells(start_row + 3, start_col + i + 1) = y
        old_y = y
    Next
End Sub

 

こいつを実行すると入力データの下に生成された波形データが出力されます。

適宜グラフ化するなりして狙いのデータができているか確認してみましょう。

 

なお、このプログラムは元あったデータは強制的に削除されますので実行まえに必要なデータがシート上に残っていないかよく確認してから実行するようにしましょう。

 

スポンサーリンク

サンプルコードの実行結果確認

それでは設定を変更しながら実行してみましょう。

 

まずは適当にこんな感じ。

サンプルコードの実行結果1

問題なく実行できてますね。

 

つぎはこの状態からデータ点数だけを増やしてみましょう。

サンプルコードの実行結果2

プロット間隔が小さくなり、データ点数が増えたのがわかると思います。

 

次は通過するデータの数を増やしてみましょう。

サンプルコードの実行結果3

線が折れる回数が一回増えたのがわかると思います。

こちらも問題なく実行できていますね。

 

最後に一点注意点です。

以下のように総データ数があまりにも小さいとすべてのデータを通過しきることができません。4番目くらいのデータで終わってますね。

サンプルコードの実行時の注意点

 

また、上記のグラフを見てわかる通り、この手法はあくまでも区間を均等に分割して線形補間しながら進んでいっているだけなので、必ずしも指定した点に到達した瞬間に次の点を目指して進むわけではありません。

上記のグラフは指定は60なのに80以上に飛び出してしまっていることがわかると思います。

 

こういった現象を避けたいのであればなるべくデータ点数を多くとることをオススメします。

 

スポンサーリンク

おわりに

ということで今回は任意の点を通過する指定長さの波形データを作成する方法をご紹介しました。

 

私のブログではこのように様々なスキルを多数紹介しています。

 

是非他の記事も見ていっていただけると嬉しいです。

 

それではまた!!

コメント

タイトルとURLをコピーしました