アクティブなシート名の取得

エクセルアプリケーションスコープで開いた時にアクティブになっているシート名を取得したいのですがうまくできません
ワークブック変数.current sheet.nameでやってもオブジェクトインスタンスが設定されていないとエラーが出ます

バージョンは2018.4.5です

エクセルアクティビティの、バージョン2.8.5でやってみました。同様のエラーが発生しますね。
もしかしたらバグかもしれません。

こんにちは

Excel Application Scopeで開く前に以下の式で取得を試みてください。
(target.xlsxは適当なファイル名に変更してください)
開いた直後はこのシートがアクティブになっていると思います。

workbook = new ClosedXML.Excel.XLWorkbook("target.xlsx")
sheetName = workbook.Worksheets.First(function(s) s.TabActive).Name

上記の後、Invoke Method(メソッド呼び出し)アクティビティで workbookを Dispose してください。
その後EXCEL Application Scopeで開いてください。
なお workbook はClosedXML.Excel.XLWorkbook型になります。

1 Like

回答ありがとうございます!

今手元にui pathがなくて実際のフローが思いつかないのですが…
アクティビティとそれぞれのプロパティまで教えていただけると非常に助かります
よろしくお願いします

こんにちは

以下のような感じになります。

Main.xaml (7.8 KB)

2 Likes

ありがとうございます!
整理すると
1 開きたいワークブックのパスを取得
2 ワークブック型に前の回答で教えていただいたものを代入
3 2で作った変数を使ってアクティブなシート名を取得するメソッド?を代入
4 メソッド呼び出しでターゲットオブジェクトを2で作ったものを設定、メソッドネームをDisposeにする
5 3を表示させる
という解釈でいます
ちなみに4のメソッド呼び出しの部分で引数など設定されていましたら、プロパティの内容も教えてください…!
プロパティのスクショとかでもいいので、よろしくお願いします!

こんにちは

先のpostにxaml添付してますので、詳細はそちら参照ください。

すみません、気づきませんでした
ありがとうございます!

今日いただいたxamlファイルを確認しました!
メソッド呼び出しには引数など使わずにできることがわかりました
ありがとうございました

1 Like

すみません
本日会社のPCで頂いたxamlを真似して作ってみたのですが、
シーケンスに、一致する要素は含まれてません
と表示されます…

こんにちは

最初の確認事項になりますが、上記で添付しておりますファイルは動作しましたでしょうか?
(ファイル名の変更は必要かと思いますが)

あとエラーが出ているスクリーンショット等を貼り付けいただくことは可能でしょうか?

都合でエクセルが入っていないPCで現在仕事しておりまして実行自体はできてないです
在宅勤務でリモートさきのPCで開発しております
例外の種類
System.invalid operation exception
エラー箇所
アクティブシートネームを代入する部分で出てます

スクリーンショットは規定によりとれないです…

こんにちは

再度確認しましたが、どうやら最初のシートがアクティブな場合に、アクティブを示す
情報が設定されないため例外が発生するようです。
以下修正案お試しいただけないでしょうか?

activeSheet = if(workbook.Worksheets.Any(function(s) s.TabActive), workbook.Worksheets.First(function(s) s.TabActive).Name, workbook.Worksheet(1).Name)

ありがとうございます
アクティブシートネームの部分に教えていただいた式を入力しましたところ、シート2.シート3がアクティブな時はシート名が取得できました!
ただ、シート1をアクティブにしてあってもシート2が帰ってきます

アクティブシートの設定で(0)にしたらうまく行きました!

1 Like

こんにちは

情報共有ありがとうございます。
手元のEXCEL2019や2013で出力したbookですと、内部的にはSheetIDは1から始まっていましたので、
1を決め打ちしていましたが、0始まりで出力する実装もあるということかもしれません。対応しきれているかわかりませんが、以下修正案作成してみました。

activeSheet = if(workbook.Worksheets.Any(function(s) s.TabActive), workbook.Worksheets.First(function(s) s.TabActive).Name, workbook.Worksheet(workbook.Worksheets.Min(function(s) s.Position)).Name)

ちなみにご利用のエクセルファイルはどのバージョン(or システム?)で出力されたものでしょうか?

使ってるエクセルは2016ですね

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.