2013-07-22 2 views
0

ОК, поэтому у меня есть VBA, который я хочу использовать для обновления и добавления данных в таблицу на SQL-сервере. Я весь день путался с ограниченным знанием этой функциональности в VBA, занимался поиском различных сайтов и не получал никаких ответов, чтобы сделать что-то на месте и не получал ответа при публикации в другом месте. Надеюсь, я смогу решить эту проблему.Изменение и добавление таблиц SQL с помощью Excel 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: Это в настоящее время выкидывает ошибку в «С 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: Как мое знание VBA для соединения ADODB ужасно, в лучшем случае, я не могу понять, как продолжить, как только я нашел строку я требую, отсюда " «Сделай что-нибудь». Мне нужно это, чтобы найти запись, сопоставленную с столбцом B в таблице «Изменить» excel, а затем отредактировать эту строку в таблице 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 

Любая помощь люди могли бы дать с этим было бы удивительным.

Приветствия

Бен

EDIT: Я это из 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" 

Это для полной линии (так поэтому список полей не требуется, так как это данные для каждого столбца в правильном порядке).

+0

Просьба уточнить вашу конкретную проблему или добавить дополнительные сведения, чтобы точно указать, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. –

+0

Addnew принимает два аргумента: http://msdn.microsoft.com/en-us/library/windows/desktop/ms677536(v=vs.85).aspx – dennythecoder

+0

@mehow, я немного изменил его, чтобы объяснить, что я становясь немного лучше. – bmgh1985

ответ

0

Опубликуйте это сейчас, а не в понедельник, иначе я могу забыть.

Законченный, будучи самым аккуратным решением, поскольку работа с массивами в этом случае, похоже, сильно терпит неудачу, и их гораздо сложнее отладить. Это, по крайней мере, сделало это намного проще.

Кроме того, было хорошо узнать, что, как только вы нашли строку (мой часть 2 вопроса), что фактически это тот же процесс, как и с .addnew (что было то, что я не был уверен)

With conn 
    .ConnectionString = "Driver={SQL Server};server=sage;Database=CS3Live;Uid=sa;Pwd=pass; ReadOnly=False;""" 
    .Open 
    End With 
recset.Open Source:="custinfosheetdata", ActiveConnection:=conn, CursorType:=adOpenKeyset, LockType:=adLockOptimistic 

If Sheets("Changes").Range("A1").Value <> 0 Then 
    For i = 3 To LastRow 
     With recset 
      .Find "Col2 = " & "'" & Sheets("Changes").Range("B" & i) & "'" 
      For k = 1 To 38 
       strField = Sheets("Changes").Cells(2, k).Value 
       varValue = Sheets("Changes").Cells(i, k).Value 
       .Fields(strField).Value = varValue 
      Next k 
      .Update 
     End With 
    Next i 
Else 
i = 0 
End If 

If Sheets("New").Range("A1").Value <> 0 Then 
    For j = 3 To LastRow 
     With recset 
      .AddNew 
      For k = 1 To 38 
       strField = Sheets("New").Cells(2, k).Value 
       varValue = Sheets("New").Cells(j, k).Value 
       .Fields(strField).Value = varValue 
      Next k 
      .Update 
     End With 
    Next j 
Else 
j = 0 
End If 
... etc 

Так или иначе, спасибо всем, кто пытался помочь здесь. Я все еще не могу понять, почему массивы не работают.

2

Из того, что вы опубликовали, я считаю, что вы пытались объединить все значения в строку, разделенную ','. (исправьте меня, если я ошибаюсь)

Этот ответ полезен только в том случае, если вы хотите добавить новые данные, если хотите найти конкретную запись в базе данных и обновить ее, тогда это совершенно другая история.

Метод «Добавить новый» принимает два аргумента.

  1. Список полей в виде массива
  2. список значений в виде массива

Если у вас есть только одно поле или одно значение для добавления вы должны поместить их в массив перед использованием " Добавить новый ".

Возможный способ построения массивов:

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 

Позвольте мне знать, если это помогает!

+0

Да, верно, я контактирую там. Добавление новых данных - это то, что я делаю в этой части. Код фактически находится в двух отдельных частях. Один делает изменения, один делает новые данные для добавления. Я попробую добавить поля к уже имеющейся строке данных, но поскольку я устанавливаю полную строку с правильными столбцами, это не должно иметь значения. – bmgh1985

+0

Боюсь, что это не имеет никакого значения после того, как вы его применили. – bmgh1985

+0

+1 для вашего кода. Другая возможность - использовать параметризованные объекты Command. См. Http://support.microsoft.com/kb/181734 о том, как создавать команды с параметрами ADO. – Tarik

Смежные вопросы