スポンサーリンク

選択中の文字をUTF8から読める文字に変換するOutlookマクロ

●やりたいこと
デスクトップ版のOutlookで以下のようなUTF8にエンコードされた文字列を、、、 https://faq.jrepoint.jp/faq/show/648?site_domain=default#:~:text=%E4%BB%A5%E4%B8%8B%E3%81%AESuica%E3%81%AFJRE,%E8%BF%BD%E5%8A%A0%E3%82%92%E3%81%94%E7%A2%BA%E8%AA%8D%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82&text=%E3%83%BBGoogle%20Pay%E3%80%81%E6%8F%90%E6%90%BA%E5%85%88%E3%82%A2%E3%83%97%E3%83%AA,POINT%E3%81%AB%E3%81%94%E7%99%BB%E9%8C%B2%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82

以下のような日本語の文字列に変換する。さらにリンクの挿入も実施する。 https://faq.jrepoint.jp/faq/show/648?site_domain=default#:~:text=以下のSuicaはJRE,追加をご確認ください。&text=・Google Pay、提携先アプリ,POINTにご登録ください。

'**************************************************************
'* 関数名:DecodeUrlEncodedSelection
'* 概要:UTFのURLを日本語テキストに変換、リンクの挿入
'* 使い方:
'* パラメータ :(I) なし
'*              (O) なし
'* 戻り値     :なし
'* 備考:
'***************************************************************
Public Sub DecodeUrlEncodedSelection()
    Dim objInspector As Inspector
    Dim objEditor As Object
    Dim selectedText As String
    Dim decodedText As String
    ' 今開いているアイテムのウインドウを取得
    Set objInspector = Application.ActiveInspector
    ' 何も開いていない場合は終了
    If objInspector Is Nothing Then
        MsgBox "メール編集ウィンドウが開いていません。", vbExclamation
        Exit Sub
    End If

    Set objEditor = objInspector.WordEditor
    
    ' 選択されたテキストを取得
    selectedText = objEditor.Application.Selection.Text
    ' 選択テキストが無い場合終了
    If Len(selectedText) = 0 Then
        MsgBox "文字が選択されていません。", vbExclamation
        Exit Sub
    End If

    ' ■UTF8の文字を日本語にデコード
    decodedText = UrlDecodeUtf8(selectedText)

    Debug.Print decodedText

    ' 下線を引く
    objEditor.Application.Selection.Font.Underline = True
    ' 文字色。Outlookのハイパーリンクの色
    objEditor.Application.Selection.Font.Color = RGB(70, 120, 134)
    ' ハイパーリンクの挿入
    objEditor.Application.Selection.Hyperlinks.Add _
        Anchor:=objEditor.Application.Selection.Range, _
        Address:=decodedText, _
        SubAddress:="", _
        ScreenTip:=decodedText, _
        TextToDisplay:=decodedText
End Sub

'**************************************************************
'* 関数名:UrlDecodeUtf8
'* 概要:UTFのURLを日本語テキストにして返却
'* 使い方:
'* パラメータ :(I) str1 URL
'* 戻り値     :UTF8部分を日本語に修正した文字列
'* 備考:
'***************************************************************
Public Function UrlDecodeUtf8(str1 As String) As String
    Dim bytes() As Byte
    Dim i As Long
    Dim temp As String
    Dim hexVal As String

    'Debug.Print str1

    ' まず %XX をバイト列に変換
    ReDim bytes(0 To 0)
    i = 1
    ' 全ての文字に対して処理
    Do While i <= Len(str1)
        ' 対象の文字が"%" かつ 2文字先が末尾文字列をはみ出してないこと
        ' UTF8の文字に変換できる場合
        If Mid(str1, i, 1) = "%" And i + 2 <= Len(str1) Then
            ' %から2文字取得
            hexVal = Mid(str1, i + 1, 2)
            ' UTF8の1文字分取得して配列に格納
            bytes(UBound(bytes)) = CByte("&H" & hexVal)
            ' 配列を1つ増やす
            ReDim Preserve bytes(0 To UBound(bytes) + 1)
            ' 次の文字へ
            i = i + 3
        Else
            ' 通常文字はそのまま ASCII として追加
            bytes(UBound(bytes)) = Asc(Mid(str1, i, 1))
            ' 1文字追加
            ReDim Preserve bytes(0 To UBound(bytes) + 1)
            i = i + 1
        End If
    Loop

    ' 最後の余分な要素削除
    If UBound(bytes) > 0 Then
        ReDim Preserve bytes(0 To UBound(bytes) - 1)
    End If

    ' ADODB.Stream で UTF-8 として読み込む
    Dim stm As Object
    Set stm = CreateObject("ADODB.Stream")
    stm.Type = 1 ' バイナリ
    stm.Open
    stm.Write bytes
    stm.Position = 0
    stm.Type = 2 ' テキスト
    stm.Charset = "UTF-8"

    UrlDecodeUtf8 = stm.ReadText
    stm.Close
    Set stm = Nothing
    
End Function

Windows treeコマンドの結果をエクセルに貼れるように整形

「├─|└─|│  |    |│」

上記の「」内の文字列を\tに正規表現置換

細かく書くと以下。順次置換していっても同じ結果

「├─」をタブ文字に置換

「└─」をタブ文字に置換

「│  」をタブ文字に置換

「    」をタブ文字に置換

「│」をタブ文字に置換

 

C:.
│  001.txt
│  002.txt
│  tree.xlsx
│
└─aaa
    ├─aaa01
    │      aaa01.txt
    │
    └─bbb01
            bbb01.txt

上記が以下になる。

 

エクセルにペタッと貼り付けられる。インデントがいい感じ。

 

Windows batファイルでシェアポイントのエクセルファイルを開く

●編集可能で開く
start "" "ms-excel:ofe|u|パス"

 

●読取専用で開く。「ブックの編集」ボタンが出てきて押せば編集も可能。
start "" "ms-excel:パス"

 

●パスについて

・エクセルの「ファイルの場所」からコピーしたURLは半角スペースが%20になるが、これを本物の半角スペースにしてやると開けるようになる。

 

 

ファイル・フォルダに現在日時を付ける ps

ファイル・フォルダに現在日時を付ける.ps1

# エラー有無
$IsError = 0;

# 受け取ったファイルに対して以下の処理を実行
foreach ($Path1 in $args) {
    Write-Output ""

    # ファイルが存在する場合
    if (Test-Path $Path1) {
        # 現在日時を取得
        $CurrentTime = Get-Date -Format "yyyyMMdd_HHmmss"

        # フォルダの場合
        if ( (Get-Item $Path1) -is [System.IO.DirectoryInfo] )  {
            Write-Output ■フォルダ:$Path1
            $NewFilePath = (Split-Path -Leaf $Path1) + "_" + "$CurrentTime"
            # Write-Output $NewFilePath
        } else {
            # ファイルの場合
            Write-Output ■ファイル:$Path1

            # 拡張子以外のファイル名を取得
            $FileName = [System.IO.Path]::GetFileNameWithoutExtension($Path1)
            # 拡張子を取得
            $Extension = [System.IO.Path]::GetExtension($Path1)
            # 新しいファイル名を作成
            $NewFileName = "$FileName" + "_" + "$CurrentTime" + "$Extension"
            # ファイルパス
            $NewFilePath = [System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($Path1), $NewFileName)
            #Write-Output NewFilePath:$NewFilePath
        }

        # リネーム ※ファイルがロックされているとここでエラーが起きる
        Rename-Item -Path $Path1 -NewName $NewFilePath
        # エラーの場合、エラーフラグオン
        if ($? -ne "True"){
            #Write-Output "Error:「$Error」"
            $IsError = 1;
        } else {
            Write-Output "Renamed $Path1 to $NewFilePath"
        }
    } else {
        # ファイルが存在しない場合
        Write-Output "File not found: $Path1"
    }
}

exit $IsError

ファイル・フォルダに現在日時を付ける【複数可】.cmd

echo off
rem 概要
rem  指定された複数ファイル・フォルダに以下の処理を実施
rem   ①ファイル名末尾に現在日時[_yyyymmdd_hhmmss]を付与
rem 
rem 使い方
rem  このcmdファイルにファイル(複数可)をドラッグアンドドロップ
rem 
rem 注意
rem  選択ファイル数には限界があります(バッチの引数の最大文字数に依存)

echo 【バッチ】のパラメータ:%*
echo -

rem ■powershellの実行
powershell -NoProfile -ExecutionPolicy RemoteSigned -File "%~dp0\ファイル・フォルダに現在日時を付ける.ps1" %*
rem echo 戻り値:%ERRORLEVEL%

rem エラーがある場合は一時停止
IF %ERRORLEVEL% == 1 (
    echo エラーあり
    pause
)

rem %~nx0はバッチファイル名
rem echo 【バッチ】%~nx0の処理終了

ファイル、フォルダに更新日時をつけるPowerShell

ファイル・フォルダに更新日時を付ける.ps1

# エラー有無
$IsError = 0;

# 受け取ったファイルに対して以下の処理を実行
foreach ($Path1 in $args) {
    Write-Output ""

    # ファイルが存在する場合
    if (Test-Path $Path1) {
        # 更新日時を取得
        $LastWriteTime = (Get-Item $Path1).LastWriteTime
        # 更新日時をyyyyMMdd_HHmmss形式にする
        $FormattedTime = $LastWriteTime.ToString("yyyyMMdd_HHmmss")

        # フォルダの場合
        if ( (Get-Item $Path1) -is [System.IO.DirectoryInfo] )  {
            Write-Output ■フォルダ:$Path1
            $NewFilePath = (Split-Path -Leaf $Path1) + "_" + "$FormattedTime"
            # Write-Output $NewFilePath
        } else {
            # ファイルの場合
            Write-Output ■ファイル:$Path1
            # 拡張子以外のファイル名を取得
            $FileName = [System.IO.Path]::GetFileNameWithoutExtension($Path1)
            # 拡張子を取得
            $Extension = [System.IO.Path]::GetExtension($Path1)
            # 新しいファイル名を作成
            $NewFileName = "$FileName" + "_" + "$FormattedTime" + "$Extension"
            # ファイルパス
            $NewFilePath = [System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($Path1), $NewFileName)
            #Write-Output NewFilePath:$NewFilePath
        }

        # リネーム ファイルがロックされているとここでエラーが起きる
        Rename-Item -Path $Path1 -NewName $NewFilePath
        # エラーの場合、エラーフラグオン
        if ($? -ne "True"){
            #Write-Output "Error:「$Error」"
            $IsError = 1;
        } else {
            Write-Output "Renamed $Path1 to $NewFilePath"
        }
    } else {
        # ファイルが存在しない場合
        Write-Output "File not found: $Path1"
    }
}

exit $IsError

ファイル・フォルダに更新日時を付ける【複数可】.cmd

echo off
rem 概要
rem  指定された複数ファイルに以下の処理を実施
rem   ①ファイル名末尾に更新日時[_yyyymmdd_hhmmss]を付与
rem 
rem 使い方
rem  このcmdファイルにファイル(複数可)をドラッグアンドドロップ
rem 
rem 注意
rem  選択ファイル数には限界があります(バッチの引数の最大文字数に依存)

echo 【バッチ】のパラメータ:%*
echo -

rem ■powershellの実行
powershell -NoProfile -ExecutionPolicy RemoteSigned -File "%~dp0\ファイル・フォルダに更新日時を付ける.ps1" %*
rem echo 戻り値:%ERRORLEVEL%

rem エラーがある場合は一時停止
IF %ERRORLEVEL% == 1 (
    echo エラーあり
    pause
)

rem %~nx0はバッチファイル名
rem echo 【バッチ】%~nx0の処理終了

無限ループシェル。停止機能あり。

意図的に無限ループを発生させて、任意のタイミングで終了させたいときのシェル

ログの出力間隔と、loop.txtを参照しに行く間隔は設定可能。

#!/bin/bash

##################################################
# 概要:loop.txtの値が"1"になるまで無限ループ
# 
# 備考:loop.txtが当シェルと同じディレクトリに
#       存在しない場合は値"0"で作成します。
# 
# loop.txt用コマンド
#   echo 1 > loop.txt
#   echo 0 > loop.txt
#
##################################################

# ミリ秒スリープ時間(例:100ms)
SLEEP_MS=1000

#ログ出力間隔(ms)。スリープ時間よりも大きくする
LOG_INTERVAL_MS=10000

#経過時間
LOG_ELAPSED_TIME=0

# loop.txt のパス(このスクリプトと同じディレクトリ)
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
LOOP_FILE="$SCRIPT_DIR/loop.txt"

# [ loop.txtの値が"1"になるまで無限ループ ]
while true; do
    # loop.txt が存在するか確認、なければ作成して "0" を書き込む
    if [ ! -f "$LOOP_FILE" ]; then
        echo "0" > "$LOOP_FILE"
    fi

    # loop.txt の内容を読み取る
    VALUE=$(<"$LOOP_FILE")

    # 内容が "1" ならループを抜ける
    if [ "$VALUE" = "1" ]; then
        echo `date +"%Y/%m/%d %H:%M:%S"` "ループ終了条件を検出しました。"
        break
    fi

    # ミリ秒スリープ(sleep は秒単位なので 100ms = 0.1秒)
    sleep "$(bc <<< "scale=3; $SLEEP_MS/1000")"

    # 経過時間 = 経過時間 - ミリ秒スリープ時間
    ((LOG_ELAPSED_TIME = LOG_ELAPSED_TIME + SLEEP_MS))
    
    # 経過時間 > ログ出力間隔の場合
    if [ "$LOG_ELAPSED_TIME" -ge "$LOG_INTERVAL_MS" ]; then
        # 経過時間 = 経過時間 - ログ出力間隔
        ((LOG_ELAPSED_TIME = LOG_ELAPSED_TIME - LOG_INTERVAL_MS))
        echo `date +"%Y/%m/%d %H:%M:%S"` 無限ループ中
    fi
done

exit 0

motorola Smart ConnectでChromeリモートデスクトップを試す

motorola Smart ConnectでChromeリモートデスクトップを使ってみた。

これが意外に使えたのでメモ。

 

■前提

・Type-Cハブで

 HDMI出力(フルHDモニタ)

 キーボード、マウス

 

■感想

・文字入力が「テキストを送信」を経由せずに普通にできる。

 キーボード配列も普通に日本語配列での入力になる。

・shift + win + s はsmart connectのスクショ取得になる。

 スクショはSnipping Toolのアイコンから起動すればよい。

・ctrl + alt + delはリモート先に送られる。

・完全に全画面にするにはChromeリモートデスクトップの設定の

 画面右上のピンボタンを押下

 画面右上のキーボードボタンを押下

・普通に使えるのでネット環境とディスプレイ、キーボード、マウスがあれば普通に使えそうな印象

・マウスカーソルが迷子になることがあるがいろいろ動かしてるうちにちゃんと出るようになる。

・「キーボード ショートカットを設定」が有効だとShiftキーで大文字入力がうまく機能しなくなるので無効にしておく。

 

テキストのみで申し訳ないが上記のような感じ。

この記事も試しにChromeリモートデスクトップを使って書いている。特に問題ない。

ただディスプレイ、キーボード、マウスがあるということはWindowsマシンがあるのが普通であり、そちらを使ったほうが早いし快適と思われる。

そうするとSmart Connectの意味とは?とはなる。