Quantcast
Channel: いつも隣にITのお仕事
Viewing all 2078 articles
Browse latest View live

【Outlook VBA】CurrentItemプロパティで今開いているメールのMailItemオブジェクトを取得する方法

$
0
0
vba,outlook,currentitem,eyecatch

みなさまこんにちは、ノグチです。

前回から複数回の記事に分けて、Outlookのメールに添付されたファイルを、ワンクリックで任意のフォルダに格納する方法をご紹介しています。

前回の記事では、ActiveInspectorメソッドを使って、今ウインドウを開いているOutlookのアイテムを、Inspectorオブジェクトとして取得する方法をご紹介しました。

【Outlook VBA】今開いているOutlookウインドウを操作しよう!Inspectorオブジェクトの取得
Outlook vbaで、メールの添付ファイルをワンクリックで指定フォルダに保存する方法を複数回記事にわたってご紹介していきます。今回は、ActiveInspectionメソッドで、今開いているOutlookウインドウのInspectorオブジェクトを取得する方法をご紹介しています。

今回記事では、前回取得したInspectorオブジェクトから、OutlookアイテムのオブジェクトをCurrentItemプロパティで取得する方法をご紹介していきます。

前回のおさらい

まずは前回までのおさらいをしておきましょう。

「今開いているメールの添付ファイルをワンクリックで任意フォルダに格納する方法」をVBAでコーディングするにあたっては、こんなステップを経ることになります。

  1. 今開いているOutlookのウインドウのInspectorオブジェクトを取得
  2. 取得できたInspectorオブジェクトからMailitemオブジェクトを取得
  3. 取得できたMailItemオブジェクトからAttachmentsオブジェクトを取得
  4. Attachmentsオブジェクトから添付ファイルのAttachmentオブジェクトを取得
  5. AttachmentオブジェクトのSaveAsFileメソッドで、添付ファイルを任意フォルダに保存

上の5つのステップのうち、「1.今開いているOutlookのウインドウのInspectorオブジェクトを取得」については、前回記事でご紹介しました。

そして、Inspectorオブジェクトを取得するVBAコードがこちらです。

Sub SaveAttachmentFile()
Dim objIns As Inspector
Set objIns = Application.ActiveInspector
End Sub

今Outlookで開いているアイテムウインドウのオブジェクトを、ActiveInspectorメソッドでInspectorオブジェクトとして取得するのでしたね。

今回の記事から、このコードにプロパティやメソッドを追加していきましょう。

メールウインドウの情報をCurrentItemプロパティで取得

さて、上のコードで今Outlookで開いているウインドウをInspectorオブジェクトとして取得出来たら、お次はステップ2の「取得できたInspectorオブジェクトからMailItemオブジェクトを取得」です。

MailItemオブジェクトってなんだっけ?

「MailItemオブジェクトって何だっけ?」という方は、下記の記事でご紹介していますので併せてご覧下さい。

【エクセルVBA】Outlookでメールを作成・送信する方法
エクセルシートに記入された件名や本文を、エクセルVBAによってOutlookのメールの件名と本文にセットしてメール送信する方法をご紹介しています。VBAでメールの送信ができれば、宛先に応じてメールの本文を変えつつ一斉に送信することもできますよ。

CurrentItemプロパティとは

InspectorオブジェクトからこのMailItemオブジェクトを取得するために使用するのが、InspectorオブジェクトのCurrentItemプロパティ

CurrentItemプロパティは、Inspectorオブジェクトで取得した、今開いているOutlookウインドウのアイテムオブジェクトを取得することができるプロパティです。

メールであればMailItemオブジェクトを、予定であればAppointmentItemオブジェクトを取得することができます。

記述方法はコチラ。

Inspectorオブジェクト.CurrentItem

Inspectorオブジェクト取得からMailItemオブジェクト取得までをコードにする

さて、ここまでで冒頭に示したステップの1と2のInspectorオブジェクトの取得と、CurrentItemプロパティを使ったMailItemオブジェクトの取得までをご紹介しました。

一旦ここまでをVBAコードにすると、こんなコードになります。

Sub SaveAttachmentFile()
Dim objIns As Inspector
Dim objItem As Object

Set objIns = Application.ActiveInspector
Set objItem = objIns.CurrentItem   '今開いているメールのMailItemオブジェクトを取得

End Sub

5行目と6行目でInspectorオブジェクトの取得とMailItemオブジェクトの取得を分けて記述していますが、こんな風に1行にまとめてしまってもOKです。

Set objItem = Application.ActiveInspector.CurrentItem

実行結果

そしてこのコードを実際に実行してみると、こんな感じになります。

メールのウインドウを開いてコードを実行してみると…

vba,outlook,CurrentItem,実行結果

この通り、Inspectorオブジェクトから、メールのアイテムオブジェクトであるMailItemオブジェクトが取得できていますね。

もちろん、Outlookアイテムのウインドウを開いていなかった場合は実行時エラーになってしまうので注意しましょう。

これで、今開いているメールのMailitemオブジェクトが取得できました。

最後に

今回は、InspectorオブジェクトのCurrentItemプロパティによる今Outlookで開いているウインドウのアイテムオブジェクトの取得方法をご紹介しました。

次回記事では、ステップ3の「取得できたMailItemオブジェクトからAttachmentsオブジェクトを取得からご説明をしていきます。

それでは最後までお読みいただき、ありがとうございました!

連載目次:はじめてのOutlook VBA

Outlook VBAで、予定やタスクの登録方法など、Outlookを操作する方法をご紹介しています。メーラーやスケジューラとして便利なOutlookですが、VBAで更に便利なツールにしてしまいましょう!

  1. 【はじめてのOutlook VBA】Outlookの予定を登録する方法
  2. 【Outlook VBA】エクセルワークシートの内容で予定登録する方法
  3. 【Outlook VBA】今開いているOutlookウインドウを操作しよう!Inspectorオブジェクトの取得

Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!

$
0
0

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。

前回の記事はこちらです。

Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
Windowsのポチポチ業務(マウスを使った業務)を爆速化するCUI=PowerShell。オンラインヘルプを使ってコマンドレットを調べられるようになれば、コマンドレットのすべての機能(パラメータ)を使いこなすことができます。オンラインヘルプの起動方法から、詳細の見方までご説明します!

前回はオンラインヘルプを使ってコマンドレットの構文、設定値の内容を調べる方法をお伝えしました。

これまでの連載でPowerShellの基礎は抑えました。

今回は統合開発環境PowerShell ISEを使って、スクリプトという短いプログラムを作成・保存する方法をご説明していきます

それでは行ってみましょう!

PowerShell ISEとは

ISEはPowerShellのコーディング・実行・デバッグができる開発ツールです。

これまでコマンドレットを単体で動かしてきましたが、PowerShellは複数のコマンドレット、if文・for文などの構文を組み合わせてプログラムを作ることができ、さらにすぐに実行できます。このようにすぐ実行できるプログラムのことをスクリプトと言います

ISEとは「Integrated Scripting Environment」の略で、直訳すると「統合されたスクリプティング環境」となります。

PowerShell ISEを起動する

さっそくPowerShell ISEを起動してみます!

WinR」を押します。

「ファイル名を指定して実行」ダイアログが表示されるので、powershell_iseと入力して実行します。

ISEが起動しました。

以下の記事でご紹介している「スタートメニューから起動する」と同じ方法でもISEは起動できますので、ご参考にしてください。

Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
Windowsのマウス業務を爆速化するCUI=PowerShell。キーボードを使わずにササっと起動してHelloWorldをやってみましょう!

PowerShell ISEの画面構成

ISEの画面構成についてご説明します。

  • スクリプトウィンドウ

スクリプトウィンドウは、スクリプトを記載していく場所です。

  • コンソール

コンソールはPowerShellの画面と同じ機能を持ちます。スクリプトを実行するとコンソールに実行結果が表示されます。コンソールに直接コマンドを入力して実行することもできます

  • コマンドアドオン

コマンドアドオンはチェックボックス・テキストボックスといった直感的な操作でコマンドレットのパラメータを設定することができます。

なお、画面構成は「表示」メニューで表示・非表示を切り替えることができます。左側の✔は現在表示されている画面を示します。

スクリプトを使うとできること

ISEではスクリプトを作ることができます。では、そのスクリプトを使うとどんないいことがあるのかを見ていきましょう。

複数のコマンドレットを組み合わせて実行できる

スクリプトは複数のコマンドレット、if文・for文などの構文を組み合わせてすぐに実行できるプログラムのことと説明しました。

プログラムというと難しく感じますが、複雑な処理はコマンドレットにまとめられています。

PowerShellのスクリプトではコマンドレットをパズルのように組み合わせていくことで複雑な処理もシンプルに実現することができます

条件判定・繰り返し処理ができる

PowerShellのスクリプトでは以下のような条件判定ができます

  • 格納先フォルダが存在しない場合、新たにフォルダを作成する
  • あるワードを含むファイルだけ一覧に出力する

また以下のような繰り返し処理ができます

  • 10回処理を繰り返す
  • ディレクトリ内にあるすべてのファイルに対して処理をする

マウスで作業する場合、自分でフォルダを作ったり、エクスプローラーで処理対象のファイルをピックアップして別のフォルダにコピーしたりと人間が判断をするため非常に時間がかかりますが、スクリプトが条件判断、繰り返し処理を自動で実行してくれるので、処理時間が大幅に短縮できます。

保存して再利用できる

一度作って保存したスクリプトは何度でも利用できますので、毎日よく実施する処理をまとめておくと非常に便利です。

また、保存したスクリプトはほかの人に配布することができます。複数人のチームで業務している場合は、そのスクリプトを配布すればチーム全体の生産性を上げることができます。

スクリプトを作成・保存する

以下のコマンドレットを、スクリプトウィンドウに書いていきましょう。

 Write-Host "ISEから実行しました!"

Write-まで入力するとダイアログが表示されます。コマンドレットの候補を提示してくれるサジェスト機能といいます。ISEではコマンドレットやパラメータはサジェスト機能でミスなく短時間で入力することができます

スクリプトウィンドウの左上をみるとファイル名が「無題1.ps1」となっていますね。PowerShellのスクリプトを保存するときは拡張子を「.ps1」としてください。ファイルメニューから名前を付けて保存を選択して「rename.ps1」としてデスクトップに保存しましょう。

まとめ

PowerShellは複数のコマンドレット、if文などの構文を組み合わせすぐ実行できるスクリプトを作ることができます。

ISEはスクリプトのコーディング・実行・デバッグができる開発ツールのことです。サジェスト機能を使いコマンドレットを効率的に入力することもでき、PowerShellの開発では必須のツールですのでしっかり使いこなしていきましょう!

次回は、今回ISEで保存したスクリプトを実行する方法と、実行を制限する実行ポリシーについて詳しく説明していきます。

最後までお読みいただきありがとうございました!

連載目次:Windowsのポチポチ業務を爆速化するPowerShell

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
  1. Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
  2. Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
  3. Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
  4. Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
  5. Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!

PowerPoint VBAで選択しているテキスト範囲のフォントを変更するマクロの作り方

$
0
0
textrange-font

photo credit: hownowdesign E’s e collection via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

PowerPoint VBAで選択した部分のフォントを変更するマクロの作り方をお伝えしています。

前回の記事はコチラ。

PowerPoint VBAで選択しているシェイプのフォントを変更するマクロの作り方
PowerPoint VBAで選択している部分を操作するマクロの作り方をお伝えしています。今回は、ShapeRangeオブジェクトつまり選択しているシェイプのフォントを変更するマクロの作り方についてです。

選択しているシェイプのフォントを変更するマクロの作り方をお伝えしました。

さて、スライド→シェイプ→…ときましたので、次は「テキスト」です。

では、PowerPoint VBAで選択しているテキスト範囲のフォントを変更するマクロの作り方について紹介していきます。

行ってみましょう!

選択している部分の取得のおさらい

では、再度「選択している部分」の取得についておさらいをしておきましょう。

コチラの記事で紹介していました、以下コードです。

Sub 選択状態を調べる()

With ActiveWindow.Selection
    If .Type = ppSelectionNone Then Debug.Print "何も選択されていません"
    If .Type >= ppSelectionSlides Then Debug.Print "スライドが選択されています"
    If .Type >= ppSelectionShapes Then Debug.Print "シェイプが選択されています"
    If .Type >= ppSelectionText Then Debug.Print "テキスト範囲が選択されています"
End With

End Sub

アクティブなウィンドウの「選択している部分」を取得、そのTypeプロパティを使って、その選択状態を判定しています。

今回テーマとしている「テキスト」が選択されていれば、「テキスト範囲が選択されています」とイミディエイトウィンドウに出力されるはずですね。

選択しているテキストを操作する

選択しているテキスト範囲を取得する

選択しているテキスト範囲を取得するには、SelectionオブジェクトのTextRangeプロパティを使います。

書式はコチラです。

Selectionオブジェクト.TextRange

以下の記事で紹介している方法であれば、シェイプに含まれるテキスト全体をTextRangeオブジェクトとして取得していましたね。

【初心者向けPowerPoint VBA】Shapeオブジェクトのテキストを取得する方法
初心者向けPowerPoint VBAのシリーズとして、図形やテキストオブジェクトのフォントを変更するマクロを作成する方法をお伝えしています。今回は、Shapeオブジェクトのテキストを取得する方法です。

Selectionオブジェクトに対して実行をすれば、選択している箇所だけをTextRangeオブジェクトとして取得できるというわけです。

TextRangeオブジェクトを取得する例

例として、以下のようにいずれかのシェイプのテキストを選択した状態で…

PowerPointでテキストを選択

コチラのプロシージャを実行してみましょう。

Sub 選択したテキスト範囲()

With ActiveWindow.Selection
    If .Type >= ppSelectionText Then
        Debug.Print "選択しているテキスト: " & .TextRange.Text
    End If
End With

End Sub

イミディエイトウィンドウには、以下のように出力されました。

PowerPoint VBAで選択しているテキストをイミディエイトウィンドウに出力

選択しているテキストのフォントを変更するプロシージャ

さて、では勢い余って選択テキストのフォントの変更をするプロシージャも作ってみましょう。

以下の記事でお伝えしている通り、TextRangeオブジェクトからFontプロパティでFontオブジェクトを取得できちゃうので簡単です。

PowerPoint VBAでフォント設定をするFontオブジェクトを取得する
初心者向けPowerPoint VBAのシリーズとして、全てのシェイプについてフォントを変更するマクロの作成を目指しています。今回はフォントを設定するFontオブジェクトを取得する方法をお伝えします。

プロシージャはコチラです。

Sub 選択したテキスト範囲のフォントを変更()

With ActiveWindow.Selection
    If .Type >= ppSelectionText Then
        With .TextRange.Font
            .Name = "Meiryo UI"
            .NameFarEast = "Meiryo UI"
            .Color = RGB(89, 89, 89)
        End With
    End If
End With

End Sub

実行をすると、以下のようにフォントを変更することができますよ!

PowerPoint VBAでテキスト範囲のフォントを変更する

「うえ」の部分だけ、フォントが変更されましたよね。

まとめ

以上、PowerPoint VBAで選択しているテキスト範囲のフォントを変更するマクロの作り方をお伝えしました。

テキスト範囲はTextRangeオブジェクトで表されますが、Fontオブジェクトもすぐ取得できますし、すんなり便利ですね。

さて、では次回はこれまでの内容を踏まえてマクロを便利にしていきたいと思いますよ。

どうぞお楽しみに!

連載目次:初心者向けPowerPoint VBAで選択箇所を操作する

PowerPointでプレゼンテーションを作っている際に、「選択している部分のフォントを好きに変えたい!」ということありますよね。そのニーズに応えるマクロの作り方をシリーズでお伝えしていきます。
  1. PowerPoint VBAでアクティブなウィンドウを取得する方法
  2. PowerPoint VBAで選択した部分を表すSelectionオブジェクトとその取得
  3. PowerPoint VBAのSelectionオブジェクトの4つのタイプについて理解しよう!
  4. PowerPoint VBAで選択しているスライドを操作するSlideRangeオブジェクト
  5. PowerPoint VBAで選択しているスライドのフォントを変更するマクロの作り方
  6. PowerPoint VBAで選択しているシェイプを操作するShapeRangeオブジェクト
  7. PowerPoint VBAで選択しているシェイプのフォントを変更するマクロの作り方

エクセルVBAとWORKDAY関数の組み合わせでスケジュール表を自動作成する最初の一歩

$
0
0

スケジュール表自動作成アイキャッチ
みなさん、こんにちは!
フジタニ(@libartweb)です。

エクセルVBAとWORKDAY関数を組み合わせたスケジュール表自動作成の方法をシリーズでお伝えしております。

前回の記事はこちら

エクセルで営業日判定を実現するWORKDAY関数の使い方
エクセルで土日祝日を判定したい!といった場合に、祝日の判定は標準のエクセル機能では不可能です。今回紹介するWORKDAY関数を使用すれば、祝日の判定を実現することが可能です。

WORKDAY関数を使用すれば土日だけでなく祝日の判定も可能であることをお伝えしました。

これを応用すれば、土日祝日を考慮した月間スケジュール表を自動で作成することができます!

実務で使いこなすことができればとても便利なツールとして活用できるはずです!

今回は最初にスケジュール表を自動作成する流れと概要について説明します。

エクセルVBAでスケジュール表を自動作成する流れ

基本的にはエクセル関数ですべての日付計算を行い、VBAは体裁を整えるためだけに使用します。

スケジュール表の完成イメージ

まずは、完成イメージをご覧いただき、どのように作るか?を具体的にイメージしていただければと思います。

カレンダー

このように○月○日には何のタスクがあるか?を自動でカレンダーに出力します。

スケジュール表自動作成で必要なシート

用意するのは以下の2シートのみでOKです。

シート名 シートの内容
テンプレート カレンダーのテンプレートシート
日付計算 定例タスクの処理タイミングを羅列したスケジュール一覧シート

カレンダーのテンプレートシート

カレンダーテンプレート
カレンダーのテンプレートです。

エクセルVBAで指定月のスケジュール表を作成する際、このテンプレートをコピーし、変名(“yyyy年m月 スケジュール表” など)して、その変名したシートに対してエクセルVBAで土日祝日の行に色をつけたり、その月の内容に従って編集します。

日付計算シート

スケジュール一覧シート
エクセル関数を使用して各タスクの処理日を一覧化します。

処理タイミングによって様々なエクセル関数を使用しますので、エクセル関数の知識が必要となります。(連載の中でよく使いそうなものを紹介します)

このシートがすべての処理タイミングを管理します。スケジュール表を自動作成をする上で非常に重要です。

スケジュール表自動作成の流れ

おおまかな流れは以下の通りです。

①定例タスクの処理タイミングをエクセル関数でリスト化
②エクセルVBAで翌月分のカレンダーシートを作成
②処理タイミング(①で作成)をカレンダーシート(②で作成)へエクセルVBAで転記

スケジュール表自動作成の流れ

スケジュール表自動作成の仕組み

では①の処理タイミングをエクセル関数でリスト化する仕組みを詳しく見ていきましょう。

スケジュールリスト説明

上記のスクリーンショットの画面内の各項目について説明します。

項目名 説明
A 開始日 そのタスクの基準となる開始日を設定します。例えば「英会話教室」ならその月の毎週月曜日すべてが記載されています。
B 日数 WORKDAY関数で使用する日数を指定します。詳細は前回記事をご覧ください。
C 営業日計算 WORKDAY関数でAの開始日から営業日を計算した日付を出力します。
D 基準日 スケジュール表を作成する月を指定するための基準日です。デフォルトは「今日の日付」としています。
E 基準日の翌月 基準日の翌月を関数で求め、このセルに出力しています。今回は基準日の翌月分のカレンダーを作成するので「翌月」を求めています。
F 除外する日(祝日) WORKDAY関数で使用する祝日の一覧です。

今回のスケジュールリストで紹介するスケジュールパターンは以下の通りです。

定例タスク タイミング
英会話教室 毎週月曜日(休み→翌営業日)
月例会議 第2月曜日(休み→翌営業日)
月末処理 毎月最終営業日
カード引き落とし 毎月27日(休み→翌営業日)
口座へ入金 カード引き落とし日の前営業日

詳細は次回以降の記事で1つずつ解説していきますが、このようなシート構成でスケジュール表作成の自動化を行います。

特に「開始日」はエクセルVBAで求めることも可能なのですが、シート内のエクセル関数で管理した方がメンテナンス性が高く、引き継ぎもしやすいということで今回紹介するツールは、基本的にはエクセル関数の使用がメインとなります。

エクセルVBAとWORKDAY関数を組み合わせる際の注意点

WORKDAY関数を実務に取り入れる際に、気をつけていただきたいのが祝日一覧表のメンテナンスです。

  • 祝日が増えた
  • 祝日一覧を1年分しか作っていないことを失念していてメンテナンスしていなかった

最もキケンなのが祝日一覧を直近数年分しか設定しておらず、それを過ぎてしまったときに気づけないことです。

気づかずに過ぎてしまったら…誤った営業日が表示され、正しい処理結果を得られなくなってしまいます。

  • 祝日一覧の期限が近付いてきたらWorkbookオープン時に日付を自動で判定して注意メッセージを出力する(エクセルVBA)
  • 祝日の取得をエクセルVBAによるIE操作で自動化する

など…忘れないための工夫を取り入れることをおすすめします。

1つ目のWorkbookオープン時の自動実行を実現する方法は以下の記事が参考になります。

エクセルVBAでブックを開いたときに他のワークブックも一緒に自動で開く
エクセルで特定のファイルを開いたら、一緒に使用する他のファイルも自動で開くと便利です。今回はAuto_Openというイベントプロシージャを使ってブック起動時に他のブックも自動で開くVBAプログラムです。

忘れないための予防策も打っておきましょう。せっかく便利な関数を使っているのに、それがミスにつながったら意味がないですからね。

基準日とその翌月を求めてみよう

「日付計算」シート内の、「基準日」と「基準日の翌月」を求めてみましょう。

この部分です!

基準日とその翌月

F2セル「基準日」には今日の日付を入れるため、TODAY関数を設定します。

TODAY関数は、システム日付(今日の日付)をシリアル値で返します。

書式は以下の通り。

=TODAY()

F5セル「基準日の翌月」には、基準日の翌月を求めるため、DATE関数を使います。

=DATE(年,月,日)

DATE関数は引数に、年、月、日をバラバラにして指定し、シリアル値で日付を返す関数です。

今回のサンプルでは、以下の通り関数を設定しています。

=DATE(YEAR(F2),MONTH(F2)+1,1)

YEAR関数とMONTH関数を使用し、F2セル(TODAY関数で求めた今日の日付)を参照しています。

=YEAR(シリアル値)

YEAR関数は引数として指定された日付の年だけを返す関数です。

=MONTH(シリアル値)

YEAR関数は引数として指定された日付の月だけを返す関数です。

つまり、DATE関数の中身は以下のようになっています。YEAR関数とMONTH関数でF2セルの今日の日付を分解し、分解後の月に+1して翌月を求めています。

=DATE(2018,9+1,1)

今回の場合だと、”2018年10月1日”がDATE関数で返されます。

これで、翌月分のスケジュール表を自動作成する第一歩として、今日の日付の「翌月」を求めることができました!

まとめ&次回予告

以上、スケジュール表を自動作成する流れと仕組み、翌月の求め方について説明しました。

用意するシートは2シートのみ、エクセルVBAはほぼ使わず、エクセル関数をメインに使用してスケジュール表を自動作成することを理解していただけたと思います。

次回以降、引き続きスケジュール表自動作成に必要な関数の解説を行っていきます。

どうぞお楽しみに!

【IFTTTでチャットワーク連携】Twitterで指定条件が含まれるツイートを自動通知する

$
0
0

IFTTTアイキャッチ2

こんにちは!もり(@excelprog)です!

前回の記事では「IFTTTのDate&Timeサービス」を使用して「チャットワーク」にメッセージを送信するレシピを2つ紹介しました。

【IFTTTでチャットワーク連携】定期作業のメッセージを自動で通知する
IFTTTを使用したチャットワーク連携のレシピを紹介するシリーズです。今回の記事では、「毎日・毎週の指定時刻」「毎月決まった日付の指定時刻」にチャットワークへメッセージを自動通知する方法を紹介します。

月次・日次などの定期リマインドをチャットワークに通知できる、とても便利なレシピでしたね。

さて、今回はTwitterとチャットワークの連携レシピを紹介していきます。

IFTTT で Twitter × チャットワーク

IFTTT(イフト)とは「If This Then That」の略です。「もし、Aシステムで○○したら、Bシステムに○○する」という、Webサービス間を連携するプログラムのことでしたね。

「もし、Twitterで何らかのアクションが起きたならば、それをチャットワークに通知する」ので、今回紹介するレシピはこんなイメージです。

chatwork-ifttt2-1

それでは早速、チャットワーク連携のレシピが公開されているURLにアクセスして設定していきます。

IFTTT
Connect ChatWork to Email, chatwork, Date & Time, Twitter, Google Calendar, Office 365 Mail, Gmail and more.

レシピの一覧が出てきます。

chatwork-ifttt1-4-2

今回紹介するレシピを使用するには、IFTTTとチャットワークの連携許可が必要なので、初めて使う方は前回の記事をご覧くださいね。

さぁ、2つのレシピをみていきましょう!

Twitterでメンションされたツイートを通知する

メンションとは、特定の相手宛てにツイートしたことを知らせるために@アカウント名を付けてツイートすることです。

たとえば、私のTwitterアカウントはexcelprogなので、@excelprogが私宛のメンションになります。

レシピ名:Post message to ChatWork whenever someone mentions you on Twitter

直訳すると「Twitterで誰かがあなたをメンションするたびにチャットワークに通知する」です。

chatwork-ifttt2-2

このレシピを使うと、自分宛のメンションがあった時に、そのツイート内容をチャットワークに通知することができます。

設定方法

基本的な設定方法は他のレシピと同じです。
「Turn on」クリックします。
chatwork-ifttt2-3

IFTTTでTwitter連携のレシピを初めて使用する場合は、連携認証が必要です!

IFTTTからTwitterに接続(ログイン)するための認証をします。

このレシピはTwitter×チャットワークですが、ここで一度認証すれば他の2万以上のApplet(レシピ)が使用できるみたいですね!

「OK」をクリックします。

chatwork-ifttt2-4

「連携アプリを認証」をクリックします。
※TwitterのログインID・パスワード入力画面が出る場合は、それに従って入力しましょう。

chatwork-ifttt2-5

IFTTTとTwitterの連携が完了しました。

ここからはレシピの設定をしていきます。

「room」でチャットワークの通知グループを選択して、Saveします。
ここではマイチャットに通知することにします。
chatwork-ifttt2-6

設定はたったのこれだけです。お手軽ですね!

実行結果

私のツイートに対して、タカハシさんが返信してくれたツイートです。

chatwork-ifttt2-7

メンションされたツイートの内容が、roomで設定したマイチャットに通知されます。

数十秒ほどで届くので、ほぼリアルタイムでの確認ができます。
(※実行したタイミングや、環境によって異なる可能性があります)

chatwork-ifttt2-8

URLが付いているので、すぐにTwitterにアクセスできるのが便利ですね。

Twitterで検索語句に一致するツイートを通知する

レシピ名:Post message to ChatWork when a tweet matches your search term

直訳すると「ツイートがあなたの検索語句に一致した時、チャットワークに通知する」です。

chatwork-ifttt2-9-2
このレシピを使うと、指定の検索語句に一致したツイートをチャットワークに通知することができます。”エゴサーチ”にも使えそうですね。

設定方法

「Turn on」をクリックします。
chatwork-ifttt2-10

「Search for」に自分が検索したい語句を入力します。

ここでは”ノンプロ研”という単語を指定してみます。
chatwork-ifttt2-11

「room」で宛先を選択してSaveします。
chatwork-ifttt2-12

実行結果

指定の語句”ノンプロ研”を含むツイートをしてみます。
chatwork-ifttt2-13
roomで指定した宛先のマイチャットに通知が届きました!

chatwork-ifttt2-14

※このレシピは、自分のツイート・フォローしている人のツイートが通知されるのはもちろんのこと、自分がフォローしていない人のツイートもキャッチします。

多くの人がツイートしそうな単語を検索語句に指定すると、たくさん通知が届くのでご注意くださいね!(試しに”Excel”で検索したら大量の通知が届きました…)

高度な検索

検索条件の指定方法はTwitterと同じですので、複数条件の組み合わせなどもできます。

高度な検索の使い方
twitter.comでは、高度な検索オプションを使って探しているツイートを見つけることができます。

“Excel”と”VBA”を含むツイートを検索してみます。

半角スペースで区切ると複数語句の検索ができます。

  • Excel VBA → AND検索
  • Excel OR VBA → OR検索

「Search for」に入力します。ExcelVBA半角スペースで区切ることでAND検索します。chatwork-ifttt2-15-2

“Excel”と”VBA”を含む内容をツイートしてみます。

chatwork-ifttt2-15

マイチャットに届きました!

chatwork-ifttt2-16

まとめ

今回の記事では、Twitter連携のレシピを2つ紹介しました。

  • 自分宛のメンションをキャッチして通知する
  • 指定の単語が含まれるツイートを検索して通知する

Twitterの通知・検索機能でもこの処理は可能ですよね。

ただ、ひとたびTwitterを開くとダラダラとながめて時間をムダにしてしまう・・・

Twitterを閉じて仕事に集中したいけど、指定条件に合致するツイートはリアルタイムで把握したい!そんなときに使えるレシピですよ。

上手に使いこなしていきましょう!

次回も他のレシピを紹介していきます。どうぞお楽しみに!

連載目次:IFTTTでチャットワークを使おう

IFTTTのチャットワーク連携レシピを紹介しているシリーズです。

  1. 【IFTTTでチャットワーク連携】定期作業のメッセージを自動で通知する
  2. 【IFTTTでチャットワーク連携】Twitterで指定条件が含まれるツイートを自動通知する

【Outlook VBA】今開いているメールのAttachmentsコレクションを取得する方法

$
0
0

 

 

outlook,vba,Attachments,eyecatch
みなさまこんにちは、ノグチです。

何度かの連載で、Outlook VBAでOutlookでウインドウで開いているメールの添付ファイルを、ワンクリックで任意のフォルダに格納する方法をご紹介しています。

【Outlook VBA】今開いているOutlookウインドウを操作しよう!Inspectorオブジェクトの取得
Outlook vbaで、メールの添付ファイルをワンクリックで指定フォルダに保存する方法を複数回記事にわたってご紹介していきます。今回は、ActiveInspectionメソッドで、今開いているOutlookウインドウのInspectorオブジェクトを取得する方法をご紹介しています。
【Outlook VBA】CurrentItemプロパティで今開いているメールのMailItemオブジェクトを取得する方法
Outlook VBAで、今開いているメールの添付ファイルをワンクリックで任意のフォルダに保存する方法を5ステップにわけて、連載記事でご紹介しています。今回は、InspectorオブジェクトのCurrentItemプロパティによるMailItemオブジェクトの取得についての説明です。

前回の記事では、InspectorオブジェクトのCurrentItemプロパティで、今開いているウインドウをOutlookのItemオブジェクトとして取得する方法をご紹介しました。

今回の記事では、前回取得したOutlookアイテムオブジェクトのMailItemオブジェクトから、Attachmentsコレクションを取得する方法をご紹介していきます。

前回までのおさらい

Outlook VBAでOutlookでウインドウで開いているメールの添付ファイルを、ワンクリックで任意のフォルダに格納するためには、VBAで以下のステップを経ることになります。

  1. 今開いているOutlookのウインドウのInspectorオブジェクトを取得
  2. 取得できたInspectorオブジェクトからMailitemオブジェクトを取得
  3. 取得できたMailItemオブジェクトからAttachmentsコレクションを取得
  4. Attachmentsコレクションから添付ファイルのAttachmentオブジェクトを取得
  5. AttachmentオブジェクトのSaveAsFileメソッドで、添付ファイルを任意フォルダに保存

前回までの記事では、このステップ2の取得できたInspectorオブジェクトからMailitemオブジェクトを取得までをご紹介しました。

そしてこのステップ2まででできたコードがこちらです。

Sub SaveAttachmentFile()
Dim objIns As Inspector
Dim objItem As Object

Set objIns = Application.ActiveInspector
Set objItem = objIns.CurrentItem   '今開いているメールのMailItemオブジェクトを取得

End Sub

Outlookで開いているアイテムウインドウのInspectorオブジェクトをActiveInspectorメソッドで取得し、MailitemオブジェクトをCurrentItemプロパティで取得するまでが上記コードです。

今回も、記事の内容を上のコードに追加していきましょう!

Attachmentsコレクションを取得

さて、前回記事でMailItemオブジェクトが取得できました。

そうするとお次は、

3.取得できたMailItemオブジェクトからAttachmentsコレクションを取得

のステップです。

Attachmentsコレクションとは

添付ファイルを操作するためにまず取得するのが、Attachmentsコレクション

Attachmentsコレクションは、添付ファイルそのもののオブジェクトではなく、Outlookアイテムの添付ファイルがまとまったものです。

1つ1つの添付ファイルが入っている、大きな箱を想像していただくとわかりやすいかもしれません。

このオブジェクトは、MailItemオブジェクトのAttachmentsプロパティで取得することができます。

MailItemオブジェクト.Attachments

Attachmentsコレクションを取得するコード

MailItemオブジェクトのAttachmentsプロパティでAttachmentsコレクション取得を上のコードに追加すると、こうなります。

Sub SaveAttachmentFile()
Dim objItem As Object
Dim objIns As Inspector

Dim objAttchments As Object

Set objIns = Application.ActiveInspector
Set objItem = objIns.CurrentItem   '今開いているメールオブジェクトを取得
Set objAttchments = objItem.Attachments ’Attachmentsコレクションを取得

End Sub

 

MailItemの取得とAttachmentsコレクションの取得を1行にまとめて記述することもできます。

こんな感じ。

Set objItem =objIns.CurrentItem.Attachments

 

これで、Attachmentsコレクションを取得することができました。

Attachmentsコレクション ≠ 添付ファイルのオブジェクト

「添付ファイルのオブジェクトを取得できたなら、もう添付ファイルの操作ができるんじゃないの?」と思いますよね。

先にお伝えした通り、このAttachmentsコレクションは、添付ファイルそのものではなく、1つ1つの添付ファイルが入った大きな箱のようなものです。

添付ファイルを保存したり削除したりといった操作をするためには、この箱の中に入った添付ファイル1つ1つをオブジェクトとして取り出して、取り出した一つ一つの添付ファイルに対して操作をしていかねばなりません。

その方法は、次回の記事でご紹介していきますね。

最後に

今回は、Outlookのウインドウで開いているメールのAttachmentsコレクションを取得する方法をご紹介しました。

ここまでくれば、ゴールはもう目前です。

次回記事では、ステップ4のAttachmentsコレクションから添付ファイルのAttachmentオブジェクトを取得する方法からご紹介していきます

それでは、最後までお読みいただきありがとうございました!

連載目次:はじめてのOutlook VBA

Outlook VBAで、予定やタスクの登録方法など、Outlookを操作する方法をご紹介しています。メーラーやスケジューラとして便利なOutlookですが、VBAで更に便利なツールにしてしまいましょう!

  1. 【はじめてのOutlook VBA】Outlookの予定を登録する方法
  2. 【Outlook VBA】エクセルワークシートの内容で予定登録する方法
  3. 【Outlook VBA】今開いているOutlookウインドウを操作しよう!Inspectorオブジェクトの取得
  4. 【Outlook VBA】CurrentItemプロパティで今開いているメールのMailItemオブジェクトを取得する方法

 

PowerPoint VBAで選択した部分を判別してそのフォントを変更するマクロ

$
0
0
selection

photo credit: Hatoriz Idea selection via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

PowerPoint VBAで選択している部分のフォントを変更するマクロの作り方についてお伝えしています。

前回の記事はコチラ。

PowerPoint VBAで選択しているテキスト範囲のフォントを変更するマクロの作り方
PowerPoint VBAで選択した部分のフォントを変更するマクロの作り方をお伝えしています。今回は、選択しているテキスト範囲の取得方法、およびフォントを変更するマクロの作り方について紹介していきます。

選択しているテキスト範囲のフォントを変更するマクロを作りました。

さて、スライドの選択、シェイプの選択、テキストの選択…と3種類作りましたが、SelectionオブジェクトのTypeプロパティを見て、勝手に振り分けてくれたら便利ですよね。

ということで、今回これまでのマクロをギュッとまとめて、どんな状態でも動くようにしてみます。

PowerPoint VBAで選択した部分を判別してそのフォントを変更するマクロを紹介します。

では、行ってみましょう!

参考にするこれまで作ったマクロ

これまで作ったマクロをいい感じに組み合わせれば目的のものができそうなので、紹介しておきましょう。

選択しているテキストのフォントを変更するマクロ

まず、選択しているテキストのフォントを変更するマクロ。

Sub 選択したテキスト範囲のフォントを変更()

With ActiveWindow.Selection
    If .Type >= ppSelectionText Then
        With .TextRange.Font
            .Name = "Meiryo UI"
            .NameFarEast = "Meiryo UI"
            .Color = RGB(89, 89, 89)
        End With
    End If
End With

End Sub

これはけっこうシンプルですよね。

解説はこちらの記事を参考してください。

PowerPoint VBAで選択しているテキスト範囲のフォントを変更するマクロの作り方
PowerPoint VBAで選択した部分のフォントを変更するマクロの作り方をお伝えしています。今回は、選択しているテキスト範囲の取得方法、およびフォントを変更するマクロの作り方について紹介していきます。

選択しているシェイプのフォントを変更するマクロ

続いて、選択しているシェイプのフォントを変更するマクロです。

Sub 選択したシェイプのフォントを変更2()

With ActiveWindow.Selection
    If .Type >= ppSelectionShapes Then
    
        Dim shp As Shape
        For Each shp In .ShapeRange
            With shp.TextFrame.TextRange.Font
                .Name = "Meiryo UI"
                .NameFarEast = "Meiryo UI"
                .Color = RGB(89, 89, 89)
            End With
        Next shp
    
    End If
End With

End Sub

ShapeRangeの要素分をループする必要がありますので、前述の「選択しているテキスト」よりも少し複雑です。

PowerPoint VBAで選択しているシェイプのフォントを変更するマクロの作り方
PowerPoint VBAで選択している部分を操作するマクロの作り方をお伝えしています。今回は、ShapeRangeオブジェクトつまり選択しているシェイプのフォントを変更するマクロの作り方についてです。

選択しているスライドのフォントを変更するマクロ

最後に、選択しているスライドのフォントを変更するマクロです。

Sub 選択したスライドのフォントを設定2()

With ActiveWindow.Selection
    If .Type >= ppSelectionSlides Then
    
        Dim sld As Slide
        For Each sld In .SlideRange
            Dim shp As Shape
            For Each shp In sld.Shapes
                With shp.TextFrame.TextRange.Font
                    .Name = "Meiryo UI"
                    .NameFarEast = "Meiryo UI"
                    .Color = RGB(89, 89, 89)
                End With
            Next shp
        Next sld
        
    End If
End With

End Sub

SlideRangeについてのループと、各スライドのShapesコレクションについてのループとの入れ子のループになりますので、これが最も複雑な感じですね。

PowerPoint VBAで選択しているスライドのフォントを変更するマクロの作り方
みなさん、こんにちは!タカハシ(@ntakahashi0505)です。PowerPoint VBAで選択している部分を操作するマクロの作り方について解説をしています。前回の記事はコチラです。選択しているスライド範囲を表...

選択箇所を判別してそのフォントを変更するマクロ

以上のマクロを組み合わせて、選択箇所を判別してフォントを変更するマクロを作成しました。

コチラです。

Sub 選択箇所のフォントを変更()

With ActiveWindow.Selection
    Select Case .Type
        Case ppSelectionText
            Call フォントの変更(.TextRange.Font)
            
        Case ppSelectionShapes
            Call シェイプのフォントの変更(.ShapeRange)
        
        Case ppSelectionSlides
            Dim sld As Slide
            For Each sld In .SlideRange
                Call シェイプのフォントの変更(sld.Shapes)
            Next sld
    End Select
End With

End Sub

共通部分はSubプロシージャにより部品化していますが、けっこうシンプルですね。

Select Caseステートメントによる多岐分岐

SelectionオブジェクトのTypeプロパティで、

  • テキストが選択されている
  • シェイプが選択されている
  • スライドが選択されている

のいずれかの状態かを判別できます。

If~ElseIfステートメントでも実現できるのですが、並列の3つ以上の分岐であれば、Select Caseステートメントを使ったほうが読みやすくなります。

書式はコチラです。

Select Case
 Case 式のリスト1
  ’式が式のリスト1のいずれかとマッチした場合の処理
 Case 式のリスト2
  ’式が式のリスト2のいずれかとマッチした場合の処理
 …
 Case Else
  ’どのCase句ともマッチしなかった場合の処理
End Select

それぞれのCase句の「式のリスト」にはカンマ区切りで複数の式を設定することができます。

ToキーワードやIsキーワードを使って、範囲で指定をすることができます。

前述のコードでは、Typeプロパティのずばりの値ごとに条件分岐をするように作っています。

PowerPoint VBAのSelectionオブジェクトの4つのタイプについて理解しよう!
PowerPoint VBAで選択しているシェイプのフォントを変更するマクロの作り方をお伝えしています。今回は、選択する部分を表すSelectionオブジェクトの4つのタイプについて理解を深めていきます。

シェイプのコレクションについてループをする処理

シェイプが選択されている場合はShapeRangeについてのループ、スライドが選択されている場合はスライド上のShapeコレクションについてのループになります。

その2つはSubプロシージャとして部品化することができますので、以下のように作りました。

Sub シェイプのフォントの変更(objShapes As Object)
    Dim shp As Shape
    For Each shp In objShapes
        Call フォントの変更(shp.TextFrame.TextRange.Font)
    Next shp
    
End Sub

フォントを変更する処理

いずれにしても、フォントを変更する対象はFontオブジェクトになります。

ですから、フォントの変更部分はFontオブジェクトを受け取って、そのフォント種類とフォントの色を変更するSubプロシージャに部品化をすることができます。

ここを部品化しておけば、「やっぱりフォントの設定をこうしたい」という事後の変更にも一箇所の変更で対応できるようになります。

Sub フォントの変更(objFont As Font)

With objFont
    .Name = "Meiryo UI"
    .NameFarEast = "Meiryo UI"
    .Color = RGB(89, 89, 89)
End With

End Sub

実行結果

これらのプロシージャを作成して、「Sub 選択箇所のフォントを変更」を実行します。

実行したときの、選択状態によって実行結果が変わります。

まず、テキストを選択しているときがコチラ。

PowerPoint VBAで選択しているテキストのフォントを変更する

次がいくつかのシェイプを選択している場合です。

PowerPoint VBAで選択しているシェイプのフォントを変更する

そして、スライドを選択している状態での結果がこちらです。

PowerPoint VBAで選択しているスライドのフォントを変更する

ということで、選択している状態に応じて、フォントの変更をすることができていますね。

まとめ

以上、PowerPoint VBAで選択している部分を判別してそのフォントを変更するマクロの作り方について解説しました。

これまで作ってきたマクロをガッシャンコしたわけですが、Select CaseステートメントやSubプロシージャによる部品化でスッキリさせるのが重要ですね。

次回は、このマクロを実行しやすくしていきます。

どうぞお楽しみに!

連載目次:初心者向けPowerPoint VBAで選択箇所を操作する

PowerPointでプレゼンテーションを作っている際に、「選択している部分のフォントを好きに変えたい!」ということありますよね。そのニーズに応えるマクロの作り方をシリーズでお伝えしていきます。
  1. PowerPoint VBAでアクティブなウィンドウを取得する方法
  2. PowerPoint VBAで選択した部分を表すSelectionオブジェクトとその取得
  3. PowerPoint VBAのSelectionオブジェクトの4つのタイプについて理解しよう!
  4. PowerPoint VBAで選択しているスライドを操作するSlideRangeオブジェクト
  5. PowerPoint VBAで選択しているスライドのフォントを変更するマクロの作り方
  6. PowerPoint VBAで選択しているシェイプを操作するShapeRangeオブジェクト
  7. PowerPoint VBAで選択しているシェイプのフォントを変更するマクロの作り方
  8. PowerPoint VBAで選択しているテキスト範囲のフォントを変更するマクロの作り方
  9. PowerPoint VBAで選択した部分を判別してそのフォントを変更するマクロ

PowerPoint VBAでフォームボタンからマクロを実行する方法

$
0
0
command-button

photo credit: Carbon Arc Test monthly -[ HMM ]- via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

PowerPoint VBAで選択している部分のフォントを変更するマクロを作成しています。

前回の記事はコチラ。

PowerPoint VBAで選択した部分を判別してそのフォントを変更するマクロ
PowerPoint VBAで選択している部分のフォントを変更するマクロの作り方についてお伝えしています。今回は、これまでのマクロをまとめて、選択した部分を判別してそのフォントを変更するマクロを紹介します。

選択している部分を判別して、そのフォントを変更するマクロを作成しました。

…てか、もう完成じゃん。

という感じなのですが、実はちょっとその操作性にまだ課題がありました。

だって、マクロを実行するの、面倒なんですもん。

ということで、今回はそれを解決していきます。

PowerPoint VBAでフォームボタンからマクロを実行する方法をお伝えします。

では、行ってみましょう!

前回までのおさらい

では、前回までで作成したマクロを紹介します。

まずコチラがメインのマクロですね。

Sub 選択箇所のフォントを変更()

With ActiveWindow.Selection
    Select Case .Type
        Case ppSelectionText
            Call フォントの変更(.TextRange.Font)
            
        Case ppSelectionShapes
            Call シェイプのフォントの変更(.ShapeRange)
        
        Case ppSelectionSlides
            Dim sld As Slide
            For Each sld In .SlideRange
                Call シェイプのフォントの変更(sld.Shapes)
            Next sld
    End Select
End With

End Sub

実行すると、選択の状態に合わせてSelect Case文で分岐して、各状態に応じて必要な処理を行います。

シェイプのコレクションを渡して、ループを回してくれるのが、以下プロシージャです。

Sub シェイプのフォントの変更(objShapes As Object)
    Dim shp As Shape
    For Each shp In objShapes
        Call フォントの変更(shp.TextFrame.TextRange.Font)
    Next shp
    
End Sub

そして、最終的に各シェイプのFontオブジェクトを渡して、その設定をするのが以下のプロシージャです。

Sub フォントの変更(objFont As Font)

With objFont
    .Name = "Meiryo UI"
    .NameFarEast = "Meiryo UI"
    .Color = RGB(89, 89, 89)
End With

End Sub

このマクロを実行すると、その選択状態に応じて、スライド、シェイプ、テキストのフォントを変更してくれます。

PowerPointマクロはショートカットキーへの設定が難しい

それで、「Sub 選択箇所のフォントを変更()」を、リボンの「マクロ」からショートカットキーに設定すればOK!

…と思うのですが、以下に示すとおり、PowerPointのリボンで「開発」→「マクロ」でマクロダイアログを開いても、「オプション」がありません。

PowerPointのマクロからはショートカットキーの設定ができない
PowerPointではマクロをショートカットキーに登録する機能がデフォルトではないのです。

エクセルであれば、以下のように「オプション」から「マクロオプション」でショートカットキーにマクロを割り当てられるんですが…

Excelのマクロからショートカットキーの設定をする

Wordでもできますよね。

Word VBAで作成したマクロをショートカットキーに登録する方法
初心者向けにWord VBAで便利な文字入力をするマクロの作り方シリーズ。今回は文書入力しながらサクサク使うために、Word VBAで作ったマクロをショートカットキーに登録する方法をお伝えします!

いろいろと調べてみると、いろいろとやればPowerPointでもショートカットキーにマクロを設定できそうなのですが、ノンプログラマーには少し難しそう…

ということで、フォームのコマンドボタンでマクロの実行を実現することを目指してみようと思います。

PowerPoint VBAでユーザーフォームを使用する

動作イメージとしては、常にフォームで「フォント変更」というボタンを表示しておいて…

  1. フォントを変更したい部分を選択
  2. 「フォント変更」ボタンをクリック

これで、実行できるというものです。

では、その方法を見ていきましょう。

ユーザーフォームの挿入

まず、VBEのメニューから「挿入」→「ユーザーフォーム」で、新規のユーザーフォームを挿入します。

PowerPoint VBAでユーザーフォームの挿入

すると、以下のような画面になります。

PowerPointのユーザーフォーム

この例では、「UserForm1」というオブジェクト名のユーザーフォームが追加されました。

このユーザーフォーム上に要素(コントロールといいます)を配置したり、プロパティの設定ができるようになります。

ユーザーフォームの設定をする

では、まずこのユーザーフォームのタイトル表示となるキャプションと、サイズを変更しましょう。

左下の「プロパティ」ウィンドウには、オブジェクト「UserForm1」のプロパティが一覧されています。

このウィンドウを使って、各プロパティを直接編集できるんですね。

フォームのタイトルと表示される「Caption」プロパティを「便利ツール」に変更をします。

ユーザーフォームのプロパティとサイズを変更する

また、今回設置するボタンは一つだけなので、今のままではフォームが大きすぎる…ということで、右下の□ポッチをつかんでドラッグしてサイズをいい感じに変更しておきます。

ユーザーフォームにコマンドボタンを配置する

続いて、このフォーム上にクリックできるコマンドボタンを設置していきましょう。

「ツールボックス」ダイアログには、配置できるコントロールのアイコンが並んでいまして、その中の「コマンドボタン」をクリックします。

その上で、フォーム上でドラッグをすると、そのサイズにコマンドボタンを設置することができます。

ユーザーフォームにコマンドボタンを設置

コマンドボタンの設定をする

次に、設置したコマンドボタンの設定をしていきます。

コマンドボタンをクリックすると、プロパティウィンドウはそのコマンドボタンのプロパティ一覧に切り替わります。

まず表示名である「Caption」を「フォント変更」に設定、次に「Font」の「…」をクリックしてフォントダイアログを開いてフォントの設定をします。

コマンドボタンの設定をする
フォント名を大好きな「Meiryo UI」にして、サイズを18に設定して「OK」としました。

これで、ユーザーフォームとコマンドボタンの設置が完了です。

コマンドボタンのクリックで実行するマクロを記述する

次に、コマンドボタンのクリックで実行するマクロを書いていきましょう。

ユーザーフォームのコマンドボタンをダブルクリックすると、コードウィンドウが開きUserForm1にコードを書くことができるようになります。

まず、以下のように表示されているはずです。

Private Sub CommandButton1_Click()
    
End Sub

これは、「CommandButton1」をクリックしたイベント時に動作するプロシージャです。

前回までに作成した「選択箇所のフォントを変更」マクロを実行させたいので、以下のようにCallステートメントで呼び出すようにしてあげましょう。

Private Sub CommandButton1_Click()
    Call 選択箇所のフォントを変更
End Sub

フォームをモードレスで表示する

また、このユーザーフォームを開くためのプロシージャが必要ですので、標準モジュールのほうに以下のプロシージャを追加します。

Sub フォーム表示()
    UserForm1.Show vbModeless
End Sub

Showメソッドの引数として「vbModeless」を設定すると、「モードレス」でユーザーフォームを開いてくれます。

モードレスというのは、フォームが表示されている状態でも、プレゼンテーションの操作ができるようにするというモードです。

これを設定しないと「モーダル」で表示されますが、この場合はフォームを閉じないとプレゼンテーションの操作ができないのです。

ユーザーフォームのコマンドボタンからマクロを実行する

では、テストをしてみましょう。

「フォーム表示」を実行してみると、プレゼンターション上にフォームが表示されます。

何かしらかを選択して、「フォント変更」ボタンをクリックします。

ユーザーフォームのコマンドボタンをクリックする

すると、以下のように選択している部分のフォントの変更が確認できました。

コマンドボタンのクリックによるマクロの実行結果

まとめ

以上、PowerPoint VBAでフォームボタンからマクロを実行する方法をお伝えしました。

これで、常に表示されているボタンをクリックするだけで、選択している部分のフォント変更ができるようになりました。

次回は、ユーザーフォームの表示のマクロの実行をリボンから行えるようにしていきます。

どうぞお楽しみに!

連載目次:初心者向けPowerPoint VBAで選択箇所を操作する

PowerPointでプレゼンテーションを作っている際に、「選択している部分のフォントを好きに変えたい!」ということありますよね。そのニーズに応えるマクロの作り方をシリーズでお伝えしていきます。
  1. PowerPoint VBAでアクティブなウィンドウを取得する方法
  2. PowerPoint VBAで選択した部分を表すSelectionオブジェクトとその取得
  3. PowerPoint VBAのSelectionオブジェクトの4つのタイプについて理解しよう!
  4. PowerPoint VBAで選択しているスライドを操作するSlideRangeオブジェクト
  5. PowerPoint VBAで選択しているスライドのフォントを変更するマクロの作り方
  6. PowerPoint VBAで選択しているシェイプを操作するShapeRangeオブジェクト
  7. PowerPoint VBAで選択しているシェイプのフォントを変更するマクロの作り方
  8. PowerPoint VBAで選択しているテキスト範囲のフォントを変更するマクロの作り方
  9. PowerPoint VBAで選択した部分を判別してそのフォントを変更するマクロ
  10. PowerPoint VBAでフォームボタンからマクロを実行する方法

エクセル関数だけで営業日を考慮した月間スケジュールを作成する方法

$
0
0

エクセル関数で営業日計算
みなさん、こんにちは!
フジタニ(@libartweb)です。

エクセルVBAとWORKDAY関数を組み合わせたスケジュール表自動作成の方法をシリーズでお伝えしております。

前回の記事はこちら

エクセルVBAとWORKDAY関数の組み合わせでスケジュール表を自動作成する最初の一歩
エクセルVBAとWORKDAY関数を組み合わせればスケジュール表を自動作成することが可能です。実務で役立てるととても便利なツールになります。どんな流れや仕組みでツール開発を進めていくか?を解説します。

前回は「スケジュール自動作成ツール」を作るためには、どのシートに何のエクセル関数の入力が必要であるか?

そしてツールが動作する全体の仕組みと流れについて解説しました。

最初に必要なのが定例タスクの日付計算です。何日に何のタスクがあるのか?それをまずはエクセル関数で計算する必要があります。

今回は定例タスクのスケジュールを自動計算する際に便利なエクセル関数を紹介します。

月間スケジュールリストを作成する際に便利なエクセル関数

定例タスクの日付計算には様々なパターンがありますが、よく使うものをピックアップしました。

これだけでは求められないパターンもあるかもしれませんが、大体はこれでOKなはずです。

紹介するパターンは以下の通りです。

定例タスク タイミング
英会話教室 毎週月曜日(休み→翌営業日)
月例会議 第2月曜日(休み→翌営業日)
月末処理 毎月最終営業日
カード引き落とし 毎月27日(休み→翌営業日)

F2セルとF5セルには前回の記事で説明した「基準日」と「基準日の翌月」が入力されている前提とします。

おさらいすると・・・以下の2つの関数が設定されています。

F2セル=基準日(TODAY関数)
F5セル=基準日の翌月(DATE関数)

基準日の翌月

月の最終日の求め方

月の最終日を求めるのは非常に簡単です。

月末はEOMONTH関数でシンプルかつ簡単に求められます!

「開始日」から起算して、指定した月数だけ前または後の月の最終日に対応するシリアル値を返します。

書式は以下の通り。

EOMONTH(開始日,月指定)

「開始日」に最終日を求めたい日付を入力します。

「月指定」は「開始日」から見たどの月の最終日を求めるかを指定します。

月指定は以下の通り。

月指定 内容
0 当月末
1 来月末
2 再来月末
-1 前月末
-2 前々月末

2018年11月の最終日を求めたい場合はF5セルに「2018年11月1日」と入力しておき以下のように関数を使用します。

=EOMONTH($F$5,0)

これで2018/11/30が返ります。

毎週○曜日の求め方

英会話教室(毎週月曜日)を例に説明します。

まず、第1月曜日を求めます。式は以下の通り。(F2セルに今日の日付をTODAY関数で入力しておきます。今回は2018年10月9日の日付がF2セルに入っています)

※実際に毎週月曜日を求める月の対象は、今日の日付の翌月です。

=EOMONTH($F$2,0)-WEEKDAY(EOMONTH($F$2,0),3)+7

この式は、WEEKDAY関数の返り値を使いながら、曜日を考慮して日付計算を行っています。

WEEKDAY関数の書式等は以下の記事の冒頭で紹介しております。

エクセルで営業日判定を実現するWORKDAY関数の使い方
エクセルで土日祝日を判定したい!といった場合に、祝日の判定は標準のエクセル機能では不可能です。今回紹介するWORKDAY関数を使用すれば、祝日の判定を実現することが可能です。

EOMONTH($F$2,0)からWEEKDAY($F$2,3)+7を引いております。1つずつこの式を解説していきます。

=EOMONTH($F$2,0)+0

F2セルに入力されている基準日である「2018年10月」の最終日をEOMONTH関数で求めます。その最終日に対して求めたい曜日の「数値」を足します。

EOMONTH関数の書式、使い方は前述の「月の最終日の求め方」で説明しましたので参照してください。

ここでいう「数値」とはWEEKDAY関数の返り値(種類は3)とします。そのため、WEEKDAY関数の返り値の表を見ながら作ってください。

種類 返り値
1 1:日 2:月 3:火 4:水 5:木 6:金 7:土
2 1:月 2:火 3:水 4:木 5:金 6:土 7:日
3(今回使用) 0:月 1:火 2:水 3:木 4:金 5:土 6:日

今回求めたいのは月曜日なので、月曜日の「数値」である0を足します。

=2018年10月31日+0

=EOMONTH($F$2,0)+0の式で2018年10月31日が求められました。月曜日ではなく毎週火曜日を求める場合、=2018年10月31日+1で2018年11月1日を求めます。

今回は説明のためにあえて+0をしています。0を足しても結果は変わらないのは明白なので実務で使用する際は0を足す必要はありません。

=WEEKDAY(EOMONTH($F$2,0),3)

続いてF2セルに入力されている「2018年10月」の最終日をEOMONTH関数で求め、それをWEEKDAY関数で曜日を表す「数値」にします。「=EOMONTH($F$2,0)+0」で求めた日付(2018年10月31日)からその「数値」を引きます。

曜日の「数値」は前述のWEEKDAY関数の返り値表を参照してください。

2018年10月31日は水曜日なので「数値」は2です。

2018年10月31日-2

→2018年10月29日(月曜日)が求められました。これだと前月の最終月曜日となってしまうので+7します。

2018年10月29+7=2018年11月5日

これで求めたい月の、1週目の月曜日が求められました。

ここまで説明してきた内容は、以下の通りです。

毎週○曜日を求める

その月の全月曜日を求める

第1月曜日は7を足し、第2月曜日は14を足します。

7の倍数を足していけばOKです。

つまり以下の通りです。

第1月曜日:=EOMONTH($F$2,0)-WEEKDAY(EOMONTH($F$2,0),3)+7
第2月曜日:=EOMONTH($F$2,0)-WEEKDAY(EOMONTH($F$2,0),3)+14
第3月曜日:=EOMONTH($F$2,0)-WEEKDAY(EOMONTH($F$2,0),3)+21
第4月曜日:=EOMONTH($F$2,0)-WEEKDAY(EOMONTH($F$2,0),3)+28
第5月曜日:=EOMONTH($F$2,0)-WEEKDAY(EOMONTH($F$2,0),3)+35

第n月曜日の求め方

弟2月曜日だけ求めたいなど、特定の弟n曜日を求めたい場合は、7の倍数を足すことを覚えておけば便利です。上記の「その月の全月曜日を求める」で説明した式をご覧いただくとわかりやすいでしょう。

今回の例だと「月例会議」が第2月曜日ですので、14を最後に足せばOKです。

第2月曜日 =EOMONTH($F$2,0)-WEEKDAY(EOMONTH($F$2,0),3)+14

毎月○日の求め方

毎月○日、と日付を指定したい場合は、DATE関数を使用します。

今回の例だと「カード引き落とし」が毎月27日にあります。

DATE関数の書式は前回の記事で説明しました。

エクセルVBAとWORKDAY関数の組み合わせでスケジュール表を自動作成する最初の一歩
エクセルVBAとWORKDAY関数を組み合わせればスケジュール表を自動作成することが可能です。実務で役立てるととても便利なツールになります。どんな流れや仕組みでツール開発を進めていくか?を解説します。

書式をおさらいすると以下の通りです。

=DATE(年,月,日)

年と月と日をバラバラに指定して、それを合体し、日付で返す関数でしたね。

=DATE(YEAR($F$5),MONTH($F$5),27)

F5セルには2018年11月1日が入力されていますので、この式の中身は以下のようになっています。

=DATE(2018,11,27)

日だけ直接27を指定しています。

計算結果は以下の通りです。

2018年11月27日

今回紹介したエクセル関数をスケジュールリストシートに設定する

定例タスクのタイミングに従って、エクセル関数をシート内に一覧で入力していきましょう。

スケジュールリストシートの例は以下の通り。(前回までの記事でB~Fの内容について紹介しました。)今回紹介した関数はAの開始日に入力してきます。
スケジュールリスト説明

今回紹介したすべてのエクセル関数を入力した設定例は以下の通りです。参考にしてください!
式一覧

まとめ&次回予告

以上、スケジュールを作成する際に想定されるよくある日付パターンをエクセル関数で求める方法をお伝えしました。

複雑なようですが慣れればとても簡単です。今回の記事を参考にすれば、処理日がパターン化された定例タスクであればすべて自動で求めることが可能です。

ここまで来たら、カレンダー作成までもう少しです。

次回は、エクセルVBAを使用して、カレンダーを作成する方法を紹介します!

どうぞお楽しみに!

連載目次:エクセルVBAで営業日を考慮したスケジュール表を自動で作成する

WORKDAY関数とエクセルVBAを組み合わせ、営業日を考慮したスケジュール表を自動作成する方法をお伝えします。 実務で使いこなすことができればとても便利なツールとして活用できるはずです!
  1. エクセルで営業日判定を実現するWORKDAY関数の使い方
  2. エクセルVBAとWORKDAY関数の組み合わせでスケジュール表を自動作成する最初の一歩

【エクセルVBAでIE操作】alt属性・src属性を利用して画像ボタンをクリックする

$
0
0

画像ボタンaltsrcアイキャッチ画像

こんにちは!もり(@excelprog)です!

エクセルVBAでIEを操作するシリーズをお届けしています。
前回の記事では、name属性を利用して画像ボタンをクリックする方法をお伝えしました。

【エクセルVBAでIE操作】画像タイプの送信ボタンをクリックする
エクセルVBAでInternet Explorerを操作する初心者向けのシリーズ。今回は「画像タイプの送信ボタン」をname属性を使用してクリックする方法についてお伝えします。

今回の記事では、inputタグのalt属性またはsrc属性を利用して画像ボタンをクリックする方法を紹介していきます。

(おさらい)name属性を利用して画像ボタンをクリックする方法

「画像ボタン」の題材は、前回に続きSMBC日興証券オンライントレードのログインページです。

このログインボタンは画像ファイルで作成されています。

日興証券ログインボタン画像

ログインボタンのHTMLがこちら。

そして、name属性を利用したクリック処理のコードがこちらです。
getElementsByNameメソッドでオブジェクト(ボタン)を取得しています。

Dim loginBtns As IHTMLElementCollection
Set loginBtns = htmlDoc.getElementsByName("logIn")

Dim loginBtn As IHTMLElement
Set loginBtn = loginBtns(0) 'コレクションの1番目の要素を取得

loginBtn.Click

name=”logIn”の要素タグをコレクションに格納し、目的のオブジェクト(ボタン)を取り出して、Clickメソッドでクリックするという流れです。

inputタグのコレクションを取得する

それではここからが本題です!
まずは、alt属性を利用する方法・src属性を利用する方法の「共通処理」から紹介します。

getElementsByTagNameメソッドで、HTML全体からinputタグを取得します。

HTMLDocumentオブジェクト.getElementsByTagName(タグ名)

IHTMLElementCollection型のコレクション変数を用意し、getElementsByTagNameメソッドの返り値を格納します。

今回はinputタグを取得するので、getElementsByTagNameメソッドの引数に“input”と文字列型で指定します。

Dim inputTags As IHTMLElementCollection
Set inputTags = htmlDoc.getElementsByTagName("input")

【イメージ】
click1

For Each~Next文でinputタグを順番に取得する

コレクション変数(inputTags)に格納されているinputタグを、順番にオブジェクト変数にセットしていきます。

オブジェクト変数にはIHTMLElement型の変数を用意します。

For Each オブジェクト変数 In コレクション
 ‘処理
Next オブジェクト変数

コードがこちらです。

Dim inputTag As IHTMLElement
For Each inputTag In inputTags
    '処理
Next

【イメージ】
click2

これで、inputタグを一つずつチェックしていくための準備ができました。

この先、alt属性を利用するか、src属性を利用するかで処理が分かれます。
それぞれの方法を紹介していきますね。

alt属性の値を利用してクリックする方法

alt属性とは、画像の代替となるテキストを指定する属性です。
何らかの理由で画像ファイルが表示されない場合に、代わりに表示される文言です。

HTMLでinputタグのalt属性の値を確認します。

<alt="ログイン">

Ifステートメントでinputタグのalt属性の値をチェックします。
もし、目的のボタン(alt=”ログイン”)であれば、Clickメソッドを実行します。

Dim inputTags As IHTMLElementCollection
Set inputTags = htmlDoc.getElementsByTagName("input")

Dim inputTag As IHTMLElement
For Each inputTag In inputTags
    
    If inputTag.alt = "ログイン" Then
        inputTag.Click
        Exit For
    End If

Next

【イメージ】
click3

目的のボタンをクリックできたら、それ以上For文を繰り返す必要はないので、Exit Forステートメントでループを抜けます。

src属性の値を利用してクリックする方法

src属性とは、表示する画像ファイルを指定する属性です。
画像ボタンには、必ずsrc属性で画像ファイルが設定されています。

画像ボタンをクリックしたいけれど、name属性もalt属性も設定されてない・・・そんな時にこの方法を使いましょう。(少し処理が長くなるので、最終手段としてご利用ください!)

HTMLでinputタグのsrc属性の値を確認します。

<src="/common_2015/img/login_help_btn_001.gif">

画像ファイル(.gif)のパスが指定されていますね。

ここで注意するのがパスの指定です。
この画像ファイルのパスは相対パスであるため、alt属性のように完全一致検索では取得できません。

そこで、Instr関数を使用して部分一致検索します。

Instr(検索対象の全体の文字列,検索文字列)
  • 引数1:inputタグのsrc属性
  • 引数2:画像ファイルの相対パス

返り値はこちらです。

  • 検索文字列が見つかった場合→1以上の数値
  • 検索文字列が見つからなかった場合→0

Instr関数の返り値を利用して、目的のオブジェクトを取得できたか判定し、クリックします。

Dim inputTags As IHTMLElementCollection
Set inputTags = htmlDoc.getElementsByTagName("input")

Dim inputTag As IHTMLElement
For Each inputTag In inputTags
    
    If InStr(inputTag.src, "/common_2015/img/login_help_btn_001.gif") > 0 Then
        inputTag.Click
        Exit For
    End If

Next

こちらも同じく、目的のボタンをクリックしたらExit Forステートメントでループを抜けます。

まとめ

エクセルVBAでIEを操作するシリーズ、2回にわたって画像ボタンのクリック方法をお届けしました。

  • name属性の値を利用してクリックする方法
  • alt属性の値を利用してクリックする方法
  • src属性の値を利用してクリックする方法

ボタンをクリックする処理をマスターすると、ページ遷移などができてIE操作の幅が広がりますよ!

Webサイトによってボタンの作りは様々なので、色々なパターンに対応できるよう、知識の引き出しを広げていきましょう。

お読みいただきありがとうございました。

連載目次:エクセルVBAでIEを操作してWEBスクレイピング

IEを操作してWEBページのデータを取得して、エクセルのデータとして取り込む、つまりWEBスクレイピングをエクセルVBAで実現します。各種WEBページを課題として様々なデータの取得の仕方を解説していきたいと思います。

  1. 【エクセルVBAでIE操作】10分で終わるセッティングとWEBページの閲覧確認
  2. 【エクセルVBAでIE操作】HTMLタグと要素そしてドキュメントの取得
  3. 【エクセルVBAでIE操作】ブラウザの読み込み待ちをしないとダメなのです
  4. 【エクセルVBAでIE操作】ページ内のリンク先URLを全部取得する
  5. 【エクセルVBAでIE操作】ディスクリプションなどの要素をname属性でGetする
  6. 【エクセルVBAでIE操作】hタグなどの要素をタグ名でGetする
  7. 【エクセルVBAでIE操作】WEBページのテーブル要素を自動で取得する方法
  8. 【エクセルVBAでIE操作】IEで検索窓にキーワードを入力して送信する方法
  9. 【エクセルVBAでIE操作】ページをクロールしてブログの記事一覧を取得する方法
  10. 【エクセルVBAでIE操作】ブログの記事一覧ページから公開日とカテゴリを取得する
  11. 【エクセルVBAでIE操作】ページャーを最後のページまでどんどんリンクする
  12. 【エクセルVBAでIE操作】ユーザー名とパスワードを入力してログインをする
  13. 【エクセルVBAでIE操作】画像タイプの送信ボタンをクリックする

Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備

$
0
0

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。

前回の記事はこちらです。

Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
Windowsのポチポチ業務(マウスを使った業務)を爆速化できるPowerShell。統合開発環境のPowerShell ISEを使って、効率よくPowerShellの開発を進めましょう!ISEでスクリプトを作成・保存方法とスクリプトで何ができるのかについてお伝えします!

前回は統合開発環境ISEでPowerShellのスクリプトを保存するところまでご説明しました。

PowerShellはWindowsのほぼすべての機能を操作できる強力なCUIであるため、デフォルトの設定ではスクリプトを実行することができません

スクリプトの実行を制御する実行ポリシーというステータスを変更する必要があるんです

本記事を読んで実行ポリシーについて理解し、PowerShellのスクリプトを自在に実行できるようになりましょう!

デフォルトではスクリプトを実行できない

前回保存したスクリプトは以下の通りです。

Write-Host "ISEから実行しました!"

スクリプトを実行するにはISEのツールバーにある三角の実行マークをクリックするか、F5を押します。

このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\terad\Desktop\sample.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
+ CategoryInfo : セキュリティ エラー: (: ) []、ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnauthorizedAccess

あれ、セキュリティエラーでファイルの読み込みができませんでした。

デフォルトの設定では自分が作ってローカルに保存したスクリプトすら実行できないんです…!

スクリプトの実行を制御する実行ポリシーとは

スクリプトを実行するには、実行ポリシーを変更する必要があります。

実行ポリシーはスクリプトの発走ゲートのような役割を果たします。そう、競馬でカッシャン!と開くゲートのことです。

条件を満たしている場合にゲートが開きスクリプトの実行が可能になる、というようなイメージを持ってください。

実行ポリシーを確認する

現在設定されている実行ポリシーを確認しましょう。

Get-ExecutionPolicyコマンドレットで、現在設定されている実行ポリシーを確認できます

Get-ExecutionPolicy

PS C:\Users\terad> Get-ExecutionPolicy
Restricted

実行ポリシーはRestricted=すべてのスクリプトが実行不可となっています。だからセキュリティエラーになってしまったんですね。

PowerShellのスクリプトはWindowsのほぼすべての機能を操作できる強力なCUI、セキュリティの観点からデフォルトでは実行不可となっています。

実行ポリシーを変更する

さあ、スクリプトを実行するために発走ゲートを開けてあげましょう!

Set-ExecutionPolicyコマンドレットで、実行ポリシーを変更できます

Set-ExecutionPolicy 実行ポリシーの種類 -Scope 実行ポリシーの適用範囲

今回実行ポリシーの種類には自分で作成しローカルに保存したスクリプトが実行可能なRemoteSignedを設定します。

実行ポリシーには以下の種類があります。

実行ポリシーの種類 実行できるスクリプト
Restricted スクリプトの実行を行いません
AllSigned 署名付スクリプト
RemoteSigned 署名付スクリプト、または自分で作成しローカルに保存したスクリプト
Unrestricted すべてのスクリプト、ただしインターネットからダウンロードされた未署名のスクリプトを実行する場合、実行するかどうか確認されるのでユーザーが明示的に許可した場合に実行される
Bypass 何もブロックされず、警告もメッセージも表示されません
Undefined 現在のスコープから割り当てられている実行ポリシーを削除します

Scopeパラメータを使えば、実行ポリシーの適用範囲を指定できます

今回は適用範囲が現在のユーザーとなるCurrentUserを設定します。

Scopeには以下の種類があります。

Scopeの種類 実行できるスクリプト
Process 現在のWindowsPowerShellプロセス(PowerShell、ISEを終了すると設定はリセットされます)
CurrentUser 現在のユーザー
LocalMachine コンピューターのすべてのユーザー

以下のコマンドレットで実行ポリシーを変更しましょう。

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

再度Get-ExecutionPolicyを実行すると

PS C:\Users\terad> Get-ExecutionPolicy
RemoteSigned

実行ポリシーがRomoteSignedに変更されました。

スクリプトを実行する

今、スクリプトの発走ゲートは開いた状態です。

実行すると…

PS C:\Users\terad\Desktop\sample> C:\Users\terad\Desktop\rename.ps1
ISEから実行しました!

コンソールに「ISEから実行しました!」のメッセージが表示されました!

まとめ

PowerShellはWindowsのほぼすべての機能を操作できる強力なスクリプトである代わりに、セキュリティの観点から実行ポリシーという制限=発走ゲートの開け閉めが必要になります

少し面倒ですが、一度分かってしまえば簡単ですね。

さあスクリプトが実行が制御できるようになりました!

次回はコマンドレット間で値の受け渡しができるパイプラインの説明をしながらファイルのリネームをやってきますよ!

最後までお読みいただきありがとうございました!

連載目次:Windowsのポチポチ業務を爆速化するPowerShell

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
  1. Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
  2. Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
  3. Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
  4. Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
  5. Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
  6. Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
  7. Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備

【Outlook VBA】メールの添付ファイルをワンクリックで指定フォルダに保存する方法

$
0
0

outlook,vba,Attachment,saveasfile,eyecatch皆様こんにちは、ノグチです。

何度かの連載に分けて、Outlookで今ウインドウを開いているメールの添付ファイルを、ワンクリックで指定フォルダに保存する方法をご紹介しています。

【Outlook VBA】今開いているOutlookウインドウを操作しよう!Inspectorオブジェクトの取得
Outlook vbaで、メールの添付ファイルをワンクリックで指定フォルダに保存する方法を複数回記事にわたってご紹介していきます。今回は、ActiveInspectionメソッドで、今開いているOutlookウインドウのInspectorオブジェクトを取得する方法をご紹介しています。
【Outlook VBA】CurrentItemプロパティで今開いているメールのMailItemオブジェクトを取得する方法
Outlook VBAで、今開いているメールの添付ファイルをワンクリックで任意のフォルダに保存する方法を5ステップにわけて、連載記事でご紹介しています。今回は、InspectorオブジェクトのCurrentItemプロパティによるMailItemオブジェクトの取得についての説明です。
【Outlook VBA】今開いているメールのAttachmentsコレクションを取得する方法
何度かの連載で、Outlookで今開いているメールの添付ファイルを任意のフォルダに、ワンクリックで保存する方法をご紹介しています。今回は、メールの添付ファイルのオブジェクトがまとまったAttachmentsコレクションの取得についてのご紹介です。

メールの添付ファイルをフォルダに保存するコードを記述するにあたっては、下記5ステップを経てコーディングしていくことは、各回の記事の中でお伝えしている通りです。

  1. 今開いているOutlookのウインドウのInspectorオブジェクトを取得
  2. 取得できたInspectorオブジェクトからMailitemオブジェクトを取得
  3. 取得できたMailItemオブジェクトからAttachmentsコレクションを取得
  4. Attachmentsコレクションから添付ファイルのAttachmentオブジェクトを取得
  5. AttachmentオブジェクトのSaveAsFileメソッドで、添付ファイルを任意フォルダに保存

前回の記事では、ステップ3の取得できたMailItemオブジェクトからAttachmentsコレクションを取得までご紹介しました。

今回はいよいよ仕上げ、ステップ4,5のAttachmentsコレクションから添付ファイルのAttachmentオブジェクトを取得AttachmentオブジェクトのSaveAsFileメソッドで、添付ファイルを任意フォルダに保存についてご紹介していきます!

 前回までのおさらい

さて、前回記事でステップ3までご紹介しました。

そのステップ3の段階でできたVBAのコードがこちら。

 
Sub SaveAttachmentFile()
Dim objItem As Object
Dim objIns As Inspector
Dim objAttchments As Object
 
Set objIns = Application.ActiveInspector
Set objItem = objIns.CurrentItem   '今開いているメールオブジェクトを取得
Set objAttchments = objItem.Attachments ’Attachmentsコレクションを取得
 
End Sub
  1. 今開いているウインドウのInspectorオブジェクトを取得
  2. InspectorオブジェクトのCurrentItemプロパティでMailItemオブジェクトを取得
  3. MailItemオブジェクトからAttachmentsコレクションを取得

というところまでコーディングできています。

上のコードで取得したAttachmentsコレクションは、添付ファイルのオブジェクトであるAttachmentオブジェクトがまとまったものであることは前回記事でご紹介しましたね。

今回記事では、このAttachmentsコレクションからAttachmentオブジェクトを取り出して、フォルダに保存するコードを書き加えていきましょう!

 ItemメソッドでAttachmentオブジェクトを取得

では早速、ステップ4.Attachmentsコレクションから添付ファイルのAttachmentオブジェクトを取得にある通り、前回記事で取得したAttachmentsコレクションからAttachmentオブジェクトを取得していきましょう。 

Attachmentオブジェクトとは

Attachmentオブジェクトは、Outlookのアイテム(メール、予定表、タスクなど)の添付ファイルそのものを操作するオブジェクトです。

Outlookアイテムの添付ファイルを保存したり削除したりといった操作をするためには、このAttachmentオブジェクトを取得せねばなりません。

Attachmentオブジェクトは、AttachmentsコレクションのItemメソッドで取得できます。
記述方法がこちら。
Attachmentsコレクション.Item(添付ファイルのインデックス番号)

Itemメソッドは省略してもOK

Attachmentsコレクションに限らず、コレクション内のオブジェクトはItemメソッドを使う他、コレクションに直接インデックス番号を指定することで、そのインデックス番号したコレクション内のオブジェクトを取得することができます。

なので、Attachmentsコレクションの後の.Itemを、このようにインデックス番号に置き換えてもAttachmentオブジェクトを取得することができますよ。

Attachmentsコレクション(インデックス番号)

SaveAsFileメソッドで取得した添付ファイルをフォルダに保存

Attachmentオブジェクトが取得できたら、後は指定フォルダに保存するだけです。

添付ファイルを保存するには、AttachmentオブジェクトのSaveAsFileメソッドを使います。

Attachmentオブジェクト.SaveAsFile(保存先のパス)

 メールの添付ファイルを指定フォルダに保存するコード

さて、ここまでをコードに落とし込むと、こんなコードになります。
Sub SaveAttachmentFile()
Dim objItem As Object
Dim strFile As String
Dim strPath As String
 
strPath = "C:\Users\ryoku\Desktop\" 'ファイルを保存したいフォルダ
 
Set objItem = Application.ActiveInspector.CurrentItem   '今開いているメールオブジェクトを取得
 
    With objItem
 
        '添付ファイルの数が0だったら処理終了
        If .Attachments.Count = 0 Then
            MsgBox "メールに添付ファイルがありません。"
            Exit Sub
        End If
    
        strFile = strPath & .Attachments.Item(1)
        .Attachments.Item(1).SaveAsFile strFile
    End With
 
End Sub

AttachmentオブジェクトはFor Each文でも取得できる

さて、上で「AttachmentsコレクションからItemメソッドでAttachmentオブジェクトを取得します!」と鼻息荒くご紹介しておいてなんですが、実は他にもAttachmentオブジェクトを取得する方法があります。

For Eachで取得

Attachmentオブジェクトは、For Each文でも取得することができます。

AttachmentsコレクションからAttachmentオブジェクト取得用のオブジェクト変数を定義して、こんな風に記述すればOK。

Sub SaveAttachmentFile()
Dim objItem As Object
Dim objIns As Inspector
Dim strFile As String
Dim strPath As String
Dim objAttachment As Object
 
Set objIns = Application.ActiveInspector
Set objItem = objIns.CurrentItem   '今開いているメールオブジェクトを取得
 
strPath = "C:\Users\ryoku\Desktop\添付ファイルを保存したいフォルダ\" 'ファイルを保存したいフォルダ
 
With objItem
 
    For Each objAttachment In .Attachments
        strFile = strPath & objAttachment
        objAttachment.SaveAsFile strFile
    Next objAttachment
End With
 
End Sub

For Each文を使えばメールにいくつ添付ファイルがあっても、AttachmentsコレクションからAttachmentオブジェクトを取得して、全添付ファイルを指定フォルダに放り込んでくれます

 VBAを実行してメールの添付ファイルをフォルダに保存する

では、このFor eachを使ったコードを実行してみましょう。

たとえば、このようにテキストファイルが3つ添付されたメールを開いておいて、

outlook,vba,添付ファイル,メール

上のコードを実行すると…
outlook,vba,添付ファイル,メール,フォルダに保存

この通り、指定したフォルダに、メールに添付されたファイルが全て格納されていますね

これで、メールの添付ファイルを指定フォルダに保存することができました!

 最後に

これまで複数記事にわたって、今Outlookのウインドウで開いているメールの添付ファイルを、ワンクリックで指定フォルダに保存する方法をご紹介してきました。

メールに添付されたファイルをフォルダに保存していくのって、添付ファイルが複数あると地味に手間だったりするんですよね。

保存先のフォルダが決まっているのなら、今回ご紹介した方法を使って、マクロ実行のワンステップでファイルを保存してしまうのも手ですよ。

それでは、最後までお読みいただきありがとうございました!

【IFTTTでチャットワーク連携】Googleカレンダーの予定登録と開始前リマインドを通知する

$
0
0

IFTTTGoogleアイキャッチ

みなさんこんにちは!もり(@excelprog)です!

引き続き、IFTTTでチャットワーク連携シリーズをお届けしていきます。
前回はTwitter × チャットワークのレシピを2つ紹介しました。

【IFTTTでチャットワーク連携】Twitterで指定条件が含まれるツイートを自動通知する
IFTTTを使用したチャットワーク連携のレシピを紹介するシリーズです。今回の記事では「自分がメンションされたツイート」「指定の単語が含まれるツイート」をチャットワークへ自動通知する方法を紹介します。

Twitterでメンションされた場合・指定語句のツイートがあった場合に、そのツイート内容をチャットワークに通知できる便利なレシピでしたね。

さて、今回はGoogleカレンダーとチャットワークの連携レシピを紹介していきます。

IFTTT で Googleカレンダー × チャットワーク

IFTTT(イフト)とは「If This Then That」の略です。「もし、Aシステムで○○したら、Bシステムに○○する」という、Webサービス間を連携するプログラムのことです。

今回紹介するレシピはGoogleカレンダー × チャットワークなので、「もし、Googleカレンダーで何らかのアクションが起きたならば、それをチャットワークに通知する」となります。

チャットワーク連携のレシピが公開されているURLにアクセスしてIFTTTにSign up(ログイン)します。

IFTTT
See all of the services that partner with IFTTT. From the smart home to business tools to social media — you can browse by category or search by name.

今回紹介するレシピを使用するにはIFTTTとチャットワークの連携許可が必要です。
初めて使う方は、連載初回の記事をご覧のうえ連携の設定をしておきましょう。

【IFTTTでチャットワーク連携】定期作業のリマインドメッセージを自動で通知する
IFTTTを使用したチャットワーク連携のレシピを紹介するシリーズです。今回の記事では、「毎日・毎週の指定時刻」「毎月決まった日付の指定時刻」にチャットワークへメッセージを自動通知する方法を紹介します。

Googleカレンダーに新規の予定が登録されたら通知する

レシピ名:Google カレンダーに予定が追加されたらチャットワークに通知

IFTTTのレシピ一覧で検索、もしくは、こちらのURLに直接アクセスしてください。

Google カレンダーに予定が追加されたらチャットワークに通知
Google カレンダーに予定が追加された場合、グループチャットに通知します。

Turn onをクリックします。
IFTTTGoogleカレンダー予定追加1

設定方法

IFTTTでGoogleカレンダー連携のレシピを初めて使用する場合は、連携認証が必要です!

IFTTTからGoogleアカウントに接続するための認証をします。

「OK」をクリックします。
IFTTTGoogleカレンダー連携1

アカウントの選択をします。
※GoogleアカウントのログインID・パスワード入力画面が出る場合は、それに従って入力しましょう。
IFTTTGoogle連携1-2

「許可」をクリックします。
IFTTTGoogleカレンダー連携2

IFTTTとGoogleカレンダーの連携が完了しました!

ここからはレシピの設定をしていきます。
Configure(設定)で以下の2点を設定します。

  • Which calendar?:Googleカレンダーを選択
  • room:チャットワークの宛先グループを選択

最後にSaveをクリックして設定完了です。
IFTTTGoogleカレンダー予定追加2

設定はたったのこれだけです。お手軽ですね!

Googleカレンダーに予定登録

Googleカレンダーに予定を登録してみます。

「自分で自分のカレンダーに登録した予定」の通知がきても面白みがないので、この記事では下記のシナリオで解説していきます。

  • 「Googleアカウント2」が「Googleアカウント1」のカレンダー編集権限を保有
  • 「Googleアカウント1」とチャットワークが連携している

IFTTTとGoogleカレンダー連携イメージ

「Googleアカウント2」で、「Googleアカウント1のカレンダー」に予定を登録します。
IFTTTGoogleカレンダー予定追加3

実行結果

「Googleアカウント2がGoogleアカウント1に登録した予定」「Googleアカウント1と連携しているチャットワーク」に通知されました。

数秒~数十秒ほどで届くので、ほぼリアルタイムでの確認が可能です。
(※実行したタイミングや、環境によって異なる可能性があります)

誰かにカレンダーの編集権限を付与していて、知らぬ間に予定を登録された場合でも、すぐにキャッチできるのが良いですね!

また、通知メッセージにGoogleカレンダーへのURLが付いているので、すぐにアクセスして確認できるのも便利です。IFTTTGoogleカレンダー予定追加4

Googleカレンダーの予定開始前にリマインドする

レシピ名:Google カレンダーの予定が開始される◯◯分前に、チャットワークにリマインドを通知

IFTTTのレシピ一覧で検索、もしくは、こちらのURLに直接アクセスしてください。

Google カレンダーの予定が開始される◯◯分前に、チャットワークにリマインドを通知
Google カレンダーに登録されている予定が開始される◯◯分前に、グループチャットにリマインドを通知します。

「Turn on」をクリックします。
IFTTTGoogleカレンダーリマインド1

設定方法

Configure(設定)で以下の3点を設定します。

  • Which calender?:Googleカレンダーを選択
  • Time before event starts:何分前に通知するか選択(0,15,30,45分から選択可)
  • room:チャットワークの宛先グループを選択

最後にSaveをクリックして設定完了です。
IFTTTGoogleカレンダーリマインド2

実行結果

Googleアカウント1のカレンダーに、下記の予定が登録されています。
IFTTTGoogleカレンダーリマインド3
レシピで30分前に通知の設定にしたので、「11時の30分前」=「10時30分」に、roomで指定した宛先のマイチャットに通知が届きました!
こちらもURL付きなので、すぐにカレンダーにアクセスできるのが便利です。

IFTTTGoogleカレンダーリマインド4

まとめ

今回の記事では、Googleカレンダー × チャットワーク連携のレシピを2つ紹介しました。

  • Googleカレンダーに新規の予定が登録されたら通知する
  • Googleカレンダーの予定開始前にリマインドする

GoogleカレンダーにもGmailなどへの通知機能がありますが、通知をOFFにしていたり、Gmailをリアルタイムで確認しない場合などでも、ビジネスチャットツール「チャットワーク」さえ起動しておけば、予定を忘れる心配もありませんね!

色々な通知を「チャットワーク」に集約しておけば、アプリを多数起動しておく必要もなく、集中力を遮られることもなく仕事がこなせますね。

プログラミング不要でサクッと利用可能なIFTTTを上手に使いこなしていきましょう!

次回も他のレシピを紹介していきます。どうぞお楽しみに!

連載目次:IFTTTでチャットワークを使おう

IFTTTのチャットワーク連携レシピを紹介しているシリーズです。

  1. 【IFTTTでチャットワーク連携】定期作業のリマインドメッセージを自動で通知する
  2. 【IFTTTでチャットワーク連携】Twitterで指定条件が含まれるツイートを自動通知する

「ギガ盛り」と「ノンプロ研」合同のVBA・GASハンズオンを開催しました

$
0
0

vba-gas-handson

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

先日、コミュニティ「ギガ盛りブログ飯」と、「ノンプログラマーのためのスキルアップ研究会」の合同ハンズオン企画でお話させていただきました。

「VBA・Google App Scriptで業務効率化!両方知って触れる欲張りハンズオン」です。

VBA・Google App Scriptで業務効率化!両方知って触れる欲張りハンズオン
VBAやGoogle App Script(GAS)の書籍も出版されている高橋宣成さんにお願いして、初心者・未経験者向けのセミナー&ハンズオンを開催してもらえることになりました。 ... powered by Peatix : More than a ticket.

初心者向けではありますが、VBAもGASも両方とも知って触って味わえちゃうという、お得な企画です。

場所は、コワーキングスペースも運営されているBasis Pointさんの新橋店。アイキャッチに掲載している通り、素敵な場所をお借りして開催させていただきました。

Basis Point(ベーシスポイント) - コワーキングスペース/貸会議室
東京都内に4店舗(新橋・五反田・神保町・池袋)ある、カフェのような雰囲気のコワーキングスペースです。コワーキングスペースならではの仕切りのないオープンスペースでは、お客様同士の会話も生まれています。全店駅近!電源&Wi-Fi完備。魅力的なイベントも随時開催。お気軽にコワーキングスペースBasis Pointへお越しくだ...

ということで、今回はイベントレポートでございます。

なお、ツイートまとめはコチラになりますので、合わせてお楽しみくださいませ!

VBA・Google App Scriptで業務効率化!両方知って触れる欲張りハンズオン
お仕事にすぐに使えるプログラミング言語VBAとGoogle Apps Script。その両方について、初心者向けに知って触れるハンズオンを開催しました!

ギガ盛りを参考にコミュニティをスタート

コミュニティ「ノンプログラマーのためのスキルアップ研究会」は、開始して1年くらい経っておりますから、今でこそある程度カタチになって運営しているように見えます。

しかし、やろうと思っても、コミュニティ…何からどうしていいものやら…

そんなときに、出会ったのがコミュニティ「ギガ盛りブログ飯」なんですね。

染谷昌利 - ギガ盛りブログ飯 ~情報発信力を身につけて激動の時代を生き抜こう~ - DMM オンラインサロン
これからの時代、自分自身で仕事を創り出したり、会社に頼り切らない生き方が求められます。そのためには情報発信力が重要です。セミナーで学び、FBグループで交流をはかりながら個のスキルを一緒に伸ばしていきましょう。

昨年のちょうど今頃(10/24でした)に、「オンラインサロンを1年運営してわかった「コミュニティ」の重要性と作り方&維持について」というセミナーイベントがありまして、参加させていただきました。

コミュニティ「ノンプログラマーのためのスキルアップ研究会」を立ち上げます
コミュニティ「ギガ盛りブログ飯」の主催者である、染谷昌利さんの「コミュニティの作り方」についてのセミナーに参加しました。それを受けまして、コミュニティ「ノンプログラマーのためのスキルアップ研究会」を立ち上げます。

そして、そこで見聞きした内容をパクr…、とても参考にさせていただいて、12/1にコミュニティをスタート。

つまり、今のノンプロ研があります。

入会していたつもりだったのですが

さて、8月のノンプロ研の定例会のテーマが「コミュニティ」だったんですね。

ノンプロ研の活動も少しカタチになってきたのでその報告と、活用方法と、今後について発表させていただきました。

コミュニティの活用術とノンプロ研の今、そしてこれからについて
2017年12月から「ノンプログラマーのためのスキルアップ研究会」を運営しています。今回は、そもそもコミュニティって何?なぜ必要なの?ノンプロ研の活動ってどうなの?そしてこれからは?というところを整理していきます。

それで、その中で「複数のコミュニティでギブをするといいよ」、というパートがあったんですね。

何かのコミュニティで活動しているときは、そのコミュニティ内でギブすることを意識するのはもちろん、もうひとつのコミュニティでギブをすることを意識すると。

「2つ目」のコミュニティは、別に「ザ・コミュニティ」ではなくてもよくて、わかりやすいのは「会社」とかでOKです。

実際にノンプロ研で学んだ内容を、「会社というコミュニティ」でバリバリ活用されている方もいらっしゃいます。

それで、そんな話をするために、以下のようなスライドを用意してました。

私が所属しているコミュニティのスライド

当然のように「ギガ盛りブログ飯」のバナー画像を入れていたのですが…

おや?…私、実は「ギガ盛り」に入ってないじゃん!!!

という衝撃的な事実に自ら気づきました。

で、慌てて入会したのが9/1のことでした。

複数のコミュニティに所属すると起こる化学反応

そしたら、9/2。入会2日目、次の日ですよ。

染谷さんからメッセンジャーでのご連絡。

高橋さんにVBAの講座をやってもらうことって可能ですか?

おお、展開が速すぎやしませんか…!

でもあれですよ、ノンプロ研のモットーは

1. 教えることは2度学ぶこと
2. 自分で薪を割れ
3. 鉄は熱いうちに打て

です。脊髄反射で即答OKです。

そして、せっかくなのでVBAだけでなく、GASも両方触れるという、珍しいタイプのハンズオン企画にさせていただくことになりました。

ギガ盛りメンバーはもちろん、ノンプロ研メンバーも参加できる合同企画(どちらにも入っていらっしゃらない方は有料)。

いい響きです。合同企画。

VBA・GASハンズオンの収穫

ターゲットが違うと得るものも違う

今回は、いつものノンプロ研とは少しターゲットが違います。

全くの初心者もいらっしゃるという想定だったので、VBAとGASのデモと「Hello World」的なところまでを紹介するという内容でした。

デモは以下のようにたっぷりご紹介しました。

  • VBA
    • Excel領収書作成
    • WordアウトラインからのPowerPointスライド作成
    • Amazonからの書籍ランキング取得
  • GAS
    • メール下書き作成
    • 問い合わせメールのスプレッドシート転記&チャットワーク転送
    • カレンダー実績取得
    • ドキュメントアドオン
    • Webアプリケーション
  • おまけ(公開アドオン)
    • スプレッドシートGoogleアナリティクスアドオン

染谷さんは当然書籍ランキングに食いつくと思っていたのですが、他の皆さんはドキュメントだったり、Wordアウトラインだったり…

参加者さんそれぞれで、琴線に触れるネタが違うんですよね。

デモのバリエーション大事ですね。もっと用意しておこう。

…とまあ、このように自らがもともと持っているノウハウを提供するだけでも、ターゲットが変わると、別のアプローチや発見があるんですね。

「複数のコミュニティでギブをするといいよ」

また自らが明確に味わう経験をさせていただきました。

VBAとGASを両方触るという機会

もう一つ、VBAとGASを両方触るという機会

これって提供できる方って、そんなに多くはいないんじゃないですかね。

そういう組み合わせによる希少性も増すのですが、それだけではありません。

やってみて、この企画は企業さん向けの営業企画としてすごくいいなと思いました。

いったん単発でこの内容のセミナーを実施しておいて、参加者の反応を見て、その後のアクションを決めていく。

そして、片方だけだと「やる」「やらない」の選択肢になるところが、この場合だと「両方やる」「VBA」「GAS」「やらない」という、何かのアクションは起こせる選択肢が4/3を締められる。

参加者も「何ができるか」「どんな雰囲気か」という情報が得られますから、次のアクションがイメージしやすくなります。

これはいいですね。使おう。

まとめ

はい、以上「VBA・Google App Scriptで業務効率化!両方知って触れる欲張りハンズオン」のレポートをお送りしました。

「複数のコミュニティでギブをするといいよ」

間違いありませんでしょ?

皆さんも、ぜひご堪能ください。

また合同企画やりたいですね…!

技術書執筆者トークイベントとか…どうでしょう、染谷さん?

ノンプログラマーでも「クラス」を学ぶべき理由

$
0
0

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

ノンプログラマーがVBAやGASを学習していくと、その先に理解不能な概念が支配する恐怖のエリアがあることに気づきます。

「クラス」です。

これまで標準モジュールに、SubプロシージャとFunctionプロシージャでマクロを作っていて、それで十分でした。

極稀に、上級者のソースコードやブログ記事を見ると、そもそもクラスモジュールにコードを書いていて、さっぱり何が書いているかわからず…

そっとPCを閉じる…みたいな。

ネットや書籍にもなかなか情報がないですし、ノンプログラマーが簡単なツールを作る上では利用しなくても作れる場合が多いのは事実。

でも、気になる存在である「クラス」。

そんなクラスへの苦手意識を取り除く、というハイレベルな目標を立てて、コミュニティ「ノンプログラマーのためのスキルアップ研究会」の定例会「クラスって何?」に臨みました。

今回は、その背景として「なぜノンプログラマーがクラスを学ぶべきなのか」について書きたいと思います。

ノンプログラマーにとってのクラス

クラス、インスタンス、コンストラクタ、そしてオブジェクト…わからない概念のオンパレードです。

車とか、たい焼きとか、人間とか、犬とか、色々な例えを使って、あの手この手で色んな方が色んな説明をしてくださっています。

…ですが、なかなか理解が難しい。

そして、さらにノンプログラマーが相手となると、周りにクラスを使っている人はほとんど見かけません。

そもそもプログラミング自体をしている人が希少ですから。

さらに、Webや書籍で事例が載っていても、そのコードには見たことのない、全く知らない世界が展開されていて、どういう意味なのか、どのようなメリットがあるのかを読み解くことができません。

今、実現できていることを、なぜ理解のできない難しい概念に載せ替えなくてはいけないのか…説明がつかないのです。

結果として、 ノンプログラマーにとってクラスというのは、立ち入り禁止区域のような存在になってしまっています。

「クラスを使わなくてもいい」という理由

実際、このブログでも、まだクラスを使用した事例は紹介していません。

理由としては前述の通り

  • 学習の難易度が高い点
  • 活用する機会とそのメリットが見出しづらい点

にあります。

ビジネスマンは時間がないので、なるべく目の前の業務を、少しの学習コストで自動化したいですから、回り道をさせるのも気が引けるというのもあります。

どちらかというと、ノンプログラマーが作るようなプログラムであれば「クラス不要説」を説く方も多いような気がしています。

なぜクラスを学ぶ必要があるのか?

ですが私は、ノンプログラマーでもクラスを作成して活用できる知識とスキルをなるべく早い段階で身につけるべきというスタンスに変わってきています。

「詳解!Google Apps Script完全入門」では、6章で紹介するようにしました。

そして、今回の定例会もそうですし、書籍やブログを通して積極的に「クラスを理解し活用するためのコンテンツ」を供給していきたいと思っています。

その理由を3つ挙げます。

オブジェクトの理解が進む

VBAでもGASでも、操作する対象の多くはオブジェクトです。

そして、そのオブジェクトの全ては、ひな形となるクラスがベースとなっています。

クラスの挙動を知ることで、全てのオブジェクトに共通する機能や挙動を、コードベースで把握してイメージすることができます。

つまり、オブジェクトを正しく理解しやすくなるはずと思います。

他の言語を新たに学習する際に移行しやすい

GASを学ぶメリットとして、JavaScriptを学べるという点があります。

ノンプログラマーでもGASきっかけにJavaScriptを学び、その後頑張ってHTMLやCSSの操作を勉強すれば、フロントエンジニアへの道が開けるかも知れない。

そういう可能性があります。

ですが、おそらく本職プログラマーの皆さんは、オブジェクト指向を普通に使いこなされていて、それベースの開発をされているはずです。

当然、開発環境とか、ECMA Scriptとか、DOM操作とか、フレームワークとか、他に学ばなくてはいけないことはあります。

ですが、準備は先にできるならしておいたほうがいいわけで、GASでも学べるクラスは先に学んでおいたほうが良いと考えます。

いつクラスを学べばいいのか

さて、私がサラリーマン時代に作ったVBA。

最初は200~300行くらいのコードだったと思います。

それくらいであれば、プロシージャだけで十分に構成でき、十分にマネジメントできる内容と言えます。

しかし、その後。独学で勉強しながら、少しずつ機能を増やしていきました。

それを2年くらい続けて、独立のために退職をする頃のには、そのマクロは15のプロシージャ、合計2000行以上のコードで構成される規模になりました。

これ、今思えばなるべく早い段階でクラスを想定して作り直しておきたかったと思うんです。

では、いつクラスを学べばよかったのか?

タイミングが遅いと作り直すのが大変です。

早めに知っておければ、規模の小さいうちにクラスを想定した作り直しができます。

基本構文、制御構文、プロシージャまたは関数を学んだ後に、クラスの作り方を身に着けちゃったほうが良いというスタンスでいます。

GAS本では、そういう流れにしましたし、今執筆しているVBA本でもそういう流れを大事にしています。

まとめ

というのが、ノンプログラマーでも「クラス」を学ぶべき理由です。

「いやでも先にクラス学んでも、使う機会なきゃ忘れちゃうじゃん」

という意見もあると思います。

そう思います。

きっと多くの人は忘れちゃいます。

でも、いいんです。

今回の定例会「クラスって何?」の後のメンバーの反応から、その確認が取れましたので、次回の記事でお伝えします。

どうぞお楽しみに!

「ノンプログラマーのためのスキルアップ研究会」定例会・分科会レポート

コミュニティ「ノンプログラマーのためのスキルアップ研究会」では、毎月1回、学びの質やモチベーションを高めるための定例会を開催していますので、こちらで過去のレポートをお送りしています。

エクセル関数でスケジュール自動表示のためのカレンダーを作成する方法

$
0
0

エクセルVBAでカレンダー自動作成
みなさん、こんにちは!
フジタニ(@libartweb)です。

エクセルVBAとWORKDAY関数を組み合わせたスケジュール表自動作成の方法をシリーズでお伝えしております。

前回の記事はこちら

エクセル関数だけで営業日を考慮した月間スケジュールを作成する方法
エクセル関数だけで営業日を考慮し、月間スケジュールを作成する方法をお伝えします。想定されるよくある日付パターンを、VBAを使用せずエクセル関数だけで計算。スケジュールリストを自動で作成します。

エクセルVBAを使用せず、エクセル関数を使用するだけで、ほとんどのスケジュールパターンは自動計算が可能であることをお伝えしました。

前回の記事でお伝えした便利な関数をフル活用して、スケジュールの日付を一覧に記載した「スケジュールリスト」ができあがっている前提で今回は解説を行っていきます。

スケジュールを一覧に記載することができたら、今度はそれをわかりやすいようにカレンダーに転記していく必要があります。

そのためには、転記先のカレンダーを作る必要があります。

今回紹介するのはカレンダー自動作成の一例です。まずはエクセル関数のみでテンプレートを作る方法の紹介です。カレンダーのレイアウトは様々なパターンが考えられると思いますので使いやすいように加工して記事の内容をご活用ください。

翌月分のカレンダーをテンプレートシートから作成する

カレンダーの内容は当然、月によって変動します。そのため、テンプレートとなるワークシートを作っておき、そのテンプレートを編集する形で翌月分のカレンダーを作成します。

まずは「テンプレート」という名前のワークシートを作成します。
(テンプレートであることがわかれば名前は何でもOKです)

できあがりのサンプルは以下の通り。

カレンダー

2018年10月分のカレンダーを作成する想定で、説明します。まずはエクセル関数だけでできるところまで作り込みます。

セル 設定内容
A1 作成したい月の初日(2018/10/1)
B1 =A1(書式設定で日付のみ表示)
B2以降 B列の上のセル+1(B2セルの場合は=B1+1、B3セルの場合は=B2+1これを31日分)
C列 =TEXT(B列,”aaa”) C2セルの場合は=TEXT(B2,”aaa”)

わかりやすいように、エクセル関数を見えるようにすると以下の通りです。まずはこのようにエクセル関数を設定してください。

カレンダーエクセル関数

A1セルに開始日に書式を設定(月のみ表示)

A1セルはVBAで自動的にカレンダーの開始日となる日付を入力する領域です。
サンプルでは、2018年10月1日が入っており、書式設定で月のみを表示させています。

書式設定の方法は以下の通りです。

セルの書式設定ダイアログ
セルの書式設定ダイアログを表示します。

ユーザ定義 月指定

A1セルを選択した状態でユーザー定義→種類に m”月”と入力してOKを押下

これで実際には2018年10月1日とフルの日付が入っていますが、月のみが表示されるようになりました。

B列に書式設定(日のみ表示)

B列もA1セルと同様に実際は年、月、日のすべての情報が入っていますが、書式設定で日のみ表示するように設定しています。
設定方法は以下の通りです。
ユーザ定義

B列を選択した状態でユーザー定義→種類に d”日”と入力してOKを押下

これで日のみがB列に表示されます。

C列にTEXT関数で曜日を表示させる

TEXT(値, 表示形式)

TEXT関数は値を指定した表示形式に変換して返します。

値に日付、表示形式に”aaa”を指定することで、その日付の曜日を求めることが可能です。

ちなみに”aaa”だと月、火・・・と省略された形で表示されますが、”aaaa”にすると月曜日、火曜日・・・と完全な形で表示させることが可能です。

ここまでの設定で以下の通り、カレンダーのテンプレートとなるものができあがりました。

カレンダー

作成したテンプレートシートに、シートの保護をかける

ここまでエクセル関数の入力がすべて終わったら、作成したテンプレートシートに保護をかけましょう。

シートの保護をかけ、そのワークシートの編集ができなくします。

この先ずっと使う、カレンダーのテンプレートとなるシートなので、何らかの拍子に誤操作などでテンプレート内のエクセル関数などを壊してしまわないための対策です。

シートの保護は非常に簡単です。

シートの保護
①テンプレートシートのタブを右クリック

シートの保護
②シートの保護をクリック

以上で完了します。

エクセルVBAでシートの保護をかけたり解除したりできるので最初に保護をかけておけば、人間は意識せず、すべてエクセルVBAに任せられるので安全に運用できます。

詳細は以下の記事でも解説しています。

エクセルVBAによる運用業務で人為的ミスを減らす4つの方法
エクセルVBAを運用業務で活用されている方必見!人為的ミスを大幅に減らす4つの方法を紹介します。エクセルVBAはメイン処理に偏らず人為的ミスを想定したコーディングが業務効率化に繋がります。

まとめ

以上、エクセル関数をフル活用したカレンダーのテンプレートシートの作成方法をお伝えしました。

次回はそのテンプレートシートをエクセルVBAを使って対象月用に編集をかける処理を紹介します。

いよいよ本格的にエクセルVBAの解説に入ります。

どうぞお楽しみに!

連載目次:エクセルVBAで営業日を考慮したスケジュール表を自動で作成する

WORKDAY関数とエクセルVBAを組み合わせ、営業日を考慮したスケジュール表を自動作成する方法をお伝えします。 実務で使いこなすことができればとても便利なツールとして活用できるはずです!
  1. エクセルで営業日判定を実現するWORKDAY関数の使い方
  2. エクセルVBAとWORKDAY関数の組み合わせでスケジュール表を自動作成する最初の一歩
  3. エクセル関数だけで営業日を考慮した月間スケジュールを作成する方法

【Outlook VBA】受信フォルダにあるメールの添付ファイルを指定フォルダに取り出す方法

$
0
0

outlookvba,MailAttachment,saveasfile,eyecatch
皆様こんにちは、ノグチです。

前回記事では、今開いているメールの添付ファイルを、ワンクリックで指定のフォルダに保存する方法をご紹介しました。

【Outlook VBA】メールの添付ファイルをワンクリックで指定フォルダに保存する方法
複数回の連載で、Outlookのメール添付ファイルを、マクロ実行のワンステップで指定フォルダに保存する方法をご紹介しています。今回は連載の仕上げ、AttachmentsコレクションからAttachmentオブジェクトを取得して、SaveAsFileメソッドで添付ファイルを指定フォルダに保存する方法をご紹介しています。

そして以前の記事で、エクセルVBAで、受信メールフォルダ内のメールの内容をエクセルワークシートに書き出す方法もご紹介しています。

今回は、この二つの方法を組み合わせて、受信メールフォルダにある全メールの添付ファイルを、ワンクリックで指定フォルダに保存する方法をご紹介していきます。

Outlookの仕分けルールで添付ファイルを取り出したいメールをサブフォルダに集めておく

受信フォルダ内のメール全ての添付ファイルを取り出したい!という要望はあまりないと思います。

「このプロジェクトに関連するメール」や、「特定の取引先から送られてくるメール」など、添付ファイルを取り出したいメールの条件がありますよね。

なので、まずはOutlookの仕分けルールを使って、添付ファイルを取り出したいメールを1つのフォルダに集めてしまいましょう

Outlookの自動仕分けウィザードを使って、「議事録」というタイトルのメールを、受信フォルダ内の「議事録」というサブフォルダに集めてしまいます。

Outlook,自動仕分けルール

Outlook,サブフォルダ,メール

おさらい①サブフォルダのFloderオブジェクトを取得

まずは添付ファイルを取り出すフォルダのオブジェクトを取得しましょう。

今回は受信フォルダ内のサブフォルダが対象なので、このサブフォルダのFolderオブジェクトの取得が必要ですね。

なので、まずはこのFolderオブジェクトの取得コードを用意します。

Sub SaveAttachmentFiles()
Dim myNamespace As NameSpace
Dim myInbox As Object
Dim mySubfolder As Object

Set myNamespace = GetNamespace("MAPI")
Set myInbox = myNamespace.GetDefaultFolder(olFolderInbox)
Set mySubfolder = myInbox.Folders.Item("議事録")

End Sub

受信フォルダ直下にあるサブフォルダ「議事録」のFolderオブジェクトを取得するところまでのコードです。

NameSpaceオブジェクトやGetDefaultFolderオブジェクトについては、下記記事をご覧ください。

【エクセルVBA】GetNamespaceメソッドでOutlookのデータフォルダにアクセスする方法
GetNameSpaceメソッドでOutlookのデータフォルダにアクセスする方法をご紹介しています。このメソッドでOutlookのNameSpaceオブジェクトを取得すれば、メール、連絡先、予定表などのデータフォルダにアクセスして、更にその中のデータを読込んだり、エクセルシートに書き出したりすることができますよ。

おさらい②フォルダ内のメールのオブジェクトを取得

お次はサブフォルダに格納されているメールのMailItemオブジェクトの取得です。

受信フォルダ内のMailItemオブジェクトは、FolderオブジェクトのItemsメソッドで取得できるのでしたね。

エクセルVBAでOutlookの受信メールをワークシートに書き出す方法
エクセルVBAで、outlookの受信メールフォルダ内にあるメールをワークシートに書き出す方法をご紹介しています。この方法を使えば、受信メールフォルダ内にあるメールの件名や送信日、送信者のメールアドレスやメール本文を簡単にリストにできてしまいます。

そのItemsメソッドを上のコードに追加すると、こうなります。

Sub SaveAttachmentFiles()
Dim myNamespace As NameSpace
Dim myInbox As Object
Dim mySubfolder As Object
Dim myMailItem As Object

Set myNamespace = GetNamespace("MAPI")
Set myInbox = myNamespace.GetDefaultFolder(olFolderInbox)
Set mySubfolder = myInbox.Folders.Item("議事録")

set myMail = mySubfolder.Items(1)

End Sub

おさらい③メール添付ファイルのAttachmentオブジェクトの取得

更に、メールの添付ファイルは、MailItemオブジェクトのAttachmentsコレクションからAttachmentオブジェクトを取り出すので、上のコードのx行目にAttachmentsコレクションとAttachmentオブジェクトの取得を加えると…

set myMailItem = mySubfolder.Items(1).Attachments(1)

こんな1文になります。

サブフォルダ内のメール添付ファイルを指定フォルダに保存するコード

上のおさらい3項目でできたコードのままでは、「議事録」フォルダ内の1つめのメールの、1つの添付ファイルしか取得できません。

なので、For Each文でサブフォルダ内メールのMailItemオブジェクトを取得し、Itemメソッドで各添付ファイルのAttachmentオブジェクトをループで取得するようにコードを組み合わせます。

更に、添付ファイルを指定フォルダに保存するためのSaveAsメソッドを入れ込むと、こんなコードになります。

Sub SaveAttachmentFiles()
Dim myNamespace As NameSpace
Dim myInbox As Object
Dim mySubfolder As Object
Dim strPath As String
Dim strFile As String
Dim i As Long

Set myNamespace = GetNamespace("MAPI")

Set myInbox = myNamespace.GetDefaultFolder(olFolderInbox)
Set mySubfolder = myInbox.Folders.Item("議事録")  

strPath = "C:\Users\ryoku\Desktop\Folder\" '添付ファイルを保存したいフォルダ

For Each objItem In mySubfolder.Items
    With objItem
    For i = 1 To .Attachments.Count

        strFile = strPath & .Attachments.Item(i)
    .Attachments.Item(i).SaveAsFile strFile

    Next i
    End With
Next objItem

End Sub

「議事録」というフォルダ内にある全メールを対象に、各メールの添付ファイルを、デスクトップの「Folder」というフォルダに保存するコードです。

ワンクリックでサブフォルダ内の全添付ファイルを指定フォルダに保存

上で完成したコードを実行してみると…

メール添付ファイル,保存結果

「議事録」フォルダに集めたメールが全て指定フォルダに格納されています。

これで、「メールを開いて添付ファイルをクリックし、指定フォルダに保存をクリックして保存先を選んで」…という、地味且つ面倒な作業をスキップできますよ。

最後に

今回は、受信フォルダ内のメールの添付ファイルを、ワンクリックで指定のフォルダに保存する方法をご紹介しました。

この方法を使えば、後であるプロジェクトに関わるメールに添付された資料を集めないといけない!といった場合に、VBAコード内の受信フォルダ名と保存先のフォルダ名を書き換えれば、簡単に受信フォルダから取り出すことができますよ。

それでは、最後までお読みいただきありがとうございました!

連載目次:はじめてのOutlook VBA

Outlook VBAで、予定やタスクの登録方法など、Outlookを操作する方法をご紹介しています。メーラーやスケジューラとして便利なOutlookですが、VBAで更に便利なツールにしてしまいましょう!

  1. 【はじめてのOutlook VBA】Outlookの予定を登録する方法
  2. 【Outlook VBA】エクセルワークシートの内容で予定登録する方法
  3. 【Outlook VBA】今開いているOutlookウインドウを操作しよう!Inspectorオブジェクトの取得
  4. 【Outlook VBA】CurrentItemプロパティで今開いているメールのMailItemオブジェクトを取得する方法
  5. 【Outlook VBA】今開いているメールのAttachmentsコレクションを取得する方法
  6. 【Outlook VBA】メールの添付ファイルをワンクリックで指定フォルダに保存する方法
  7. 【Outlook VBA】受信フォルダにあるメールの添付ファイルを指定フォルダに取り出す方法

Windowsのポチポチ業務を爆速化するPowerShell、フォルダを作るスクリプトの作り方

$
0
0

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。

前回の記事はこちらです。

Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備
Windowsのポチポチ業務(マウスを使った業務)を爆速化できるPowerShell。スクリプトを実行するために必要な実行ポリシーの変更方法について解説します。

前回はスクリプトの実行を制御するために必要な実行ポリシーについてご説明しました。

これまでの連載でディレクトリ・開発環境(ISE)・実行ポリシーと基礎的な内容をしっかりと積み上げてきました。本記事からはこれらを踏まえて実用的なスクリプトを作っていきます。

しかし、いざスクリプトを作ってみよう!と思ってもif文・for文など構文を使ったプログラミングは難易度が高いですよね。

そこで今回はノンプログラマーの方でも簡単に実用的なスクリプトの作成できる方法をご紹介します!

コマンドレットでディレクトリ(=フォルダ)を作る方法をお伝えし、さらにエクセルの数式・オートフィル機能を利用してコマンドレットを大量生産する方法もお伝えします。

写真データなどを日付毎のディレクトリに保存することはよくあるのではないでしょうか。このような日付毎のディレクトリを一気に作成するスクリプトを作ってみましょう!

ディレクトリを作成する

ディレクトリを作成するにはNew-Itemというコマンドレットを使用します

New-Itemはディレクトリ、またはファイルを新たに作成するコマンドレットです。今回はディレクトリを作成したいのでItemTypeにDirectoryを指定します

New-Itemの構文は以下の通りです。

New-Item ディレクトリ名 -ItemType Directory

201810、201811、201812、と3つのディレクトリを作ってみたいと思います。

まずPowerShellの開発環境であるISEを起動します。ISEについてはこちらの記事をご参照ください。

Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
Windowsのポチポチ業務(マウスを使った業務)を爆速化できるPowerShell。統合開発環境のPowerShell ISEを使って、効率よくPowerShellの開発を進めましょう!ISEでスクリプトを作成・保存方法とスクリプトで何ができるのかについてお伝えします!

スクリプトウィンドウに以下のコマンドレットを入力します。

New-Item 201810 -ItemType Directory
New-Item 201811 -ItemType Directory
New-Item 201812 -ItemType Directory

デスクトップにSampleというディレクトリを作成し、その中にファイル名を「makedeirectory.ps1」としてスクリプトを保存してください。

実行前に実行ポリシーを変更してくださいね!実行ポリシーについてはこちらの記事をご参照ください。

Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備
Windowsのポチポチ業務(マウスを使った業務)を爆速化できるPowerShell。スクリプトを実行するために必要な実行ポリシーの変更方法について解説します。

このまま実行すると…

カレントディレクトリである「C:\Users\terad」にディレクトリが作成されています。指定した場所にディレクトリを作成できるようSet-Locationコマンドレットを使いカレントディレクトリを変更しておきましょう

Set-Location <変更したいディレクトリのパス>

今回は先ほど作成したデスクトップ上のSampleというディレクトリを指定しましょう。

ディレクトリの移動方法についてはこちらの記事をご参照ください。

Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
Windowsのポチポチ業務(マウスを使った業務)を爆速化するCUI=PowerShell。CUIを使う上で重要なカレントディレクトリ、親ディレクトリ・サブディレクトリ、ルートディレクトリの考え方をしっかり理解して、自由自在にディレクトリを移動できるようになりましょう!

下記のようにスクリプトの1行目でカレントディレクトリを変更します。

Set-Location C:\Users\terad\Desktop\sample
New-Item 201810 -ItemType Directory
New-Item 201811 -ItemType Directory
New-Item 201812 -ItemType Directory

保存して実行すると…

このように変更したカレントディレクトリ内に、ディレクトリを作成することができました。

エクセルの関数・数式でスクリプトを作成する

ここからはエクセルを使ってコマンドレットを大量生産する方法をお伝えします。

エクセルを起動し、2018/10/1~2018/10/31の日付をA列に入力します。エクセルのオートフィル機能を使えば連続した日付を一気に入力できます。

2018/10/1だけ入力し、セルの右下にマウスカーソルを合わせるとカーソルが「+」の形に変わります。その状態で左クリックを押しながら下にドラッグしてください

このように連続した日付が一気に入力されました。

次に日付の隣、B列に以下の数式を入力してください。TEXT関数で日付形式のデータを文字列に変換します。

=TEXT(A1,”mmdd”)

1行目のB1セルに数式を入力したらセルの右下にマウスカーソルを合わせ、ダブルクリックしてください。日付が入力されている行数分、数式が自動でコピーされます

最後にスクリプトを作成する数式をC列に入力しましょう。

=”New-Item “& B1 &” -ItemType Directory”

さきほどのB列同様、カーソルが「+」の状態でダブルクリックしてください。日付が入力されている行数分、一気に数式がコピーされます。

なお、この時点で日付を文字列に変換しておかないと

「New-Item 43374 -ItemType Directory」

のようにシリアル値という日付を数値で表した形に変換されてしまうため、前処理としてTEXT関数を使っています。

ISEにエクセルで作成したスクリプトを貼り付ける

C列で作成したコマンドレットをISEのスクリプトウィンドウに貼り付けましょう!

さきほど作成したカレントディレクトリを変更するSet-Location(1行目)は残しておき、ディレクトリを「C:\Users\terad\Desktop\sample\201810」に変更しましょう。

スクリプトを実行すると…

このように「201810」内に日付毎のディレクトリが作成できました!

まとめ&次回予告

いかがだったでしょうか。

New-Itemとうコマンドレットを使えば普段よく行うディレクトリ(=フォルダ)作成ができます

またエクセルの数式とオートフィル機能を使えばそのコマンドレットを大量生産することができます

ディレクトリを1つ1つマウスでコピーし名前を変更して…という作業に比べると格段に生産性が上がりますね!

次回以降はコマンドレットを複数並べて書くのではなく、繰り返し処理を使いスッキリとしたスクリプトを書いていきましょう。繰り返し処理に必要なパイプラインとForEach-Objectコマンドレットについて説明していきますよ。

最後までお読みいただきありがとうございました!

連載目次:Windowsのポチポチ業務を爆速化するPowerShell

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
  1. Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
  2. Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
  3. Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
  4. Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
  5. Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
  6. Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
  7. Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備

エクセルファイルの不要な更新を防ぎたい!読み取り専用を推奨する・書き込みパスワードを設定する

$
0
0

アイキャッチ

こんにちは!もり(@excelprog)です!

オフィスワーカーのみなさん!会社の日常業務で、このような困りごとってありませんか?

  • Excelファイルを更新したいのに、誰かがずっと開いたままで更新ができない!
  • 意図しない第三者に更新されてしまい、データ不整合が発生!

その悩み、ちょっとした設定をするだけで解決できますよ!

2つの方法を紹介していきますね。

読み取り専用を推奨する方法

会社の共有フォルダにあるExcelファイルを開いたときに、このようなメッセージをみたことはありませんか?
Excel読み取り専用推奨3

「このファイルを更新する必要がない人は、読み取り専用で開いてね!」というメッセージです。

たとえば、部署メンバーの休暇をExcelで管理している場合、自分のスケジュールを書き込むときはもちろん、他人のスケジュールを確認するときもファイルを開きますよね。

ファイルを更新するつもりがなく、ただ閲覧するために開いていても、「そのファイルを更新したい人」が更新できなくなってしまいます。

しかも、ファイルを開いているのを忘れて長時間離席しちゃう人もいて・・・本当に困っちゃいますよね。

それを防ぐのが、この「読み取り専用を推奨する」方法です。

それでは設定していきましょう。

設定方法

ここでは「休暇管理表.xlsx」という名称のファイルに設定をしていきます。

対象のExcelファイルを「名前を付けて保存」します。ショートカットキーF12がオススメです。

ツール → 全般オプションの順に選択します。

ツール全般オプション1

全般オプションの「読み取り専用を推奨する」にチェックをつけて、「OK」をクリックします。

Excel読み取り専用推奨1

「保存」をクリックします。

Excel読み取り専用推奨1-2

さきほど「名前を付けて保存」をしましたね。同名のファイル休暇管理表.xlsxはすでにフォルダ内に存在するので、当然このメッセージが出てきます。

「上書きしますか?」の選択は「はい」で大丈夫です。

Excel読み取り専用推奨2

たったのこれだけで設定完了です!

エクセルファイルを開く

「読み取り専用を推奨する」の設定がされたExcelファイルを開くと、確認メッセージが表示されます。

読み取り専用で開きますか?と聞かれているので、自分の目的によって下記の選択をします。

  • ファイルを閲覧するだけの人:「はい」を選択
  • ファイルを更新したい人:「いいえ」を選択

Excel読み取り専用推奨3

「はい」をクリックしてファイルを開くと、このように「読み取り専用」で開かれたことが確認できます。

Excel読み取り専用推奨4

閲覧するだけの人が「読み取り専用」で開いてくれれば、更新したい人がいつでもファイルを更新できるので効率がよいですね。

チェックを入れるだけの簡単な作業なので、意図しない更新を防ぐためにも、多くの人がアクセスするExcelファイルには「読み取り専用を推奨」の設定をしておくと安全です。

書き込みパスワードを設定する方法

さて、「読み取り専用を推奨する方法」はあくまでも”推奨”なので、誰でもファイルの編集ができてしまいます。

「みんなにファイルを閲覧されるのはOKだけど、特定メンバーのみ更新できるようにしたい」という場合には、書き込みパスワードを設定しましょう!

設定方法

対象のファイルを「名前を付けて保存」を選択し、ツール → 全般オプションの順に選択します。
ここまでは先ほどの手順と同じです。
ツール全般オプション2

全般オプションで「書き込みパスワード」を設定します。

ここで設定したパスワードを忘れてしまった場合、復元はできないのでご注意ください!

Excel書き込みパスワード1

確認のため、もう一度同じパスワードを入力します。
Excel書き込みパスワード1-2

これで設定完了です!

エクセルファイルを開く

書き込みパスワードが設定されたファイルを開くと、パスワード入力画面が出現します。
ファイル ‘~.xlsxは次のユーザによって保護されています:’の下にファイル作成者の名前が表示されます。Excel書き込みパスワード3

  • ファイルを更新したい人:パスワードを入力して「OK」をクリック
  • それ以外の人:「読み取り専用」をクリック

書き込みパスワードを知らない人は「読み取り専用」を選択して開くことしかできないので、意図しない誰かに勝手に更新されてしまう心配はありませんね!

パスワードを解除したい場合

書き込みパスワードの解除方法も紹介しておきます。

対象のファイルを「名前を付けて保存」で、ツール → 全般オプションを選択します。
「書き込みパスワード」の項目に、現状設定しているパスワードが非表示で入力されています。

Excel書き込みパスワードの解除1
入力されている値をクリアしてOKを押します。
Excel書き込みパスワードの解除2

これでファイルのパスワードが解除ができたので、「保存」をしましょう。

まとめ

エクセルファイルの不要な更新を防ぐ方法を2つ紹介しました。

  • 読み取り専用を推奨する方法
  • 書き込みパスワードを設定する方法

ファイルを更新したいのに誰かが開きっぱなしで困っている…

誰かに勝手に更新されてデータが壊れてしまった…

1つのファイルを複数人で使用する場合には避けては通れない問題ですよね。

エクセルファイルの設定を上手に活用して、オフィスワークのイライラをなくしていきましょう!

お読みいただきありがとうございました。

【GAS】Gmailの特定条件で検索したスレッドの全メールを取得してスプレッドシートに書き出す

$
0
0

Gmailアイキャッチ

みなさん、こんにちは!
もり(@excelprog)です。

こちらの記事で、Gmailから特定条件で検索したメールをスプレッドシートに追加していく方法をお伝えしました。

【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
Gmailの未読メールを取得する方法、メールを既読にする方法などを活用して、Google Apps Scriptで問い合わせメールを都度スプレッドシートに追加していく方法についてお伝えします。

前回紹介したスクリプトは、スレッドの最初の1件のみを取得する仕組みになっています。

スレッドに含まれるすべてのメールを取得できたほうが、問い合わせメールを蓄積して分析をしたりする時にはより効果的ですよね。

さて、今回の記事では、Gmailのスレッドの全メールを取得するスクリプトを紹介していきます!

前回のスクリプトの確認

特定条件に合致したメールを取得してスプレッドシートに書き出す処理がこちらです。

function fetchContactMail() {

  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var strTerms = '検索文字列';
  var myThreads = GmailApp.search(strTerms, 0, 30); //条件にマッチしたスレッドを取得
  var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納

  var valMsgs = [];

  /* 各メールから日時、送信元、件名、内容を取り出す*/
  for(var i = 0;i < myMsgs.length;i++){
  valMsgs[i] = [];
  valMsgs[i][0] = myMsgs[i][0].getDate();
  valMsgs[i][1] = myMsgs[i][0].getReplyTo();
  valMsgs[i][2] = myMsgs[i][0].getSubject();
  valMsgs[i][3] = myMsgs[i][0].getPlainBody().slice(0,200);
  valMsgs[i][4] = myThreads[i].getPermalink();
 } 

  /* スプレッドシートに出力 */
 if(myMsgs.length>0){
    
    var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール'); //シートを取得
    var maxRow=mySheet.getDataRange().getLastRow(); //シートの使用範囲のうち最終行を取得
    mySheet.getRange(maxRow+1, 1, i, 5).setValues(valMsgs); //シートに取得したメッセージのデータを追加

  }
}

二次元配列myMsgsに格納したスレッドから、myMsgs[i][0]で最初の1件目を取得する仕組みになっています。

Gmailのスレッドとは

Gmailヘルプの説明がこちらです。

受信者がメールに返信すると、Gmail では返信がスレッドにまとめられ、最新のメールが一番下に表示されます。

Aさん・Bさんの2人でメールのやりとりをするとき、お互いが「受信したメールに返信」をすると、その一連のやりとりが”スレッド”という一つのかたまりになります。

たとえば、2人がメールを2往復した場合、そのスレッドには合計4件のメールが含まれます。
Gmailのスレッドとは

問い合わせフォーム経由で受信したメールの場合だと、「問い合わせを受信して終わり」ではなく、そこから何往復かやりとりすることが想定されますよね。

スレッドに含まれるすべてのメールを取得して書き出す

二次元配列のスレッドの全メールを取得する

getMessagesForThreadsメソッドで取得したスレッドはこのように二次元配列に格納されています。

Gmailスレッド二次元配列1

そこで、for文を入れ子にして、スレッドが格納されている二次元配列myMsgsの各メールを順番に取得します。
Gmailスレッド二次元配列2

二次元配列の座標を[i][j]と指定するのがポイントです。

function myFunction(){
  
 for(var i=0;i<myMsgs.length;i++){
  for(var j=0;j<myMsgs[i].length;j++){
      
   var date = myMsgs[i][j].getDate();
   var from = myMsgs[i][j].getFrom();
   var subj = myMsgs[i][j].getSubject();
   var body = myMsgs[i][j].getPlainBody().slice(0,200);
   var perm = myThreads[i].getPermalink();

  }
 }
}

これで、二次元配列に格納されたすべてのメールを取得することができます。

pushメソッドで配列に要素を格納する

Arrayオブジェクトのpushメソッドを使用して、取得したメールを配列に格納します。

Arrayオブジェクト.push([データ1,データ2,データ3, …])

配列変数のvalMsgsを宣言しておき、1レコードずつ追加していきます。

valMsgs = [];
valMsgs.push([date,from,subj,body,perm]);

配列をスプレッドシートに書き出す

スレッドのすべてのメールを配列変数valMsgsにデータ格納できたので、これをスプレッドシートに書き出します。

配列を使わずに1行ずつ直接スプレッドシートに書き出すこともできますが、データをいったん配列に格納してから、その配列をまとめてスプレッドシートに書き出す方が、APIの呼び出し回数が少なく処理が高速になります。

Google Apps Scriptで配列を使ってスプレッドシートにデータ行を追加する方法
Google Apps Scriptでは配列操作が非常に重要です。実行速度が6分を超えてエラーとしないテクニックとして、スプレッドシートへのレコード追加を配列へのpushメソッドで処理する方法をお伝えします。

スプレッドシートに書き出すコードがこちらです。

if(myMsgs.length>0){
  var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール');
  mySheet.getRange(2, 1, valMsgs.length, 5).setValues(valMsgs);
}

getRangeメソッドの行数指定でvalMsgsの要素数(length)を使うのがポイントです。

setValuesメソッドを使う場合のgetRangeの引数の指定の仕方はこちらをご参考ください。

Google Apps Scriptのスプレッドシート読み書きを格段に高速化をする方法
Google Apps Scriptでスプレッドシートの操作をしていて実行速度が遅い!と感じたことがあると思います。今回はスプレッドシートを操作する場合に処理速度を格段に速くする方法をお伝えします。

スクリプトまとめ

Gmailの特定条件で検索したスレッドの全メールを取得してスプレッドシートに書き出すスクリプトがこちらです。

function searchContactMail() {

  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var strTerms = '検索文字列';
  var myThreads = GmailApp.search(strTerms,0,30);
  var myMsgs = GmailApp.getMessagesForThreads(myThreads);//二次元配列

  var valMsgs = [];
  
  /* 各メールから日時、送信元、件名、内容を取り出す */
  for(var i=0;i<myMsgs.length;i++){
    for(var j=0;j<myMsgs[i].length;j++){
   
   var date = myMsgs[i][j].getDate();
   var from = myMsgs[i][j].getFrom();
   var subj = myMsgs[i][j].getSubject();
   var body = myMsgs[i][j].getPlainBody().slice(0,200);
   var perm = myThreads[i].getPermalink();

   valMsgs.push([date,from,subj,body,perm]);
  }
 }
 /* スプレッドシートに出力 */
 if(myMsgs.length>0){
    var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール');
    mySheet.getRange(2, 1, valMsgs.length, 5).setValues(valMsgs);
  }
}

実行結果

スレッドに含まれるすべてのメールについて、この5つの情報が取得できました。

  1. 日付
  2. 差出人
  3. 件名
  4. メッセージ(冒頭200文字)
  5. パーマリンク

Gmailスレッド取得結果

まとめ

Google Apps Scriptを使用して、Gmailのスレッドの全メールを取得してスプレッドシートに書き出す方法をお伝えしました。

次回は、Gmailの各メールに一意に割り当てられたメッセージIDを取得・利用して、スクリプトを実行する都度、新しく受信したメールのみを取得するように改良していきますよ。

どうぞお楽しみに!

連載目次:GASでGmailに届いた問い合わせメールを分析する

お仕事の現場では日々様々なメールが届きます。その中で重要なのが「問い合わせメール」ですね。このシリーズでは、Webサイトからの問い合わせメールを自動でスプレッドシートに取り込んだり、チャットワークに送る方法についてお伝えしていきます。

  1. 【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
  2. 【GAS】Gmailからメールを検索してスプレッドシートに書き出す
  3. フリーランスの仕事はどこから来たか、独立して1年間の受注件数を全て晒す
  4. 【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する
  5. 【GAS】Gmailに来た問い合わせをチャットワークに通知してかつタスク追加する
  6. Google Apps ScriptにおけるGmailの読み取り件数の制限とその対処法
  7. 【GAS】Gmailの特定条件で検索したスレッドの全メールを取得してスプレッドシートに書き出す
Viewing all 2078 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>