Attribute VB_Name = "Module1" ' シートのlinuxコマンドを読み取り、TeraTermマクロファイルに出力する Sub UpdateCommandSet(setid As String) ' setid はTeraTermマクロファイルの名前の一部として使用する。 ' 例えば、setid="A" の場合、TeraTermマクロファイルは以下のとおりとなる。 ' ' 連続実行用のマクロファイル名: commandset-seq-A.ttl ' 選択実行用のマクロファイル名: commandset-sel-A.ttl Dim r, c, rr, cc As Integer Dim addrtop, addrbtm As String Dim cmdset As Range Dim cmd As Range Dim cmdline As String Dim i, l, ii As Integer 'Debug.Print "setid: "; setid ' UpdateCommandSet() はボタンクリックにより呼び出されるものとする。 ' 下記プロシージャでボタン位置(左上カドの座標)のセルアドレス(Row、Column)を取得する。 r = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row c = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column ' linuxコマンドはボタンの右隣に並んでいるものとし、最初のコマンドと最後のコマンドのアドレスを取得する。 rr = r cc = c + 1 ' コマンドが登録されていなければ何もしない If Cells(rr, cc).Value = "" Then Exit Sub End If ' コマンドセットの先頭と最後のAddressを取得 addrtop = "" addrbtm = "" If Cells(rr - 1, cc).Value = "" Then addrtop = Cells(rr, cc).Address End If If Cells(rr + 1, cc).Value = "" Then addrbtm = Cells(rr, cc).Address End If If addrtop = "" Then addrtop = Cells(rr, cc).End(xlUp).Address End If If addrbtm = "" Then addrbtm = Cells(rr, cc).End(xlDown).Address End If ' コマンドセットのRangeを取得 Set cmdset = Range(addrtop, addrbtm) ' コマンドセットを2種類のマクロファイルに出力する。 ' 1つ目はコマンドセットのコマンドを順次実行するためのマクロ。 ' 2つ目はコマンドセットから選択して実行するためのマクロ。 ''' コマンドセットを1つ目のマクロファイルに出力 ' コマンドセットの出力先のパスを組み立て cmdsetfile = Worksheets("env").Range("commandset_path").Value & "commandset-seq-" & setid & ".ttl" 'Debug.Print "cmdsetfile: "; cmdsetfile Open cmdsetfile For Output As #1 For Each cmd In cmdset ' シングルクォートのエスケープ処理(TeraTermマクロ内の文字列にシングルクォートを含める場合の措置) cmdline = Replace(cmd.Value, "'", "'#39'") Print #1, "send '" & cmdline & "'" Print #1, "wait " & Worksheets("env").Range("wait_string").Value ' Print #1, "pause 1" Next Print #1, "end" Close #1 ''' コマンドセットを2つ目のマクロファイルに出力 ' コマンドセットの出力先のパスを組み立て cmdsetfile = Worksheets("env").Range("commandset_path").Value & "commandset-sel-" & setid & ".ttl" 'Debug.Print "cmdsetfile: "; cmdsetfile Open cmdsetfile For Output As #1 Print #1, "strdim COM " & cmdset.Count i = 0 ll = 0 For Each cmd In cmdset ' コマンドの長さを確認 ' TeraTermでコマンドをリストから選択する際、デフォルトだとリストが小さくてコマンドが最後まで見えないため、 ' ここで確認した長さで無理やりリストを広げる。 l = LenB(StrConv(CStr(cmd.Value), vbFromUnicode)) If l > ll Then ll = l End If ' シングルクォートのエスケープ処理(TeraTermマクロ内の文字列にシングルクォートを含める場合の措置) cmdline = Replace(cmd.Value, "'", "'#39'") Print #1, "COM[" & i & "] = '" & cmdline & "'" i = i + 1 Next Print #1, "listbox '" & setid & " " & String(ll, "-") & "' '' COM" Print #1, "if result != -1 then" ' Print #1, " sendln COM[result]" Print #1, " send COM[result]" Print #1, "endif" Print #1, "end" Close #1 End Sub Sub RunCommand() ' IWshRuntimeLibrary.WshShell を使用するためにライブラリ(Windows Script Host Object Model)の登録が必要。 ' [ツール] > [参照設定]から"Windows Script Host Object Model"をチェックオンにする。 ' Dim wsh As New IWshRuntimeLibrary.WshShell Dim result As WshExec Dim cmd As String ' クリックしたボタンが配置されているRowとColumnを取得 r = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row c = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column ' ボタンの右隣のセルに登録されているコマンドを取得 cmd = Cells(r, c + 1).Value ' コマンドを実行 wsh.Run "%ComSpec% /c " & cmd, 0, False Set result = Nothing Set wsh = Nothing End Sub Sub ClipCommand() ' MSForms.DataObject を使用するためにライブラリ(Microsoft Froms 2.0 Object Library)の登録が必要。 ' [ツール] > [参照設定] > [参照] から"C:\Windows\System32\FM20.DLL"もしくは"C:\Windows\SysWOW64\FM20.DLL"を選択する。 ' (FM20.DLLを選択すると、"Microsoft Froms 2.0 Object Library"は自動的にチェックオンになる。) ' Dim buf As String ' a = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Address r = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Row c = ActiveSheet.Shapes(Application.Caller).TopLeftCell.Column buf = Cells(r, c + 1).Value With New MSForms.DataObject .SetText buf '変数の値をDataObjectに格納する .PutInClipboard 'DataObjectのデータをクリップボードに格納する End With ' ActiveSheet.Paste Destination:=Range("A1") End Sub