0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ワンランク上のVBAを書いてみた

Last updated at Posted at 2024-07-26

どうも。
葬送のフリーエンです。

皆さんは、VBAをご存じだろうか?

Excelに標準でついてくる言語のひとつで、マクロとも呼ばれていたりする言語です。

VBAのいいところは開発環境の構築が、ExcelやWordなどのOffice製品のみで完結するため、
Office製品がインストールされている環境(PC)であれば、ほぼ使える。
VBAの歴史は長く、古来より情報は公開され、いろいろなコードもまた生成されてきたコンニチ。
そんな無駄遣いにされたコードたちを送る...

それでは、本題に入ります。
まず、はじめにExcelの真骨頂は、データベースを扱いやすく設計されていることでしょう。
方眼紙の線がそれを物語っています。
このVBA関数TableDataFormatは、指定されたExcelのテーブルからデータを配列に変換して返す役割を持っています。
入力パラメータとしてselectedTableを受け取り、これは操作対象のワークシートとテーブル名に使用されます。この関数はString型の2次元配列を返します。

コードの動作

この関数はselectedTableを引数として受け取ります。
対象のワークシート(ws)とテーブル(tbl)を特定します。
テーブルの行数と列数に基づき、items配列のサイズを再定義します。
二重ループを使用して、テーブルの全てのデータを読み取り、items配列に格納します。
完成した配列を関数の出力として返します。

Module1
Function TableDataFormat(selectedTable As String) As String()
    Dim items() As String
    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim i As Long, j As Long

    On Error GoTo ErrorHandler
    Set ws = ThisWorkbook.Sheets(selectedTable)
    Set tbl = ws.ListObjects(selectedTable)
    If tbl Is Nothing Then Err.Raise Number:=vbObjectError + 513, Description:="Table not found."

    ReDim items(0 To tbl.ListRows.Count - 1, 0 To tbl.ListColumns.Count - 1)
    For i = 0 To tbl.ListRows.Count - 1
        For j = 0 To tbl.ListColumns.Count - 1
            items(i, j) = tbl.DataBodyRange.Cells(i + 1, j + 1).Value
        Next j
    Next i
    TableDataFormat = items
    Exit Function

ErrorHandler:
    TableDataFormat = Nothing
    MsgBox "Error: " & Err.Description
End Function

使用方法: TableDataFormat関数

TableDataFormat関数は、引数としてExcelのテーブル名を受け取ります。このテーブル名は、ワークシート上で定義されたテーブルの名前である必要があります。


ExcelにSalesDataという名前のテーブルがある場合、次のように関数を呼び出すことができます。

VBAエディター内で新しいサブルーチンを作成するか、即時ウィンドウを使用します。
次のコードを実行して関数をテストします。

Sub TestTableDataFormat()
    Dim output As Variant
    output = TableDataFormat("SalesData")
    
    ' 出力結果をデバッグウィンドウに表示
    Dim i As Long, j As Long
    For i = LBound(output, 1) To UBound(output, 1)
        For j = LBound(output, 2) To UBound(output, 2)
            Debug.Print output(i, j)
        Next j
    Next i
End Sub


0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?