我知道这可能不是最佳做法,但我的公司用户有时会向我发送带有值的电子表格以生成手动SQL。我很想写出来。我正在制作一个他们填写的电子表格,其中包含表名,列和值。它几乎总是插入。如果你看下面你会看到我的列插入SQL,它基本上只是跨越行,并选择列名称,然后选择值。
但是,有时列数可能会有所不同。因此它可能不会进入P7,它可能只是O7或Z7。
有没有办法获取在某种函数中填充的所有列?
= "INSERT INTO "&B1&"("&A7&","&B7&","&C7&","&D7&","&E7&","&F7&","&G7&","&H7&","&I7&","&J7&","&K7&","&L7&","&M7&","&N7&","&O7&","&P7&") SELECT "&A8&","&B8&","&C8&","&D8&","&E8&","&F8&","&G8&","&H8&","&I8&","&J8&","&K8&","&L8&","&M8&","&N8&","&O8&","&P8&" "
谢谢!
答案 0 :(得分:0)
出于其他目的,我有一些非常相似的东西,但复杂程度更高。这就是我的代码的样子,也许你可以对你的文档提出一些想法。如果您需要任何附加信息,请告诉我。
Dim CounterA As Integer
For CounterA = 1 To Sheets.Count
Dim CounterB As Integer
CounterB = 0
Dim CounterC As Integer
CounterC = 0
Dim break As Boolean
break = False
Dim break1 As Boolean
break1 = False
'Loop all column names
Dim allColumns As String
allColumns = ""
CounterB = 0
Do
CounterB = CounterB + 1
ColumnName = Sheets.Item(CounterA).range(Utils.Col_Letter(CounterB) & 1).Value
If ColumnName = "" Then
break = True
Else
If allColumns = "" Then
allColumns = ColumnName
Else
allColumns = allColumns & ", " & ColumnName
End If
End If
Loop While Not break
CounterB = 1
break = False
'Loop all details
Do
CounterB = CounterB + 1
Dim firstValue As String
firstValue = Sheets.Item(CounterA).range("A" & CounterB).Value
If firstValue = "" Then
break1 = True
Else
'Loop all columns of a detail
Dim allDetailValues As String
allDetailValues = ""
CounterC = 0
break = False
Do
CounterC = CounterC + 1
ColumnValue = Sheets.Item(CounterA).range(Utils.Col_Letter(CounterC) & CounterB).Text
ColumnName = Sheets.Item(CounterA).range(Utils.Col_Letter(CounterC) & 1).Value
ColumnValue = RTrim(ColumnValue)
ColumnValue = Replace(ColumnValue, "'", "''")
If ColumnName = "" Then
break = True
Else
If allDetailValues = "" Then
allDetailValues = "'" + ColumnValue + "'"
Else
If ColumnValue <> "null" Then ColumnValue = "'" & ColumnValue & "'"
allDetailValues = allDetailValues & ", " & ColumnValue
End If
End If
Loop While Not break
Dim insertValid As Boolean
insertValid = InsertRecord(CS, libb_dest, Sheets.Item(CounterA).Name, allColumns, allDetailValues)
If Not insertValid Then
Exit Sub
End If
End If
Loop While Not break1
Next
ps,你可能也需要这个
Public Function Col_Letter(ByVal lngCol As Long) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
Col_Letter = vArr(0)
End Function