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
作为一个更大项目的一部分,我正在开发一个表单,用户可以在其中将 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