先日Twitterで @blacklist_ryu さんが下記ツイートをされていました。
ここで苦戦中・・・説明がざっくりだ・・ https://t.co/7J10zpHK2H pic.twitter.com/TFyrVnTAeA
— りゅうりゅう (@blacklist_ryu) September 18, 2020
ADOでSharePointリストに接続するところで苦戦されているようで、私も気になったので確認してみました。
参考サイト
上記サイトによると、SharePointサイトのURLとリストのIDさえ分かれば接続できるようなので、まずはID(GUID)を取得してみます。
ページのソースからSharePointリストIDを取得
接続したいリストをブラウザーで開き、ソースを表示したところ、「listId」として、それらしい値が載っていました。
ただ、この方法ではサイトの仕様が変わるとIDが取得できなくなる可能性もあるので、別の方法も試してみます。
Get-PnPListによるSharePointリストIDの取得
「SharePoint Online: PowerShell to Get List ID (GUID)」によると、PnP PowerShellライブラリのGet-PnPListで簡単に取得できそうです。
PnP PowerShellのインストール
PnP PowerShellをまだインストールしていない場合は、PowerShell(管理者権限)で下記コマンドを実行します。
Install-Module SharePointPnPPowerShellOnline
Get-PnPListの実行
PnP PowerShellがインストールできていれば、上記参考サイトにある通り、Get-PnPListでID含めてサイトの情報を列挙できます。
$url = "https://****.sharepoint.com/" $usr = "(user)@****.onmicrosoft.com" $cred = Get-Credential -UserName $usr -Message "Type the password." Connect-PnPOnline -Url $url -Credentials $cred Get-PnPList | Select-Object Title, Id
ADOでSharePointリストに接続する方法
リストのIDさえ分かれば、あとはADOで接続するだけですね!
接続文字列は下記サイトに分かりやすくまとめてありました。
Public Sub Sample() Dim cn As Object 'ADODB.Connection Dim rs As Object 'ADODB.Recordset Const SharePointUrl As String = "https://****.sharepoint.com/" Const ListId As String = "{********-****-****-****-************}" Set cn = CreateObject("ADODB.Connection") cn.Open "Provider=Microsoft.ACE.OLEDB.16.0;WSS;IMEX=2;RetrieveIds=Yes;DATABASE=" & SharePointUrl & ";LIST=" & ListId & ";" 'プロバイダーは適宜変更 Set rs = CreateObject("ADODB.Recordset") With rs .Open "SELECT * FROM list", cn .MoveFirst Do Until .EOF Debug.Print .Fields.Item("Name").Value .MoveNext Loop .Close End With cn.Close End Sub
上記コード実行時、365アカウントでサインインしていない場合は下図のようなログイン画面が表示されるので、必要事項を入力してサインインします。
接続に問題が無ければ、下図のようにリストの内容が出力されます。
SharePointのリストに関しては、ロールアウトが始まったばかりのMicrosoft Listsと、どのような使い分けがされていくのかまだ不透明な部分がありますが、すぐに使えなくなることは無いだろうと思います。
(Microsoft Listsに関しては下記 @ai_yamasaki さんのブログで詳しく説明されています。)
また、ADOによるSharePointリストへの接続に関して検索したところ、下記サイトを見つけました。
これによると、接続する際はリストのIDではなく、リスト名でも大丈夫なようです。
わざわざIDを取得した手間は一体何だったんだ・・・!?😅
ADOの解説サイト
2021/9/15 追記:
@KotorinChunChun さんから下記ご報告をいただきました。
#助けてVBA
VBAからADODBでSharePointリストに接続して、レコードを追加しようとすると、Updateメソッド実行時に「行ハンドルは無効です」が表示されるんですが、追加することは出来ないんでしょうか?※読み込みまでは下記を参考に設定して成功してます。https://t.co/MsQDuqiaNi
— ちゅん🐣VBAer (@KotorinChunChun) September 14, 2021
Updateメソッドで行ハンドル無効エラーが発生したとのこと。
私も以前同様のエラーが発生したことがあるのですが、そのときは入力が必須になっている列が未入力になっていることが原因でした。
他にも同様に事例がないか検索したところ、下記の質問がヒットしました。
Did you check the SharePoint list mandatory fields? Few columns would automatically be marked as ‘Required’ (eg: Title column). Removing such criteria or including such columns in the code by passing a value would help.
との回答が寄せられていたので、まずは入力必須となっている列を確認するのが良いのかもしれません🙂
この記事へのコメントはありません。