VBAの勉強を始めてみた

色々試しています。

「効率の良さ」という価値に対してもっと具体的な対価がほしい(雑記-18)

効率良く仕事をこなす人っていうのは周りに評価されにくい場合があります。
例えば同じ仕事を

  • Aさんは、周囲の助言がなくても半日でこなせる
  • Bさんは、周囲に知恵を借りまくり、さらに残業し、3日間かけてこなす

 

出来上がった成果が同じであれば、単純にAさんのほうが能力が高いと言えるでしょう。

でも、これは上記の事情を知っている者が下した評価です。

問題なのは、事情をまったく知らない第三者が、AさんとBさんを見た場合にどう思うかです。

ある日、Bさんが ひぃひぃ 言いながら書類の山と格闘をしている。傍ら、Aさんは涼しい顔で定時帰宅する・・・・・・・。

注意深く見ている人じゃなければ、ぱっと見、Bさんのほうが仕事をしている風に見えますね。

  • Aさんは仕事を効率良くこなすために、人知れず創意工夫を重ねています。
  • Bさんは行き当たりばったりで漫然と仕事をしています(ガッツはあります)。

 

問題なのは、そんな事情は第三者は知る由もないということ・・・・・・。

その第三者の中に人事考課者がいたらもっと厄介です。

AさんはAさんで、「人知れず」というところを「人に知れるように(考えた効率的方法を拡散するなどして)」すればいいのですが、Aさんは「人知れずやることの何が悪い?」という始末。

そんな言い方もあり、成果と評価が反比例しそうな勢い。

うーん・・・・・・、仕事はできるが処世術に長けていないAさんはどうすればいいんでしょうか?

余った時間で、Bさんを助けてあげればいいじゃない?

確かに!

それならば、Aさんの評価もウナギ登りです。

でも、それでAさんとBさんがもし同じ給料だったら?その内、やる気がなくなってしまうでしょう。

私はAさんのような(人知れず創意工夫を重ねているような)人が埋没しないように、効率的に仕事ができることなどの価値に対してもっと具体的に対価を支払う仕組みがほしいと思っています。

  • IF(成果 ÷ 時間 > 1, 成果÷時間 , 0) × 手当てa + (同僚を補佐した時間 × 手当てb)
  • ※IF(論理式,真の場合,偽の場合)

 

とか・・・・・・。

これは、月単位での給料への上乗せ希望の妄想であります。

成果が同じで、時間外手当てが少ないAさんと、時間外手当てが大きいBさんでは不公平でしょう?

 

人の評価っていうのは複雑で数値化しづらいもの・・・・・・。

完全に数値化しようとすると、数値だけでは測れない要素が欠落していびつになってしまいます。

だからといって、数値以外のもので評価しようとすれば、雰囲気やぱっと見、好き・嫌いなどの 主観の混じった評価 が加わる恐れもあります。

媚を売って出世する とはよく言ったもので

そういうものが、(人知れず努力をしているような)価値ある人を埋没させているような気がしてならない今日この頃です。

Windows1.0で遊んでみた(雑記-17)

ブラウザ上で Windows1.0 が動作するエミュレーターがあるようなので遊んでみます!

↓こちら「Virtual x86」というページ

http://copy.sh/v86/


上記にアクセスするとエミュレート可能な OS の一覧が表示されます。

f:id:kouten0430:20181105231045j:plain

 

Windows1.0の他に Windows95Windows98、FreeBSD10.2、Linux2.6・・・・・・等もあり、クリックすると OS がブラウザ上でエミュレートされます。(今回は Windows1.0 をクリック!)

f:id:kouten0430:20181105231823j:plain

 

最初にファイルマネージャ(今でいうエクスプローラ)が起動しました。

f:id:kouten0430:20181105232134j:plain

 

アイコンが無いシンプルな表示です。

「ABC.TXT」という謎のファイルをダブルクリックしてみましょう。

f:id:kouten0430:20181110085706j:plain


ふむふむ・・・・・・、this is the contents of the file abc.txt(訳:これはファイルabc.txtの内容です)

ふむふむ。要するにこれは「テキストファイル」で、開いているプログラムは「メモ帳」ですね。


次に、ペイントを起動して落書きでもしてみようかと思います。

f:id:kouten0430:20181109230742j:plain

 

ペン・消しゴム・塗りつぶし・図形・テキストの挿入など基本的なことが一通りできます。

ちなみに、画面下の緑色の部分はデスクトップで、左下にプログラムマネージャー、メモ帳が最小化された状態になっています。(1.0から3.Xまでは、デスクトップがタスクバーの役割をしていた)

 

 すべて最小化するとこんな感じ。

f:id:kouten0430:20181109232145j:plain

 

逆に、起動中のプログラムをすべて並べてみます。

f:id:kouten0430:20181109231853j:plain

 

ちゃんと Windows になっています。

 

さて、ファイルマネージャーに戻ります。

ディレクトリを新規作成するには、

  • Special → Create Directory

ディレクトリを移動するには、

  • Special → Change Directory

を選択します。しかし、これをやろうとするとフリーズしてしまいました。

f:id:kouten0430:20181110090806j:plain

 

ファイルマネージャーを 閉じると、MS-DOS に戻ります。OS はあくまでも MS-DOS であり、WindowsMS-DOSGUI環境を付加するアプリケーションの一種でした。

MS-DOS上で WIN.COM と入力すると、再び Windows が起動します。(最初の起動時は AUTOEXEC.BAT から WIN.COM が自動実行されていた)

f:id:kouten0430:20181109233342j:plain

 

AUTOEXEC.BATの中身

f:id:kouten0430:20181110091124j:plain

 

 最後に、Windows1.0 が登場して以来の歴史をざっくりとまとめて締めます。 

製品名 bit 備考
1985 Windows 1.01 16bit MS-DOSGUI環境を付加するアプリケーションという位置づけで誕生(以降 3.Xまで)
1987 Windows 2.03 16bit  
1990 Windows 3.0 16bit  
1992 Windows 3.1 16bit 日本で初めて普及したWindows
1993 Windows NT 3.1 32bit  
1995 Windows 95 32bit 世界的に大ヒットし、以降、PCとインターネットが加速的に普及する
1998 Windows 98 32bit  
1999 Windows 98 SE 32bit  
2000 Windows 2000 32bit  
2000 Windows Me 32bit  
2001 Windows XP 32bit 32bitカーネルに一本化し、個人向け・企業向けの流れも一本化された
2003 Windows XP 64bit版 64bit  
2007 Windows Vista 32bit Meと共に黒歴史と呼ばれているそうな
2009 Windows 7 32bit  
2012 Windows 8 64bit  
2013 Windows 8.1 64bit  
2015 Windows 10 64bit 最終バージョンと謳われているらしい

 

使うほど時短になる! 愛用フリーソフトを晒すだけの巻(雑記-16)

今回は下記のようなPC操作を楽チンにしてくれるフリーソフトを3つ紹介します。

  • 別ウィンドウの必要な箇所を見ながらアクティブウィンドウで作業する
  • 最近コピーした文章や定型文を再利用(ペースト)する
  • 目的のフォルダに簡単にアクセスする

 

似たような機能のものはいくつかありますが、インストール不要で使える・操作性が良い・何となくアイコンが好み(?)という観点で勝手に選出しました。

上記のような操作をたくさん行う人ほど、月間や年間での累積時短効果は大きくなります。そして何より、仕事がストレスなくこなせるようになりますヽ(‘ ∇‘ )ノ

既に知名度が高いものばかりかもしれませんが、もし、まだ使ったことがないという人がいたらぜひ使ってみて下さいね。

 

f:id:kouten0430:20181102145226j:plainRapture

ソフトを起動した後、画面内でドラッグした範囲をキャプチャすることができます。キャプチャした範囲は 常に最前面に表示 されるため、別ウィンドウでキャプチャした範囲を参照しながら作業することができます。

f:id:kouten0430:20181102145445j:plain

 

これまで、データを参照するために印刷したり、ウィンドウを上下・左右に並べて作業していた人は少しだけ手間が省けると思います。キャプチャした範囲を画像として保存したり、クリップボードへ転送したり、メモを書き加えたりすることもできます。

キャプチャ範囲を常に最前面に表示できる恩恵が大きいため、他のキャプチャーソフトはPC内から自然淘汰されました。

個人的に「おにぎりアイコン」が脱力系で気に入ってます。

 

ダウンロードはこちらから

freesoft-100.com

 

 

f:id:kouten0430:20181102150605j:plainCLCL

いわずと知れたクリップボード拡張ソフトです。一度コピーしたデータは履歴として残り、履歴から何回でも再利用することができます。履歴は古いものから上書きされるので、残しておきたいものは登録アイテムとして保存しておくことも可能です。登録アイテムはフォルダ毎に分けることができるので、アイテムが延々と増え続けても大丈夫です(きちんと整理さえしていれば・・・・・・)。私は使用頻度の高い定型文やHTML、CSSスクリプトなどを登録アイテムの中に入れて使い回しています。

PC起動時は常に使えるように、CLCL.exeをスタートアップフォルダに入れて常駐しておきましょう。

 

ダウンロードはこちらから

freesoft-100.com

 

 

f:id:kouten0430:20181102151100j:plainFolders Popup

目的のフォルダーへ素早くアクセスするためランチャーです。マウスのホイールクリック(中ボタンクリック)でメニューを表示し、リストから選んでアクセスできます。

f:id:kouten0430:20181102151350j:plain

 

デスクトップ上、エクスプローラ上からだけでなくファイルを開くダイアログ名前を付けて保存ダイアログでも素早く目的のフォルダにアクセスできるので重宝します。

すべて英語表記ですが、表示中のフォルダーをリストに追加するための「Add This Folder」と、リストから削除するための「Remove」(「FoldersPopup Settings」 → 設定画面にて)くらいしか使わないのでまったく問題ありません。

f:id:kouten0430:20181102151440j:plain

f:id:kouten0430:20181102151524j:plain


「Opthions」で、好みに合わせてカスタマイズするとさらに使い勝手が良くなります。CLCLと同様に、PC起動時は常に使えるように FoldersPopup-X_X_X-XX-bit.exe をスタートアップフォルダに入れて常駐させておきましょう。

 

ダウンロードはこちら

freesoft-100.com

 

通常版はインストールが必要なので、インストール不要で使えるポータブル版をおすすめします。(ポータブル版は作者のページにある「Download this zip file」でダウンロード可能)

 

 

おわりに
Raptureで参考資料を最前面に表示しつつ、Folders Popupで素早く目的のアプリを起動し、CLCL クリップボード履歴を活用しながら作業を進める・・・・・・。この組み合わせだけでも、月間・年間でかなりの時短ができると思います。
他にもまだまだある便利なフリーソフト・・・・・・、皆さんのお気に入りは何でしょうか?

電気の雑学 ブラックアウト・ブラックスタートについて分かりやすく説明する試み(雑記-15)

今回は VBA とはまったく関係ありません。書くことも無くなってきた たまには違うことも書いてみましょう。

 

2018年9月6日に起こった、北海道胆振地方の地震および全域停電はまだ記憶に新しいところです。被災された方、停電で日常生活が困難になった方はとても大変だったことだろうと思います。
その間、テレビのニュースなどでは ブラックアウト という聞き慣れない言葉が頻繁に出てきました。今回はブラックアウトについて、さらにもっと聞き慣れないブラックスタートについても簡単に説明をしてみたいと思います。

 

ブラックアウトとは?

例えば、スポーツジムなどにあるエアロバイクをA君、B君、C君で漕いでいるとします。特別ルールとして、エアロバイクは常に一定の回転数で漕がなければなりません。このときエアロバイクが「負荷」、漕いでいる人が「発電機」、回転数が「商用周波数」に当たります。

9月6日の事象では、A君が苫東厚真火力発電所です。

漕いでいる途中で一番パワーのあるA君が膝を痛めて地震で被災して)離脱してしまいました。漕ぐ力が2/3以下となってしまって回転数を維持することがしんどくなり、B君が離脱・・・・・・ほどなくしてC君も離脱。これでエアロバイクは完全に停止・・・・・・。これがブラックアウトです。

 

ブラックスタートとは?

さて、完全に停止したエアロバイクを再び回転させるにはどうすればいいでしょうか?まず、一人で<軽めの負荷で>漕ぎ、回転数を維持しつつ、徐々に負荷を増やしていきます。負荷に合わせて漕ぐ人数も二人・三人と増やしていきます。で、完全復旧!

ってな風に、簡単にはいきません。

人間は電気がなくても活動ができますが、発電機は電気なしで発電を開始することができません。皮肉な話ですが。
全電源が喪失されたなかで発電を開始するには・・・・・・はて?どうしましょう(@_@;)

 

実はこういう時のために外部電源なしでも発電を開始することができる 特殊な水力発電所<ブラックスタート機能を有する発電機> がいくつか用意されています。エンジン発電機などを組み込んであり、それで発電した電気を用いて水力発電機を起動する仕組みです。(その、エンジン発電機自体はバッテリーなどを火種にして起動しています・・・・・・)

発電した電気を途中で消費されないようになるべく負荷を切り離した状態で、火力発電所などに送り届けます。(ポジトロンスナイパーライフルに電力を集中させるヤ○マ作戦のようだ。と、いうのは不謹慎なのでお控え下さい( ̄ω ̄;))

f:id:kouten0430:20181027163146j:plain

 

次に火力発電所などを起動します。

f:id:kouten0430:20181027163238j:plain

 

負荷を接続し停電を解消します。

f:id:kouten0430:20181027163305j:plain

 

これはかなり簡略化した図ですが、実際の順番やタイミングはもっと複雑怪奇です。

f:id:kouten0430:20181027163350j:plain

 

9/6 ~ 8に行われたブラックスタートは一回目が失敗に終わり、二回目で成功したそうです。

 

疑問を自分で回答してみる!

自分で感じた疑問を自分自身で回答してみます!専門家のツッコミは受け付けません。

疑問1

Q.太陽光や風力でブラックアウトは阻止できないの?また、ブラックスタートはできないの?

  • A.今の技術だと太陽光や風力は・・・・・例えるなら エアロバイクを力のある別の誰か(例えば火力や原子力)が先に漕いでいること が前提の補佐的発電しか行うことができません。漕ぐ力も弱め、かつ気まぐれです。なので、電源の主軸となることができません。

 

疑問2

Q.本州側から電気の融通はできなかったの?

  • A.本州側から海底ケーブルを通じて融通できる上限は60万kWです。苫東厚真火力発電所の停止で喪失した電源は165万kWであることを考えると、足りていません。また、片方がブラックアウトしている状態では 交直変換 ができないという欠点もあるそうです。

    f:id:kouten0430:20181027164008j:plain

 

疑問3

Q.原発は起動できないの?

  • A.国の許可が下りるまでは起動できません。

 

ブラックアウト・ブラックスタート・それに関連した疑問等についてざっくりと説明してみましたが、なんとなく分かっていただけたでしょうか?普段あたりまえのように使っている電気ですが、今回のように全域で喪失する場合があることも分かりました。これを機に、電気のみならず ライフラインと呼ばれるもの(電気・ガス・水道・電話・インターネット・交通 等)が普段不自由なく使えることのありがたみを考えてみるのもいいかもしれませんね。

Word 左からの文字数指定で置換する

前回は段落の両端に対しての処理でしたが、今回は段落の内側にアプローチしてみたいと思います。
ということで、左からの文字数指定で各段落の内側を置換するマクロを作ってみました。

 

前回と同じように任意の範囲を選択します。
仮に左から5文字目を置換開始位置にし、そこから3文字分を ヽ(‘ ∇‘ )ノ に置換してみます。

f:id:kouten0430:20181021110734j:plain

 

f:id:kouten0430:20181020125923j:plain

 

範囲選択してからマクロ実行。InputBox の指示に従い、置換開始位置、置換開始位置からの文字数、指定文字を入力するだけで使えます。

コードはこちら。

Sub 左からの文字数指定で置換する()
    '選択範囲内にある各段落に対して処理します
    'ReplaceEndが0指定のときは、置換開始位置の左側に挿入されます
    Dim ReplaceStart As Integer
    Dim ReplaceEnd As Integer
    Dim 指定文字 As String
    Dim SelectionStart As Integer
    Dim SelectionEnd As Integer
    Dim 段落 As Paragraph
    
    ReplaceStart = InputBox("左から何文字目を置換開始位置にしますか?")
        If ReplaceStart < 1 Then
            ReplaceStart = 1
        End If
    ReplaceEnd = InputBox("開始位置から何文字分を置換しますか?")
        If ReplaceEnd < 0 Then
            ReplaceEnd = 0
        End If
    
    指定文字 = InputBox("置換後の文字を入力して下さい。")
        If 指定文字 = "" Then
            Exit Sub
        End If

    'Textプロパティで選択が解除されるので、選択範囲を記憶させる
    SelectionStart = Selection.Start
    SelectionEnd = Selection.End
    
    For Each 段落 In ActiveDocument.Range(SelectionStart, SelectionEnd).Paragraphs
        If 段落.Range.Start + ReplaceStart - 1 < 段落.Range.End - 1 Then    '開始位置が段落の文字数を超過している場合は処理しない
            If 段落.Range.Start + ReplaceStart + ReplaceEnd - 1 <= 段落.Range.End - 1 Then
                ActiveDocument.Range(段落.Range.Start + ReplaceStart - 1, _
                段落.Range.Start + ReplaceStart + ReplaceEnd - 1).Text = 指定文字
            Else    '開始位置からの文字数が段落の範囲を超える場合、強制的に範囲内で収める
                ActiveDocument.Range(段落.Range.Start + ReplaceStart - 1, _
                段落.Range.End - 1).Text = 指定文字
            End If
        End If
    Next
    
End Sub

 

※コードの大まかな流れ

  • まず左から何文字目を開始位置にするか、開始位置から何文字分を置換するか、置換後の文字を何にするか InputBox で指定します。
  • 現在の選択範囲の開始位置と終了位置を変数に入れておきます(処理中に選択が解除されてしまうため)。
  • For Each ~Next で、選択範囲内の段落すべてにループ処理を行います。
  • ループ内の処理:置換開始位置から指定文字分を Text プロパティで置換します。(条件分岐では、各段落の末端位置よりも置換開始位置が超過していた場合は処理をパスし、指定文字数が超過していた場合はマイナス補正〔末端位置まで〕をかけています。)

 

※コードの使用方法

  • SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存し、やり直しのできる状態にしておいて下さい。Wordで標準モジュールにコードを貼り付けてマクロを使用する方法はこちら

Word 選択範囲の段落の先頭または末尾に指定文字を挿入する

文書の各段落の先頭や末尾に文字をまとめて追加したい場面ってありませんか?
「俺(私)にそんな場面はないっ!」って方には、ここから下の記事は無用の長物です。他の場所に GoTo して下さい。

ということで、今回は選択範囲内にある各段落(の先頭または末尾)にマクロを使って指定文字を挿入させてみようと思います。

実験に協力していただくのは次の文書です。

f:id:kouten0430:20181017131736j:plain

注:魂の叫びではありません。

 

目次

 

各段落の先頭に指定文字を挿入する

任意の範囲を選択した状態でマクロを実行。マクロ実行後に表示される InputBox で入力した文字が各段落の先頭に挿入されるようにします。

f:id:kouten0430:20181017131856j:plain

 

コードはこちらです。

Sub 選択中の段落の先頭に指定文字を挿入する()
    Dim 指定文字 As String
    Dim 段落 As Paragraph
    
    指定文字 = InputBox("先頭に挿入する文字を入力して下さい。")
        If 指定文字 = "" Then
            Exit Sub
        End If
    
    For Each 段落 In Selection.Paragraphs
        段落.Range.InsertBefore 指定文字
    Next
    
End Sub

 
選択範囲内の段落すべてに For Each ~Next でループ処理を行うようにします。
ループ内では、一つの段落の範囲に対して InsertBefore で先頭に指定文字を挿入させています。これは簡単ですね。

 

 

各段落の末尾に指定文字を挿入する

考え方は先ほどと同じですが、今度は指定文字が各段落の末尾に挿入されるようにします。

f:id:kouten0430:20181017132919j:plain

 

コードはこちらです。

Sub 選択中の段落の末尾に指定文字を挿入する()
    Dim 指定文字 As String
    Dim 段落 As Paragraph
    
    指定文字 = InputBox("末尾に挿入する文字を入力して下さい。")
        If 指定文字 = "" Then
            Exit Sub
        End If
    
    For Each 段落 In Selection.Paragraphs
       ActiveDocument.Range(0, 段落.Range.End - 1).InsertAfter 指定文字 '改行の手前に挿入するのがポイント
    Next
    
End Sub

 

先ほどのコードを、 InsertBefore から InsertAfter に変えるだけでは上手くいかないので若干工夫が必要です。
そのまま InsertAfter にすると改行の後ろ(つまり次の段落の先頭)に文字が挿入されてしまいます。なので Range.End から-1文字の位置(つまり改行の前)に挿入させましょう。この時、段落の Range は引数指定できないので、 ActiveDocument.Range を使用します。

 

 

各段落の先頭にクリップボードの各文字を挿入する

ここからはおまけです。
各段落の先頭に InputBox の指定文字ではなく、クリップボードの各行の文字を挿入させます。

f:id:kouten0430:20181017133409j:plain

 

コードはこちらです。

Sub 選択中の段落の先頭にクリップボードのデータを貼り付け()
    Dim myLib As Object
    Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  '参照設定なしでDataObjectのインスタンスを生成する
    Dim 全文字列 As String
    Dim 分割文字列 As Variant
    Dim i As Integer
    Dim 段落 As Paragraph
    
    myLib.GetFromClipboard
    
    On Error Resume Next
    
    全文字列 = myLib.GetText
    
    On Error GoTo 0
    
    If 全文字列 <> "" Then
        分割文字列 = Split(全文字列, vbCrLf)  '全文字列を改行で分割し配列に格納する
        i = 0
    
        For Each 段落 In Selection.Paragraphs
            If i <= UBound(分割文字列) Then
                段落.Range.InsertBefore 分割文字列(i)
                i = i + 1
            Else
                Exit For
            End If
        Next
        
    Else
        MsgBox "クリップボードにデータがありません!"

    End If
    
End Sub

 

 

各段落の末尾にクリップボードの各文字を挿入する

各段落の末尾に InputBox の指定文字ではなく、クリップボードの各行の文字を挿入させます。

f:id:kouten0430:20181017133534j:plain

 

コードはこちらです。

Sub 選択中の段落の末尾にクリップボードのデータを貼り付け()
    Dim myLib As Object
    Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  '参照設定なしでDataObjectのインスタンスを生成する
    Dim 全文字列 As String
    Dim 分割文字列 As Variant
    Dim i As Integer
    Dim 段落 As Paragraph
    
    myLib.GetFromClipboard
    
    On Error Resume Next
    
    全文字列 = myLib.GetText
    
    On Error GoTo 0
    
    If 全文字列 <> "" Then
        分割文字列 = Split(全文字列, vbCrLf)  '全文字列を改行で分割し配列に格納する
        i = 0
    
        For Each 段落 In Selection.Paragraphs
            If i <= UBound(分割文字列) Then
                ActiveDocument.Range(0, 段落.Range.End - 1).InsertAfter 分割文字列(i) '改行の手前に挿入するのがポイント
                i = i + 1
            Else
                Exit For
            End If
        Next
        
    Else
        MsgBox "クリップボードにデータがありません!"

    End If
    
End Sub

 

 

※コードの使用方法

  • SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存し、やり直しのできる状態にしておいて下さい。Wordで標準モジュールにコードを貼り付けてマクロを使用する方法はこちら

Word 開いている全文書の同じ行にクリップボードのデータを貼り付ける

今回は Word で開いているすべての文書の同じ行(厳密にいうと段落※)にクリップボードのデータを貼り付けさせてみたいと思います。

 

イメージとしてはこんな感じ。

f:id:kouten0430:20181014143415j:plain

 

マクロ実行時にアクティブな文書(最前面にある文書)のカーソル位置を読み取り、すべての文書の同じ行にデータを貼り付けします。

貼り付けされる順番は、アクティブな文書から・・・・・・ではなく、どの文書がアクティブであろうとも文書を開いた順番と逆(最後に開いた文書 → 最初に開いた文書)になるので注意して下さい。

 

コードはこちら。

Sub 現在開いている全文書の同じ行にクリップボードのデータを貼り付ける()
    '現在アクティブになっている文書のカーソル位置と同じ行(厳密には段落)にデータが貼り付けされます
    'データが貼り付けされる順番は文書を開いた順番と逆(最後に開いた文書 → 最初に開いた文書)になります
    Dim myLib As Object
    Set myLib = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")  '参照設定なしでDataObjectのインスタンスを生成する
    Dim 全文字列 As String
    Dim 分割文字列 As Variant
    Dim i As Integer
    Dim 段落番号 As Integer
    Dim 文書 As Document
    
    myLib.GetFromClipboard
    
    On Error Resume Next
    
    全文字列 = myLib.GetText
    
    On Error GoTo 0
    
    If 全文字列 <> "" Then
        分割文字列 = Split(全文字列, vbCrLf)  '全文字列を改行で分割し配列に格納する
        i = 0
    
        段落番号 = ActiveDocument.Range(0, Selection.End + 1).Paragraphs.Count  'カーソル位置の段落番号を取得する
    
        For Each 文書 In Documents  '処理の順番は文書を開いた順番と逆になることに注意!
            If i <= UBound(分割文字列) Then
                文書.Paragraphs(段落番号).Range.InsertBefore 分割文字列(i)
                i = i + 1
            Else
                Exit For
            End If

        Next
        
    Else
        MsgBox "クリップボードにデータがありません!"

    End If
    
End Sub

 

※コードの大まかな流れ

  • まず、クリップボードの全文字列を変数に格納します。
  • 次に、Split関数を使って全文字列を改行(CrLf)で分割し配列に格納します。
  • アクティブな文書のカーソル位置の段落番号(つまり、カーソルがあるのは先頭から数えて何個目の段落か)を Paragraphs.Count でカウントして変数に格納します。※段落の先頭にカーソルがある場合、一つ前の段落までしかカウントされないため、先頭からカーソル位置+1文字の範囲内にある段落をカウントさせています。
  • For Each ~Next で、現在開いているすべての文書に対してループ処理を行います。
  • ループ内の処理:文書の該当の段落に配列の文字列を挿入します(次のループで、配列は次の要素に進みます)。ループの途中で配列の要素が尽きたら、ループを抜けて終了します。

 

※段落とは?

  • 改行の次の文字から次の改行までを指します。次の改行までが長くなると右端で折り返されて複数行に渡る場合もあります。

 

※コードの使用方法

  • SubからEnd Subまでをコピーし、標準モジュール等に貼り付けて使用して下さい。なお、マクロで実行した処理は「元に戻す」ことができません。実行前に一旦保存し、やり直しのできる状態にしておいて下さい。Wordで標準モジュールにコードを貼り付けてマクロを使用する方法はこちら