VBA插入包含内容的行并编辑前一行和前一行

时间:2015-04-16 09:59:28

标签: sql-server excel vba

我将数据从Excel插入SQL数据库。我不能使用批量上传,因为数据不在服务器上,我也无法访问SSIS。我有直接从Excel插入数据库的VBA代码,但我有许多数据源,并希望有一个SQL查询来插入所有数据。

我已经处理了数据并使用CONCATENATE函数将其复制到SQL中,但是有1000行限制,因此我生成了以下代码(下面),每1,000行插入两行,并包含所需的SQL语句。

我现在需要在INSERT语句之前选择行,并在文本末尾添加一个分号,并选择VALUES语句后面的行并删除前导逗号。

有人可以帮忙吗?

Sub SQLInsert()
Dim sht As Worksheet
Dim LastRow As Long

Set sht = ThisWorkbook.Worksheets(Sheet7.Name)

LastRow = sht.Range("A1").CurrentRegion.Rows.Count

For i = LastRow To 1 Step -1000
Rows(i).Insert
Range("A" & i).Select
ActiveCell.FormulaR1C1 = "VALUES"
Rows(i).Insert
Range("A" & i).Select
ActiveCell.FormulaR1C1 = "INSERT INTO data.Table (A,B,C,D)"
Next i

End Sub

我对VBA比较新,所以如果有任何错误或不良做法,请更正我的代码。

编辑: 使用下面的R3UK代码后出现一个错误。运行代码后,我发现VALUES下面的单元格包含两个记录。例如: 如果在第10行上方插入值,则包含:,(框) 和第11行包含:,(杯) 值下的行现在包含:(Box)Cup) 所有其他行都没问题。

此外,代码在工作表的最后一个数据行上方添加了一个INSERT和VALUES行。这不是问题,但效率不高,是否有任何建议可以防止这种情况?

编辑:下面我已经包含了我正在运行的VBA代码的三个屏幕截图,之前突出显示了相关的单元格,并显示了错误。

vba script

Before running script

After running script

2 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你,因为我没有sql经验,而且我自己仍然是VBA新手,但如果我理解你,你想要: 1 - 在文本中添加半冒号 2 - 删除作为字符串

中第一个字符的逗号

所以,您可以通过简单地选择特定单元格并添加如下

来添加
Cells(rw,cl).Value = Cells(rw,cl).Value & ";"

其中rw是行号,cl是列号(你也可以使用字母,即“A”)

并通过操纵字符串删除前导逗号:

Cells(rw,cl).Value = Mid(Cells(rw,cl).Value,2)

答案 1 :(得分:0)

首先,我摆脱了Select,它们是贪婪的资源,在你看到的大部分代码中都没用。

然后我添加了删除逗号的代码(相同代码中的2个版本,选择你的代码)并添加一个分号:

Sub SQLInsert()
Dim sht As Worksheet, _
    LastRow As Long, _
    TempStart As String, _
    TempEnd As String, _
    TempCell As String


Set sht = ThisWorkbook.Worksheets(Sheet7.Name)

LastRow = sht.Range("A1").CurrentRegion.Rows.Count


For i = LastRow To 1 Step -1000
    sht.Cells(i , 1) = CStr(CStr(sht.Cells(i , 1)) & ";")
    'String variable to improve code efficiency
    TempCell = CStr(sht.Cells(i + 1, 1))
    If InStr(1, TempCell, ",") Then
        'Hardcore version : (if there is more than one "," it will delete all of them)
        'TempCell = Replace(TempCell, ",", "")

        'Clean version :
        If InStr(1, TempCell, ",") <> Len(TempCell) Then
            TempStart = Left(TempCell, InStr(1, TempCell, ",") + 1)
            TempEnd = Replace(TempCell, TempStart, "")
            TempStart = Replace(TempStart, ",", "")
            sht.Cells(i + 1, 1) = CStr(TempStart & TempEnd) 
        Else
            sht.Cells(i + 1, 1) = Left(TempCell, Len(TempCell) - 1)
        End If
    Else
        'Didn't find a comma in that cell
    End If

    DoEvents
    Rows(i + 1).Insert
    Range("A" & i + 1).FormulaR1C1 = "VALUES"
    Rows(i + 1).Insert
    Range("A" & i + 1).FormulaR1C1 = "INSERT INTO data.Table (A,B,C,D)"
Next i

End Sub