
VB .NETで Excel ファイルを配列に読み込む: IronXLと Microsoft Interop
.NETでExcelデータを配列に読み込むには、ワークブックを読み込み、ワークシートを選択し、行と列を繰り返し処理して、各セル値を2次元配列に格納する必要があります。 IronXLを使用すると、Microsoft Officeをインストールせずに数行でこれを達成できます。NuGetパッケージをインストールし、Rowsコレクションをループして配列を埋めます。
無料トライアルを開始して、 IronXLがVisual StudioプロジェクトにおけるExcelの自動化をどのように簡素化するかを体験してください。
これらのソリューションをひと目で比較するとどう違うのか?
| 特徴 | IronXL | Microsoft Office Interop |
|---|---|---|
| オフィスへのインストールが必要です | なし | はい |
| NuGetインストール | はい、1つのパッケージです | いいえ -- COM参照 |
| サーバー/CI環境のサポート | はい | 制限あり |
| COMオブジェクトのライフサイクル管理 | 不要 | 必須 |
| 対応フォーマット | XLSX、XLS、CSV、TSV、JSON | XLSX、XLS(Excelのみ) |
| 型安全なAPI | はい | 一部 - 遅れて到着するCOM |
| Linux / macOS のサポート | はい(.NET 6以降) | なし |
| 例外処理スタイル | 標準 for .NET例外 | COM例外処理と手動クリーンアップ |
VB .NETプロジェクトにIronXLをインストールするにはどうすればよいですか?
IronXLを任意 for .NETプロジェクトに追加する最も簡単な方法は、 NuGetパッケージマネージャーを使用することです。 Visual StudioでPackage Manager Consoleを開き、実行してください:
または、 .NET CLI を使用してください。
インストール後、あなたのVB.NETモジュールの先頭にImports IronXLを追加してください。 Officeのインストールは不要です。IronXLは独自の解析エンジンを通してExcelファイルの読み書きをすべて行います。
古いフレームワークを対象とするプロジェクトや、特定のバージョンへの固定が必要なプロジェクトの場合、 IronXLのNuGetページには公開されているすべてのリリースが掲載されています。 IronXLのドキュメントには、Visual Studio 2019、2022、および.NET CLIのインストールガイドが記載されています。
IronXLを使用してExcelデータを配列に読み込むには、開発者はどのようにすればよいですか?
IronXLは、ローカルにOfficeをインストールすることなく、ワークブックを開いたり、範囲を選択したり、セル値を反復処理したりするための、使いやすいAPIを提供します。 WorkBookオブジェクトを返します。
Imports IronXL
Module ReadExcelToArray
Sub Main()
' Load the Excel workbook from a file path
Dim workbook As WorkBook = WorkBook.Load("SalesData.xlsx")
' Access the first worksheet in the workbook
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Define the cell range to extract
Dim dataRange As IronXL.Range = sheet.GetRange("A1:D5")
' Determine array dimensions from the range
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim salesArray(rowCount - 1, colCount - 1) As String
' Populate the two-dimensional array from cell values
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
salesArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
' Print each row to the console
Console.WriteLine("Data loaded into array:")
For i As Integer = 0 To rowCount - 1
For j As Integer = 0 To colCount - 1
Console.Write(salesArray(i, j) & vbTab)
Next
Console.WriteLine()
Next
End Sub
End ModuleImports IronXL
Module ReadExcelToArray
Sub Main()
' Load the Excel workbook from a file path
Dim workbook As WorkBook = WorkBook.Load("SalesData.xlsx")
' Access the first worksheet in the workbook
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Define the cell range to extract
Dim dataRange As IronXL.Range = sheet.GetRange("A1:D5")
' Determine array dimensions from the range
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim salesArray(rowCount - 1, colCount - 1) As String
' Populate the two-dimensional array from cell values
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
salesArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
' Print each row to the console
Console.WriteLine("Data loaded into array:")
For i As Integer = 0 To rowCount - 1
For j As Integer = 0 To colCount - 1
Console.Write(salesArray(i, j) & vbTab)
Next
Console.WriteLine()
Next
End Sub
End Moduleワークブックオブジェクトとワークシートオブジェクトの理解
WorkBook.LoadはXLSX、XLS、CSV、およびTSVファイルをサポートします。 読み込み後、workbook.DefaultWorkSheetは最初のシートを返します。 workbook.WorkSheets(0)でインデックスでシートにアクセスすることもできます。
Columnsコレクションを公開します。 各cell.StringValueは基になるセルのタイプに関係なく表示文字列を返します。
セルに入力された値はどのように処理しますか?
IronXLのセルはStringValueとともに型付きプロパティを公開します。
cell.IntValue-- セルを整数として解析しますcell.DoubleValue-- セルをダブルとして解析しますcell.DateTimeValue-- 日付形式のセルを解析しますcell.IsFormula-- セルが式を含むかどうかを示します
金融データの場合、配列をcell.DoubleValueを直接割り当ててください。 これにより、後続の処理における文字列から数値への変換が回避されます。
Imports IronXL
Module ReadExcelToDoubleArray
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("Revenue.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
Dim dataRange As IronXL.Range = sheet.GetRange("B2:E10")
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim revenueArray(rowCount - 1, colCount - 1) As Double
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
revenueArray(rowIndex, colIndex) = cell.DoubleValue
colIndex += 1
Next
rowIndex += 1
Next
' Calculate column totals
For j As Integer = 0 To colCount - 1
Dim total As Double = 0
For i As Integer = 0 To rowCount - 1
total += revenueArray(i, j)
Next
Console.WriteLine($"Column {j + 1} total: {total:C}")
Next
End Sub
End ModuleIRON VB CONVERTER ERROR developers@ironsoftware.com出力

このコード例は、IronXLの直感的なAPIを示しています。 RangeオブジェクトはExcelスプレッドシート内の特定のセル領域へのアクセスを提供します。 従来のVBAマクロとは異なり、この方法は完全に型安全であり、 .NETエコシステムに統合されています。
従来のMicrosoft Officeの相互運用性に関するアプローチとは?
Microsoft Office Interopは、COMオートメーションを利用してExcelアプリケーションインスタンスに接続します。 Visual Studioでこれを設定するには、プロジェクトメニューに移動し、"参照の追加"を選択して、COMタブでMicrosoft Excelオブジェクトライブラリを検索します。 コードを実行するすべてのマシンに、ローカルのExcelがインストールされている必要があります。
Imports Microsoft.Office.Interop.Excel
Module InteropExcelArray
Sub Main()
Dim excelApp As New Application()
Dim workbooks As Workbooks = excelApp.Workbooks
Dim workbook As Workbook = なしthing
Dim sheet As Worksheet = なしthing
Try
' Suppress screen updates during processing
excelApp.ScreenUpdating = False
' Open the workbook by full file path
workbook = workbooks.Open("C:\Data\SalesData.xlsx")
' Reference the first worksheet
sheet = CType(workbook.Sheets(1), Worksheet)
' Define a range and pull values into an object array
Dim dataRange As Range = sheet.Range("A1", "D5")
Dim values(,) As Object = CType(dataRange.Value, Object(,))
' COM arrays are 1-based, so enumerate from index 1
Dim rows As Integer = values.GetUpperBound(0)
Dim columns As Integer = values.GetUpperBound(1)
For i As Integer = 1 To rows
Dim line As String = ""
For j As Integer = 1 To columns
line &= values(i, j).ToString() & vbTab
Next
Console.WriteLine(line)
Next
Catch ex As Exception
Console.WriteLine("Error: " & ex.Message)
Finally
' Release COM objects to prevent orphaned Excel processes
If sheet Isなしt なしthing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet)
End If
If workbook Isなしt なしthing Then
workbook.Close(False)
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook)
End If
excelApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp)
End Try
End Sub
End Module
COMオブジェクト管理が重要な理由とは?
相互運用アプローチでは、COMオブジェクトのライフサイクル管理に細心の注意を払う必要がある。 Excelアプリケーションが返すすべてのオブジェクト(ワークブック、ワークシート、範囲、セルなど)には、参照カウント付きのCOMポインターが含まれています。 これらのオブジェクトそれぞれにEXCEL.EXEプロセスが実行されたままになります。
サーバー上では、放置されたプロセスが時間とともに蓄積され、最終的には利用可能なメモリやファイルハンドルを使い果たしてしまう。 上記のTry...Finallyパターンは最小限の安全なアプローチですが、多くのエンタープライズコードベースはネストされたオブジェクトグラフを処理するために専用のCOMクリーンアップユーティリティを追加します。
Interop配列のインデックス付け規則は、標準のVB .NET配列とは異なります。COMベースの配列はインデックス0ではなく1から始まります。つまり、行または列のループでは、この1のずれを考慮する必要があり、これは実行時エラーやデータ切り捨てバグの一般的な原因となります。
どちらのソリューションがより優れた開発者体験を提供するか?
これらの手法を実運用で評価する際、 IronXLが最適なソリューションとなる要因はいくつかあります。
導入の簡便性: IronXLは単一のNuGetパッケージでインストールできますが、Interopは複雑な環境設定が必要です。 これは、ユーザーセッションが存在しないビルドサーバーまたはクラウド関数上で、プログラムがXLSXファイルを処理する必要がある場合に重要になります。
コードの保守性: IronXLを通してデータテーブルを読み込むことで、コードを短く読みやすく保つことができます。 行数と列数は、第一級プロパティとして利用可能です。 Interopを使用すると、1インデックスのCOM配列の上限を計算し、遅延バインドされたObject値を手動でキャストします。
フォーマットの柔軟性: IronXLは、XLSXなどの標準的なExcelワークブック形式に加えて、CSV解析をネイティブにサポートしており、テストデータが複数の形式で届く場合に便利です。 このライブラリは、新しいワークブックファイルを作成したり、セルに値を書き込んだりすることも同様に簡単に行えます。 完全なリストについては、 IronXLフォーマットガイドを参照してください。
エラー処理: IronXLには標準的な.NET例外パターンが適用されるため、エラー回復が容易です。 COMベースの例外処理には追加の処理ロジックが必要であり、適切に管理されないとExcelインスタンスが実行状態のままになる可能性がある。
クロスプラットフォーム対応: IronXLは、 .NET 6以降を介してLinuxおよびmacOS上で動作します。 相互運用機能はWin32 COMサブシステムに依存するため、Windows専用です。
| 基準 | IronXL | Microsoft Interop |
|---|---|---|
| 基本的な配列読み取りのためのコード行数 | 約20 | 40歳以上 |
| 手動のCOMクリーンアップが必要 | なし | はい |
| Excelがインストールされていなくても動作します | はい | なし |
| Docker / CIパイプラインで実行されます | はい | なし |
| 配列のインデックス付け規則 | 0ベース(.NET Standard) | 1ベース(COM規格) |
.NETで動的なExcel範囲を扱うにはどうすればよいですか?
生産管理用のスプレッドシートは、行数が固定されていることはほとんどありません。 IronXLは各ワークシートにUsedRangeプロパティを提供し、すべての非空セルの境界矩形を返します。 ハードコードされた範囲文字列の代わりにこれを使用できます。
Imports IronXL
Module DynamicRangeExample
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("DynamicData.xlsx")
Dim sheet As WorkSheet = workbook.DefaultWorkSheet
' Get the bounding range of all populated cells
Dim usedRange As IronXL.Range = sheet.UsedRange
Dim rowCount As Integer = usedRange.Rows.Count
Dim colCount As Integer = usedRange.Columns.Count
Dim dynamicArray(rowCount - 1, colCount - 1) As String
Dim rowIndex As Integer = 0
For Each row As RangeRow In usedRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
dynamicArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
Console.WriteLine($"Loaded {rowCount} rows x {colCount} columns from UsedRange.")
End Sub
End ModuleIRON VB CONVERTER ERROR developers@ironsoftware.com配列データを読み込んだ後、どのようにフィルタリングおよび検証しますか?
配列にデータが格納された後、一般的な後処理手順には以下が含まれます。
-ヘッダー行をスキップする:列ヘッダーを省略するために、表示ループをインデックス0ではなく1から開始します。
- 空白のトリム:
.Trim()を呼び出してスプレッドシートからコピーされた先頭と末尾のスペースを削除します。 - null セルの処理: IronXL は空白セルに対して空の文字列を返すため、ほとんどの場合、null チェックは不要です。 -数値範囲の検証: double 型の値を読み込んだ後、保存する前に範囲チェックを適用して、-1 や 9999 などのプレースホルダー値を含むセルを検出します。
大規模なデータセットの場合は、生の二次元配列の代わりにList(Of T)または強く型付けされたクラスを使用することを考慮してください。 データを型付きオブジェクトに読み込むことで、後続のコードの可読性とテスト性が向上します。IronXL IronXLモデルリファレンスには、利用可能なすべてのセルプロパティとワークシートメソッドが記載されています。
.NETの配列をExcelにエクスポートするにはどうすればよいですか?
IronXLは、配列データをワークシートに書き戻す際に、読み取りに使用するのと同じAPIをサポートしています。 これは、メモリ内でデータを変換し、その結果を新しいExcelファイルとして保存する必要がある場合に役立ちます。
Imports IronXL
Module WriteArrayToExcel
Sub Main()
' Create a new workbook and worksheet
Dim workbook As WorkBook = WorkBook.Create(ExcelFileFormat.XLSX)
Dim sheet As WorkSheet = workbook.CreateWorkSheet("Results")
Dim outputArray(,) As String = {
{"Region", "Q1", "Q2", "Q3"},
{"なしrth", "12500", "14200", "15800"},
{"South", "9800", "10500", "11300"},
{"East", "8200", "9100", "9900"}
}
' Write the array contents to the worksheet cell by cell
For i As Integer = 0 To outputArray.GetUpperBound(0)
For j As Integer = 0 To outputArray.GetUpperBound(1)
Dim cellAddress As String = IronXL.ExcelAddress.ToAddress(i, j)
sheet(cellAddress).Value = outputArray(i, j)
Next
Next
workbook.SaveAs("Output.xlsx")
Console.WriteLine("Workbook saved as Output.xlsx")
End Sub
End Module
ExcelAddress.ToAddress(row, column)ヘルパーはゼロベースの整数座標をA1表記の文字列に変換します。 これにより、書き込みループがクリーンに保たれ、セルアドレスを手動で計算する必要がなくなります。 数式の挿入やスタイルの適用など、その他のパターンについては、 IronXLのライティングチュートリアルを参照してください。
複数のワークシートを別々の配列に読み込むにはどうすればよいですか?
ワークブックによっては、複数のシートにデータが保存されるものもあります。例えば、月ごと、地域ごとに1つのシートが保存されるといった具合です。 IronXLはworkbook.WorkSheetsを通じてすべてのシートを公開しており、それぞれのシートを自分の配列にロードするために反復できます。
Imports IronXL
Module MultiSheetArrayLoader
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("AnnualReport.xlsx")
For Each sheet As WorkSheet In workbook.WorkSheets
Console.WriteLine($"Loading sheet: {sheet.Name}")
Dim dataRange As IronXL.Range = sheet.UsedRange
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim sheetArray(rowCount - 1, colCount - 1) As String
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
sheetArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
Console.WriteLine($" Loaded {rowCount} rows x {colCount} columns.")
Next
End Sub
End ModuleImports IronXL
Module MultiSheetArrayLoader
Sub Main()
Dim workbook As WorkBook = WorkBook.Load("AnnualReport.xlsx")
For Each sheet As WorkSheet In workbook.WorkSheets
Console.WriteLine($"Loading sheet: {sheet.Name}")
Dim dataRange As IronXL.Range = sheet.UsedRange
Dim rowCount As Integer = dataRange.Rows.Count
Dim colCount As Integer = dataRange.Columns.Count
Dim sheetArray(rowCount - 1, colCount - 1) As String
Dim rowIndex As Integer = 0
For Each row As RangeRow In dataRange.Rows
Dim colIndex As Integer = 0
For Each cell As Cell In row
sheetArray(rowIndex, colIndex) = cell.StringValue
colIndex += 1
Next
rowIndex += 1
Next
Console.WriteLine($" Loaded {rowCount} rows x {colCount} columns.")
Next
End Sub
End Moduleシートナビゲーションの理解
For Eachとインデックスでのアクセスの両方をサポートします。 プログラムでシートを特定するためにsheet.Nameを使用し、既知のシート名に基づいてロジックを分岐します。 IronXLのワークシートガイドでは、範囲選択、名前付き範囲、および動的範囲検出について詳しく解説しています。
数十枚のシートを含むワークブックの場合は、読み込む前にシート名でフィルタリングして、無関係なシートの処理やメモリの無駄遣いを回避してください。
開発者は相互運用配列フォーマットについて何を知っておくべきか?
InteropアプローチはCOMの1ベースインデックスを使用してObject(,)配列としてセルデータを返します。 最初の行の最初の要素はvalues(0, 0)にはありません。 これは、オフバイワンエラーの頻繁な原因となる。
追加の問題はnull処理です:Interopは空のセルになしthingを返します。 null参照でNullReferenceExceptionがスローされます。すべてのセルアクセスの周りにnullガードを追加する必要があります。
If values(i, j) Isなしt なしthing Then
line &= values(i, j).ToString() & vbTab
End If
IronXLは、空白セルに対して空の文字列を返すことでこの問題を解決します。つまり、ループコードは追加のガードなしで動作します。
Interopで使用されるExcelオブジェクトモデルに関する信頼できる情報については、 Microsoft Excel VBAリファレンスおよびMSDN Office Interopドキュメントを参照してください。
次のステップは何ですか?
Excelデータを配列に読み込むことは、 .NETスプレッドシートで最も一般的なタスクの1つであり、 IronXLを使えばその実装が簡単になります。 次のステップに進むには:
- IronXLをダウンロード: NuGet(
Install-Package IronXL.Excel)を経由でインストールし、入門ガイドに従ってください。 -フォーマットのサポートを確認してください: IronXLは、XLSX、XLS、CSV、TSV、およびJSONの読み書きに対応しています。 詳細については、対応フォーマットのページをご覧ください。 -高度な機能をお試しください:範囲の並べ替え、数式の適用、セルスタイルの設定、グラフの生成など、すべてExcelをインストールせずに実行できます。 機能一覧については、 IronXLの機能概要をご覧ください。 -コード例を参照する: IronXLのコード例ライブラリには、一般的なスプレッドシート作業の数十種類に対応したコピー&ペースト可能なコードスニペットが用意されています。 -ライセンスの見直し:本番環境への導入向けに、 IronXLのライセンスは開発者、チーム、OEMの各ティアを提供しています。

IronXLとMicrosoft Office InteropはどちらもExcelデータを配列に読み込むことができますが、 IronXLはOfficeに依存しないアーキテクチャ、より洗練されたAPI、そして柔軟なデプロイメントオプションにより、優れた開発者エクスペリエンスを提供します。 このライブラリは、COMオブジェクト管理やシステム依存関係といった一般的な問題点を解消しつつ、スプレッドシート自動化のための高度な機能へのアクセスを提供します。
IronXLのドキュメントハブでは、サンプルプロジェクト、リソース、ドキュメントを通して、 IronXLの全機能を詳しく知ることができます。 Enterpriseアプリケーションの場合、 IronXLのライセンスオプションは、あらゆるプロジェクト規模に対応できる柔軟な条件を提供します。

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。
関連する記事


