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

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

ただいまの
回答率

88.62%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,653

hiroto01

score 11

 前提・実現したいこと

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

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

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

例)元ブック

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

新しいブック

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

 試したこと

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

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

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

ソース

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)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YAmaGNZ

    2018/12/03 19:48

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

    キャンセル

  • hiroto01

    2018/12/04 08:45

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

    キャンセル

回答 1

checkベストアンサー

+1

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

ご提示の現象を確認致しました。
当方で実験した結果、同一列に同じ入力規則があった場合、入力規則の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行あたりの

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


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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/04 17:06

    YAmaGNZ様

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

    キャンセル

  • 2018/12/04 17:28

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

    本当にありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る