|
Option Explicit
'式自体を表示するにはいろいろな方法がある。 '[Ctrl][Shift]@を同時に押下。 'キーボードによってはできない。 Sub main() Dim レベル As Integer Dim 枝番 As Integer Dim ワークシート名 Dim wsheet As Worksheet Dim i As Integer Dim 関数があったフラグ As Boolean '解析する式にカッコがなければ終了。 If InStr(Worksheets("main").Range("A1").Formula, "(") = 0 Then MsgBox "関数がないので終了します。" Exit Sub End If '前回処理したワークシートなど余計なものがあれば削除。 Call 不要なワークシートの削除 'レベル01という名前の新しいワークシートを作成。 Set wsheet = 新しいワークシートを作成("レベル01") 'レベル1(一番外側の関数)で解析する。結果はワークシートレベル01に展開される。 レベル = 1 Call 解析(wsheet, Worksheets("main").Range("A1").Formula, レベル) 'ワークシートレベル01のレベル2以降を順次展開する。 '解析される関数が無くなる(内側のループの中で関数があったフラグがTrueにならない)になるまで繰り返す。 '同じレベルで複数の関数がある場合があるので、出現順に枝番を振る。 Do i = 5 '5行目から解析スタート。 関数があったフラグ = False レベル = レベル + 1 枝番 = 0 Do Until Worksheets("レベル01").Range("A" & i).Interior.Color = vbBlue If InStr(Worksheets("レベル01").Cells(i, レベル), "(") <> 0 Then 関数があったフラグ = True 枝番 = 枝番 + 1 ワークシート名 = "レベル" & Format(レベル, "00") & "_" & Format(枝番, "00") Set wsheet = 新しいワークシートを作成(ワークシート名) '関数があった行を解析する。 Call 解析(wsheet, Worksheets("レベル01").Cells(i, レベル), レベル) '解析された行を削除 Worksheets("レベル01").Rows(i).Delete '削除された部分に展開された行をコピー。 Call 書換(wsheet, i) End If i = i + 1 Loop Loop While 関数があったフラグ MsgBox "正常に終了しました。" End Sub (2020年12月21日 10時28分40秒)
Private Sub CommandButton1_Click()
Dim i As Integer Dim j As Integer Worksheets("Sheet2").Cells.ClearContents i = 1 j = 1 Do Until Worksheets("Sheet1").Cells(i, 1) = "" With Worksheets("Sheet1") If StrConv(Left(.Cells(i, 1), 6), vbUpperCase) = "SELECT" Then Call SELECT句の処理(i, j) ElseIf StrConv(Left(.Cells(i, 1), 12), vbUpperCase) = "UNION SELECT" Then Call UNIONSELECT句の処理(i, j) ElseIf StrConv(Left(.Cells(i, 1), 8), vbUpperCase) = "GROUP BY" Then Call GROUPBY句の処理(i, j) ElseIf StrConv(Left(.Cells(i, 1), 11), vbUpperCase) = "INSERT INTO" Then Call INSERTINTO句の処理(i, j) ElseIf StrConv(Left(.Cells(i, 1), 6), vbUpperCase) = "UPDATE" Then Call UPDATE句の処理(i, j) Else Worksheets("Sheet2").Cells(j, 1) = .Cells(i, 1) j = j + 1 End If i = i + 1 End With Loop Worksheets("Sheet2").Activate Worksheets("Sheet2").Range("A1").Select MsgBox "終了" End Sub (2021年03月03日 13時21分30秒)
Sub SELECT句の処理(i As Integer, j As Integer)
Dim wdata wdata = Split(Worksheets("Sheet1").Cells(i, 1), ", ") Worksheets("Sheet2").Cells(j, 1) = "SELECT " j = j + 1 If wdata(0) = "SELECT " Then Else Worksheets("Sheet2").Cells(j, 1) = Replace(wdata(0), "SELECT ", "") & "," j = j + 1 End If Call サブ(i, j, wdata) End Sub Sub UNIONSELECT句の処理(i As Integer, j As Integer) Dim wdata wdata = Split(Worksheets("Sheet1").Cells(i, 1), ", ") Worksheets("Sheet2").Cells(j, 1) = "UNION SELECT " j = j + 1 If wdata(0) = "SELECT " Then Else Worksheets("Sheet2").Cells(j, 1) = Replace(wdata(0), "UNION SELECT ", "") & "," j = j + 1 End If Call サブ(i, j, wdata) End Sub Sub GROUPBY句の処理(i As Integer, j As Integer) Dim wdata wdata = Split(Worksheets("Sheet1").Cells(i, 1), ", ") Worksheets("Sheet2").Cells(j, 1) = "GROUP BY " j = j + 1 If wdata(0) = "SELECT " Then Else Worksheets("Sheet2").Cells(j, 1) = Replace(wdata(0), "GROUP BY ", "") & "," j = j + 1 End If Call サブ(i, j, wdata) End Sub (2021年03月03日 13時22分05秒)
Sub INSERTINTO句の処理(i As Integer, j As Integer)
Dim wdata Dim k As Integer wdata = Split(Worksheets("Sheet1").Cells(i, 1), "( ") Worksheets("Sheet2").Cells(j, 1) = wdata(0) & " (" j = j + 1 wdata = Replace(Worksheets("Sheet1").Cells(i, 1), wdata(0) & "(", "") wdata = Split(wdata, ", ") For k = 0 To UBound(wdata) If k = UBound(wdata) Then Worksheets("Sheet2").Cells(j, 1) = wdata(k) Else Worksheets("Sheet2").Cells(j, 1) = wdata(k) & "," End If j = j + 1 Next End Sub Sub UPDATE句の処理(i As Integer, j As Integer) Dim k As Integer Dim wdata wdata = Split(Worksheets("Sheet1").Cells(i, 1), " SET ") Worksheets("Sheet2").Cells(j, 1) = wdata(0) & " SET " j = j + 1 wdata = Split(wdata(1), ", ") If UBound(wdata) = 0 Then Worksheets("Sheet2").Cells(j, 1) = wdata(0) Else Worksheets("Sheet2").Cells(j, 1) = wdata(0) & "," End If j = j + 1 Call サブ(i, j, wdata) End Sub Sub サブ(i As Integer, j As Integer, wdata) Dim k As Integer For k = 1 To UBound(wdata) If k = UBound(wdata) Then Worksheets("Sheet2").Cells(j, 1) = wdata(k) Else Worksheets("Sheet2").Cells(j, 1) = wdata(k) & "," End If j = j + 1 Next End Sub Private Sub CommandButton2_Click() ActiveSheet.Cells.ClearContents End Sub (2021年03月03日 13時22分40秒) |