社内SEの徒然なる日記

NetCOBOLのソース編集をExcelマクロで作ってみた(専用関数)

初めに

※ 本記事は、ExcelマクロでCOBOLソースを自動編集させるマクロを作る記事の第3話です。

専用関数

今回は、commonLocalモジュールを作成します。

まず、SQL節の開始と終了を判断する必要があります。
なので、開始と終了を判断する関数を用意します。

これが、開始を判断する関数です。
いろいろとやっていますが、要するに「EXEC SQL」であればTrueを返却しています。

' 機能 : COBOLソース解析(SQL宣言の開始判定)
'
' 返り値 : TRUE - SQL宣言開始 , FALSE - SQL宣言では無い
'
' 引き数 : pLine - 判定する行(文字列)
'
' 機能説明 : 引数として受け取ったコードがSQL宣言の開始(EXEC SQL)をしているかを取得する関数
'
' 備考 :
'

Public Function ExecSqlStartChk(ByVal pLine As String) As Boolean

Dim myLen As Integer
Dim myNum As Integer
Dim myWorkStr As String

myLen = Len(RTrim(pLine))

'規定桁数以下
If myLen < 16 Then
GoTo falseEnd
End If

'コメント行判断
If Mid(pLine, 7, 1) = "*" Then
GoTo falseEnd
End If

If InStr(1, pLine, " EXEC ") > 0 _
And InStr(1, pLine, " SQL") > 0 _
And InStr(1, pLine, " EXEC ") < InStr(1, pLine, " SQL") Then

'EXEC の 次は SQL がある
myWorkStr = Mid(pLine, InStr(1, pLine, " EXEC ") + 5, (InStr(1, pLine, " SQL") + 1) - (InStr(1, pLine, " EXEC ") + 5))
If Trim(myWorkStr) <> "" Then
GoTo falseEnd
End If

'単一コメント行制御
If InStr(1, pLine, "*>") > 0 _
And InStr(1, pLine, "*>") < InStr(1, Trim(pLine), "EXECSQL") Then
GoTo falseEnd
End If

myNum = InStr(1, pLine, " SQL")
If myLen > myNum + 3 Then
If Mid(pLine, myNum + 4, 1) = " " Then
GoTo trueEnd
Else
GoTo falseEnd
End If
Else
GoTo trueEnd
End If
End If

GoTo falseEnd

trueEnd:
ExecSqlStartChk = True
Exit Function
falseEnd:
ExecSqlStartChk = False
Exit Function
End Function


上記の、ExecSqlStartChk関数の対になる関数です。
SQL節の終了、つまり「END-EXEC」であれば、Trueを返す関数です。

' 機能 : COBOLソース解析(SQL宣言の終了)
'
' 返り値 : TRUE - SQL宣言終了 , FALSE - SQL宣言終了ではない
'
' 引き数 : pLine - 判定する行(文字列)
'
' 機能説明 : 引数として受け取ったコードがSQL宣言の終了(END-EXEC)をしているかを取得する関数
' :
' : ①コード中に END-EXECが存在する場合はTrue(END-EXECの前には1文字の半角スペースがある)
' : ② ①の例外として、END-EXECが7文字(連続番号領域・標識領域)にかかっている場合はFalse
' : ③ ①の例外として、END-EXECの後は空白、.(ピリオド)、*>(単一行コメント)以外の場合はFalse
' : ④ 対象行がコメント行、又は単一コメント宣言移行の場合はFalse
'
' 備考 :
'

Public Function ExecSqlEndChk(ByVal pLine As String) As Boolean

Dim myLen As Integer
Dim myNum As Integer

myLen = Len(RTrim(pLine))

myNum = InStr(1, pLine, " END-EXEC")

If myNum > 6 And myLen >= 16 Then
If Mid(pLine, 7, 1) = "*" Then
ExecSqlEndChk = False
Else
If InStr(1, pLine, "*>") > 0 And InStr(1, pLine, "*>") < myNum Then
ExecSqlEndChk = False
Else
If myLen > myNum + 8 Then
If Mid(pLine, myNum + 9, 1) = "." Then
ExecSqlEndChk = True
Else
If Mid(pLine, myNum + 9, 2) = "*>" Then
ExecSqlEndChk = True
Else
ExecSqlEndChk = False
End If
End If
Else
ExecSqlEndChk = True
End If
End If
End If
Else
ExecSqlEndChk = False
End If

End Function


もうひとつ、関数を準備します。
COBOLの特徴のひとつである連続番号領域の値を生成する関数です。
基本機能としては単純で、引数で受けた値に10を加算しているだけです。
ただし、連番を使用しないパターンにも対応させています。

' 機能 : COBOLソース用の連番生成
'
' 返り値 : 引数で与えられた連番に10を加算した値。
' : 6桁になるように先頭に0埋めして返却される。
' : ただし、引数「pNoSpaceFlg」がTrueの場合、6桁のスペースを返却する。
'
' 引き数 : pNo - 連番の現在地
' : pNoSpaceFlg - True:連番を生成しない、False:連番を生成する
'
' 機能説明 : 引数として連番に10を加算した値を返します。
'
' 備考 :
'

Public Function cobolNoAdd(ByRef pNo As String, ByRef pNoSpaceFlg As Boolean) As String

'連番を設定しない場合は、空白を返却
If pNoSpaceFlg Then
cobolNoAdd = " "
Exit Function
End If

'計算用の変数
Dim myNo As Long

'未設定の場合は0で補正
If pNo = "" Then
pNo = "000000"
End If

'長整数方に変換して 10 を加算
myNo = CLng(pNo)
myNo = myNo + 10

'6桁になるように先頭0埋めして返却
pNo = String(6 - Len(CStr(myNo)), "0") & CStr(myNo)
cobolNoAdd = pNo

End Function


第1話(概要): NetCOBOLのソース編集をExcelマクロで作ってみた(概要)
第2話(共通関数): NetCOBOLのソース編集をExcelマクロで作ってみた(共通関数)
第3話(専用関数): この記事です
第4話(Cobolソース編集) : NetCOBOLのソース編集をExcelマクロで作ってみた(Cobolソース編集)
第5話(実行結果) : NetCOBOLのソース編集をExcelマクロで作ってみた(実行結果)

投稿記事の一覧:目次

次回

次回は、いよいよ本命のOrthographyEditメソッドです。

元々が自分のためだけに作ったマクロなのでしかたないのですが、ところどころに、褒められたものじゃない書き方がありますね。
ExecSqlEndChkなんかは、ロジック中にコメントがひとつもないし。

まぁ、難しいことはしていない(つもり)ので、追えるとは思いますけどね。
スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する