prettify

2021年11月7日日曜日

リマインドメール自動送信

お久しぶりです!

1回目のワクチンがほとんど副反応なかったので調子乗ってたら2回目のワクチンで副反応出まくったなんプロです。


約3ヶ月ぶりの動画投稿になっちゃいました😅

いや~、ここまで面倒くさがり屋だと病気なのかな?😆

前回の動画のPowerAutomateやVBScriptバージョンを作ろうかな~と思いつつも作らず、基本情報の午後問題をベースにした動画を作ろうかな~と思いつつも作らず


コメントでリクエストを頂いたので動画にしてみました。

(リクエストでようやく重い腰が上がりましたw)

Outlook、ExcelやらVBScriptとかいろいろ使ってるので分かりにくいかもしれないですけど、勉強にはなるかなと思います。

意外と長尺になっちゃいました😫


Windows11も動画にしようかな~って思ってたけど、意外と動画にするようなのが無くて辞めちゃいました😄

次の動画はどうしようかな?


2021年6月20日日曜日

Outlook VBAで自動返信

安心してください!生きてますよ! 😆


気付いたら前回の動画投稿から約2ヶ月近く経ってるんですね💦

VBAベストプラクティスの動画を作ろうと思ってたんですが気持ちが乗らず…

ということで、久しぶりの動画投稿となります。


Outlook VBAでメールに返信してしまおう!というものになります。

私のチャンネルでは初Outlook VBAですね。

(VBScriptやらExcel VBAから操作するのはやってたんですが

 改めて直Outlook VBAは初めてでした😁)


※動画は本日(6/20)17:00までは限定公開にしてあります。🙇

動画内で使用しているレジストリ追加用コマンド

REG ADD HKCU\SOFTWARE\Microsoft\Office\16.0\Outlook\Security /v EnableUnsafeClientMailRules /t REG_DWORD /d 1


ご質問に対して動画で回答する…

メールに電話で返答する的な感じですね😂


せっかくなんでPowerAutomateバージョンやVBScriptバージョンも

作っていこうかな~と思ってます。

(あくまで思ってるだけです💦)


2021年4月26日月曜日

VBAのベストプラクティス(Best Practice)

いくつかのサイトに載っていたベストプラクティス

【参考サイト】

http://www.spreadsheet1.com/vba-development-best-practices.html

https://www.automateexcel.com/vba/best-practices/

https://riptutorial.com/excel-vba/topic/1107/vba-best-practices

https://www.microsoft.com/en-us/microsoft-365/blog/2009/03/12/excel-vba-performance-coding-best-practices/

https://bettersolutions.com/vba/macros/best-practices.htm

https://masterofficevba.com/vba-coding-constructs/best-practices-for-excel-vba-code/

 

こうやってリストにしてみると、すごい多いですね😲

  • Option Explicit を宣言する
  • Sub, Function, 変数 は分かりやすい名前を付ける
  • 変数名にはデータ型のプレフィックスを付ける
  • 変数名にVBAの予約語(定数)を使わない
  • ScreenUpdating, Calculation, Events, PageBreaks, DisplayStatusBar は停止する
  • エラーハンドリングする
  • オブジェクト変数はリリースする(ガベージコレクション, メモリリーク対策)
  • Activate や Select はなるべく使わない
  • コピペ処理は使わない
  • シートを保護するときはできるだけ UserInterFaceOnly にする
  • 多くのセルを処理するときは配列を使う
  • 型宣言する(できるだけ Variant を使わない)
  • ワークシート関数を活用する
  • コードを実行する前にコンパイルする
  • レイトバインディングを使う
  • Cell, Range は完全修飾子を使う
  • ActiveCell ActiveSheet はなるべく使わない
  • インデントを入れる
  • 空文字は "" ではなく vbNullString を使う
  • For より For Each を優先して使う
  • With ステートメントを使う
  • コメントを入れる
  • VBAの定数を使う
  • 変数は使用している場所の近くで宣言する
  • 関連する変数は同じ行で宣言する
  • Gotoステートメントは使わない
  • Call は使わない
  • MagicNumber を避ける(Enumを使う)
  • ByVal ByRef の違いに注意する
  • Exit For や Exit Do を使う場合は注意を払う(乱用しない)


中には古い考えなんじゃないかなって思うのもあるけど

基本的には納得できるベストプラクティスですね。

動画のネタになるかな?😅


2021年3月28日日曜日

Power Automate Desktop のフローをスケジュール実行したい!!

※2021/07/12 追記あり

 Power Automate Desktop は、Power Automate(クラウド)と連携することで

スケジューリングした時間に実行したり、トリガーしたりすることができるらしい。

でも、Power Automate(クラウド)は調べた感じ、無料では使えないっぽい😭

(試用期間中は無料らしいけど…)


トリガーは無理でも、スケジュール実行ぐらいはしたい。

でも、お金は掛けたくない😥


ということでVBAで Power Automate Desktop (PAD) のフローを

力技💪で起動してみました(笑)

(Let's Power Play!!)


クラスファイルにしたので興味があればどうぞ。

【ダウンロードページ】

Releases · nampro47/PADFlowLauncher · GitHub

※ページ内の"Source code (zip)"クリックでダウンロードできます。

【使用方法】

How to use · nampro47/PADFlowLauncher Wiki · GitHub


試してないけど、おそらくスクリーンセーバーや

画面ロックされている状態だと動かないと思います(多分)


作成過程を動画にしようと思ったけど、尺が長すぎてボツになりました😱

(編集無理っス💦)


クラスファイルを使うところだけでも、動画にしようかな~😒

(もったいないし…)


2021/07/12 追記

6月にPower Automate Desktopがバージョンアップしていたようで

ウィンドウタイトルが変わってました。

(「(プレビュー)」の文字がなくなってた💦)

YouTubeのコメントで教えてもらいました。助かります😊

GitHub上のコードを修正したので、ダウンロードしてもらえれば使えるはず…


もしくはウィンドウタイトルを設定できるようになっているので

タイトルに「Power Automate Desktop」を指定してもらえれば動くはず…

コード例)

Public Sub scheduleRun()
    With New PadFlowLauncher
        .windowTitle = "Power Automate Desktop"  '←これ追加😎
        .runFlow "Flow_Name_You_Wanna_Execute"
    End With
End Sub


GitHub触るのが久しぶりで更新に手こずったのはナイショ…😅


2021年3月22日月曜日

動画投稿予定

ついつい飽きっぽい性格なんで 

投稿予定の動画を書いとこうと思いますw

(投稿できなかったら、ごめんなちゃい(/ω\))


3/27(土) Webからファイルをダウンロード(VBA Selenium版) (中級シリーズ)

3/28(日) Webからファイルをダウンロード(Power Automate Desktop版) (中級シリーズ)

VBA IE版の流れで…

4/4(土) 正規表現 (入門シリーズ)

正規表現の説明をしてないのに動画で使ってたんで、そろそろ説明しようかな~と。

4/5(日) 再帰呼出 (中級シリーズ)

ファイル名に連番を付与する処理で使ってたんで、一応動画として出しとこうと…


出せるかな~(*‘ω‘ *)


2021年3月10日水曜日

動画の構想

Power Automate Desktop動画の受けが良さそうなんで
(あくまで、なんプロチャンネル内での話だけど…)
調子に乗って、もう一つ投稿しようと思ってます。

以前、動画投稿した「転記ツール」の機能を流用する感じでPower Automate Desktopを
使って自動化してみようと考えてます。

Power Automate (Desktopじゃない方)使わないとスケジュール実行とか、
メール受信をトリガーにして、みたいな事が出来なそうなんだよな〜😟

エンドユーザー向けのツールとしては、良さそうなんだけど
せめてコマンドからフロー実行できるようにならないかな〜

Desktop単体だと、作成したフローのエクスポートも出来なそうだし、
現時点では、本当に個人のちょっとした作業を自動化するぐらいしか用途がないかな?
ある意味、野良マクロ的なものが出来ない状態で良いのかな…😑

同じ処理をVBS版、VBA版で作るのも
比較できて面白そうかな?

2021年3月7日日曜日

セル内の一部文字に色を付けてみる(3)

 YouTubeに投稿した動画内で使用しているコードを貼っておきます。

ご参考までに。

エラー処理など、きちんと作りこんでいないので

コードをコピペして使用するのはオススメしません (m´・ω・`)m ゴメン…

また、実行時の条件によってXMLの形式が破損し、Excelデータを紛失する可能性がありますので、コードの内容を理解したうえでご使用ください。

※コードは自己責任でご使用ください。



【動作条件】
  • Module内にコードが記述されていること
  • キーワードを指定したテーブル名は "キーワードリスト" になっていること
  • キーワードが被っていないこと
  • 選択している範囲は文字を入力しているセルだけになっていること
  • 選択しているセルのCharactersオブジェクトにColor, Bold以外の設定がされていないこと
  • その他、なんプロが気付いていない動作条件を満たしていないこと(´・ω・`)


  1. Public Sub mainWithXml()
  2. Dim objTarget As Range
  3. Set objTarget = Selection
  4. '先にセル内の書式をリセットしておく'
  5. With objTarget.Font
  6. .Color = 0
  7. .Bold = False
  8. End With
  9. Dim objCell As Range
  10. Dim objRngGrp As Range
  11. '100セルずつ処理'
  12. For Each objCell In objTarget.Cells
  13. If objRngGrp Is Nothing Then '1つ目のセル'
  14. Set objRngGrp = objCell
  15. ElseIf objRngGrp.Cells.Count <= 99 Then '2~99個目のセル'
  16. Set objRngGrp = Application.Union(objRngGrp, objCell)
  17. Else '100個目のセル'
  18. Set objRngGrp = Application.Union(objRngGrp, objCell)
  19. Call setColorWithXml(objRngGrp, Application.Range("キーワードリスト"))
  20. Set objRngGrp = Nothing
  21. End If
  22. Next
  23. '100個に満たなかった最後のセル'
  24. If Not objRngGrp Is Nothing Then
  25. Call setColorWithXml(objRngGrp, Application.Range("キーワードリスト"))
  26. End If
  27. End Sub
  28.  
  29.  
  30. 'XMLレベルでセル内の文字色(&Bold)を設定するプロシージャ'
  31. '検索文字列が重複している場合は正常動作しません'
  32. Private Sub setColorWithXml(ByVal objRngGrp As Range, ByVal objRngFindString As Range)
  33. Const FONT_ST = "<Font html:Color=""#[COLOR]"">"
  34. Const FONT_ED = "</Font>"
  35. Const B_ST = "<B>"
  36. Const B_ED = "</B>"
  37. Dim objRng As Range
  38. Dim strXml As String
  39. 'XMLデータ取得'
  40. strXml = objRngGrp.Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet)
  41. '先にData要素を置換(リテラル決め打ち)'
  42. strXml = Replace(strXml, "<Data ss:Type=""String"">", _
  43. "<ss:Data ss:Type=""String"" xmlns=""http://www.w3.org/TR/REC-html40"">")
  44. strXml = Replace(strXml, "</Data>", "</ss:Data>")
  45. '検索文字分ループ'
  46. For Each objRng In objRngFindString.Cells
  47. Dim strRep As String
  48. Dim lngColor As Long
  49. 'HTMLカラーに変換'
  50. With objRng.Font
  51. lngColor = (.Color And &HFF) * (2 ^ 16)
  52. lngColor = lngColor + (.Color And &HFF00&)
  53. lngColor = lngColor + ((.Color And &HFF0000) / (2 ^ 16))
  54. End With
  55. 'タグ生成'
  56. strRep = Replace(FONT_ST, "[COLOR]", Right(String(6, "0") & Hex(lngColor), 6))
  57. If objRng.Font.Bold Then strRep = strRep & B_ST
  58. strRep = strRep & objRng.Value
  59. If objRng.Font.Bold Then strRep = strRep & B_ED
  60. strRep = strRep & FONT_ED
  61. '置換処理'
  62. strXml = Replace(strXml, objRng.Value, strRep)
  63. Next
  64. 'XMLデータを書き戻す'
  65. objRngGrp.Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet) = strXml
  66. End Sub


リマインドメール自動送信

お久しぶりです! 1回目のワクチンがほとんど副反応なかったので調子乗ってたら2回目のワクチンで副反応出まくったなんプロです。 約3ヶ月ぶりの動画投稿になっちゃいました😅 いや~、ここまで面倒くさがり屋だと病気なのかな?😆 前回の動画のPowerAutomateやVBScrip...