環境: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("リンクテーブル名","リンク先のエクセルへのパス","リンク先のシート名")
また、上記プログラムでは、リンクテーブルの変更が出来なかった場合、
元々のリンクテーブルを削除したままとなってしまいますが、
変更出来なかった場合は、元のリンクテーブルを復活させたいと考えています。
最初に、「元のリンクテーブルをリネームしてコピー」すればいいと思っているのですが、
リンクテーブルをリネームしてコピーする方法が分からないでいます。
参考となるサイトがありましたら教えてください。
> 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)を元の名前に戻す。
という方法でいけないでしょうか。
>> 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)を元の名前に戻す。
ヒントありがとうございます。
回答が付かないので、解決してませんが終了します。
[一部自己解決]
該当エクセルファイルにシートが単数だろうと複数だろうと、
エラーが発生していました。
>>> 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" としていたためにエラーとなっていました。
ツイート | ![]() |