VBA 用逗号重新格式化字符串

VBA re-format string with commas

作为一个更大项目的一部分,我正在开发一个表单,用户可以在其中将 SQL 粘贴到文本框中,然后单击各种按钮来更改其中的内容。

比如全部转成小写,一个去掉--和/* */注释,一个去掉换行符(在一些没有处理好这些的场景下很有用)。

最后一个采用未格式化的字符串(就像我把行断开的字符串一样)并使其可读。

到目前为止,我已经在一个函数中得到了以下内容,该函数对一些关键字非常有效(我不是在寻找一个详尽的功能,只是一个可以帮助用户的功能):

Function FormatSQL(str As String) As String

SSelect:
Do Until InStr(LCase(str), " select ") = 0
    str = Replace(LCase(str), " select ", vbCrLf & "select ")
Loop

BSelect:
Do Until InStr(LCase(str), "(select ") = 0
    str = Replace(LCase(str), "(select ", "(" & vbCrLf & "select ")
Loop

From:
Do Until InStr(LCase(str), " from ") = 0
    str = Replace(LCase(str), " from ", vbCrLf & "from ")
Loop

Where:
Do Until InStr(LCase(str), " where ") = 0
    str = Replace(LCase(str), " where ", vbCrLf & "where ")
Loop

Having:
Do Until InStr(LCase(str), " having ") = 0
    str = Replace(LCase(str), " having ", vbCrLf & "having ")
Loop

GroupBy:
Do Until InStr(LCase(str), " group by ") = 0
    str = Replace(LCase(str), " group by ", vbCrLf & "group by ")
Loop

OrderBy:
Do Until InStr(LCase(str), " order by ") = 0
    str = Replace(LCase(str), " order by ", vbCrLf & "order by ")
Loop

FormatSQL = str
End Function

我最不想做的事情就是处理这样的事情:

select column1, column2, column3, column4 from table;

我希望它是:

select column1,

column2,

column3,

column4

from table;

我正在努力使用逗号,因为可能这些逗号后面可能有一个 space,或者它们可能会直接进入下一个字母数字值。我也意识到会有一些情况,例如 ','"," 我不想插入换行符。

这几乎就像我的 instr 必须是 ", {anyalphanumeric}"",{anyalphanumeric}" 但我正在努力寻找实现它的好方法。

如有任何想法/建议,我们将不胜感激。

我的解决方案是创建这个函数:

Function bIsAlphaNumeric(str As String) As Boolean
If (Asc(LCase(str)) >= 97 And Asc(LCase(str)) <= 122) Or IsNumeric(str) Then
    bIsAlphaNumeric = True
Else
    bIsAlphaNumeric = False
End If
End Function

我的主要功能现在是:

Function FormatSQL(str As String) As String
Dim x As Double, y As Double

Commas:
y = Len(str)
For x = 1 To y
    If Mid(str, x, 1) = "," Then
        y = x
        If Mid(str, x + 1, 1) = " " Then
            'Look at x+2
            If bIsAlphaNumeric(Mid(str, x + 2, 1)) Then
                'Convert x+1 to linebreak
                str = Left(str, x) & vbCrLf & Mid(str, x + 2)
            End If
        Else
            'Look at x+1
            If bIsAlphaNumeric(Mid(str, x + 1, 1)) Then
                'Convert x+1 to linebreak
                str = Left(str, x) & vbCrLf & Mid(str, x + 1)
                y = y + 1
            End If
        End If
    End If
Next x

SSelect:
Do Until InStr(LCase(str), " select ") = 0
    str = Replace(LCase(str), " select ", vbCrLf & "select ")
Loop

BSelect:
Do Until InStr(LCase(str), "(select ") = 0
    str = Replace(LCase(str), "(select ", "(" & vbCrLf & "select ")
Loop

From:
Do Until InStr(LCase(str), " from ") = 0
    str = Replace(LCase(str), " from ", vbCrLf & "from ")
Loop

Where:
Do Until InStr(LCase(str), " where ") = 0
    str = Replace(LCase(str), " where ", vbCrLf & "where ")
Loop

Having:
Do Until InStr(LCase(str), " having ") = 0
    str = Replace(LCase(str), " having ", vbCrLf & "having ")
Loop

GroupBy:
Do Until InStr(LCase(str), " group by ") = 0
    str = Replace(LCase(str), " group by ", vbCrLf & "group by ")
Loop

OrderBy:
Do Until InStr(LCase(str), " order by ") = 0
    str = Replace(LCase(str), " order by ", vbCrLf & "order by ")
Loop

aand:
Do Until InStr(LCase(str), " and ") = 0
    str = Replace(LCase(str), " and ", vbCrLf & "and ")
Loop

oor:
Do Until InStr(LCase(str), " or ") = 0
    str = Replace(LCase(str), " or ", vbCrLf & "or ")
Loop

FormatSQL = str
End Function