見出し画像

AHK✕クリップボード|コピペを利用して文字列整理の実施について|小さな業務改善に向けて

PC業務の中でも多くを占める作業である通称コピペ、コピー&ペーストについて少し掘り下げていきます。

コピペってなんだろうか?

一旦ね
言うまでもないと思ますが

コピー (Copy)
テキスト、画像、ファイルなどを選択して「コピー」すると、その内容がPCの一時的な記憶領域(クリップボード)に保存されます。元のデータはそのまま残ります。
ショートカットキー:Ctrl + C(Windows)またはCmd + C(Mac)。
右クリックメニューから「コピー」を選ぶ方法もあります。

ペースト (Paste)
コピーしたデータをクリップボードから別の場所(例えば文書やフォルダ)に貼り付けます。これで選択した場所にデータが複製されます。
ショートカットキー:Ctrl + V(Windows)またはCmd + V(Mac)。
右クリックで「貼り付け」を選ぶことも可能。


例:
ワードプロセッサで文章を書いているとき、1段落をコピーして別の場所にペーストすれば、同じ内容を繰り返し入力せずに済みます。

シンプルだけど、日常的な作業効率を上げる便利な機能です!

By Grok

Cliborも知っておいて損は無いソフトです

コピペが楽に便利になるもので結構気に入っています
呼んでも無いときに出現するのがたまにあるくらいは気になりますがほかは特に問題なく使っています。

「Clibor(クリボー)」は、Windows向けの無料クリップボード管理ソフトで、コピー&ペーストを劇的に便利にするツールです。シンプルかつ高機能で、テキスト入力やデータ管理の効率を上げたい人におすすめです。以下に、主な機能を網羅しつつ簡単に説明します。

主な機能クリップボード履歴の管理
コピーしたテキストを履歴として保存(最大10,000件まで設定可能)。
過去にコピーした内容をいつでも呼び出してペーストできます。
デフォルトではCtrlキーを2回押すと履歴画面が表示され、選択が簡単。
定型文の登録
よく使うフレーズや文章を「定型文」として保存可能。
グループ分けやホットキー設定ができ、すぐに呼び出して利用できます。
テキスト整形機能
コピーしたテキストの書式を消してプレーンテキストに変換(例: Excelの装飾付き文字を普通のテキストに)。
正規表現を使って柔軟にデータを編集・整形可能。
FIFO/LIFOモード
FIFO(先入れ先出し)やLIFO(後入れ先出し)で連続貼り付けが可能。
例えば、複数のセルをコピーして順番に貼り付けたり、逆順で貼り付けたりできます。
カスタマイズ性の高さ
デザイン変更(配色や枠線、影など)やショートカットキーの設定が可能。
動作環境に合わせて細かく調整でき、使いやすさを自分好みに最適化できます。
その他の便利機能
ファイルやフォルダのフルパスを履歴に保存。
テキストのバックアップ機能(入力ミスやアプリクラッシュ時の復旧に便利)。
検索機能で履歴や定型文を素早く見つけられる。


使い方と特徴シンプルな操作: 起動後はタスクトレイに常駐し、必要なときだけ呼び出せるので邪魔になりません。
軽量で手軽: インストール不要で、実行ファイル(Clibor.exe)をダブルクリックするだけで使えます。
開発者サポート: 2009年から公開され、定期的に更新。公式サイト(chigusa-web.com/clibor/)で最新バージョンや詳細を確認可能。


どんな人に役立つか文章作成やプログラミングでコピペを多用する人。
ExcelやPDFからデータを移す際に書式を整えたい人。
繰り返し使うフレーズをすぐ使いたい人。


一度使うと手放せなくなるほど便利で、無料ながら寄付も歓迎されています。PC作業の時短と快適さを求めるなら、ぜひ試してみてください!

By Grok

AHKとコピペについて

AutoHotkey(AHK)とコピー&ペースト(コピペ)について簡単に説明しますね。AHKはWindowsで使えるスクリプト言語で、キーボードやマウスの操作を自動化するのに便利です。コピペに関しても、AHKを使えば手動でのCtrl+CやCtrl+Vを超えた柔軟で効率的な操作が可能です。

AHKでコピペをどう使うか

AHKでは、Clipboardという変数を使ってクリップボードの内容を操作できます。これを活用することで、単純なコピー&ペーストから、特定のパターンのテキストを加工して貼り付けたり、複数のデータを順番に貼り付けたりといったことが簡単にできます。

AHKのコピペの魅力自動化: 繰り返し作業を省ける。
柔軟性: テキストの編集や条件分岐をスクリプトに組み込める。
ショートカット: 好きなキーに機能を割り当て可能。

By Grok
F1::
Send {Ctrl down}c{Ctrl up}  ; Ctrl+Cでコピー
Sleep 100                   ; 少し待機(クリップボードが更新されるのを待つ)
Send {Ctrl down}v{Ctrl up}  ; Ctrl+Vで貼り付け
return

こんな例がありました

F2::
Clipboard := ""             ; クリップボードをクリア
Send {Ctrl down}c{Ctrl up}  ; コピー
ClipWait 1                  ; クリップボードにデータが入るのを待つ
Clipboard := "[" Clipboard "]"  ; 前後に「[」「]」を追加
Send {Ctrl down}v{Ctrl up}  ; 貼り付け
return

こんなのも

AHKを利用するとコピーした文字によってその動作、つまりは文字列を任意に変えて貼り付けることが可能になる

まだ具体的なコードも動きも見ていない妄想段階ですが

  • コピーした文字列を見て動作を変える

  • 実行スクリプトで同じ文字列でも出力を変える

などが容易なんだろうなと思います

AHKにはホットストリングの機能があって似たことは十分にやれるのですが、これをONにしておくと必要としていないときも勝手に置き換わったりすることがあるので、それを防ぐ措置にもなると見ています。

具体的コードを調べてみる

これはblenderのときに使っているものですが、度数法の値を弧度法に変えてくれるもの
使い方のイメージはまずは度数法でどこかに入力し、それをコピーして、貼り付ける前に変換、そんな感じです
これだけで電卓を叩く手間は省けます

; ホットキー Ctrl+Shift+V で実行
^+v::
ClipboardOld := ClipboardAll  ; 現在のクリップボード内容を保存
Clipboard := ""               ; クリップボードをクリア
Send ^c                       ; コピー操作(選択中のテキストをコピー)
ClipWait, 1                   ; クリップボードにデータが入るのを待つ
if (ErrorLevel = 0)           ; クリップボードにデータがあれば
{
    Num := Clipboard          ; クリップボードの内容を取得
    if Num is number          ; 数値かどうかを判定
    {
        Result := Num * 0.0174533        ; 10を足す処理
        Clipboard := Result   ; 結果をクリップボードにセット
        MsgBox, % "元の値: " Num "`n新しい値: " Result  ; 確認メッセージ(任意)
    }
    else
    {
        MsgBox, クリップボードの内容は数値ではありません。
        Clipboard := ClipboardOld  ; 元のクリップボード内容を復元
    }
}
else
{
    MsgBox, クリップボードにデータがありません。
    Clipboard := ClipboardOld  ; 元のクリップボード内容を復元
}
return

ホットキー: Ctrl+Shift+V を押すと実行されます。
機能: 選択したテキストをコピーし、それが数値なら0.0174533を掛けた結果をクリップボードに保存します。
例えば、選択したテキストが「180」なら、180 × 0.0174533 ≈ 3.14159(ラジアン変換)になります。
処理の流れ:
現在のクリップボードをバックアップ。
選択したテキストをコピー。
コピーした内容が数値かチェック。
数値なら計算して結果を表示、数値でなければエラーメッセージを出して元に戻す。
用途: 主に角度を度からラジアンに変換する便利ツールとして使えそうです。


簡単に言うと、「選択した数をラジアンに変換してクリップボードにコピーするショートカット」です!

by Grok

次、どうしますかね|例えばコピーする文字で生成する文字列を切り替えてみよう

; ホットキー Ctrl+Shift+V で実行
^+v::
ClipboardOld := ClipboardAll  ; 現在のクリップボード内容を保存
Clipboard := ""               ; クリップボードをクリア
Send ^c                       ; コピー操作(選択中のテキストをコピー)
ClipWait, 1                   ; クリップボードにデータが入るのを待つ
if (ErrorLevel = 0)           ; クリップボードにデータがあれば
    {
        Text := Clipboard         ; クリップボードの内容を取得
        if (Text = "か")          ; 文字列が「か」かどうかを判定
        {
            Clipboard := "株式会社"  ; クリップボードに「株式会社」をセット
            MsgBox, % "元の値: " Text "`n新しい値: 株式会社"  ; 確認メッセージ(任意)
        }
        else
        {
            ;MsgBox, クリップボードの内容は「か」ではありません。
            Clipboard := ClipboardOld  ; 元のクリップボード内容を復元
        }
    }
    else
    {
        ;MsgBox, クリップボードにデータがありません。
        Clipboard := ClipboardOld  ; 元のクリップボード内容を復元
    }
    return

例えばこうすると、「か」をコピーして実行すると「株式会社」という文字列でペーストできるようになります
手間はありますが確実性が高いのは嬉しいかもしれないですね

でもこれだとあまりにも手間、でもホットストリングと被るのはいやなのだ、という場合に向けて次の検討

入力は待機できるか?

; ホットキー(例えば Ctrl+J)でスクリプトを開始
^j::
InputBox, userInput, 入力待ち, キーボードから何か入力してください, , , , , , , , 
if ErrorLevel  ; キャンセルされた場合
    return

; 入力内容に応じて処理を分岐
if (userInput = "こんにちは")
    result := "Hello!"
else if (userInput = "さようなら")
    result := "Goodbye!"
else
    result := "入力された文字: " . userInput

; 処理結果をクリップボードに保存
Clipboard := result
MsgBox, クリップボードに保存しました: %result%
return

できますね

スクリプトの説明

  1. ^j: Ctrl+J を押すとスクリプトが実行されます。

  2. InputBox: ユーザーにテキスト入力を求めるダイアログを表示します。

    • userInput にユーザーが入力した内容が格納されます。

    • キャンセルされた場合は ErrorLevel が 1 になり、スクリプトを終了します。

  3. if 文: 入力内容に応じて処理を分岐します。

    • 例えば「こんにちは」と入力されたら "Hello!" に変換。

    • 「さようなら」なら "Goodbye!" に。

    • それ以外はそのまま「入力された文字: 」と結合。

  4. Clipboard: 処理結果をクリップボードにコピーします。

  5. MsgBox: 結果をユーザーに確認のために表示します。

なるほどね
いい感じいい感じ
これができるということは色々と辞書的に使うことも可能になってきますね
一旦次の検討

CSVは読み込めるか

読み込めるようです

^j::
; CSV を読み込んで連想配列に格納
keywordMap := {}  ; キーワードと出力文字を格納する連想配列
Loop, Read, keywords.csv
{
    line := A_LoopReadLine
    StringSplit, fields, line, `,
    keywordMap[fields1] := fields2  ; 1列目をキー、2列目を値として保存
}

; ユーザー入力を待つ
InputBox, userInput, 入力待ち, キーワードを入力してください, , , , , , , , 
if ErrorLevel
    return

; 入力に応じた出力文字を取得
result := keywordMap[userInput]
if (result = "")  ; 該当するキーワードがなければ
    result := "対応するキーワードが見つかりません: " . userInput

; クリップボードに保存
Clipboard := result
MsgBox, クリップボードに保存しました: %result%
return

スクリプトの説明CSV の読み込み:
Loop, Read で keywords.csv を1行ずつ読み込み。
StringSplit でカンマ区切りの1列目(キーワード)と2列目(出力文字)を分割。
keywordMap という連想配列に「キーワード → 出力文字」のペアを保存(例: keywordMap["こんにちは"] = "Hello!")。
ユーザー入力の取得:
InputBox でユーザーにキーワードを入力させ、userInput に保存。
出力文字の検索:
keywordMap[userInput] で入力されたキーワードに対応する出力文字を取得。
見つからない場合は、デフォルトメッセージを設定。
クリップボードへの保存:
結果を Clipboard にコピーし、確認用のメッセージを表示。

実行手順

  1. 上記のスクリプトを script.ahk として保存。

  2. keywords.csv をスクリプトと同じフォルダに作成。

  1. AutoHotkey でスクリプトを実行し、Ctrl+J を押して試してみてください。

    • 例: 「a」と入力 → クリップボードに HELLO が保存される。

    • 例: 「テスト」と入力 → "対応するキーワードが見つかりません: テスト" が保存される。

つまり、辞書的に普段良く使う文字列をこのCSVに保存しておくことで数文字のキーで長文出力も可能になってきますね
しかもこのコード例ではAHKコード自体は変えずにCSVを読みに行くというだけなので、コードは書き換えることなくCSVを更新するだけで辞書の拡張が可能になります
動的辞書のようなイメージですかね

これ、AHKのコマンドも出力できる?

となると次はこちらですよね
ただの文字列を実行できた、次はAHKのコマンドとして任意に実行可能かが気になりますよね
これができれば、入口は一つのホットキーで中身は無尽蔵、というのが可能になり、しかもソフト毎で挙動を変えることもできるはずなので、かなり強烈な振り幅になってきます

調査
Grokさんと頑張った

; グローバル変数でコマンドを保持
global selectedCommand := ""

; ユーザー入力待ち(Ctrl+J)
^j::
; コマンドを格納する連想配列(毎回初期化)
commandMap := {}

; CSV を読み込む(毎回実行)
Loop, Read, commands.csv
{
    line := A_LoopReadLine
    StringSplit, fields, line, `,
    commandMap[fields1] := fields2
}

; 入力に応じたコマンドを取得
InputBox, userInput, 入力待ち, キーワードを入力してください, , , , , , , , 
if ErrorLevel
    return

command := commandMap[userInput]
if (command = "")
{
    MsgBox, 対応するコマンドが見つかりません: %userInput%
    return
}

; コマンドをグローバル変数に保存し、ホットキーを有効化
selectedCommand := command
Hotkey, +^j, ExecuteCommand, On  ; Shift+Ctrl+J を有効化
MsgBox, Shift+Ctrl+J でコマンドを実行できます: %command%
return

; Shift+Ctrl+J で実行
+^j::
ExecuteCommand:
if (selectedCommand = "")
{
    MsgBox, コマンドが設定されていません。
    return
}
RunCommand(selectedCommand)
Hotkey, +^j, Off  ; 実行後にホットキーを無効化
return

; コマンドを実行する関数
RunCommand(cmd) {
    ; セミコロンでコマンドを分割
    StringSplit, commands, cmd, `;  ; `;` で区切る
    Loop, %commands0%  ; 分割されたコマンド数だけ繰り返す
    {
        currentCmd := commands%A_Index%  ; 現在のコマンド
        if (SubStr(currentCmd, 1, 5) = "Send ")
        {
            action := SubStr(currentCmd, 6)
            if (RegExMatch(action, "^{.*}$"))  ; {文字列} の形式
            {
                StringReplace, action, action, {, , All
                StringReplace, action, action, }, , All
                SendRaw %action%
            }
            else
            {
                Send %action%  ; キーコマンドとして実行
            }
        }
        else if (SubStr(currentCmd, 1, 4) = "Run ")
        {
            action := SubStr(currentCmd, 5)
            Run %action%
        }
        else
        {
            SendRaw %currentCmd%
        }
        Sleep, 200  ; コマンド間に少し待機(安定性のため)
    }
}


こういうCSVを用意してCtrl+jで

Shift+Ctrl+jでaiueo
が出力されます
コマンドなどもいけることが確認できました
これで一つのホットキーを入口にして出口をいくらでも増やせるようなものができます
しかも違うものとして認識できさえすればなんでもいいみたいなので、ひらがなや漢字、英語など混ざっててもOKというなかなかなものそのままランチャーにしてもいいしコマンドにしてもいいし

ちなみに今のは段階を作っていますが、即時実行版もあります

; ユーザー入力待ち(Ctrl+J)
^j::
; コマンドを格納する連想配列(毎回初期化)
commandMap := {}

; CSV を読み込む(毎回実行)
Loop, Read, commands.csv
{
    line := A_LoopReadLine
    StringSplit, fields, line, `,
    commandMap[fields1] := fields2
}

; 入力に応じたコマンドを取得
InputBox, userInput, 入力待ち, キーワードを入力してください, , , , , , , , 
if ErrorLevel
    return

command := commandMap[userInput]
if (command = "")
{
    MsgBox, 対応するコマンドが見つかりません: %userInput%
    return
}

; 即時実行
RunCommand(command)
return

; コマンドを実行する関数
RunCommand(cmd) {
    StringSplit, commands, cmd, `;  ; `;` で区切る
    Loop, %commands0%  ; 分割されたコマンド数だけ繰り返す
    {
        currentCmd := Trim(commands%A_Index%)  ; 現在のコマンド(余分な空白を削除)
        if (SubStr(currentCmd, 1, 5) = "Send ")
        {
            action := Trim(SubStr(currentCmd, 6))
            if (RegExMatch(action, "^{.*}$"))  ; {文字列} の形式
            {
                StringReplace, action, action, {, , All
                StringReplace, action, action, }, , All
                ; 特殊キーの場合は Send を使い、それ以外は SendRaw
                if (action = "Home" || action = "End" || action = "Enter" || action = "Tab" || action = "Up" || action = "Down")
                {
                    Send {%action%}  ; 特殊キーとして送信
                }
                else
                {
                    SendRaw %action%  ; それ以外は生の文字列として送信
                }
            }
            else
            {
                Send %action%  ; キーコマンドとして実行
            }
        }
        else if (SubStr(currentCmd, 1, 4) = "Run ")
        {
            action := SubStr(currentCmd, 5)
            Run %action%
        }
        else
        {
            SendRaw %currentCmd%
        }
        Sleep, 200  ; コマンド間に少し待機(安定性のため)
    }
}

これでかなり流動的に作業を進めることができるのではないでしょうか?
しかもですね先の例と同様に、実行するたびにCSVを読ませるので追加しておきたい言葉や数字などをどんどん変えて使うことも可能です
やってみたら作れるものですね


ホットストリングについてはこちら

途中でさらっと出てきた気のするホットストリングについてもせっかくなのでご紹介です

AutoHotkey(AHK)のホットストリングについて簡単に説明しますね。

ホットストリングは、特定の文字列を入力したときに、自動的に別のテキストやアクションを実行する機能です。たとえば、よく使うフレーズや長い単語を短い略語で入力できるように設定したり、スクリプトを実行したりできます。AHKを使うと、キーボード入力を効率化するのにすごく便利です。

基本的な書き方はこんな感じ:

::略語::置き換えるテキスト

例えば:

::btw::By the way

これを設定すると、「btw」と入力してスペースやEnterを押した瞬間に「By the way」に置き換わります。

ポイント:

  • :: でホットストリングを定義する。

  • デフォルトでは、スペースやタブ、Enterなどの「終端文字」で発動する。

  • オプション(* や 0 など)を使えば、終端文字なしで即時発動とかもできる。

簡単な例:

:*0:omg::Oh my goodness!

この場合、omg と入力した瞬間に「Oh my goodness!」に置き換わります(*0 で終端文字不要)。

おわりに

なんだか終わりを迎えられるか不安な内容でしたが一応それっぽくなりました。。。

今回はより動的なコマンダーの作成という感じでしたね
クリップボードの活用もよし、CSVとの併用もよし
AHKは自由です

よいAHKライフを!

いいなと思ったら応援しよう!