0

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"

これは行全体です (したがって、これは正しい順序ですべての列のデータであるため、フィールド リストは必要ありません)。

4

2 に答える 2

2

あなたが投稿した内容から、すべての値を「,」で区切られた文字列に連結しようとしていると思います。(間違っていたら訂正してください)

この回答は、新しいデータを追加する場合にのみ役立ちます。データベース内の特定のレコードを見つけて更新する場合は、まったく別の話です。

「Add New」メソッドは 2 つの引数を取ります。

  1. 配列形式のフィールドのリスト
  2. 配列形式の値のリスト

追加するフィールドまたは値が 1 つしかない場合を除き、「新規追加」メソッドを使用する前にそれらを配列に入れる必要があります。

配列を構築する可能な方法:

For i = 0 to count_of_fields
    aryFields(i) = field_value
Next
For i = 0 to count_of_values
    aryValues(i) = value
Next
recset.AddNew aryFields,aryValues
recset.Update

それが役立つかどうか教えてください!

于 2013-07-22T14:32:45.987 に答える