質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

8254閲覧

ClosedXMLを使用し、Excel保存時の入力規則の扱い

hiroto01

総合スコア11

ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

1グッド

1クリップ

投稿2018/12/03 10:05

編集2018/12/03 23:43

前提・実現したいこと

VB.NETとClosedXMLを使用し、既存のブックにDBから取得した値を入れ、別名で保存をする
プログラムを書いております。

発生している問題・エラーメッセージ

既存のブックの列に入力規則が入っている場合、新しく作成したブックには
それ以降のセルにも同様の入力規則が入ってしまいます。
<追記>
説明に誤りがありました。
同じ列に入力規則があるセルと無いセルが混在する場合、入力規則があるセルに挟まれた
入力規則がないセルも直上の入力規則が入ってしまうようです。
例)を修正しました。

例)元ブック

列1列2列3
入力規則A
入力規則B
入力規則A
入力規則B

新しいブック

列1列2列3
入力規則有A
入力規則有A入力規則有B
入力規則有A入力規則有B
入力規則有B

試したこと

値を何も設定せずにSaveAs(xxx.xlsx)にて保存を行ったところ、同じ状態に
なりましたので、設定している値等の問題ではないような気がします。

ドキュメントやリファレンスを検索しましたが解決の糸口を見つけることが
できませんでした。

対処方法をご存知の方いらっしゃいましたらご教授お願いいたします。

###ソース
```VB.NET
Private Sub Test()
Dim wb As New ClosedXML.Excel.XLWorkbook("元Excelフルパス.xlsx")
Dim ws As ClosedXML.Excel.IXLWorksheet = wb.Worksheet("Sheet1")
wb.SaveAs("新しく作成されるExcelフルパス.xlsx")
End Sub

### 補足情報(FW/ツールのバージョンなど) 環境:VB.NET(VisualStudio2017) ClosedXML(バージョン0.93.1.0)
mnrj_0👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2018/12/03 10:48

入力規則を設定したエクセルファイルを開き、SaveAsにて別ファイルとして保存しましたが、おっしゃる現象は確認出来ませんでした。現象を確認できるソースの提示をお願いいたします。
hiroto01

2018/12/03 23:45

発生する事象の修正とソースを追記しました。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

現象の確認を行っただけで、解決には至っておりません。

ご提示の現象を確認致しました。
当方で実験した結果、同一列に同じ入力規則があった場合、入力規則のRangeが変わります。

列A列B列C
入力規則A
入力規則B
入力規則A入力規則A

とあった場合
Save前は
ws.DataValidations.Count=4
ws.DataValidations(0).Range="A1:A1"
ws.DataValidations(1).Range="A2:A2"
ws.DataValidations(2).Range="A3:A3"
ws.DataValidations(3).Range="B3:B3"
とあるのが
ws.DataValidations.Count=2
ws.DataValidations(0).Range="A1:A3,B3:B3"
ws.DataValidations(1).Range="A2:A2"
となって保存され、エクセルにて確認したところ、A2のセルは入力規則Aが適用されました。

保存した後、纏められた入力規則のRangeを"A1:A3,B3:B3"から”A1:A1,A3:A3,B3:B3”に変更してみましたが、Saveを実行すると"A1:A3,B3:B3"に変わりました。

ClosedXMLのソースを見てみましたが、保存する際にDataValidationsを纏める行為を行っているようです。
(/ClosedXML/Excel/XLWorkbook_Save.csの5146行あたり)
この部分を修正し、ビルドしなおせば今回の現象は起こらなくなるかと思いますが、他にどのような影響があるかは分かりません。

追記

ClosedXMLのMasterブランチのソースをダウンロードし、XLWorkbook_Save.csの5172行あたりの

C#

1var dataValidations = worksheetPart.Worksheet.Elements<DataValidations>().First(); 2cm.SetElement(XLWSContentManager.XLWSContents.DataValidations, dataValidations); 3dataValidations.RemoveAllChildren<DataValidation>(); 4xlWorksheet.DataValidations.Consolidate(); 5

C#

1var dataValidations = worksheetPart.Worksheet.Elements<DataValidations>().First(); 2cm.SetElement(XLWSContentManager.XLWSContents.DataValidations, dataValidations); 3dataValidations.RemoveAllChildren<DataValidation>(); 4//xlWorksheet.DataValidations.Consolidate(); 5

とコメントアウトしビルドしたもので試したところ、DataValidationsが纏められて入力規則が必要なところ以外に適用されることはなくなりました。
ただ、この修正を加えることにより他に影響があるのかは分かりません。
修正を加えたものを使用するかは自己責任でお願いいたします。

投稿2018/12/04 03:08

編集2018/12/04 04:58
YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroto01

2018/12/04 08:06

YAmaGNZ様 お世話になっております。 回答ありがとうございます!! ビルドし、内容確認を行います。 結果お知らせいたします。
hiroto01

2018/12/04 08:28

動作確認できました。 ただ、おっしゃる通り、修正の影響箇所がはっきりとしていないため、慎重にテストを 行おうと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問