Excel VBAに関する質問掲示板です。
Excel VBA 質問スレッド No.737 (未解決)
Excel VBAにて 違うデータを更新してしまう件
投稿者 : ひろひろ 投稿日時 : 2022/05/22(Sun) 00:42:11 OS : Windows 10 EXCEL : Excel 2021
Excel VBAにて 違うデータを更新してしまう件について質問させてください。
Excel VBAを使用して、SharePoint リストのデータ更新を行っていますが、
全く別のIDのデータを潰して上書きしてしまう時があります。
例えば 1のデータを読み込んで 開始日 終了日を更新したいとします。
すると 2のデータを上書きしてしまうのです。
例)
ID 顧客 案件名 金額 開始日 終了日
1 AAA XXX 300
2 BBB ZZZ 500
↓ 更新すると
ID 顧客 案件名 金額 開始日 終了日
1 AAA XXX 300
2 AAA XXX 300 2022/1/1 2022/3/31
となってしまいます。 次のデータを・・・というわけではなく 全く違うデータを上書きしてしまうのです。
でも毎回そうなるわけではなく 10件ぐらい続けて入れたときに変になる時がある・・・という感じなのです。 何がいけないのか分かりますでしょうか?
ロジックを一部抜粋で載せておきます。
ちなみに こちらのロジックは最新なのですが 上記現象が起きたときは、
Withが二重になっていました。
With Adors
With Userform1
~
End With
end with
これがいけないのでしょうか?
Dim cn As Object 'ADODB.Connection
'O365環境
Const SharePointUrl As String = "https://**************"
Const ListId As String = "{******-****-****-****-*******}" ' Sharepint List ID
Dim W_WFID As Long
W_WFID = UserForm1.U_WFID
'On Error GoTo ErrHandl
Set cn = CreateObject("ADODB.Connection")
DoEvents 'ファイルOpen時の おまじない
cn.Open "Provider=Microsoft.ACE.OLEDB.16.0;WSS;IMEX=2;RetrieveIds=Yes;DATABASE=" & SharePointUrl & ";LIST=" & ListId & ";" 'プロバイダーは適宜変更
Set Adors = CreateObject("ADODB.Recordset")
On Error GoTo ErrHandl1
With Adors
DoEvents 'ファイルOpen時の おまじない
.Open "SELECT * FROM list Where ID =" & W_WFID, cn, adOpenDynamic, adLockOptimistic
.Fields.Item("ApplicationType") = UserForm1.U_申請区分.Value ' 申請区分
.Fields.Item("EMPID") = UserForm1.U_EMPID ' Sales peAdorson
.Fields.Item("Customer") = UserForm1.U_CusID ' Customer
.Fields.Item("Title") = UserForm1.U_Project.Value ' Project
.Fields.Item("StartDate") = UserForm1.U_StartDate.Value ' 開始日
.Fields.Item("EndDate") = UserForm1.U_EndDate.Value ' 終了日
.Fields.Item("ContractValue") = UserForm1.U_Value.Value ' 契約金額
.Update
End With
'11.処理時間の計測終了&メッセージ出力
WK_ENDTIME = Time
WK_ENDTIME = WK_ENDTIME - WK_STARTTIME
MsgBox "更新しました。処理時間は" & Minute(WK_ENDTIME) & "分" & Second(WK_ENDTIME) & "秒でした"
cn.Close
Set adoCn = Nothing 'オブジェクトの破棄
Set cn = Nothing 'オブジェクトの破棄
Exit Sub
Excel VBAにて 違うデータを更新してしまう件について質問させてください。
Excel VBAを使用して、SharePoint リストのデータ更新を行っていますが、
全く別のIDのデータを潰して上書きしてしまう時があります。
例えば 1のデータを読み込んで 開始日 終了日を更新したいとします。
すると 2のデータを上書きしてしまうのです。
例)
ID 顧客 案件名 金額 開始日 終了日
1 AAA XXX 300
2 BBB ZZZ 500
↓ 更新すると
ID 顧客 案件名 金額 開始日 終了日
1 AAA XXX 300
2 AAA XXX 300 2022/1/1 2022/3/31
となってしまいます。 次のデータを・・・というわけではなく 全く違うデータを上書きしてしまうのです。
でも毎回そうなるわけではなく 10件ぐらい続けて入れたときに変になる時がある・・・という感じなのです。 何がいけないのか分かりますでしょうか?
ロジックを一部抜粋で載せておきます。
ちなみに こちらのロジックは最新なのですが 上記現象が起きたときは、
Withが二重になっていました。
With Adors
With Userform1
~
End With
end with
これがいけないのでしょうか?
Dim cn As Object 'ADODB.Connection
'O365環境
Const SharePointUrl As String = "https://**************"
Const ListId As String = "{******-****-****-****-*******}" ' Sharepint List ID
Dim W_WFID As Long
W_WFID = UserForm1.U_WFID
'On Error GoTo ErrHandl
Set cn = CreateObject("ADODB.Connection")
DoEvents 'ファイルOpen時の おまじない
cn.Open "Provider=Microsoft.ACE.OLEDB.16.0;WSS;IMEX=2;RetrieveIds=Yes;DATABASE=" & SharePointUrl & ";LIST=" & ListId & ";" 'プロバイダーは適宜変更
Set Adors = CreateObject("ADODB.Recordset")
On Error GoTo ErrHandl1
With Adors
DoEvents 'ファイルOpen時の おまじない
.Open "SELECT * FROM list Where ID =" & W_WFID, cn, adOpenDynamic, adLockOptimistic
.Fields.Item("ApplicationType") = UserForm1.U_申請区分.Value ' 申請区分
.Fields.Item("EMPID") = UserForm1.U_EMPID ' Sales peAdorson
.Fields.Item("Customer") = UserForm1.U_CusID ' Customer
.Fields.Item("Title") = UserForm1.U_Project.Value ' Project
.Fields.Item("StartDate") = UserForm1.U_StartDate.Value ' 開始日
.Fields.Item("EndDate") = UserForm1.U_EndDate.Value ' 終了日
.Fields.Item("ContractValue") = UserForm1.U_Value.Value ' 契約金額
.Update
End With
'11.処理時間の計測終了&メッセージ出力
WK_ENDTIME = Time
WK_ENDTIME = WK_ENDTIME - WK_STARTTIME
MsgBox "更新しました。処理時間は" & Minute(WK_ENDTIME) & "分" & Second(WK_ENDTIME) & "秒でした"
cn.Close
Set adoCn = Nothing 'オブジェクトの破棄
Set cn = Nothing 'オブジェクトの破棄
Exit Sub
[返信 1] Re : Excel VBAにて 違うデータを更新してしまう件
投稿者 : tok 投稿日時 : 2022/05/23(Mon) 13:30:16
回答が付かないようなので気づきだけですが、
> Dim W_WFID As Long
これ有っていますか?
> .Open "SELECT * FROM list Where ID =" & W_WFID, cn, adOpenDynamic, adLockOptimistic
If .Fields.Item("ID") <> W_WFID Then
Stop
End If
> .Fields.Item("ApplicationType") = UserForm1.U_申請区分.Value ' 申請区分
入れてデバッグしてみたらいかがですか?
回答が付かないようなので気づきだけですが、
> Dim W_WFID As Long
これ有っていますか?
> .Open "SELECT * FROM list Where ID =" & W_WFID, cn, adOpenDynamic, adLockOptimistic
If .Fields.Item("ID") <> W_WFID Then
Stop
End If
> .Fields.Item("ApplicationType") = UserForm1.U_申請区分.Value ' 申請区分
入れてデバッグしてみたらいかがですか?
[返信 2] Re : Excel VBAにて 違うデータを更新してしまう件
投稿者 : ひろひろ 投稿日時 : 2022/05/23(Mon) 14:39:09
> If .Fields.Item("ID") <> W_WFID Then
> Stop
> End If
> 入れてデバッグしてみたらいかがですか?
>
上記を入れてやってみましたが、 値は =なので
STOPしません。
MCGBOXにてそれぞれの値を出してみましたが やはり一緒でした。
> If .Fields.Item("ID") <> W_WFID Then
> Stop
> End If
> 入れてデバッグしてみたらいかがですか?
>
上記を入れてやってみましたが、 値は =なので
STOPしません。
MCGBOXにてそれぞれの値を出してみましたが やはり一緒でした。
[返信 3] Re : Excel VBAにて 違うデータを更新してしまう件
投稿者 : 通りすがり 投稿日時 : 2022/05/23(Mon) 19:23:20
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11262203691
で同じ質問をしているようですが、そこでの修正前ソースの二重 Withは下記の記載。
> With Adors
> .Open "SELECT * FROM list Where ID =" & W_WFID
> With Userform1
> Adors.Fields.Item("ContractValue") = .U_Value.Value
> .Update
> End With
> End with
修正前ソースは Userform1.Update の処理をしていますけど、今回の修正ソースは Adors.Update の
処理をさせてますよね。(上記サイトでも同じ書き込みが有りましたけど。)
これが悪かったのか、他の修正に悪いところが有ったのかは知りませんが、まずは修正箇所を比較し、
何のために何故そのように変えたのかを調べて下さい。
修正した人も、修正の必要が有ったので直した(いい加減に書き換えた訳ではない)はずでは?
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11262203691
で同じ質問をしているようですが、そこでの修正前ソースの二重 Withは下記の記載。
> With Adors
> .Open "SELECT * FROM list Where ID =" & W_WFID
> With Userform1
> Adors.Fields.Item("ContractValue") = .U_Value.Value
> .Update
> End With
> End with
修正前ソースは Userform1.Update の処理をしていますけど、今回の修正ソースは Adors.Update の
処理をさせてますよね。(上記サイトでも同じ書き込みが有りましたけど。)
これが悪かったのか、他の修正に悪いところが有ったのかは知りませんが、まずは修正箇所を比較し、
何のために何故そのように変えたのかを調べて下さい。
修正した人も、修正の必要が有ったので直した(いい加減に書き換えた訳ではない)はずでは?
当掲示板について
- Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
- 記事内ではHTMLのタグは使用できません。
- 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
- Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
- Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
返信入力フォーム
( 処理日時 : 2022-07-07 12:38:08 )