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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

SharePoint

SharePointは、マイクロソフトにより開発された、ソフトウェア開発のドキュメント管理やコラボレーションを行うプラットフォームの総称です

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

1656閲覧

vba:SQL内の変数のマージについて

chaoschaos

総合スコア11

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

SharePoint

SharePointは、マイクロソフトにより開発された、ソフトウェア開発のドキュメント管理やコラボレーションを行うプラットフォームの総称です

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2022/03/03 05:08

VBA初心者です。色々なサイトをみながら見よう見まねで試行錯誤しています。
今回、excelベースでvbaを用いてエクセルの内容を動的にSQL文内で設定して、条件に応じた内容でsharepointリストに反映するという仕組みを構築しようとしています。(本来はAccessがいいのでしょうが、そもそもAcccessをよくわかっておらずハードルが高いため)
試行錯誤しながら機能確認を行っていたのですが、日付をupdateするSQLを書く際に動的に指定する方法がわかりません。
'DateSQL = "UPDATE ListId SET TodayDate = #2021/03/02# WHERE TodayDate < #2022/08/08#;"
というように静的に指定したところ問題なく動いたのですが、SQL文内への変数の反映の仕方がわからず困っています。

具体的にはこのまま実行すると
実行時エラー'-2147217900(80040e14)':
クエリ式'& getDate &'の構文エラー:演算子がありません。
とエラーがでます。

SQL文の書く際に&をつけて""でくくったりなど試してみましたがコンパイルエラーになったり、そこをくぐり抜けても
DateSQL = "UPDATE ListId SET TodayDate = " & " getDate " & " WHERE TodayDate < #2022/08/08#;"
こちらの文で試すと
実行時エラー'-2147217904(80040e10)':
1つ以上の必要なパラメータの値が設定されていません
などとでてしまいます。

&でのつなげ方が悪いのかと思っていますが、何卒ご指南いただけますようお願いいたします。

===============================================
Sub Sharepoint_update()
Dim cn As Object 'ADODB.Connection
Dim rs As Object 'ADODB.Recordset
Dim strSQL As String
Dim DateSQL
Dim getDate
getDate = Date
Debug.Print getDate
Const SharePointUrl As String = "ttps://sharepoint.com/"
Const ListId As String = "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"

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
'DateSQL = "UPDATE ListId SET TodayDate = #2021/03/03# WHERE TodayDate < #2022/08/08#;"
DateSQL = "UPDATE ListId SET TodayDate = & getDate & WHERE TodayDate < #2022/08/08#;"
cn.Execute DateSQL
.Close
End With
cn.Close
End Sub
===============================================

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2022/03/03 05:20

クオート範囲がおかしくないスか?
bebebe_

2022/03/03 05:32

SQLには詳しくないのですが DateSQL = "UPDATE ListId SET TodayDate = " & getDate & " WHERE TodayDate < #2022/08/08#;" ではないですか?
退会済みユーザー

退会済みユーザー

2022/03/03 05:40 編集

getDate = Date であるなら、変数でわざわざ現在日時を与えなくても、SQL文の中では NOW() とか書いとけばよいのではないでしょうか。(TodayDate の型に合わせてDATE型なのか文字列型なのかに加工するのも必要になるけれど。NOW()だと時刻成分も含むからSQL上でどう省くかも課題。)
chaoschaos

2022/03/03 06:06

アドバイスありがとうございます! bebe_さんから提示いただいたように""の範囲を変えたらうまくいきました。 SQL内では日付を##で囲むルールがあるようでそのままだと変な日付が入ってしまったので、ちょっと力技感がありますが、以下で動作確認ができました。 できれば##も含めて変数定義するようにきれいに直してみます。 DateSQL = "UPDATE ListId SET TodayDate = #" & getDate & "# WHERE TodayDate < #2022/08/08#;" php-gresさん。説明不足でした。Sharepointリスト上TodayDateの型はDateです。NOW()の形も有効かと思いますが、変数を使ったのはあくまでも機能テストとしてのもので、実際には既存のエクセルシートに入力されている日付を読み取ってそれを変数設定するつもりでいたためこのような形にしておりました。。
guest

回答1

0

自己解決

備忘録として、、、
こちらできれいにまとまりました。アドバイスいただいた皆様誠にありがとうございます!
恥ずかしながら&のあとに半角スペースが必要とのことを存じ上げませんでした。。。

Dim getDate
getDate = "#" & Date & "#"
DateSQL = "UPDATE ListId SET TodayDate = " & getDate & " WHERE TodayDate < #2022/08/08#;"

投稿2022/03/03 06:23

chaoschaos

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問