SQL サーバー上のテーブルにデータを更新および追加するために使用したい VBA があります。私は一日中、VBA 内のこの機能に関する限られた知識でぐちゃぐちゃになっていて、さまざまなサイトを検索しましたが、クリックして配置するための答えが得られず、他の場所に投稿しても応答が得られませんでした。うまくいけば、ここでこれを解決できます。
それで、私は一緒に石畳にした次のコードを持っています:
Sub connectsqlserver()
Dim conn As ADODB.Connection
Dim recset As ADODB.Recordset
Set conn = New ADODB.Connection
Set recset = New ADODB.Recordset
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim msgstrng As String
Dim newstring As String
If conn.State <> 0 Then
conn.Close
End If
With conn
.ConnectionString = "Driver={SQL Server};server=sage500;Database=CS3Live;Uid=sa;Pwd=pass; ReadOnly=False;"""
.ConnectionTimeout = 5
.Open
End With
recset.Open Source:="custinfosheetdata", ActiveConnection:=conn, CursorType:=adOpenKeyset, LockType:=adLockOptimistic
If Sheets("Changes").Range("A1").Value <> 0 Then
For i = 1 To Sheets("Changes").Range("A1").Value
recset.Find "Col2 = " & Sheets("Changes").Cells(2, i + 2) 'find the value in B from B3 onwards
'Do something
Next i
Sheets("Changes").Rows("3:" & i + 2).Delete xlUp
Else
i = 0
End If
If Sheets("New").Range("A1").Value <> 0 Then
For j = 1 To Sheets("New").Range("A1").Value
newstring = ""
For k = 1 To 38
If k = 38 Then
newstring = newstring & "'" & Cells(j + 2, k).Value & "'"
Else
newstring = newstring & "'" & Cells(j + 2, k).Value & "', "
newstring = Format(newstring, "")
End If
Next k
Debug.Print (newstring)
With recset
.AddNew (newstring)
.Update
End With
Next j
Sheets("New").Rows("3:" & j + 2).Delete xlUp
Else
j = 0
End If
recset.Close
conn.Close
If i = 0 And j = 0 Then
msgstring = "No Changes/New Data to add"
Else
If i = 0 And j <> 0 Then
msgstring = "No Changes and " & j & " New Customers added"
Else
If i <> 0 And j = 0 Then
msgstring = i & " Changes and no New Customers added"
Else
msgstring = i & " Changes and " & j & " New Customers added"
End If
End If
End If
End Sub
パート 1: これは現在、"With recset.AddNew..." (3001) で引数の型が間違っているというエラーをスローします。対象のテーブルは nvarchar(255) としてフォーマットされ、すべてのデータはさまざまなフィールドでテキストとしてフォーマットされるため、そこで何が起こっているのか完全にはわかりません。
パート 1 コード:
If lastrow <> 0 Then
For j = 1 To lastrow
For k = 1 To lastfield
If k = lastfield Then
newstring = newstring & "'" & Cells(j + 2, k).Value & "'"
Else
newstring = newstring & "'" & Cells(j + 2, k).Value & "', "
newstring = Format(newstring, "")
End If
Next k
With recset
.AddNew (newstring)
.Update
End With
Next j
End If
パート 2: ADODB 接続用の VBA に関する私の知識はせいぜいひどいものであるため、必要な行が見つかった後、続行する方法がわかりません。私がこれを行う必要があるのは、「変更」Excel テーブルの列 B から一致するレコードを見つけ、それと一致するように SQL テーブルのその行を編集することです。しかし、これを行う方法がわかりません。パート 2 コード:
If lastrow <> 0 Then
For i = 1 To lastrow
recset.Find "Col2 = " & Sheets("Changes").Cells(2, i + 2) 'find the value in B from B3 onwards
' Do something
Next i
End If
編集:私は debug.print からこれを持っています。これは、一部の人々がこれをもう少し視覚化するのに役立つかもしれません:
"23/07/13","TEST123","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test","Test"
これは行全体です (したがって、これは正しい順序ですべての列のデータであるため、フィールド リストは必要ありません)。