VBAで外部ブック参照

最近はChatGPTでマクロのサンプルを作って手直ししたりしてるのですが、結構便利なので自分用の資料として置いていこうと思います😌

Sub CopyColumnFromAnotherWorkbook()
    Dim sourceWorkbook As Workbook
    Dim targetWorksheet As Worksheet
    Dim sourceWorksheet As Worksheet
    Dim lastRow As Long
    Dim sourceRange As Range
    Dim cell As Range

    ' コピー元のブックを開く
    Set sourceWorkbook = Workbooks.Open("C:PathToSourceWorkbook.xlsx")

    
' コピー元の最初のシートを取得
    Set sourceWorksheet = sourceWorkbook.Sheets(1)

    

    ' コピー先のシートを指定(デフォルトは1番目のシート)
    Set targetWorksheet = ThisWorkbook.Sheets("Sheet1")    

    ' コピー元のA列の最終行を取得
    lastRow = sourceWorksheet.Cells(sourceWorksheet.Rows.Count, 1).End(xlUp).Row  

    ' コピー元のA列の値をコピー先に貼り付け
    Set sourceRange = sourceWorksheet.Range("A1:A" & lastRow)    

    ' コピー元のA列の各セルをチェックし、空白でない場合にのみコピー先に貼り付け

    For Each cell In sourceRange
        If Not IsEmpty(cell.Value) Then
            targetWorksheet.Cells(cell.Row, 1).Value = cell.Value
        End If
    Next cell
    

    ' コピー元のブックを閉じる(保存しない)
    sourceWorkbook.Close SaveChanges:=False

End Sub

PowerShellで業務自動化計画

うちの職場ではネット上のツールをインストールするのにも別の部署の許可が必要らしいのでPowerShellをつかって自分でツールを作るしかないです。なのでその時に便利なものをまとめます。

 

まあGUIでの自動化って環境によって上手く行かない事が多いので出来ればCUIでどうにかしたほうが良いのですが、エクセルやワードの操作はバッチファイルでやるのは厳しいところ。

 

小出しにしていたのをまとめてみます。

よく使うコマンド

ソフトの立ち上げ

Start-Processコマンドを使います。URLを入力すると標準設定のブラウザで開いてくれたりして便利です。ランチャーのような使い方のできると思います。

キー操作

[System.Windows.Forms.SendKeys]::SendWait("")のコマンドを使います。("")の中に文字列をいれていきましょう。全角の日本語でもしっかり入力してくれます。楽しいね。{TAB}と書けばTABキーを押してくれます。

特殊な文字は

" " スペースキーを入力したい場合は半角スペースでOK!具体的にはSendWait(" ")のように入力しましょう
"^" Controlキーを入力したい時は^を使います。"^f"で文字列検索、"^s"で上書き保存などショートカットキーも使えます
"%" Altキーを入力したい時は%を使います。"%{F4}"を使ってアプリの終了は割りとよく使うと思います。
"+"

Shiftキーを入力したいときは+を使います。"+{TAB}"を使って前の項目を選択したりしましょう。

その他のキーのことは下記を参照してください

SendKeys クラス (System.Windows.Forms) | Microsoft Learn

処理待ち

Start-Sleepコマンドを使います。

Start-Sleep -m 500で500ミリ秒(0.5秒)待ちます。

Start-Sleep -s 1で1秒待ちます。

キー操作やソフトの立ち上がりを待つのに使ったりします。

 

ただソフトを起動するのにかかる時間というのはPCの性能やら他の作業状況やらで変動するもの。1秒で終わる事もあれば8秒かかる事もあり、「じゃあバッファをとって10秒待たせよう」とすると1秒で起動完了したときに無駄に待つことになったりします。それは避けたい。

 

そう言うときはGet-Processを使うといい感じになります。これを使うとタスクマネージャーで見るようなプロセスを取得できますので、その中のウィンドウ名がファイル名と同じものがあるかを聞けばOKです。

 

CSV取り込み

例えば下記のようなCSVファイルがあったとします。

氏名,年齢,性別,職業
谷岡俊一,32,男性,会社員
山田太郎,24,男性,大学生
鈴木花子,41,女性,主婦
田中次郎,57,男性,自営業

その場合、Import-Csvのコマンドを使って取り込みます。今回は日本語を取り込むので文字コードUTF-8にしないと文字化けしてしまいます。ですので下記のように取り込んでください。

$csv = Import-Csv -Path "csvファイルのパス" -Encoding UTF8

取り込んだ後は$csv[1].年齢の中に24が入ってます。[]の中の数字がROW(列)でその後にcolumn名がくるわけですね。

Columnの中から特定のものを抽出したい場合はWhere-Objectのコマンドを使います。今回の名簿から男性をピックアップしたいのなら下記のように追記します。

$selectedRows = $csv | Where-Object { $_.性別 -eq "男性" }

 

サンプルコード

自分が自動化させる時によく使うコマンドを上げていきましたが、やはりまとまった流れの方が分かりやすいと思うのでグーグルでうんこと検索するコードを作ってみました。

Googleでうんこと検索する
#キー入力ができるようにする
Add-Type -AssemblyName System.Windows.Forms
#グーグルを開く
Start-Process https://www.google.com/
Start-Sleep -Seconds 1

#うんこで検索する
[System.Windows.Forms.SendKeys]::SendWait("うんこ")
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}"
ファイルを開いてそのファイルが開き終わるのを待つ
# ファイルの絶対パスを指定
$file = "ファイルの絶対パス"

# ファイルを開く
Start-Process $file

# ファイルを開いたプロセスを確認する
$process = $null
$file = Split-Path $file -Leaf
while ($process -eq $null) {
    Start-Sleep -Seconds 1
    $process = Get-Process | Where-Object { $_.MainWindowTitle -like "*$file*" }
}

# プロセスが確認できたら、メッセージを表示する
Write-Host "ファイルを開いたプロセスが確認できました。"

 

PowerShellで時間待ちさせる

PowerShellで処理待ちをさせる場合はStart-Sleepを使います

Start-Sleep

このコマンドには-sと-mのオプションで待ち時間を調整出来ます。具体的にいうと下記のとおりです。

Start-Sleep -s 11秒待つ
Start-Sleep -m 200200ミリ秒(0.2秒)待つ

キー操作でコピー貼り付けなどの処理は多少時間がかかったりするのでこのコマンドを使っていきましょう

PowerShellのSendKeys(キーボード)操作について

キー入力をする

PowerShellでキー操作をする際には[System.Windows.Forms.SendKeys]::SendWait("")

を使います

IDとパスワードを自動入力する事も出来ます。TABキーを押すと次の入力フォームに移動したりするのでうまく使いこなしてみましょう。

""の中になにを入れるかで動作が変わります。

a〜z、0〜9対応するキーを入力
{BS}、{TAB}などバックスペース、TABキーなどを入力
^コントロールキーを入力。C,^Vでショートカットのコピー、貼り付けなどが使える(バッチはコントロールとCで止まってしまうので気をつけろ)
 半角スペースでスペースキーを入力。
%Altキーを入力する。%{F4}と入力すればショートカットコマンドでアプリの終了などが可能

超予測力を読んでやっぱり間違った二項対立は良くないんだなあと思った(広告)

財務省のPDF資料のなかにキツネ型とハリネズミ型ではキツネ型の方が予測においては有利という一文がありました(8ページ目)

https://www.mof.go.jp/pri/research/seminar/fy2019/lm20200129.pdf

キツネ型とハリネズミ型の違いがよく分からなかったので超予測力の本を買って読んでみました。

結論としてはキツネ型はそこまで深くはないけど多角的な視点で予測し、ハリネズミ型は狭く深い知識で予測するものでキツネ型の方が予測の正確性が高いというものです。

ただし思考の型というのは複雑な思考を単純なモデルに落とし込んだものでこの2種類の人間しかいないというわけではない。

キツネよりのハリネズミハリネズミよりのキツネといった濃淡や職場ではキツネ型、プライベートではハリネズミ型というように状況によって切り替わることもありえます。

そもそもハリネズミ型がキツネ型に劣っている訳ではなく、ハリネズミ型は正確な予測以外の面では有利だったりします。

こういう二項対立ではなく補完し合う関係と考えるのが妥当です

誤った二項対立をしてはいけない(戒め)

本の中に有名な例えとして専門家の予測の精度はチンパンジーがダーツをなげたのと変わらない、というのが出てきます。投資している人ならランダムウォーク理論の説明で聞いたことがあるんじゃないでしょうか?

別にコイントスでも当てずっぽうでもいいのにチンパンジーがダーツを投げると表現したから有名になったと作者は分析していますし、私もそう思います。

ではこの例えは正しいのかというと特定の条件下では正しいけどそうでない場合は間違っているが答えです。

予測というのは遠い未来であれば難易度が大幅に上がります。典型例は天気予報で明日の天気であればかなりの的中率になりますが、一週間後になると下がってきて1~2年後にはまさにチンパンジーがダーツを投げたのと変わらなくなります。

専門家だからといって正確な予測が出来るのかというと遠い未来の場合はそうでもなく、それどころかメディアに出演して間違った予測を自信満々に語る人や怪しい商材を売り歩く人すらいます。

では専門家の予測なんてまったくの無駄だと切り捨ててもよいかというとそうでもありません。特定の条件下や近い未来であれば通常より高い精度で予測出来たりします。

正しくもあり間違ってもいるという表現に歯切れの悪さを感じる人もいるでしょうが、この間違った二項対立をしてはいけないというのが本の肝だと思っています。

専門家に過度な期待は禁物、だけど専門家を無能だとバカにするのも間違っている。その中間を絶妙なバランスで歩くのが正確な予測に繋がります

即断と熟考、直感と分析、科学と宗教、運と実力などなど世の中には数多くの二項対立がありますが、それは対立させるのではなく補完させるのが重要なんだなあと思いました

それ以外にもいくつか為になるなあと思ったこと

対立ではなく補完というとかっこよく聞こえますけども「パッと見て直感的に思った事は正しいことも多いけど錯覚の可能性もある。だから時間があるのなら本当にそうなのか確認したほうがいい」というありがちなアドバイスになっちゃいます

全体的に「なるほど、その手があったか」となるようや革新的な事は少なく、よく言われていることを丁寧に分析した様な事の方が多かったです。

それでもいくつかあった私にはなかった考え方を紹介します。

宗教と科学のちがい

珍しい事象が発生した時「なぜ?」と意味や理由を考える人は多いです。でもそれは単なる偶然で意味や理由なんてなかったりします。それでも偶然を偶然のまま受け入れる事が出来ない場合、神のはからいとして意味付けたりします。

そうやって偶然ではなく運命や定めとして決まっていた事だと考えるのが宗教的な考え方です。そして無神論者も神のはからいではなく社会の構造や権力者の陰謀としてこの考え方をしてたりします。

それに対して「どのようにして?」と過程や因果を確率的に考えるのが科学的な考え方です。

気圧などのデータを数理モデルに入力し、そこから確率的に結果を出す天気予報の考え方ですね。

ある程度の確率を求める事はできても最終的には偶然で決まるのが科学的な考え方と言われると意外と言えば意外でした。

やはり科学の終着点がラプラスの悪魔というのは間違いだったのか…

言い方を変えれば分からないことを分からないと言うのが科学であり、神のはからいや権力者の陰謀と言うのが宗教ということでしょうね

ただ悲しいことに科学的な考え方は正確さに置いては優れてますが、幸福にはなりくい考え方であり、宗教的な考え方はその逆ということです。

また科学的な考え方では断言を滅多にしないので優柔不断だと思われ、宗教的な考え方だと単純明快で力強い言葉になりやすく、意志の強さに繋がったりもします。

ただこれも誤った二項対立なのかもしれません。エジソンも失敗に意味付けをして研究を続けたように、科学者も宗教的な考え方を取り入れてもいいんじゃないかなあと

予測が外れたても予測者の目的は達成されている事もある

この観点は目からウロコでした。予測が外れた場合普通は失敗だと思うでしょう。

でもこれが「人類が核戦争を引き起こす」という予測をしたらどうでしょうか?

むしろ予測が外れるように軍縮へ世論を動かすのが目的で、予測を外れさせる事が狙いだったりもします。

投資でもそうですけど、自分で予測を当てて利益を出すのではなく経済評論家などとしてメディアに出演したりオンラインサロンやnoteで稼ぐ場合も予測が正確である必要はないですよね

また、予測は占いのように自分にとって都合のいいものだけ信じるという使い方の人も少なくありません。

例え事実に版して自分にとってポジティブな事を言って肯定してくれる人にお金を出したりもします

そうなると予測者にとってもそれを聞く人にとっても正確性なんてどうでもいいって話になりますよね

正確さより幸福を優先してそうなったのならそれはもう宗教なんだよなあ