Импорт 200000 строк в Excel в SQL с помощью макроса VBA
У меня проблема при передаче информации из Excel в SQL с помощью макроса.
Когда вы запускаете макрос, файл начинает загружать строки, но внезапно останавливается со следующей ошибкой "Overflow (6)", и это приводит к обработке каждых 32676 строк.
Сначала я думал, что это было что-то в записях, но когда я возвращаюсь к исполнению, предложение начинается снова и снова останавливается на записи 32676,
Я пытаюсь загрузить файл Excel с более чем 200000 строк, каждая запись состоит из 25 столбцов.
Я могу сделать что-то не так, чтобы это произошло.
Я делюсь кодом транзакции.
Private Sub CommandButton1_Click()
Dim conn As New ADODB.Connection
conn.CommandTimeout = 0
Dim iRowNo As Integer
Dim PK_ID As String, CUST_ID As Long, DOC_TYPE As String, BILL_DOC As Long, REFERENCE As String, INV_CON As String, ORDER_SALER As String, INV_REF As String, DOC_NUM As Long, GL As Long, DOC_DATE As Double, DUE_DATE As Double, ECURRENCY As String, DOC_AMNT As Currency, USD_AMNT As Currency, PAY_TERM As String
With Sheets("ONREPSAP")
'Abrimos conexion con el SQL server
conn.Open "Provider=SQLOLEDB;Data Source=,1433;Initial Catalog=AmericanMovil;User ID=;Password=;Encrypt=True;"
'Omitimos la linea de encabezados
iRowNo = 2
'Loop until empty cell in CustomerId
Do Until .Cells(iRowNo, 1) = ""
PK_ID = .Cells(iRowNo, 1)
CUST_ID = .Cells(iRowNo, 2)
DOC_TYPE = .Cells(iRowNo, 3)
BILL_DOC = .Cells(iRowNo, 4)
REFERENCE = .Cells(iRowNo, 5)
INV_CON = .Cells(iRowNo, 6)
ORDER_SALES = .Cells(iRowNo, 7)
INV_REF = .Cells(iRowNo, 8)
DOC_NUM = .Cells(iRowNo, 9)
GL = .Cells(iRowNo, 10)
DOC_DATE = .Cells(iRowNo, 11)
DUE_DATE = .Cells(iRowNo, 12)
ECURRENCY = .Cells(iRowNo, 13)
DOC_AMNT = .Cells(iRowNo, 14)
USD_AMNT = .Cells(iRowNo, 15)
PAY_TERM = .Cells(iRowNo, 16)
'Generamos y ejecutamos la QUERY SQL para importar las lineas de excel a SQL
conn.Execute "insert into dbo.ONREPSAP (PK_ID, CUST_ID, DOC_TYPE, BILL_DOC, REFERENCE, INV_CON, ORDER_SALES, INV_REF, DOC_NUM, GL, DOC_DATE, DUE_DATE, ECURRENCY, DOC_AMNT, USD_AMNT, PAY_TERM) values ('" & PK_ID & "', '" & CUST_ID & "', '" & DOC_TYPE & "', '" & BILL_DOC & "', '" & REFERENCE & "', '" & INV_CON & "', '" & ORDER_SALES & "', '" & INV_REF & "', '" & DOC_NUM & "', '" & GL & "', '" & DOC_DATE & "', '" & DUE_DATE & "', '" & ECURRENCY & "', '" & DOC_AMNT & "', '" & USD_AMNT & "', '" & PAY_TERM & "')"
iRowNo = iRowNo + 1
Loop
MsgBox "Reporte Cargado Correctamente | The report has finish to Uploading"
conn.Close
Set conn = Nothing
End With
End Sub
В Отладке VBA выбирает iRowNo + 1 перед "Циклом"
1 ответ
Как сказал @Comintem, вам нужно изменить тип для хранения больших значений.
Вы должны объявить Dim iRowNo As Long
вместо Integer
Здесь Сводка Типа данных
Integer uses 2 bytes and Range from -32,768 to 32,767
Long uses 4 bytes and Range from -2,147,483,648 to 2,147,483,647