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

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

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

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

SharePoint

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

SQL

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

解決済

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

chaoschaos
chaoschaos

総合スコア11

VBA

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

SharePoint

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

SQL

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

1回答

0リアクション

0クリップ

529閲覧

投稿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
===============================================

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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()の形も有効かと思いますが、変数を使ったのはあくまでも機能テストとしてのもので、実際には既存のエクセルシートに入力されている日付を読み取ってそれを変数設定するつもりでいたためこのような形にしておりました。。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VBA

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

SharePoint

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

SQL

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