none
VBとClosedXMLを使い、Excelファイルの部分書き換えをする事はできますか? RRS feed

  • 質問

  • 新規にファイルを作成する方法は検索で見つかったのですが、部分的に書き換えて保存する方法が分かりません。


    <やりたい事>
    VBとClosedXMLを使い、Excelファイルの部分書き換えをする。

    1.「テスト.xlsx」を事前作成
        A    B
    1    a1    b2
    2    あ1    い2

    2.「テスト.xlsx」を読み書きでオープン

    3.部分書き換え
        A    B
    1    a1    B2
    2    ア1    い2

    B1の値をb2からB2へ
    A2の値をあ1からア1へ

    4.セーブ

    5.解放

    2017年5月22日 8:46

回答

  • 間違っていましたらすみません。下記のようなコードで実現可能でしょうか?

    Imports ClosedXML.Excel
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Using workbook = New XLWorkbook("テスト.xlsx")
                Dim worksheet = workbook.Worksheet(1)
                worksheet.Cell("B1").Value = "B2"
                worksheet.Cell("A2").Value = "ア1"
                workbook.Save()
            End Using
        End Sub
    End Class
    参考サイト: http://sourcechord.hatenablog.com/entry/2015/06/21/180557
    2017年5月22日 10:16
  • ダメな方のプロジェクトでは、最初っからNugetを使ってインストールされましたか?

    そうでないのであれば、

    1. Nugetパッケージの管理からClosedXMLを「依存関係の削除」付きでアンインストールする
    2. ソリューションエクスプローラの参照にClosedXMLおよびDocumentFormat.OpenXmlが残っていれば削除する
    3. プロジェクトのフォルダ(サブフォルダ以下も)にClosedXML.dllおよびDocumentFormat.OpenXml.dllが存在しているなら削除(またはリネームやプロジェクトフォルダ外に移動)する
    4. 改めてNugetパッケージの管理からClosedXMLをインストール

    とやってみてはいかがでしょうか。

    2017年5月23日 2:08

すべての返信

  • お書きになった手順をほぼそのままコードに変換するだけだと思いますが、どこがおわかりにならないのでしょうか?

    なお、ClosedXMLは他の非標準ライブラリへの依存があるので、Visual Studioの「ツール」>「Nuget パッケージマネージャ」>「ソリューションのNugetパッケージの管理」からインストールすることをお薦めします。

    あと気をつけるのは、シートや行・列のインデックスがE1スタートであることぐらいでしょうか。

    2017年5月22日 10:13
  • 間違っていましたらすみません。下記のようなコードで実現可能でしょうか?

    Imports ClosedXML.Excel
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Using workbook = New XLWorkbook("テスト.xlsx")
                Dim worksheet = workbook.Worksheet(1)
                worksheet.Cell("B1").Value = "B2"
                worksheet.Cell("A2").Value = "ア1"
                workbook.Save()
            End Using
        End Sub
    End Class
    参考サイト: http://sourcechord.hatenablog.com/entry/2015/06/21/180557
    2017年5月22日 10:16
  • やってみたところ、

    ファイルまたはアセンブリ 'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)

    という状態です。

    2017年5月23日 0:16
  • お書きになった手順をほぼそのままコードに変換するだけだと思いますが、どこがおわかりにならないのでしょうか?

    なお、ClosedXMLは他の非標準ライブラリへの依存があるので、Visual Studioの「ツール」>「Nuget パッケージマネージャ」>「ソリューションのNugetパッケージの管理」からインストールすることをお薦めします。

    あと気をつけるのは、シートや行・列のインデックスがE1スタートであることぐらいでしょうか。

    そのコードに変換ができなくて困っています。

    ソリューションNugetパッケージの管理

    ClosedXML
    DocumentFormat.OpenXml
    をインストールしました。

    コードを拾ってきて構文エラーの無い状態で実行しても、

    ファイルまたはアセンブリ 'DocumentFormat.OpenXml, Version=2.5.5631.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)

    というエラーが出ています。

    一度も動かした実績が無いので、こういうエラーが出ると何をしたらよいのか全く分かりません。

    2017年5月23日 0:22
  • ちなみに、Using文があると、ブレイクポイントを無視してエラーになります。

    Imports ClosedXML.Excel
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim aaa As String
            aaa = "Test" ←←← ブレイクポイント

            Using workbook = New XLWorkbook("C:\LocalWork\テスト.xlsx")
                Dim worksheet = workbook.Worksheet(1)
                worksheet.Cell("B1").Value = "B2"
                worksheet.Cell("A2").Value = "ア1"
                workbook.Save()
            End Using
        End Sub
    End Class

    この状態で実行すると、ブレイクポイントで止まりませんが、

    Imports ClosedXML.Excel
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim aaa As String
            aaa = "Test" ←←← ブレイクポイント

            ’Using workbook = New XLWorkbook("C:\LocalWork\テスト.xlsx")
            ’    Dim worksheet = workbook.Worksheet(1)
            ’    worksheet.Cell("B1").Value = "B2"
            ’    worksheet.Cell("A2").Value = "ア1"
            ’    workbook.Save()
            ’End Using
        End Sub
    End Class

    Using文をまるまるコメントにすると、ブレイクポイントで止まります。

    通常の実行時エラーであれば、ブレイクポイントでまず止まり、F5などで下に動かした時にエラーとなりますが、これはこういうものなのでしょうか?
    2017年5月23日 0:33
  • そもそもですが、.NET Framework のバージョンと、Visual Studio のバージョンは何になりますでしょうか?

    私の場合は、.NET Framework = 4.5.2 で、Visual Studio 2015 Update 3 を使って上記のコードを書きました。ちなみに、操作した手順は下記のような感じです。

    1.Visual Studio 2015 を起動
    2.メニューの「ファイル」→「新規作成」→「プロジェクト」を選択
    3.「Visual Basic」→「Windows フォーム アプリケーション」を選択し OK
    4.メニューの「プロジェクト」→「Nuget パッケージの管理」を選択
    5.Nuget 画面で左上の「参照」をクリックして、「ClosedXML」を検索、一番トップに出てきた「ClosedXML」を選択してインストールを行う
    6.フォームのデザイン画面に戻り、ツールボックスからボタンを1つ配置し、配置したボタンをダブルクリック、コードが表示されるので上記のコードを挿入
    2017年5月23日 0:54
  • バージョン情報は下記のとおりです。

    Microsoft Visual Studio Community 2015
    Version 14.0.25431.01 Update 3
    Microsoft .NET Framework
    Version 4.6.01586

    インストールされているバージョン:Community

    Visual Basic 2015   00322-20000-00000-AA307
    Microsoft Visual Basic 2015

    Visual C# 2015   00322-20000-00000-AA307
    Microsoft Visual C# 2015

    Visual C++ 2015   00322-20000-00000-AA307
    Microsoft Visual C++ 2015

    Application Insights Tools for Visual Studio のパッケージ   7.19.00411.1
    Application Insights Tools for Visual Studio

    ASP.NET and Web Tools 2015.1   14.1.21111.0
    ASP.NET and Web Tools 2015.1

    ASP.NET Web Frameworks and Tools 2012.2   4.1.41102.0
    For additional information, visit http://go.microsoft.com/fwlink/?LinkID=309563

    ASP.NET Web Frameworks and Tools 2013   5.2.40314.0
    For additional information, visit http://www.asp.net/

    Azure App Service Tools v2.8.1   14.0.11123.0
    Azure App Service Tools v2.8.1

    Common Azure Tools   1.8
    Azure Mobile Services および Microsoft Azure Tools で使用する共通サービスを提供します。

    JavaScript プロジェクト システム   2.0
    JavaScript プロジェクト システム

    JavaScript 言語サービス   2.0
    JavaScript 言語サービス

    Microsoft .NET Core Tools (Preview 2)   14.1.21111.0
    Microsoft .NET Core Tools (Preview 2)

    Microsoft Azure Mobile Services Tools   1.4
    Microsoft Azure Mobile Services Tools

    NuGet パッケージ マネージャー   3.5.0
    Visual Studio 内の NuGet パッケージ マネージャー。NuGet の詳細については、http://docs.nuget.org/ にアクセスしてください。

    PreEmptive Analytics Visualizer   1.2
    Microsoft Visual Studio extension to visualize aggregated summaries from the PreEmptive Analytics product.

    SQL Server Data Tools   14.0.60519.0
    Microsoft SQL Server Data Tools

    TypeScript   1.8.36.0
    TypeScript tools for Visual Studio

    2017年5月23日 1:06
  • システム情報は下記のとおりです。

    OS 名    Microsoft Windows 10 Pro
    バージョン    10.0.14393 ビルド 14393
    OS の他の説明     利用不可
    OS 製造元    Microsoft Corporation
    システム名    DESKTOP
    システム製造元    Dell Inc.
    システムモデル    OptiPlex 390
    システムの種類    x64-ベース PC
    システム SKU    
    プロセッサ    Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz、3101 Mhz、4 個のコア、4 個のロジカル プロセッサ
    BIOS バージョン/日付    Dell Inc. A06, 2012/03/27
    SMBIOS バージョン    2.6
    埋め込みコントローラーのバージョン    255.255
    BIOS モード    レガシ
    BaseBoard メーカー    Dell Inc.
    BaseBoard モデル    利用不可
    BaseBoard 名    ベース ボード
    プラットフォームの役割    デスクトップ
    セキュア ブートの状態    サポートされていません
    PCR7 構成    利用不可
    Windows ディレクトリ    C:\WINDOWS
    システム ディレクトリ    C:\WINDOWS\system32
    ブート デバイス    \Device\HarddiskVolume1
    ロケール    日本
    ハードウェア アブストラクション レイヤー    バージョン = "10.0.14393.206"
    ユーザー名    DESKTOP\user1
    タイム ゾーン    東京 (標準時)
    インストール済みの物理メモリ (RAM)    8.00 GB
    合計物理メモリ    7.97 GB
    利用可能な物理メモリ    4.14 GB
    合計仮想メモリ    9.22 GB
    利用可能な仮想メモリ    4.46 GB
    ページ ファイルの空き容量    1.25 GB
    ページ ファイル    C:\pagefile.sys
    Hyper-V - VM モニター モード拡張機能    はい
    Hyper-V - 第 2 レベル アドレス変換拡張機能    はい
    Hyper-V - ファームウェアで仮想化が有効    はい
    Hyper-V - データ実行防止    はい
    2017年5月23日 1:07
  • そもそもですが、.NET Framework のバージョンと、Visual Studio のバージョンは何になりますでしょうか?

    私の場合は、.NET Framework = 4.5.2 で、Visual Studio 2015 Update 3 を使って上記のコードを書きました。ちなみに、操作した手順は下記のような感じです。

    1.Visual Studio 2015 を起動
    2.メニューの「ファイル」→「新規作成」→「プロジェクト」を選択
    3.「Visual Basic」→「Windows フォーム アプリケーション」を選択し OK
    4.メニューの「プロジェクト」→「Nuget パッケージの管理」を選択
    5.Nuget 画面で左上の「参照」をクリックして、「ClosedXML」を検索、一番トップに出てきた「ClosedXML」を選択してインストールを行う
    6.フォームのデザイン画面に戻り、ツールボックスからボタンを1つ配置し、配置したボタンをダブルクリック、コードが表示されるので上記のコードを挿入

    新しいソリューションでイチからやってみます。
    2017年5月23日 1:08
  • 新しいプロジェクトでイチからやってみたところ、上手くいきました。

    うまくいっていないヤツとの違いは、
    Formが親子になっているかどうかだけです。

    最初のフォームにボタンを置いて、そこにやりたい事毎にformを追加していってました。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim objForm As New Form1

        With objForm
            .ShowDialog()
            .Close()
            .Dispose()
        End With
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim objForm As New Form2

        With objForm
            .ShowDialog()
            .Close()
            .Dispose()
        End With
    End Sub

    Nuget パッケージの管理の手順なんかは全く同じなんですけど、同じことをしてこっちは動かない。
    こういうプロジェクトが呪われたような状態って、意味が分からないから一番困るんですよね。。。
    2017年5月23日 1:46
  • ダメな方のプロジェクトでは、最初っからNugetを使ってインストールされましたか?

    そうでないのであれば、

    1. Nugetパッケージの管理からClosedXMLを「依存関係の削除」付きでアンインストールする
    2. ソリューションエクスプローラの参照にClosedXMLおよびDocumentFormat.OpenXmlが残っていれば削除する
    3. プロジェクトのフォルダ(サブフォルダ以下も)にClosedXML.dllおよびDocumentFormat.OpenXml.dllが存在しているなら削除(またはリネームやプロジェクトフォルダ外に移動)する
    4. 改めてNugetパッケージの管理からClosedXMLをインストール

    とやってみてはいかがでしょうか。

    2017年5月23日 2:08
  • ダメな方のプロジェクトでは、最初っからNugetを使ってインストールされましたか?

    そうでないのであれば、

    1. Nugetパッケージの管理からClosedXMLを「依存関係の削除」付きでアンインストールする
    2. ソリューションエクスプローラの参照にClosedXMLおよびDocumentFormat.OpenXmlが残っていれば削除する
    3. プロジェクトのフォルダ(サブフォルダ以下も)にClosedXML.dllおよびDocumentFormat.OpenXml.dllが存在しているなら削除(またはリネームやプロジェクトフォルダ外に移動)する
    4. 改めてNugetパッケージの管理からClosedXMLをインストール

    とやってみてはいかがでしょうか。

    > 最初っからNugetを使ってインストールされましたか?

    はい、逆にNugetを使わないインストールの仕方を知りません。


    でも、アンインストールして、再度、インストールすると上手くいきました。

    あと、ネットので検索した情報では、「ClosedXMLをインストールしたらDocumentFormat.OpenXmlもセットで入れとけ」みたいな事を書いている場合が複数あったので、DocumentFormat.OpenXmlもインストールしていましたが、
    DocumentFormat.OpenXml無しで動きました。

    有難うございました。

    2017年5月23日 2:38
  • Nugetは賢いので、他に必要なライブラリがあればそれも自動的にインストールしてくれます。「無しで」と言いつつ、ソリューションエクスプローラの参照にはしっかりDocumentFormat.OpenXmlが(インストールしたClosedXMLが必要とするバージョンで)追加されているはずです。
    2017年5月23日 2:43
  • Nugetは賢いので、他に必要なライブラリがあればそれも自動的にインストールしてくれます。「無しで」と言いつつ、ソリューションエクスプローラの参照にはしっかりDocumentFormat.OpenXmlが(インストールしたClosedXMLが必要とするバージョンで)追加されているはずです。

    え?と思って、あらためて見てみると、
    Unofficial packaging of Microsoft's OpenXML SDK 2.5
    というのが勝手に入っていました。

    その前は、
    ClosedXMLをインストールした流れで、
    Official NuGet for DocumentFormat.OpenXml
    もインストールしていました。

    これがいけなかったのかな?


    Unofficialの方は水色の四角に水玉の汎用アイコン
    Officialの方はマイクロソフトのオレンジ色の四角枠のアイコン

    見た目も、名前もOfficialが妥当っぽい感じでしたが、それよりも連動性なのですかね。
    2017年5月23日 5:14