複数シートがある場合のリンクテーブルの変更

解決


bhan  2008-07-25 18:53:50  No: 145021

環境:WindowsXP, VB.NET2003

ACCESSのエクセルのシートへのリンクテーブルを変更する機能を作成しました。

エクセルの一つのブックに該当シートのみがある場合は正常に変更出来ますが、
一つのブックに該当シート以外に複数シートがある場合は下記エラーを発し変更出来ません。

エラー:オブジェクト"*"が見つかりません。オブジェクトが存在していること、名前やパス名が正しいことを確認してください

原因が何か分かりますでしょうか。

    Private Function ChangeLinkTable(ByVal strMakeName As String, ByVal strFileName As String, ByVal strSheetName As String) As Boolean
        Dim strMDB As String = System.IO.Path.Combine(strMdbPath, "test.mdb") 'strMdbPath = "D:\test"
        Dim catDB As ADOX.Catalog
        Dim tblLink As ADOX.Table

        ChangeLinkTable = True

        Try
            catDB = New ADOX.Catalog
            ' リンクを変更するmdbを指定
            catDB.let_ActiveConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strMDB)

            '変更出来なかった時のために、削除する前にリネーム&コピーで残しておきたい・・
            catDB.Tables.Delete(strMakeName)
            tblLink = New ADOX.Table
            With tblLink
                ' エクセルをリンクします
                .Name = strMakeName
                .ParentCatalog = catDB

                ' リンクを作成するためのプロパティ
                .Properties("Jet OLEDB:Create Link").Value = True
                .Properties("Jet OLEDB:Link Provider String").Value = "Excel 8.0;DATABASE=" & strFileName & ";HDR=YES"
                .Properties("Jet OLEDB:Remote Table Name").Value = strSheetName
            End With
            ' テーブルを Tables コレクションに追加します。
            catDB.Tables.Append(tblLink)

        Catch ex As Exception
            MsgBox("リンクテーブル変更中にエラーが発生しました" & vbCrLf & ex.Message & vbCrLf & ex.StackTrace)
            ChangeLinkTable = False
            'ここで元のテーブルを復活させたい
            lblInfo.Text = "LinkTableは更新されていません"
            lblInfo.Refresh()
        Finally
            tblLink = Nothing
            catDB = Nothing
        End Try
    End Function

使用方法:ChangeLinkTable("リンクテーブル名","リンク先のエクセルへのパス","リンク先のシート名")

また、上記プログラムでは、リンクテーブルの変更が出来なかった場合、
元々のリンクテーブルを削除したままとなってしまいますが、
変更出来なかった場合は、元のリンクテーブルを復活させたいと考えています。

最初に、「元のリンクテーブルをリネームしてコピー」すればいいと思っているのですが、
リンクテーブルをリネームしてコピーする方法が分からないでいます。
参考となるサイトがありましたら教えてください。


魔界の仮面弁士  2008-07-25 19:09:12  No: 145022

> strSheetName
この内容は、どのような文字列なのでしょうか。
"Sheet1" ですか?
"[Sheet1]" ですか?
"Sheet1$" ですか?
"[Sheet1$]" ですか?
あるいはシート名だけでなく、セル範囲も指定された文字列なのでしょうか?

> .Properties("Jet OLEDB:Create Link").Value = True
別件ですが、ADOX は COM オブジェクトなので、
  ps = .Properties
  p = ps("Jet OLEDB:Create Link")
  p.Value = True
  If Marshal.IsComObject(p) Then Marshal.ReleaseComObject(p)
  If Marshal.IsComObject(ps)Then Marshal.ReleaseComObject(ps)
のようにする必要があるかも。Catalog/Table/Tables も同様。

> 最初に、「元のリンクテーブルをリネームしてコピー」すればいいと思っているのですが、
(1) 元 Table の Name プロパティの内容をを別名に変更。
(2) 新規 Table を作成してリンクテーブル化。
(3) (2)を追加できたら(1)を削除、駄目だったら(1)を元の名前に戻す。

という方法でいけないでしょうか。


bhan  2008-07-25 19:42:38  No: 145023

>> strSheetName
>この内容は、どのような文字列なのでしょうか。
>"Sheet1" ですか?
>"[Sheet1]" ですか?
>"Sheet1$" ですか?
>"[Sheet1$]" ですか?
>あるいはシート名だけでなく、セル範囲も指定された文字列なのでしょうか?

すみません。"Sheet1"、"[Sheet1]"、"Sheet1$"、"[Sheet1$]"と、
それぞれ違いが分かりません。教えてください。

私は、シート名のみを指定するという風に考えています。

>> .Properties("Jet OLEDB:Create Link").Value = True
>別件ですが、ADOX は COM オブジェクトなので、

ご指摘ありがとうございます。
COMオブジェクトの解放については注意しなくちゃ・・ですね。

>(1) 元 Table の Name プロパティの内容をを別名に変更。
>(2) 新規 Table を作成してリンクテーブル化。
>(3) (2)を追加できたら(1)を削除、駄目だったら(1)を元の名前に戻す。

ヒントありがとうございます。


bhan  2008-07-29 01:05:31  No: 145024

回答が付かないので、解決してませんが終了します。


bhan  2008-07-29 18:18:25  No: 145025

[一部自己解決]
該当エクセルファイルにシートが単数だろうと複数だろうと、
エラーが発生していました。

>>> strSheetName
>>この内容は、どのような文字列なのでしょうか。
>>"Sheet1" ですか?
>>"[Sheet1]" ですか?
>>"Sheet1$" ですか?
>>"[Sheet1$]" ですか?
>>あるいはシート名だけでなく、セル範囲も指定された文字列なのでしょうか?
>
>すみません。"Sheet1"、"[Sheet1]"、"Sheet1$"、"[Sheet1$]"と、
>それぞれ違いが分かりません。教えてください。

まだ、これらの文字列の違いが分かっていませんが、

>  .Properties("Jet OLEDB:Remote Table Name").Value =

に指定する値は、構文として「シート名」&「$」という風に、
シート名に「$」を付ける必要がありました。

参考:Excel ワークブックへのリンク
      http://www.microsoft.com/japan/msdn/columns/office/office10052000.aspx

つまり、
>>strSheetName
>>この内容は、どのような文字列なのでしょうか。

"Sheet1$" という値にならなければならないところを、
"Sheet1" としていたためにエラーとなっていました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加