OutlookVBA フォルダ選択ダイアログの出しかた

outlookVBAでフォルダ選択ダイアログを出すには以下のように
PickFolderを呼び出しましょう。

Sub FolderPick()

    Dim objNS As NameSpace
    Dim objFolder As Folder

    Set objNS = Application.GetNamespace("MAPI")
    Set objFolder = objNS.PickFolder

    If TypeName(objFolder) <> "Nothing" Then
        Debug.Print " objFolder: " & objFolder
    Else
        Debug.Print "Cancel"
    End If

    Set objFolder = Nothing
    Set objNS = Nothing

End Sub

f:id:GARAPON:20210318170319p:plain
こんな感じでみえる。


OutlookVBAはほんと情報なくてめんどい。

ブラウザRPA作るときに便利なコード

色々とrpaはあるけれど、自分しか使わない、少し複雑なこともしたいという時はvbaはやっぱ便利。

ieの処理が終わるまで待つ

Function IEWait(ByRef objIE As Object)
    Do While objIE.Busy = True Or objIE.readyState <> 4
        DoEvents
    Loop
End Function

指定の時間待機

Function WaitFor(ByVal second As Integer)
    Dim futureTime As Date
    futureTime = DateAdd("s", second, Now)
    While Now < futureTime
        DoEvents
    Wend
End Function

Excelの計算精度はIEEE 754準拠

excelってどんな精度なのかと調べてみた

Microsoft Excel は、IEEE 754 の仕様に基づいて設計され、浮動小数点数の格納方法と計算方法を決定していました

Excel で浮動小数点演算の結果が不正確になる可能性がある | Microsoft Docs

java のdoubleとかと同じ制度だね

検索でOR条件・AND条件を使う

Outlookのクイック検索(Ctrl+Eキー)の検索はデフォルトでは単語「or」条件なので不便。
そういうときは「AND」をつかいましょう。

 タコ AND イカ
 タコ OR イカ
 タコ NOT イカ

これだけ覚えておけばOK。

「プログラムにコマンドを送信しているときに、エラーが発生しました。」となったらDDE無視をOFFに

数日前からエクセルをダブルクリックすると
「プログラムにコマンドを送信しているときに、エラーが発生しました。」
といったエラーになってしまう。

f:id:GARAPON:20200625225028p:plain
エラー

エクセルを一旦起動してからファイルから開いたり、ドラッグアンドドロップすればファイルは開くのだが
メールの添付はひらけなくなるし非常に不便。

対処は何かと調べてみたらすぐ見つかった。
Excel でコマンドをプログラムに送信するときにエラーが発生しました | Microsoft Docs

んでこの対処の中のこれをやるだけでOKでした!

  1. [ファイルオプション] を選択し > Optionsます。
  2. [詳細設定] を選択して [全般] セクションまでスクロールし、[全般] 領域の [動的データ交換 (DDE) を使用している他のアプリケーションを無視する] チェックボックスをオフにします。
  3. [OK] を選択します。


DDEはWindows2.0の頃の遺産でOLEやCOMにとってかわられているので、DDEを使用しているアプリケーションを無視するのは正しいと思うのですが、いまだにWindowsシェルの関連付けとかでは使われているので、そのDDE命令をエクセルが無視しちゃうということなんでしょうかね?
でもだとするとExcelの壮大なバグですよね。。。。


参考DDEをつかったいたずら

DDEが有効だとこんな悪さができます。ここでは電卓立ち上げているだけですが、ファイルひらいただけでCMD乗っ取れるので、実質なんでもできちゃう恐ろしい仕組みです。
binary-pulsar.hatenablog.jp

結合セルを解除して値を埋め、埋めた個所の文字色を変更するショートカット

いやーやはりエクセルは魔術ですね。最高です。
列結合した表を成型するマクロの記事に対しこのブクマ。破壊力抜群ですね。

【エクセルVBA】一瞬で結合セルを解除して値を埋めるマクロ

Ctrl+A→Alt→H→M→U→Ctrl+G→Alt+S→K→Enter→Shift+−→↑→Ctrl+Enter でできるよ。なお実務でスムーズにやると変態扱いされる模様/あ、日本語入力時は=をEnterで確定させてね

2020/06/18 10:05
b.hatena.ne.jp

Ctrl+A→Alt→H→M→U→Ctrl+G→Alt+S→K→Enter→Shift+−→↑→Ctrl+Enter

やっていることはシンプルで

  1. Ctrl+A→Alt→H→M→U   表の結合を解除して、
  2. Ctrl+G→Alt+S→K→Enter 空白セルを選択
  3. Shift+−→↑→Ctrl+Enter 選択したすべてのセルに一つ上のセルを参照する数式を設定

としている。

これが

f:id:GARAPON:20200619210054p:plain
before

Ctrl+A→Alt→H→M→U→Ctrl+G→Alt+S→K→Enter→Shift+−→↑→Ctrl+Enter

一発で

こうなる

f:id:GARAPON:20200619210059p:plain
after



さらに

ALT→h→f→1→↓(矢印キーで任意の色を選ぶ)→ENTER

までやると自動で埋めたセルの文字を薄くなる

f:id:GARAPON:20200619210729p:plain
まさにエクセル芸

つまり

Ctrl+A→Alt→H→M→U→Ctrl+G→Alt+S→K→Enter→Shift+−→↑→Ctrl+Enter
→ALT→h→f→1→↓(矢印キーで任意の色を選ぶ)→ENTER

これが
f:id:GARAPON:20200619210054p:plain

こうなる
f:id:GARAPON:20200619210729p:plain

まとめ

エクセルは最高!