質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

1回答

1120閲覧

VBAで、VBAのプログラムをVBSに変換する(文字の変換処理、変換回数の設定)

nekoyama771

総合スコア29

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2022/09/16 13:36

編集2022/09/18 00:58

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2022/09/16 15:38

Dim 日本語変数旧 As Long, 日本語変数 As Long というように1行で複数の変数を宣言することはないということでいいでしょうか。
hatena19

2022/09/16 19:38

あとエクセルのバージョンはなんでしょうか。 スピルが使えるバージョンですか。
guest

回答1

0

ベストアンサー

アイデアだけですが、ご参考に。

変数を長い方から順に、別名に置き換えます。
サンプルのVBSなら、下記のように置き換えます。

日本語変数旧 → 変数1
日本語変数新 → 変数2
日本語変数 → 変数3

次に、別名を元の変数名に戻すときに[]で囲むようにします。

変数1 → [日本語変数旧]
変数2 → [日本語変数新]
変数3 → [日本語変数]

質問のコードでは変数名をDictionaryオブジェクトに格納してますが、これは並べ替えの機能はないので、シートに書き出して、シート長で文字列長の降順で並べ替えて、上から順に変換するようにすればいいでしょう。

投稿2022/09/17 03:44

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nekoyama771

2022/09/18 00:59 編集

ありがとうございます。 日本語変数名の部分の問題を解決し、 VBAをVBSに変換することができるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問