Spire.XLS for .NET

ニュース&リリース

2026-03-27

Spire.XLS 16.3.6 は VBA マクロプロジェクトの操作に対応しています

Spire.XLS 16.3.6 のリリースをお知らせいたします。本バージョンでは VBA マクロプロジェクトの操作、およびデータシミュレーション分析(シナリオマネージャー)に対応しました。また、ワークシートのコピー時にマクロが消失する不具合を修正しています。詳細は下記の通りです。

変更内容一覧
カテゴリー ID 説明
新機能 SPIREXLS-938 SPIREXLS-5995 VBA マクロプロジェクトの操作機能を追加(作成・読み取り・編集・削除に対応)。

VBA プロジェクトの追加:

Workbook workbook = new Workbook();

// ドキュメントにVBAプロジェクトを追加
IVbaProject vbaProject = workbook.VbaProject;
vbaProject.Name = "SampleVBAMacro";

string text = "Encoding before modification: " + vbaProject.CodePage.ToString() + "\n";
vbaProject.CodePage = 936; // エンコード設定(中国語に対応)

text += "Encoding after modification: " + vbaProject.CodePage.ToString() + "\n";
File.WriteAllText(outputFile_TXT, text);

// プロジェクトにVBAモジュールを追加
IVbaModule vbaModule = vbaProject.Modules.Add("SampleModule", VbaModuleType.Module);
// VBAマクロのソースコードを設定
vbaModule.SourceCode = @"
Sub ExampleMacro()
    ' 変数宣言
    Dim ws As Worksheet
    Dim i As Integer
    
    ' アクティブシートを参照設定
    Set ws = ActiveSheet 
    
    ' ワークシート内容をクリア(任意)
    ws.Cells.Clear
    
    ' サンプルデータを出力
    With ws
        ' ヘッダー行を記入
        .Range(""A1:C1"").Value = Array(""No."", ""Project Name"", ""Amount"")
        
        ' ループで10行のデータを作成
        For i = 1 To 10
            .Cells(i + 1, 1).Value = i  ' 番号列
            .Cells(i + 1, 2).Value = ""Project "" & i  ' プロジェクト名列 
            .Cells(i + 1, 3).Value = i * 100  ' 金額列(計算例)
        Next i
        
        ' 列幅を自動調整
        .Columns(""A:C"").AutoFit
        
        ' ヘッダー行書式設定
        With .Range(""A1:C1"")
            .Font.Bold = True
            .Interior.Color = RGB(200, 220, 255)  ' 水色背景
        End With
        
        ' 金額列の数値書式設定
        .Range(""C2:C11"").NumberFormat = ""$#,##0.00""
    End With
    
    ' 完了メッセージを表示
    MsgBox ""Data population completed!"", vbInformation, ""Operation Prompt""
End Sub";

// Excelファイルを保存
workbook.SaveToFile(outputFile_Xls, FileFormat.Version97to2003);

VBA プロジェクトの読み取り:

Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet ws = wb.Worksheets[0];
IVbaProject vbaProject = wb.VbaProject;

string text = "IsProtected:" + vbaProject.IsProtected + "\n";
text += "Name:" + vbaProject.Name + "\n";
text += "Description:" + vbaProject.Description + "\n";
text += "HelpFileName:" + vbaProject.HelpFileName + "\n";
text += "ConditionalCompilation:" + vbaProject.ConditionalCompilation + "\n";
text += "LockProjectView:" + vbaProject.LockProjectView + "\n";
text += "Password:" + vbaProject.Password + "\n";
text += "CodePage:" + vbaProject.CodePage + "\n";

IVbaModule mod = vbaProject.Modules.GetWorksheetModule(ws);
text += "IVbaModule:" + "\n";
text += "Name:" + mod.Name.ToString() + "\n";
text += "SourceCode:\n" + mod.SourceCode.ToString() + "\n";
text += "Type:" + mod.Type.ToString() + "\n";

File.WriteAllText(outputFile_TXT, text.ToString());
vbaProject.Modules.Clear();
wb.SaveToFile(outputFile);

VBA プロジェクトの編集:

Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet ws = wb.Worksheets[0];

IVbaProject vbaProject = wb.VbaProject;
vbaProject.Password = "1234";
vbaProject.Name = "modify";
vbaProject.Description = "Description";
vbaProject.HelpFileName = "image1.png";
vbaProject.ConditionalCompilation = "DEBUG = 2";
vbaProject.LockProjectView = true;

IVbaModule mod = vbaProject.Modules.GetWorksheetModule(ws);
mod.Name = "IVbaModule";
mod.SourceCode = "Dim lRow As Long";
mod.Type = VbaModuleType.Module;

wb.SaveToFile(outputFile);

VBA プロジェクトの削除:

Workbook wb1 = new Workbook();
wb1.LoadFromFile(inputFile_1);
IVbaProject vbaProject1 = wb1.VbaProject;

vbaProject1.Modules.Remove("SampleModule");
vbaProject1.Modules.RemoveAt(0);
 
wb1.SaveToFile(outputFile_1);
新機能 SPIREXLS-6020 データシミュレーション分析(シナリオマネージャー)機能を追加。作成・編集・削除・サマリー生成・統合に対応。

シナリオの作成:

Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];

// ワークシート内のシナリオコレクションを取得
XlsScenarioCollection scenarios = worksheet.Scenarios;

// シナリオ用に異なる数値を格納したリストオブジェクトを初期化
List<object> currentChangePercentage_Values = new List<object> { 0.23, 0.8, 1.1, 0.5, 0.35, 0.2 };
List<object> increasedChangePercentage_Values = new List<object> { 0.45, 0.56, 0.9, 0.5, 0.58, 0.43 };
List<object> decreasedChangePercentage_Values = new List<object> { 0.3, 0.2, 0.5, 0.3, 0.5, 0.23 };
List<object> currentQuantity_Values = new List<object> { 1500, 3000, 5000, 4000, 500, 4000 };
List<object> increasedQuantity_Values = new List<object> { 1000, 5000, 4500, 3900, 10000, 8900 };
List<object> decreasedQuantity_Values = new List<object> { 1000, 2000, 3000, 3000, 300, 4000 };

// 同一セル範囲に異なる数値を設定したシナリオをワークシートに追加
scenarios.Add("Current % of Change", worksheet.Range["F5:F10"], currentChangePercentage_Values);
scenarios.Add("Increased % of Change", worksheet.Range["F5:F10"], increasedChangePercentage_Values);
scenarios.Add("Decreased % of Change", worksheet.Range["F5:F10"], decreasedChangePercentage_Values);
scenarios.Add("Current Quantity", worksheet.Range["D5:D10"], currentQuantity_Values);
scenarios.Add("Increased Quantity", worksheet.Range["D5:D10"], increasedQuantity_Values);
scenarios.Add("Decreased Quantity", worksheet.Range["D5:D10"], decreasedQuantity_Values);

// ワークブックを保存
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();

シナリオサマリーの生成:

Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];

// ワークシート内のシナリオコレクションを取得
XlsScenarioCollection scenarios = worksheet.Scenarios;

// シナリオ用に異なる数値を格納したリストオブジェクトを初期化
List<object> currentChangePercentage_Values = new List<object> { 0.23, 0.8, 1.1, 0.5, 0.35, 0.2 };
List<object> increasedChangePercentage_Values = new List<object> { 0.45, 0.56, 0.9, 0.5, 0.58, 0.43 };
List<object> decreasedChangePercentage_Values = new List<object> { 0.3, 0.2, 0.5, 0.3, 0.5, 0.23 };
List<object> currentQuantity_Values = new List<object> { 1500, 3000, 5000, 4000, 500, 4000 };
List<object> increasedQuantity_Values = new List<object> { 1000, 5000, 4500, 3900, 10000, 8900 };
List<object> decreasedQuantity_Values = new List<object> { 1000, 2000, 3000, 3000, 300, 4000 };

// 同一セル範囲に異なる数値を設定したシナリオをワークシートに追加
scenarios.Add("Current % of Change", worksheet.Range["F5:F10"], currentChangePercentage_Values);
scenarios.Add("Increased % of Change", worksheet.Range["F5:F10"], increasedChangePercentage_Values);
scenarios.Add("Decreased % of Change", worksheet.Range["F5:F10"], decreasedChangePercentage_Values);
scenarios.Add("Current Quantity", worksheet.Range["D5:D10"], currentQuantity_Values);
scenarios.Add("Increased Quantity", worksheet.Range["D5:D10"], increasedQuantity_Values);
scenarios.Add("Decreased Quantity", worksheet.Range["D5:D10"], decreasedQuantity_Values);

// サマリーを作成
worksheet.Scenarios.Summary(worksheet.Range["L7"]);

// ワークブックを保存
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();

シナリオの編集:

Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];

// ワークシート内のシナリオコレクションを取得
XlsScenarioCollection scenarios = worksheet.Scenarios;
XlsScenario scenario1 = scenarios[0];
XlsScenario scenario2 = scenarios[1];

// シナリオを編集
scenario1.SetVariableCells(worksheet.Range["A1:A5"], scenario2.Values);

CellRange sourceCell = worksheet.Range["B1:B5"];
scenario2.SetVariableCells(sourceCell, scenario2.Values);

scenario1.Show();
scenario2.Show();

// ワークブックを保存
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();

シナリオの統合:

Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet1 = wb.Worksheets[0];
Worksheet worksheet2 = wb.Worksheets[1];

// シナリオを統合
worksheet1.Scenarios.Merge(worksheet2);

// ワークブックを保存
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();

シナリオの削除:

Workbook wb = new Workbook();
wb.LoadFromFile(inputFile);
Worksheet worksheet = wb.Worksheets[0];

// ワークシート内のシナリオコレクションを取得
XlsScenarioCollection scenarios = worksheet.Scenarios;

// シナリオを削除
scenarios.RemoveScenarioAt(0);
scenarios.RemoveScenarioByName("two");

string content = "";
content += "Count:" + scenarios.Count + "\n";
content += "ContainsScenario:" + scenarios.ContainsScenario("two").ToString() + "\n";
content += "ContainsScenario:" + scenarios.ContainsScenario("one").ToString() + "\n";
File.WriteAllText(outputFile, content.ToString());

// ワークブックを保存
wb.SaveToFile(outputFile, ExcelVersion.Version2013);
wb.Dispose();
不具合修正 SPIREXLS-5995 SPIREXLS-6077 ワークシートコピー時にマクロが消失する問題を修正。
リンクをクリックして Spire.XLS 16.3.6 をダウンロードしてください: