2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

スピルのすすめ(ユーザー定義関数との組み合わせ

Last updated at Posted at 2021-10-27

##前書き

Excel2020くらいからの新機能のスピルですが、まだまだ知名度は低いです。
しかしながらユーザー定義関数と組み合わせることで今までと少し違ったユニークな機能を実現できそうです。
二つの具体例で説明を進めます。

##例① ~Summaryの出力~
エクセル上の特定のデータを処理して複数の値をまとめて出力する。
同時にラベリングも可能。
image.png

Public Function 統計値出力(ByRef argRange As Range) As Variant
    Dim i As Long, j As Long
    
    Dim average As Double, sigma As Double, max As Double, min As Double
    
    average = Application.WorksheetFunction.average(argRange)
    sigma = Application.WorksheetFunction.StDev(argRange)
    max = Application.WorksheetFunction.max(argRange)
    min = Application.WorksheetFunction.min(argRange)
    
    Dim label As Variant, value As Variant
    
    label = Array("平均", "標準偏差", "最大値", "最小値")
    value = Array(average, sigma, max, min)
    
    Dim myReturn As Variant
    ReDim myReturn(0 To 1, 0 To UBound(value))
    
    For i = 0 To UBound(label)
        myReturn(0, i) = label(i)
        myReturn(1, i) = value(i)
    Next i
    
    統計値出力 = myReturn
End Function

スピルとは新しくエクセルに導入されたいくつかの関数が持っている機能です。
スクリーンショットのrandarray()のようにスピルによって結果を複数セルに展開することが可能になっています。

これはユーザー定義関数でも同様です。(ユーザー定義関数とはプログラミングによって関数を作れる機能です。ここでは詳しくは説明しません。)
新しく作成した「統計値出力」関数で簡単にサマリを作成できます。

##例② ~データを間引く~
データを間引く関数を作成します。
引数を変えることで3行スキップの4行ごとのデータ出力、
50行スキップの51行ごとの出力を得ることが出来ます。

image.png

Public Function データを間引く関数( _
        ByRef argRange As Range, _
        Optional ByVal skipRow As Long = 0, _
        Optional ByVal skipColumn As Long = 0 _
    ) As Variant
    
    Dim i As Long, j As Long
    
    Dim argRow As Long, argColumn As Long
    argRow = argRange.Rows.Count
    argColumn = argRange.Columns.Count
    
    'アルゴリズムの都合上 newRow := 新しい行数から1引いた数になっていたり少しわかりずらい。
    Dim newRow As Long, newColumn As Long
    newRow = (argRow - 1) \ (skipRow + 1)
    newColumn = (argColumn - 1) \ (skipColumn + 1)
    
    Dim myReturn As Variant
    ReDim myReturn(0 To newRow, 0 To newColumn)
    'ここもアルゴリズム優先
    '行数・列数の時は1 to RowNumberにしたほうが5行3列目のデータがmyReturn(5,3)に入りわかりやすい。
    '関数経由でエクセルから得たargRangeも(1 to 列数,1 to 行数)となっており統一感がでる
    
    Dim row As Long, column As Long
    For row = 0 To newRow
        For column = 0 To newColumn
            myReturn(row, column) = argRange(row * (skipRow + 1) + 1, column * (skipColumn + 1) + 1)
        Next column
    Next row
    
    データを間引く関数 = myReturn
    
End Function

###おわりに
いかがだったでしょうか?(一度言ってみたかった)
スピル×ユーザー定義関数のメリットとしては以下の2点を挙げることができると思います。

  • リッチな出力を簡易に実現できる。
  • 引数による動作の制御可能

複数人で使いまわすことがなかなか難く一人分の削減できる時間>作成コストの見込みが強いため、自分は実際に活用するところまではいけていません。
しかしスピルと組み合わせた機能はユニークであり、レガシーが多く嫌われがちなExcelの長所を伸ばせる可能性を感じます。

引数を受け取り、処理をし、出力するといったフォーマットは今回の例で提示できていると思うので、何か面白い使い道を思いついたら作って見て下さい。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?