C# で Excel の名前が定義されたセルの名前を取得する
Q&A
Closed
C# で EXCELの名前が定義されたセルを列挙して
その中から、目的の名前を持ったセルに対して
読み書きしたいと考えています。
その前段階として、名前が定義されていることが
分かっているセルの定義された名前を取得してみようと
考えましたが、その方法が分かりません。
どなたかご教示願います。
(添付のソースファイルの一番下のほうで
取得を試みています)
すでに開かれている EXCEL シートにアクセスする必要があり
NetOfficeFw.Excel を使用しています。
今回の問題のほかに、NetOfficeFw.Excel の使い方に関する
情報があれば合わせてご教示願います。
(この問題も含め、NetOfficeFw.Excel の使い方に関する
情報を得ようと、NetOfficeFw.Excel のサイト
https://netoffice.io/
も見てみたのですがほぼ理解不能で‥‥)
当方、Windows プログラミング、C# ともにほぼほぼ
初心者です。
該当するソースコード
C#
VSCode の winforms project
ちなみに csproj は下の通り
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NetOfficeFw.Excel" Version="1.9.4"/>
</ItemGroup>
</Project>
ソースコードは下記です。
///////////////////////////////////////////////////////
// すでに開かれているEXCELのBookに対して操作を行う
// sheet名でシートを選択し、名前が定義されている
// ことが分かっているセルの 定義された名前を取得する
///////////////////////////////////////////////////////
using System.Security.Cryptography.X509Certificates;
using NetOffice.ExcelApi;
using NetOffice.Extensions.Conversion;
using NetOffice.Extensions.Invoker;
using Excel = NetOffice.ExcelApi;
//using Microsoft.Office.Interop.Excel;
namespace ExcelOperationProc
{
public partial class Form1 : Form
{
Excel.Application xlApp;
Excel.Workbook xlBook;
Excel.Worksheet xlSheet;
Excel.Range xlRange;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string debugMessage;
string _testExcelPath = @"C:\**********\********.xlsx";
string path = Path.GetFileName(_testExcelPath);
xlApp = Excel.Application.GetActiveInstance();
if (xlApp == null) {
debugMessage = "Excel Book は開かれていません";
MessageBox.Show(debugMessage,
"到達 DebugMsg",
MessageBoxButtons.OK);
return;
}
xlApp.Visible = true;
var i = 1; // WorksheetsやWorkbooks等、Excelのコレクションは常に1オリジン
var findFlag = 0;
foreach (Excel.Workbook workbook in xlApp.Workbooks) {
if (string.Compare(workbook.Name, path, true) == 0) { // 一致
findFlag = 1;
break;
}
i++;
}
if (findFlag == 0) {
debugMessage = "目的の Excel Book は開かれていません";
MessageBox.Show(debugMessage,
"到達 DebugMsg",
MessageBoxButtons.OK);
return;
}
xlBook = xlApp.Workbooks[i];
xlSheet = (Excel.Worksheet)xlBook.Worksheets[1];
// ここで開いた EXCEL シートの E10セル, cell(10,5) には
// "NamedCell_E10" の名前を定義している
// 名前つきセルへ 名前をもとにアクセス <== これは成功
xlRange = xlSheet.Range("NamedCell_E10");
var NamedCellValue = xlRange.Value;
if (NamedCellValue != null) {
debugMessage = "value of cell(10,5) = " + NamedCellValue;
MessageBox.Show(debugMessage,
"到達 DebugMsg",
MessageBoxButtons.OK);
}
// 名前つきセルの名前を取得 <== これがうまくできない
// ちなみに 下のコードでは
// name of cell(10,5) = Name
// と表示される。
if (xlRange.Name != null) {
debugMessage = "name of cell(10,5) = " + xlRange.Name;
//debugMessage = "name of cell(10,5) = " + xlRange.Name.ToString(); // 結果は上と同じ
MessageBox.Show(debugMessage,
"到達 DebugMsg",
MessageBoxButtons.OK);
}
}
}
}
自分で試したこと
当初、Microsoft.Office.Interop.Excel で
進めたものの、すでに開かれた Excel にアクセス
するところでつまずき、NetOfficeFw.Excelに転進
NetOfficeFw.Excelで、すでに開かれた Excel にアクセス
することには成功したのですが、今回の問題に遭遇しました。