VBAで、VBAのプログラムをVBSに変換したいと思います。
日本語変数に"[ ]"を付ける処理で、日本語変数名が★○・★○▲のような、
一方が他方に含まれるような関係だと、処理がうまくいきません。
どのようにすればよいでしょうか。
よろしくお願いします。
1行で複数の変数を宣言することはありません。
エクセルのバージョンは2013です。
VBA
1Option Explicit 2 3Dim zenkakuVals As Object 4 5Private Sub vba2vbs() 6 Dim fileName As String 7 Dim buf As String 8 Dim myDic As Object 9 Set myDic = CreateObject("Scripting.Dictionary") 10 Dim cnt As Long 11 cnt = 1 12 Set zenkakuVals = CreateObject("Scripting.Dictionary") 13 14 'ファイルは".vbs"形式で保存したものを読み込む 文字コードはANSIで保存しておく 15 fileName = Application.GetOpenFilename("vbsファイル,*.vbs") 16 If fileName = "False" Then Exit Sub 17 Open fileName For Input As #1 18 19 '読み込んだプログラムを一行づつ処理する 20 '(変数宣言の"As"以降を取る、日本語変数があればリストに追加する処理をする) 21 Do Until EOF(1) 22 Line Input #1, buf 23 buf = henkan(buf) 24 myDic.Add cnt, buf 25 cnt = cnt + 1 26 Loop 27 Close #1 28 29 '日本語変数をエクセルシート上に貼り付け、文字列長にソートする★★★編集★★★ 30 WS1.Cells(1, 2).Resize(zenkakuVals.Count, 1).Value = Application.Transpose(zenkakuVals.Keys) 31 WS1.Cells(1, 1).Resize(zenkakuVals.Count, 1).Formula = "=Len(B1)" 32 WS1.Sort.SortFields.Clear 33 WS1.Sort.SortFields.Add Key:=WS1.Range("A1"), Order:=xlAscending 34 WS1.Sort.SetRange WS1.Range("A1").CurrentRegion 35 WS1.Sort.Header = xlNo 36 WS1.Sort.Apply 37 WS1.Cells(1, 3).Resize(zenkakuVals.Count, 1).Formula = "=""変数"" & Row()" 38 39 '日本語変数と変数Noを文字列長順に配列に代入する 40 Dim tempHensu() As Variant 41 tempHensu = WS1.Cells(1, 2).Resize(zenkakuVals.Count, 2).Value 42 43 44 'プログラムの各行で、文字列長の長い順に日本語変数を検索し、出現すれば、一時置換用の文字列に置き換える 45 For cnt = 1 To myDic.Count 46 For i = UBound(tempHensu) To 1 Step -1 47 If InStr(myDic(cnt), tempHensu(i, 1)) > 0 Then 48 myDic(cnt) = Replace(myDic(cnt), tempHensu(i, 1), tempHensu(i, 2)) 49 End If 50 Next 51 Next 52 53 '一時置換用の文字列が出現すれば、対応する日本語変数に"[ ]"付きで変換する 54 For cnt = 1 To myDic.Count 55 For i = UBound(tempHensu) To 1 Step -1 56 If InStr(myDic(cnt), tempHensu(i, 2)) > 0 Then 57 myDic(cnt) = Replace(myDic(cnt), tempHensu(i, 2), "[" & tempHensu(i, 1) & "]") 58 End If 59 Next 60 Next 61 62 '変換したプログラムを出力する 63 Dim fso As Object 64 Set fso = CreateObject("Scripting.FileSystemObject") 65 fileName = fso.GetParentFolderName(fileName) & "\" & fso.GetBaseName(fileName) & "_new.vbs" 66 Open fileName For Output As #2 67 For cnt = 1 To myDic.Count 68 Print #2, myDic(cnt) 69 Next 70 Close #2 71End Sub 72 73Private Function henkan(ByVal buf As String) As String 74 '"Dim 変数 As Boolean"など変数宣言から"As"以降を取る 75 Dim henkanWords() As Variant 76 henkanWords = Array("As Boolean", "As Integer", "As Long", "As String", "As Object", "As Variant") 77 Dim word As Variant 78 For Each word In henkanWords 79 buf = Replace(buf, word, "") 80 Next 81 henkan = buf 82 '変数が全角の場合に、リストに追加する 83 If InStr(buf, "Dim") > 0 Then 84 buf = Trim(Replace(buf, "ReDim", "")) 85 buf = Trim(Replace(buf, "Dim", "")) 86 If InStr(buf, "'") > 0 Then buf = Left(buf, InStr(buf, "'") - 1) 87 If Len(buf) < LenB(StrConv(buf, vbFromUnicode)) Then 88 If InStr(buf, "(") > 0 Then buf = Left(buf, InStr(buf, "(") - 1) 89 If Not zenkakuVals.Exists(buf) Then zenkakuVals.Add buf, 1 90 End If 91 End If 92End Function
<変換前>
VBScript
1Dim 日本語変数旧 As Long 2Dim 日本語変数 As Long 3Dim 日本語変数新 As Long 4 5if 日本語変数=3 then 日本語変数新=4 6日本語変数旧=4
<変換後>
VBScript
1Dim [[日本語変数]旧] 2Dim [日本語変数] 3Dim [日本語変数]新 4 5if [日本語変数]=3 then [日本語変数]新=4 6[[日本語変数]旧]=4 7
回答1件
あなたの回答
tips
プレビュー