Excel / VBA:如何使用正确的字符串格式粘贴SQL查询

时间:2010-10-01 23:10:56

标签: sql string excel vba excel-vba

我一直在记事本中编写一些非常长的SQL查询,然后将它们原样粘贴到我的VBA代码中,然后一次正确地格式化每行的多行字符串。例如......

在我的文本编辑器中,查询看起来像这样。

SELECT 
      a,
      b,
      c,
      ...,
      n
FROM
      table1,
      table2,
      ...,
      tableN
WHERE
      etc

然后将其粘贴到VBA编辑器中并手动添加 sqlStr = sqlStr& “......”到每一行。

sqlStr = "               SELECT "
sqlStr = sqlStr & "          a,"
sqlStr = sqlStr & "          b,"
sqlStr = sqlStr & "          c,"
sqlStr = sqlStr & "          ...,"
sqlStr = sqlStr & "          n"
sqlStr = sqlStr & "      FROM"
sqlStr = sqlStr & "          table1,"
sqlStr = sqlStr & "          table2,"
sqlStr = sqlStr & "          ...,"
sqlStr = sqlStr & "          tableN"
sqlStr = sqlStr & "      WHERE"
sqlStr = sqlStr & "          etc"

有没有人知道一个工具可以让我自动将VBA字符串包装在我的查询周围(而不是手动添加)?我想在那里有一个网站,但我找不到它。

我可以在Vi中安装一些东西,但我不能保证我会在我有权安装Vi的计算机上执行此操作。

任何帮助表示赞赏!感谢。

6 个答案:

答案 0 :(得分:6)

您可能需要查看 SQLinForm 。在其他格式中,它允许您格式化SQL以在VB / VBA中使用

答案 1 :(得分:4)

您不需要在每一行都sqlStr = sqlStr &。只需继续这样的声明:

sqlStr = "SELECT a, b, c,..., n " & _
         "  FROM table1, table2,..., tableN " & _
         " WHERE etc"

这样一条语句最多可以有25行。

此外,我不认为你通过在单独的行上格式化每个项目的长查询来为自己做任何好处。我采取了一种更温和的方法,试图在不使用太多线条的情况下显示更多结构。这是最近一个项目的一些代码。 (它用于为组合框设置RowSource)

q = "SELECT NurseID, NurseName FROM " & _
    " (SELECT DISTINCT 0 as NurseID,  '-- choose nurse --' as NurseName FROM tblNurse) " & _
    "UNION " & _
    " (SELECT DISTINCT N.NurseID AS NurseID, FirstName & ' ' & LastName AS NurseName " & _
    "  FROM tblNurse AS N INNER JOIN tblBookings AS B" & _
    "  ON N.NurseID=B.NurseID " & _
    "  WHERE B.BDate >= " & Date_To_SQL(txtStartDate) & _
    "    AND B.BDate <= " & Date_To_SQL(txtEndDate) & ") " & _
    "ORDER BY NurseName"

这也演示了使用别名来缩短SQL的可读性。 在VBA编辑器中插入所有引号和“&amp; _”非常快,如果你把它们放在剪贴板中并使用鼠标和键盘点击,Ctrl-V,点击,Ctrl-V在行中向下嗡嗡声

答案 2 :(得分:1)

快速而肮脏的解决方案:

将文本复制到干净电子表格的单元格A1中。每条线将落在从A1开始的单元格中。

In B1 put ="sqlString ="""&A1&""""
In B2 put ="sqlString=sqlString&"""&A2&""""

将B2复制/拖动到文本列的末尾。

将结果列B复制并粘贴到您的代码中。

您还可以将sql片段直接编辑到空白Excel工作表的A列而不是记事本中,然后保存一个步骤。

如果您更愿意使用代码,此VBA将从A列创建B列:

Option Explicit

Public Sub makeSqlStmt()
    Dim r
    Dim n
    Dim i
    Const s = "sqlString = """
    Const t = "sqlString = sqlString & """
    Set r = Range("a1")
    Range("B1") = s & r & """"
    n = r.CurrentRegion.Rows.count
    For i = 1 To n - 1
        r.Offset(i, 1) = t & r.Offset(i, 0) & """"
    Next i
End Sub

如果您想直接从记事本文件中取出,可以用代码替换For循环来读取文件。

答案 3 :(得分:0)

任何具有宏/记录功能的文本编辑器都可以让你自动化它 - VS.NET,TextPad,Notepad ++。对于,最后一次看到:Notepad++ Macros

答案 4 :(得分:0)

如果你正在做VBA,你可能会安装Excel。

您可以编写一个电子表格,将SQL粘贴到A列,然后使用CONCATENATE() excel公式函数添加VBA代码。然后,您只需将其复制并粘贴到您的应用中即可。

答案 5 :(得分:0)

这是由Instant SQL Formatter(免费在线sql格式化程序)

自动生成的结果
var1 = ""
var1 = var1 & "SELECT a, " & vbCrLf
var1 = var1 & "       b, " & vbCrLf
var1 = var1 & "       c " & vbCrLf
var1 = var1 & "FROM   table1, " & vbCrLf
var1 = var1 & "       table2, " & vbCrLf
var1 = var1 & "       tablen " & vbCrLf
var1 = var1 & "WHERE  a > 1 "