【ClipGo①】コピーするだけでファイルもURLも即開く!


あなたはこんな経験はありませんか?

パソコン作業中に「このアドレスのフォルダやファイルを開きたい」「このURLをブラウザに貼り付けてWebページを開きたい」という場面で、対象の文字列を正確に選択するのが意外と大変。気をつけて選択したつもりでも、なぜか開かない。しかたなくフォルダの階層をひとつひとつ辿ったり、アドレスをもう一度選び直したり、あきらめてWeb検索したり……。

単純な作業ですが、神経を使いじわじわ疲労が溜まりますよね・・・・。


エンジニアはどうしてるの?

調べてみると、Mac派のエンジニアは「Raycast」や「Alfred」というランチャーアプリをよく使っているようです。キーワードを打つだけでファイルもURLも開けて、非常に便利そう。ただしMac専用

私はエンジニアでもなく、Windowsユーザーなので使えません。


私の解決策:コードに頑張ってもらう

そこで考えたのが、「コピーした文字の中からパスやURLを自動で拾って開く」仕組みです。多少余分な文字が混じっていても、ちゃんと動くのがポイント。(つまり雑な選択でOK!)

状況に応じて2種類使い分けています。

Excelを開いているとき → VBAマクロで実行

Excelをダッシュボード代わりに使っているので、そこからマクロを呼び出すのが一番速い。URLもファイルパスも両方対応しています。

それ以外のとき → PowerShellで実行

ExcelなしでもCtrl+Alt+Qのショートカット一発で動きます。社内システム上でも使えるのが便利。


設定方法

詳しい設定はAIに聞くのが一番早いです。以下のコードを見せて「このPCで動くように設定して」とお願いするのがオススメです。

※コードの中身は分からなくて大丈夫。まるごとコピーしてAIに渡すだけでOKです。

VBAマクロ

コードを見る(クリックで開閉)
Sub ClipGo()
    Dim rawInput As String
    Dim dataObj As Object

    ' --- クリップボード取得 ---
    On Error Resume Next
    Set dataObj = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    dataObj.GetFromClipboard
    rawInput = dataObj.GetText(1)
    If rawInput = "" Then rawInput = dataObj.GetText
    On Error GoTo 0

    rawInput = Trim(rawInput)
    If rawInput = "" Then
        MsgBox "クリップボードの情報を読み取れませんでした。" & vbCrLf & _
               "一度メモ帳などに貼り付けてから再度コピーしてみてください。", vbExclamation
        Exit Sub
    End If

    Dim regEx As Object
    Dim matches As Object
    Set regEx = CreateObject("VBScript.RegExp")
    regEx.IgnoreCase = True
    regEx.Global = False

    ' --- ① URLチェック(優先) ---
    regEx.Pattern = "https?://[^\s""<>]+"
    Set matches = regEx.Execute(rawInput)
    If matches.Count > 0 Then
        Dim url As String
        url = Trim(matches(0).Value)
        Shell "cmd /c start """" """ & url & """", vbHide
        GoTo 終了
    End If

    ' --- ② フォルダ/ファイルパスチェック ---
    regEx.Pattern = "([a-zA-Z]:\\|\\\\)[^\r\n""<>|]+"
    Set matches = regEx.Execute(rawInput)
    If matches.Count > 0 Then
        Dim targetPath As String
        targetPath = Trim(matches(0).Value)

        Dim fso As Object
        Set fso = CreateObject("Scripting.FileSystemObject")
        If fso.FolderExists(targetPath) Or fso.FileExists(targetPath) Then
            Shell "explorer.exe """ & targetPath & """", vbNormalFocus
        Else
            MsgBox "パスが見つかりませんでした。" & vbCrLf & _
                   "【抽出されたパス】" & vbCrLf & targetPath, vbExclamation
        End If
        Set fso = Nothing
        GoTo 終了
    End If

    ' --- ③ どちらも該当なし ---
    MsgBox "URLもパスも見つかりませんでした。" & vbCrLf & _
           "【コピーされている内容の先頭】" & vbCrLf & Left(rawInput, 100), vbInformation

終了:
    Set regEx = Nothing
    Set dataObj = Nothing
End Sub

PowerShellスクリプト

コードを見る(クリックで開閉)
Add-Type -AssemblyName Microsoft.VisualBasic

$rawInput = Get-Clipboard -Format Text
if ([string]::IsNullOrWhiteSpace($rawInput)) { exit }

$pattern = '([a-zA-Z]:\\|\\\\)[^\r\n"<>|]+'
$match = [regex]::Match($rawInput, $pattern)

if ($match.Success) {
    $targetPath = $match.Value.Trim()

    # まず最後のセグメント内で末尾から1文字ずつ削って探す
    $searchPath = $targetPath
    $lastSlashPos = $searchPath.LastIndexOf('\')

    while ($searchPath.Length -gt $lastSlashPos + 1) {
        if (Test-Path -LiteralPath $searchPath) { break }
        $searchPath = $searchPath.Substring(0, $searchPath.Length - 1)
    }

    # それでも見つからなければ親フォルダをさかのぼる
    if (-not (Test-Path -LiteralPath $searchPath)) {
        $searchPath = Split-Path -Parent $targetPath
        while (-not [string]::IsNullOrEmpty($searchPath) -and -not (Test-Path -LiteralPath $searchPath)) {
            $searchPath = Split-Path -Parent $searchPath
        }
    }

    if (-not [string]::IsNullOrEmpty($searchPath)) {
        $finalPath = $searchPath
        if (Test-Path -LiteralPath $finalPath -PathType Leaf) {
            $finalPath = Split-Path -Parent $finalPath
        }
        Start-Process "explorer.exe" -ArgumentList "`"$finalPath`""
    } else {
        $msg = "指定された場所が見つかりません。`n`n【確認事項】`n・ネットワークドライブは接続されていますか?`n・パスのスペルは正しいですか?`n`n【抽出されたパス】`n$targetPath"
        [Microsoft.VisualBasic.Interaction]::MsgBox($msg, 48, "フォルダを開けませんでした")
    }
}

まとめ

ささやかな時短ツールですが、毎日ファイルやWebページをたくさん開く人にはかなり効果があると思います。「2アクションでファイルやWebページを開ける」「無駄なコピペがなくなる」これだけで大分ストレスが減ります。

良かったらぜひ試してみてくださいね!


次回:VBAマクロの設定方法

「コードはわかったけど、どうやってExcelに入れるの?」という方向けに、VBAマクロの設定手順を詳しく解説します。お楽しみに!

← ブログ一覧に戻る