ADODB Excel SQL оператор для записи в следующую доступную строку

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

Моя проблема в том, что теперь мне нужно ввести новую строку данных. Как он узнает, где его разместить? Код, который я использовал, всегда дает какую-то точку отсчета: пример:

rs.Open "Update [links$] Set [F" & arrLocals(i) & "]= '" & arrChangeData(i) & "' Where [F2] = '" & arrFormID(j) & "'", cn, adOpenStatic, adLockOptimistic

в соответствии с этим, это в значительной степени означает что-то делать с этой строкой, пока вы работаете с arrFormID(j) соответствующий столбец F2 , Но, если вы хотите новую строку, я не знаю, что есть, чтобы соответствовать?

2 ответа

Решение

Вам нужно использовать insert заявление. Операторы SQL, такие как insert, delete, а также update обычно не рассматриваются как операторы, возвращающие строки, поэтому обычно имеет смысл использовать Connection сам объект для выполнения операции, а не Recordset, Например:

Dim cn
Set cn = CreateObject("ADODB.Connection")
cn.Open "<your Excel connection string>"

cn.Execute "update [links$] set ... where ..."
cn.Execute "insert into [links$] values (...)"
cn.Execute "delete from [links$] where ..."

cn.Close

Самый основной insert оператор просто предоставляет значения для каждого столбца в вашей таблице / рабочей таблице, в той же последовательности столбцы появляются:

cn.Execute "insert into [links$] values ('col1value','col2value','col3value')"

Еще один способ сделать это - использовать интерфейс RecordSet, например:

Option Explicit

Const adCmdTable = 2
Const adLockBatchOptimistic = 4
Const adLockOptimistic = 3

dim ado, rs
set ado = CreateObject("ADODB.Connection")
set rs = CreateObject("ADODB.RecordSet")

ado.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=example.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
ado.Open
'ado.Execute "DROP TABLE Sheet1"
ado.Execute "CREATE TABLE Sheet1 (ID int, name VARCHAR)"
rs.Open "Sheet1", ado, , adLockOptimistic, adCmdTable 


dim i
for i = 0 to 4
    ' create a new record, populate the fields then update the data source
    rs.AddNew
    rs.Fields("ID").Value = i
    rs.Fields("name").Value = "Dave"
    rs.Update
next 'i

' also showing populating a dictionary to pass to update() instead
' of inserting into the record's fields directly
rs.AddNew

dim dict
set dict = CreateObject("Scripting.Dictionary")
dict("ID") = 99
dict("name") = "Geoff"

rs.Update dict.Keys(), dict.Items()

rs.Close
ado.Close

Дает тебе

ID | название
----------  
 0 | Дейв  
 1 | Дейв  
 2 | Дейв  
 3 | Дейв  
 4 | Дейв  
99 | Geoff
Другие вопросы по тегам