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

【超入門】10分でできるWindowsでのはじめてのバッチファイル作成

$
0
0

みなさん、こんにちは!
タダケン(@tadaken3)です。

今回もバッチファイルのテクニックをお伝えしていきたいと思います。

【超入門】Windowsを10倍効率良く使うバッチファイル作成術
Windowsを効率良く使うためのバッチファイル作成術をご紹介します。バッチファイルの作成を学べば、今よりももっといろいろなことが自動化・効率化できるようになります。

前回はバッチファイルとは何かバッチファイルを学ぶメリットをお伝えしました。
今回からは基本的なコマンドの使い方をお伝えしていきます。
プログラミング初心者にもわかるように丁寧に解説していきますね。

今回は

  1. メッセージを表示させるためのechoコマンド
  2. 画面を一時停止するpauseコマンド
  3. コメントの書くためのremコマンド

をご紹介します。

バッチファイルの作り方

前回の最後にテキストファイルを開いて、以下のコマンドを保存したかと思います。
保存していない方は、以下のコマンドをコピーして、「hello_world.bat」と保存してください。

@echo off
::echoは、文字を出力するコメンドです
echo Welcome to bat World!!
::pauseコマンドは、画面を一時停止します。
pause

バッチファイルは以下のように保存することがポイントです。

ファイル名.bat

.batという拡張子で保存すると、バッチファイルとして認識されます。

echoコマンドで画面にメッセージを表示をする

では、前回のコマンドの具体的な解説をしていきます。
まずはechoコマンドです。

書き方は

echo 表示したいメッセージ

です。

先程のファイルの

echo Welcome to bat World!!

の部分を

echo NEXT STEP

に変更して、バッチファイルをダブルクリックしてみてください。表示されるメッセージが変更されたかと思います。今回は英語表示にしましたが、もちろん日本語を表示させることもできます。

また、一行目に@echo offと記載がありますが、これはバッチファイルを作成する際に、コマンドの入力画面を表示させないために、echo機能をオフにしているという意味です。

この一文を削除した場合は、以下のようにコマンド入力も含めて、画面が出力されます。

pauseコメンドで画面を一時停止する

pauseコマンドは画面を一時停止したいときに使います。何かのキーを押さない限り、コマンドが一時停止されます。

書き方は

pause

です。

なぜ、pauseをしているかというとバッチファイルの処理が終了すると皆さんが見ている黒い画面、コマンドプロンプトが自動的に閉じられてしまうからです。試しにpauseコメンドを消して、バッチファイルを実行してみてください。目にもとまらぬスピードでコマンドプロンプトが閉じるかと思います。

コメントの書くためのremコマンド

書き方は

remコメント

もしくは

::コメント

です。

remコマンドを使うと、remコマンド後から行末までに書かれた内容は実行されません。その為、コメントとして残しておきたい内容をremコマンドを使って記述します。::は実際はラベルという機能なのですが、コメントとして使うテクニックもあります。ラベルの機能については、今度ご紹介します。

まとめ

今回は、

  1. メッセージを表示させるためのechoコマンド
  2. 画面を一時停止するpauseコマンド
  3. コメントの書くためのremコマンド

についてをお伝えしました。これでバッチファイルの最初の一歩は踏め出せたかと思います。
次回も、バッチファイル作成のテクニックを、お伝えしてきますね。

どうぞ、お楽しみに!

連載目次:【超入門】はじめてのWindowsバッチファイル

バッチファイルを使えばWindowsの「フォルダを作る」「ファイルを別の場所にコピーする」または「アプリを実行する」といった作業の効率化・自動化ができるようになります。全くの初心者でもわかるように、Windowsバッチファイルを作成法をお伝えしていきます。
  1. 【超入門】Windowsを10倍効率良く使うバッチファイル作成術
  2. 【超入門】10分でできるWindowsでのはじめてのバッチファイル作成

【エクセルVBA】Protect/Unprotectメソッドでシートの保護設定と解除をする方法

$
0
0
excel,vba,protect,unprotect,エクセル,シートの保護

皆様こんにちは、ノグチです。

VBAでツールを作ったはいいものの、使う人に勝手にシートを変更されてVBAが動かなくなってしまったことはありませんか?

「シートの保護でセルの変更を制限することはできるけど、VBAだけはセル操作させたい…」

また、「シートの保護を設定したシートのセルの値をVBAで変更したい」ということもありますよね。

そんなときに使えるのが、Worksheetオブジェクトの「Protect」メソッドと「Unprotect」メソッドです。

今回はこの2つのメソッドを使って、VBAでシートの保護設定と、解除する方法をご紹介します!

Protectメソッドとは

Protectメソッドは、指定したシートに対して「シート保護」を設定するメソッドです。

下記の記事で手動でシートの保護を設定する方法をご紹介しましたが、このメソッドを使えば、VBAにシートの保護設定をさせることができるのです。

【Excel】勝手な編集は許しません!初心者向けのシート保護設定
エクセルの「シートの保護」を使ったシートの値編集を制限したり、パスワードを使って特定の人だけに操作できるようにする方法をご紹介しています。関数やマクロを使ったエクセルブックのように、値やシートを操作されると正しく動作しなくなる、というときに便利な機能です。

このメソッドの記述方法はこちら。

Worksheetオブジェクト.Protect

このWorksheetオブジェクトには、シートの保護を設定したいシートを指定します。

Protectメソッドでシートの保護を設定する

では早速このProtectメソッドを使って、シートの保護を設定してみましょう。

下図の表のB列とC列を乗算して、D列に乗算の結果を出力するコードを用意しました。

このVBAで出力した結果があるシートに、Protectメソッドを使ってシートの保護を設定してみましょう。

protectメソッド,例,表

Sub 計算処理()
Dim rowc As Long '処理行数カウンター
rowc = 2

Do While Cells(rowc, 1).Value <> ""
  'B列とC列を乗算して、D列に結果を表示する
  Cells(rowc, 4).Value = Cells(rowc, 2).Value * Cells(rowc, 3).Value

  '次の行へ
  rowc = rowc + 1
Loop

ThisWorkbook.Worksheets("Sheet1").Protect

End Sub
このVBAコードを実行したあと、セルの値を変更しようとすると…

protectメソッド,シートの保護,実行結果

この通り、シートの保護が設定されて、セルの値が変更できないようにすることができました!

Unprotectメソッドとは

お次はシートの保護をVBAで解除する方法のご紹介です。

シートの保護をVBAで解除するには、Unprotectメソッドを使います。

Unprotectメソッドは、シートの保護を解除するためのメソッドです。

記述方法はこちら。
Worksheetオブジェクト.Unprotect

UnprotectメソッドもProtectメソッドと同様に、Worksheetオブジェクトにはシートの保護を解除したいシートを指定してくださいね。

Unprotectメソッドでシートの保護を解除する

では、実際にUnprotectメソッドを使って、シートの保護を解除してみましょう。

Protectメソッド使ってシートの保護を設定したシートを対象に、下のコードでシートの保護を解除してみます。
Sub シートの保護解除()

ThisWorkbook.Worksheets("Sheet1").Unprotect

End Sub

この通り、シートの保護が解除されてセルの値が変更できるようになりました!
unprotect,VBA実行結果

手動でもそうですが、シートの保護は解除しても特にメッセージなどは表示されません。

セルの値が変更できるようになっていればシートの保護は解除されていますし、エクセルメニューにある「シートの保護」が緑色にハイライトされていなければ、シートの保護は解除されています。

ちなみに、手動で設定したシートの保護は、このUnprotectメソッドを使って解除することができます。

また逆に、Protectメソッドで設定したシートの保護は、エクセルのツールメニューにある「シートの保護解除」をクリックして解除することもできますよ。

最後に

いかがでしたでしょうか。

今回は、ProtectメソッドとUnprotectメソッドを使って、シートの保護、シートの解除方法についてご紹介しました。

シートの保護は手動でも設定できますが、手動だとシートの保護の設定を忘れてしまいがちです。

このシートの保護に限らず、手動での操作は私たちが考えている以上にミスをしてしまったり、処理が漏れたりしてしまうもの。

毎回設定が必要と分かっているなら、はじめからVBAで自動化してしまった方が手間が省けることと、何より確実です。

今回は単純なシートの保護と解除の方法をご紹介しました。

もちろんパスワードを使ったシートの保護の設定や、マクロだけはシート上での操作を許可する方法もありますよ。

こちらは次回以降の記事でご紹介していきます。

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

連載目次:エクセル&VBAでブックやシートの保護をするテクニック

エクセルやVBAで「このシートは消されると困る」とか、「シートの名前を変えられるとVBAが動かなくなる」といった悩み、ありますよね。そんな時は「保護」をして操作ができないようにすることができます。本シリーズではエクセルやエクセルVBAでブックやシートの保護をするテクニックについてお伝えします。
  1. 【Excel】勝手な編集は許しません!初心者向けのシート保護設定
  2. 【Excel】勝手なシート操作を防ぐ!初心者向けのブックの保護設定
  3. 【エクセルVBA】Protect/Unprotectメソッドでシートの保護設定と解除をする方法

Google Apps ScriptのWebアプリケーションにCSSでスタイル設定をする

$
0
0
exclamation

photo credit: mag3737 Bang via photopin (license)

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

Google Apps ScriptでWebアプリケーションを作る方法についてお伝えしています。

前回の記事はコチラ!

Google Apps ScriptでWebアプリケーションにスプレッドシートの値を出力する
初心者向けGoogle Apps ScriptによるWebアプリケーションの作り方シリーズです。今回はWebページにGASのスクリプト自体の埋め込む方法についてです。二種のスクリプトレットタグを使います。

GASで作成したWebアプリケーションにスプレッドシートのデータを出力をする方法をお伝えしました。

今回はGASのWebアプリケーションにCSSでスタイル設定をする方法についてお伝えします。

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

GASのWebアプリケーションにスタイルを!

これまでのシリーズで、GASでWebページを作成してきました。

こんなのとか

Google Apps ScriptのWebアプリケーションに関数の結果を出力する

こんなのとか…

スプレッドシートのデータをWebページに出力

…ページがシンプルでさみしすぎる(汗)

さすがに世にあるWebサイトのようにかっちょよくはなくとも、もう少しスタイルをなんとかしたいものです。

サンプルとするGASのWebページ

今回のお題として、こんなGASのWebページを用意しました。

「コード.gs」がこちら。

function doGet() {
  return HtmlService.createTemplateFromFile("index").evaluate(); 
}

doGet関数はWebアプリケーションのURLが叩かれたときに呼び出される関数です。

処理としては、同じプロジェクト内に用意された「index.html」というファイルをレンダリングしたものを呼び出すということをしています。

そしてその呼び出される「index.html」がこちら。



  


  
  

見出し1

こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。
  • 説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。
  • 説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。
  • 説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。

見出し2

小見出し2-1

こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。

小見出し2-2

こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。

あまり意味のある内容ではありませんが、そのままこのWebアプリケーションにアクセスすると以下のようなページが表示されます。

スタイルを設定していないGASによるWebページ

今回はこれにCSSでスタイルをつけてみたいと思います。

HTMLファイル内にCSSによるスタイルを挿入する

ベタな方法ですが、index.html内にstyleタグでCSSをそのまま指定してみましょう。

例えば、このようにしてみます。



  
 


  
  

見出し1

こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。
  • 説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。
  • 説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。
  • 説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。

見出し2

小見出し2-1

こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。

小見出し2-2

こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。

表示をしてみますと

スタイルを設定したGASのWebページ

お!?

ちゃんとスタイルが反映されていますね!

いい感じです。

でも、難点としては「index.html」ファイルが長すぎますね…。通常のWebサイトを作るときのようにCSSを別ファイルに切り出せればいいのですが。

GASのWebアプリケーションでCSSを別ファイルに切り出す

GASのプロジェクトではhtmlファイルは管理できますが、そこからプロジェクト内に作成したcssファイルを呼び出すといったことはできません。

かわりに、こんな「css.htmlファイル」を用意します。

つまりcssファイルとしてではなく、styleタグによるcssの設定をhtmlファイルとして保存して呼び出すというわけですね。

htmlファイルを読み込むための関数を作る

まず、htmlファイル内から別のhtmlファイルを読み込むための関数として以下のincludeを「コード.gs」に追加します。

function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

まず、createHtmlOutputFromFileメソッドですが、指定したファイルからHtmlOutputオブジェクトを作成します。

HtmlService.createHtmlOutputFromFile(ファイル名)

指定するファイル名は拡張子「.html」は不要です。

そして、getContentメソッドで、そのHtmlOutputオブジェクトのコンテンツを文字列で取得します。つまりHTML文を取得するわけです。

HtmlOutputオブジェクト.getContent()

いったんhtmlファイルからHtmlOutputオブジェクトを生成して、そこからそのHTML文を抜き出すという回り道な感じですが、それでOKです。

出力スクリプトレットタグではHTMLは出力できない

さて、いよいよ「index.html」内から別ファイル化したCSSを読み込む方法です。

「index.html」に先ほど作成したincludeの結果を返したいので、以前お伝えした通り、出力スクリプトレットタグ

<?= … ?>

を使えば良いような気がします。

Google Apps ScriptでWebアプリケーションにスプレッドシートの値を出力する
初心者向けGoogle Apps ScriptによるWebアプリケーションの作り方シリーズです。今回はWebページにGASのスクリプト自体の埋め込む方法についてです。二種のスクリプトレットタグを使います。

つまりcssを読み込みたい場所に

= include('css'); ?>

とするわけですが、実際にやってみると…

GASのWebページでHTMLの出力がテキストにエスケープされてしまう

このようにうまくいきません。「css.html」がエスケープされてそのまま出ちゃっていますね。

出力スクリプトレットタグでは、HTMLとかJavaScriptなどはエスケープされて単なるテキストとして出力されるのです。

強制出力スクリプトレットタグでHTMLを出力する

それをエスケープせずに出力したい場合は、強制出力スクリプトレットタグというものを使います。こんなやつです。

<?!= … ?>

強制感ありますね!つまりcssを読み込みたい場所に

!= include('css'); ?>

を挿入します。

これで表示しますと…

外部ファイルによるCSS設定をしたGASによるWebページ

このように無事に反映されました。

最終的にはindex.htmlファイルは以下のようになっているわけです。



  
  != include('css'); ?>


  
  

見出し1

こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。
  • 説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。
  • 説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。
  • 説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。説明です。

見出し2

小見出し2-1

こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。

小見出し2-2

こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。こんにちは。

まとめ

Google Apps ScriptのWebアプリケーションにCSSでスタイルを設定する方法についてお伝えしました。

普通にhtmlファイル内にstyleタグでCSSによるスタイルを設定しても良いのですが、長くなりそうなときやメンテナンスを簡単にしたい場合は、style部分を別htmlファイル化する方法が有効です。

その際に、強制出力スクリプトレットタグを使うことをお忘れなく。

さて、次回もGASでWebアプリケーションを作るテクニックをお伝えしていきます。

どうぞお楽しみに!

連載目次:Google Apps ScriptでWebアプリケーションを作る

Google Apps Scriptではスクリプトを埋め込んだWebアプリケーションを作ることもできます。スプレッドシートや外部のAPIを連携するようなWebアプリケーションを、サーバー準備不要、無料で構築し、公開することができます。本シリーズでは初心者向けに、GASでWebアプリケーションを作る方法を順を追ってお伝えします。
  1. Google Apps ScriptでWebアプリケーションを作る最初の一歩
  2. Google Apps Scriptで作るWebページにスクリプトの結果を出力して表示してみる
  3. Google Apps ScriptでWebアプリケーションにスプレッドシートの値を出力する
  4. Google Apps ScriptのWebアプリケーションにCSSでスタイル設定をする

Google Apps ScriptでGmailからHTMLメールを送信する方法

$
0
0
buzon

photo credit: R~P~M Buzon via photopin (license)

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

Google App ScriptではGmailを操作してメールを送信することができます。

以下記事でお伝えしている通りです。

初心者でも簡単!Google Apps ScriptでGmailを操作してメールを送る方法
Google Apps Scriptでメールマガジンを送るシステムを作りたいと思います。シリーズ初回の今回は、Google Apps ScriptでGmailを操作してメールを送る方法です。

さてさて、そのGmailの内容として、シンプルなテキストメールだけでなく、HTMLメールも送れるのはご存じだったでしょうか?

HTMLメールが実現できるのであれば多彩なビジュアルのメールマガジンを作成することもできますし、アクションのためのリンクボタンを仕込むこともできますね。

ということで、今回はGoogle Apps ScriptでGmailからHTMLメールを送る方法についてお伝えします。

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

sendEmailでHTMLメールを送信する

HTMLメールを送信する場合も、GmailAppサービスのsendEmailメソッドを使います。

書き方を復習しておきますと

GmailApp.sendEmail(送信先アドレス, 件名, 本文, オプション)

となります。

このオプションの部分に連想配列の形式で、様々なオプションを設定できます。

オプション名 機能
attachments 添付ファイル
bcc bccアドレス
cc ccアドレス
from fromアドレス
name 送信者名

などが挙げられますが、htmlメール用のオプションとしてhtmlBodyを設定することができます。

htmlBody: HTML文

ですから、例えばhtmlという変数にHTML文を準備できれば

GmailApp.sendEmail(
    'takahashi@hoge.jp', //宛先
    '備品購入申請のお知らせ', //件名
    'htmlメールが表示できませんでした', //本文
    {
      from: 'system@hoge.jp', //送り元
      htmlBody: html
    }
  );

とすれば良いわけです。

ちなみに、htmlBodyを設定しておくと、HTMLメールが閲覧できる環境ではそれが表示され、そうでない場合はbodyが表示されるようになります。

プロジェクト内のhtmlファイルを

HTML文ですが、ベタ打ちで変数に格納しても良いのですが、せっかくですからプロジェクト内のhtmlファイルを使いましょう。

プロジェクト内のhtmlファイルは、HtmlServiceのcreateHtmlOutputFromFileメソッドとgetContenメソッドで読み込むことができます。

HtmlService.createHtmlOutputFromFile(ファイル名)
HtmlOutputオブジェクト.getContent()

例えば「message.html」というファイル名でメッセージ用のHTML文を用意しているのであれば

var html = HtmlService.createHtmlOutputFromFile("message").getContent();

とすることで、変数htmlに格納することができます。

詳細は以下の記事をご覧下さい。

Google Apps ScriptのWebアプリケーションにCSSでスタイル設定をする
Google Apps ScriptでWebアプリケーションを作る方法についてお伝えしています。今回GASのWebアプリケーションにCSSでスタイル設定をする方法です。CSSを別ファイルにする方法もありますよ。

GASでHTMLメールを送るスクリプト

では、試しにHTMLメールを作成して送信してみましょう。

まず、HTML文はmessege.htmlに以下を用意しました。


  
    
  
  
    

備品購入申請のお知らせ

申請内容

  • 申請者:高橋
  • 内容:消しゴム500個
  • 税込価格:\54,000

承認しますか?

OK
NG

備品購入申請の承認を促すメールを想定しています。今、URLはサンプルとして本ブログにしていますが、次回以降のシリーズでワークフローが実現できるようなURLに変更していきます。

そして、gsファイルには以下のsendHtmlMailを作成します。

function sendHtmlMail() {

  /* message.htmlを取得 */
  var html = HtmlService.createHtmlOutputFromFile("message").getContent();

  /* メールを送信 */
  GmailApp.sendEmail(
    'takahashi@hoge.jp', //宛先
    '備品購入申請のお知らせ', //件名
    'htmlメールが表示できませんでした', //本文
    {
      from: 'system@hoge.jp', //送り元
      htmlBody: html
    }
  );
}

HTMLを実行した結果

sendHtmlMailを実行すると、以下のようなメールが送信先に送られます。

GASで送信したHTMLメール

見出し、リスト、ボタンなどそのスタイルとともにちゃんと表示されていますね。

ボタンは押下するとちゃんと当ブログのトップページに飛びますです。

まとめ

Google Apps ScriptでHTMLメールを送る方法についてお伝えしました。

htmlファイルさえ準備できれば簡単ですね!

さて今後ですが、今回作ったHTMLメールをベースとして、備品購入申請のワークフローを作りあげていきたいと思います。

次回は、GASにURLでアクセスした際に処理をする方法、またURLのパラメータの内容によって処理を分岐する方法をお伝えしていきます。

【GAS】doGet関数でURLのパラメータを受け取りその内容に応じた処理をする
Google Apps Scriptを使って簡単なワークフローを作っていきます。今回は、GASによるWebアプリケーションでURLのパラメータを受け取って、その内容に応じてHTMLを表示します。

どうぞお楽しみに!

連載目次:初心者でも作れるGASによる簡単ワークフロー

スプレッドシート、Gmail、フォーム…Google Apps Scriptで操作できるアプリケーションはまさに「ワークフロー」を作成する上で必要なものが揃っています。ということで、このシリーズでは初心者でも簡単に作れるワークフローの作り方について解説をしていきます。
  1. Google Apps ScriptでGmailからHTMLメールを送信する方法
  2. 【GAS】doGet関数でURLのパラメータを受け取りその内容に応じた処理をする

Google Apps ScriptでTrelloを操作するはじめの一歩

$
0
0

みなさん、こんにちは!
タダケン(@tadaken3)です。

「いつも隣にITのお仕事」の執筆チームでは、タスク管理にTrelloを使っています。最近、日本語対応もされて、ますます便利になりましたね。

Trelloについて、ご存じない方はタカハシさんが本ブログでも紹介しておりますので、一度、ご覧になってみてください。

チームでのタスク状況が一目瞭然!初心者向けTrelloの使い方と解説
チームのタスクの状況が一目瞭然でわかるカンバン方式を採用したクラウド型のタスク管理ツールTrelloについて登録の仕方、使い方、そしてその特徴とメリットにについてお伝えしたいと思います。

さて、本シリーズではGoogle Apps Scriptで、Trelloを操作する方法をご紹介します。Trelloを操作することで、タスク管理も自動化することができます。

最終的には、Trelloのボードから締切が近いカードを取得して、チャットワークに通知するところを目指します。

今回は、事前準備として、TrelloのAPIを利用するための、KeyとTokenの発行方法をご案内します。

TrelloのKeyの取得

Trelloにログインしている状態で、以下のURLにアクセスします。

https://trello.com/app-key

すると以下の画面にKeyが表示されます。

取得したKeyは今後も使いますので、メモ帳などに保存しておいてください。

Trelloのtokenの取得

つづいて、Tokenを取得します。以下のURLの[Trello Key]の部分を、先程取得してKeyに変更してアクセスしてみてください。

https://trello.com/1/authorize?key=[Trello KEY]&expiration=never&response_type=token&scope=read,write,account

すると、以下の認証画面がでてきます。
「許可」ボタンをクリックしてください。

今度は、Tokenが記載された画面が表示されます。赤枠の部分がTrelloのTokenになります。Tokenもメモ帳に保存しましょう。

KeyとTokenは、認証に使用する大事な情報になります。他人に知られないようにしっかり管理しましょう。

Google Apps ScriptでボードのIDを取得する

先程、取得したTrelloのKeyとTokenを使ってして、ボード一覧とIDを取得します。
GASで取得する場合は、TrelloのAPIにHTTPリクエストを送ります。

HTTPリクエストをするには、UrlFetchAppメソッドを使います。

書き方は

UrlFetchApp.fetch(アドレス,パラメータ)

です。

UrlFetchAppメソッドの詳細については、以下の記事もご覧になってみてください。

Google Apps ScriptでチャットワークAPIを活用するための最初の一歩
チャットワークAPIを駆使すると、様々な操作を行うことができるようになります。今回はチャットワークAPIの概要とGoogle Apps Scriptでの簡単な使い方についてお伝えします。

TrelloのAPIはGETメソッドでアクセスする必要があるため、URLのあとに「?」を付けて、Key、Tokenなどのパラメータを設定してアクセスします。パラメータの区切りは「&」になります。また、今回は情報として、ボードの名前だけがあればいいので、fieldsパラメータで「name」を指定します。

実際のコードは以下のとおりです。

function getBoard() {
  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var userName = "kaban-chan";//user nameを入力してください

  var url = 'https://trello.com/1/members/' + userName + '/boards?key=' + trelloKey + '&token=' + trelloToken + '&fields=name';
  res = UrlFetchApp.fetch(url, {'method':'get'});
  Logger.log(res);
}

実行するとLOGにボード名とIDが以下のような形で取得されているかと思います。

例えば、「いつも隣にITのお仕事」の執筆チームで利用しているボードは「エデュとリアルカレンダー」という名前なのですが、以下の部分がエディトリアルカレンダーのIDになります。

{"name":"エディトリアルカレンダー","id":"XXXXXXXXXXXXXXXXXXXXXXXX"}

まとめ

今回は、事前準備として、TrelloのKeyとToken、そして、Board IDを取得する方法をご紹介しました。次回は今回取得した情報を使って、Google Apps Scriptで、リストの一覧、カードの一覧を取得する方法をお伝えします。

Google Apps ScriptでTrelloを操作するはじめの一歩
Google Apps ScriptでTrelloをAPIで操作する方法を解説します。今回は認証に必要なkeyとtokenを取得する方法と、取得したkeyとtokenをつかってボードIDを取得する方法をお伝えします。

どうぞ、お楽しみに!

連載目次:Google Apps ScriptでTrelloを操作する

本シリーズではGoogle Apps Scriptで、Trelloを操作する方法をご紹介します。Trelloを操作することで、タスク管理も自動化することができます。
  1. Google Apps ScriptでTrelloを操作するはじめの一歩
  2. Google Apps ScriptでTrelloのリスト一覧とカード一覧を取得する

【エクセルVBA】イミディエイトウィンドウはコマンド入力画面として使うと超便利

$
0
0
command-input

photo credit: wuestenigel Tastatur via photopin (license)

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

エクセルVBAで快適にプログラミングするためのVBEのテクニックについて、シリーズでお伝えしています。

前回の記事はコチラです。

【エクセルVBA】初心者のうちから知っておくべきDebug.Printの使い方
今回はエクセルVBAでイミディエイトウィンドウを使う方法の超基本として、初心者のうちからぜひとも知っておいて欲しいDebug.Printの使い方です。一行に複数の出力をする方法も解説していますよ。

イミディエイトウィンドウの使い方の基本中の基本、Debug.Printについてお伝えしました。

さて、そのイミディエイトウィンドウなのですが、コマンド入力画面として使えるのも知っていましたか?

意外と知られていないかもなのですが、イミディエイトウィンドウでのコマンド入力は、VBAのプログラミングを快適にする上で強力な武器になります。

ということで、今回はエクセルVBAでイミディエイトウィンドウをコマンド入力画面として使う方法とそのテクニックについてお伝えします。

オススメの便利コマンドも紹介しますよ!

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

電卓みたいに計算式の結果を出力する

では、まずイミディエイトウィンドウをコマンド画面で使う基本中の基本、式の結果を表示する方法です。

式の結果を表示するには、イミディエイトウィンドウに

?

と書きます。クエスチョンマークの後に式、最後にEnterキーを押します。

例えばこんな感じです。

? 1+2+3+4

と入力してEnterすると

イミディエイトウィンドウに足し算の結果を出力

? 5^3

と入力してEnterすると

イミディエイトウィンドウにべき乗の結果を出力

となります。「^」はべき乗ですね。

このように?に続いて式を書けば、イミディエイトウィンドウは電卓のように使えます。

関数を使った結果を出力する

イミディエイトウィンドウでその結果を出力する「式」ですが、VBAの関数を使うこともできます。

例えば、Hex関数は指定した数値を16進数表記に変換する関数ですが

Hex(数値)

イミディエイトウィンドウに

? hex(3000)

と入力してEnterすると

イミディエイトウィンドウで16進数に変換

と3000という整数を16進数に変換することができます。

別の例として、日付に指定した期間を加算する関数としてDateAdd関数というものがあります。

DateAdd(間隔を表す文字列, 値, 日付)

例えば、今日から100日後を知りたいときには、イミディエイトウィンドウで

? dateadd("d",100,date())

と入力してEnterをします。ここでは、今日の日付を求めるDate関数も使っていますね。すると

イミディエイトウィンドウで日付の計算

このように、ズバっ!と求めることができるわけです。

変数の値を出力する

イミディエイトウィンドウに変数の値を出力するという使い方はデバッグの際にたいへんお世話になると思います。

例えば、サンプルとして以下のようなプログラムを用意しました。

Sub printTest()

Dim x As Long, y As Long
x = InputBox("整数を入力してください")
y = InputBox("もう一つ整数を入力してください")

Stop

End Sub

ユーザーからの入力を変数xとyに格納するだけのプログラムですが、Stopステートメントがありますので、以下のように、いったんそこでプログラムが停止しますよね。

StopステートメントでVBAプログラムが停止している

この止まっているときに、イミディエイトウィンドウに

? x

とか

? y

などと入力してEnterをしますと

イミディエイトウィンドウで変数の値を出力

このように、ストップしている時点の変数の値が出力されます。

単体の変数ですが、それも「式」ですからね。出力できるのです。

ちなみに、例ではStopステートメントでプログラムを止めていますが、もちろんブレークポイントを設置して止めているときや、ステップ実行をしているときも同じようにできます。

条件式の結果を表示する

あと、ちょっと面白い使い方として、イミディエイトウィンドウに条件式の値を表示するという使い方もあります。

例えば、前述の例でStopで止まっているときに

? x>y

とか

? x<y

などと入力してEnterをしますと

イミディエイトウィンドウで条件式の値を出力

と出力されます。

If文の評価をしたいときなどにワリと使えるテクニックだと思います。

プロパティの値を表示する

別のオススメの使い方としては、イミディエイトウィンドウに各種プロパティを表示することです。

これはかなり応用が利くテクニックで、使いこなすとそうでないとでは、VBA作業の効率がかなり違ってきます。

現在のExcelファイルのパスを知りたいならば

? ThisWorkbook.Path

特定の列の列番号を知りたいのであれば

? Range("p1").Column

現在選択されているセル範囲のアドレスを知りたいのであれば

? Selection.Address

など、それぞれイミディエイトウィンドウに入力してEnterをすればよいわけです。

イミディエイトウィンドウでプロパティの値を出力

これ、いちいちウィンドウを切り替えたりし調べることを考えると、ものすごい効率いいですよね?

ささっと Ctrl + G でイミディエイトウィンドウに移動してコマンド入力、そしてEnterです。

なお、イミディエイトウィンドウでも自動メンバー表示の機能が効きますので、ぜひ Ctrl + Space もご活用下さい。

【エクセルVBA】初心者にとっても便利なVBEの自動メンバー表示とその使い方
エクセルVBAの業務効率を上げるためのVBEのテクニックについてお伝えしています。今回は、VBEのステキ機能である「自動メンバー表示」とは何か、また自動メンバー表示を使いこなす方法についてです。

まとめ

以上、エクセルVBAでイミディエイトウィンドウをコマンド入力画面として使うテクニックについてお伝えしました。

クエスチョンマークとの組み合わせで、数式、関数、変数、条件式、プロパティなど、あらゆる「式」の結果を表示することができますね。

すぐに調べたいときなどに大変便利ですので、ぜひご活用下さい。

次回ですが、今度はイミディエイトウィンドウからプロシージャを実行する方法についてお伝えします。

どうぞお楽しみに!

連載目次:エクセルVBAの作業効率&快適さを劇的に上げるVBEの使い方

エクセルVBAの作業では、プログラムとかその書き方に目が行きがちですが、その道具であるVBEの使い方ひとつで、コーディングやデバッグの作業効率が劇的に変わりますよ。そんなテクニックやノウハウをお伝えします。
  1. 【エクセルVBA】VBEの背景色や文字色を変更して画面を見やすくしよう
  2. 【エクセルVBA】最初っから知っておきたいVBEのショートカットキーまとめ
  3. 【エクセルVBA】VBEにコメントブロックのショートカットキーを設定する方法
  4. 【エクセルVBA】初心者にとっても便利なVBEの自動メンバー表示とその使い方
  5. 【エクセルVBA】初心者にオススメのVBEの7つのコード設定とその機能について
  6. 【エクセルVBA】初心者のうちから知っておくべきDebug.Printの使い方
  7. 【エクセルVBA】イミディエイトウィンドウはコマンド入力画面として使うと超便利

【GAS】doGet関数でURLのパラメータを受け取りその内容に応じた処理をする

$
0
0
url

photo credit: mkorsakov Hegelists International via photopin (license)

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

Google Apps Scriptを使って簡単なワークフローを作っていきたいと思います。

例えば備品購入依頼のワークフローを考えます。

動作としては

  1. GASから特定のユーザー(たぶん上長)にHTMLメールを送信
  2. 受け取ったユーザーが「OK」または「NG」ボタンのリンクを踏む
  3. GASのWebアプリケーションにアクセスして、踏んだボタンに応じた処理をする

と言った動きになります。

さて、前回お送りした記事ですが、Google Apps Scriptを使ってGmailからHTMLメールを送信する方法についてお伝えしました。

Google Apps ScriptでGmailからHTMLメールを送信する方法
Google App ScriptではGmailを操作してメールを送信することができます。実はその本文としてシンプルなテキストメールだけではんくHTMLメールを送ることができます。今回はその方法をお伝えします。

つまり、上記のフローでいうと1の部分は実現できたわけです。

今回は、2と3の部分を仕込んでいきたいと思います。

どういう方法を使うかというと、URLにパラメータを仕込んでおいて受け取ったパラメータにより処理をするという方法です。

では、Google Apps ScriptのWebアプリケーションでURLのパラメータを受け取って処理をする方法です。

行ってみましょう!

doGet関数でHTMLページを表示する

まずはおさらいですが、GASで作成したWebアプリケーションにアクセスしたときに動作する特殊な関数としてdoGet関数というものがあります。

例えば、プロジェクト内に「hello.html」というHTMLファイルを作成しておき、以下スクリプトを仕込みます。

function doGet() {
  return HtmlService.createTemplateFromFile("hello").evaluate();
}

ここでは、ザックリいうとhello.htmlに記載したHTMLをブラウザに返す処理をしています。

それでスクリプトエディタのメニューから「公開」→「ウェブアプリケーションとして導入」により、URLでアクセスができるようになります。

https://script.google.com/macros/s/{…}/exec

{…}の部分はウェブアプリケーション固有の長々としたIDは入ります。

ブラウザからこのURLにアクセスすると、「hello.html」が表示されるという流れでしたね。

詳しくは以下記事をご覧ください。

Google Apps ScriptでWebアプリケーションを作る最初の一歩
初心者向けにGoogle Apps ScriptによるWebアプリケーションの作り方を解説していきます。まずは、最初の一歩して静的なWebページを表示するWebアプリケーションを作成していきます。

WebアプリケーションのURLに付与したパラメータを受け取る

さて、ここからが本題です。

doGet関数はURLに仕込んだパラメータを受け取ることができます。

URLにパラメータを付与する方法

URLに仕込んだパラメータというのは、例えば

https://script.google.com/macros/s/{…}/exec?name=takahashi?age=41

でいうところの

  • name:takahashi
  • age:41

の部分です。つまり、URLの後に

?パラメータ名=値

を付与することで任意のパラメータ名に対して値を付与してURLにアクセスできるわけです。そしてこのパラメータ名と値のセットは、上記例のように複数付与することも可能です。

備品購入依頼であれば

https://script.google.com/macros/s/{…}/exec?answer=ok

または

https://script.google.com/macros/s/{…}/exec?answer=ng

というパラメータ付のURLへのリンクを、送ったHTMLメールの「OK」「NG」ボタンに仕込めば良いということです。

doGet関数でパラメータを受け取る

doGet関数でパラメータを受け取る場合はこのようにします。

まず引数eを指定して

function doGet(e) {
‘処理
}

とします。

この引数eはイベントオブジェクトとして、URLに付与したパラメータを含む様々な情報が格納されています。

このイベントオブジェクトから、任意のパラメータの値を取得するには

e.parameter.パラメータ名

とします。

URLに付与したパラメータにより表示するHTMLファイルを変える

では一つ例を示しましょう。

ウェブアプリケーションのURLにパラメ―タ名「answer」を付与します。その値としては「ok」または「ng」をとるとします。

それで、パラメータanswerが「ok」だった場合は、以下「ok.html」を


  
    
  
  
    

備品購入申請を承認しました

あなたは備品購入申請を承認しました

「ng」だった場合は、以下「ng.html」を表示したいとします。


  
    
  
  
    

備品購入申請を否認しました

あなたは備品購入申請を承認しませんでした

ウェブアプリケーションへのアクセスにより動作させますから、doGet関数が必要なのですが、どんなスクリプトになりますでしょうか?

例えばこんなスクリプトです。

function doGet(e) {
  return HtmlService.createTemplateFromFile(e.parameter.answer).evaluate();
}

シンプルですね!

パラメータのanswerの値と、HTMLファイル名が一致していますので、パラメータの値をそのままcreateTemplateFromFileの引数として渡しちゃっています。

パラメータによるブラウザ表示の結果

パラメータanswerの値として「ok」を付与してアクセスした場合は

GASのdoGet関数でパラメータokを受け取った場合

パラメータanswerの値として「ng」を付与してアクセスした場合は

GASのdoGet関数でパラメータngを受け取った場合

という表示になります。

なお、パラメータを付与しない場合は以下のように

「undefined」というHTMLファイルは見つかりませんでした。

という表示になります。

GASのdoGet関数でパラメータが存在していない場合

まとめ

非常に簡易的ではありますが、メールで踏んだリンクでWebアプリケーションにアクセスして、パラメータを見て処理を分けるといった処理をGoogle Apps Scriptで実現することができました。

今回お伝えした、doGet(e)関数でイベントオブジェクトからパラメータを取得するテクニックは、様々なワークフローツールの基本になるかと思いますので、ぜひご活用下さい。

次回以降、備品購入申請のワークフローを作り込んでいきたいと思います。

どうぞお楽しみに!

連載目次:初心者でも作れるGASによる簡単ワークフロー

スプレッドシート、Gmail、フォーム…Google Apps Scriptで操作できるアプリケーションはまさに「ワークフロー」を作成する上で必要なものが揃っています。ということで、このシリーズでは初心者でも簡単に作れるワークフローの作り方について解説をしていきます。
  1. Google Apps ScriptでGmailからHTMLメールを送信する方法
  2. 【GAS】doGet関数でURLのパラメータを受け取りその内容に応じた処理をする

エクセルVBAでエラーが発生したらエラーの内容をログファイルに書き出すプログラム

$
0
0

エクセルVBAでエラーを知らせるメッセージボックス

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

エクセルVBAでマクロの動作状況をログファイルに出力する方法についてシリーズでお伝えしています。

前回の記事はこちらでした。

エクセルVBAでテキストファイルを新規作成するFileSystemオブジェクトの使い方
エクセルVBAによるマクロの動作状況をログファイルに残す方法をお伝えしています。今回は、書き出し先のテキストファイルの有無を判定して、もし存在しなければ新規作成するという処理を追加していきます。

ログを書き出すファイルが存在するか否かを判定して、なければファイルを新規作成する方法についてお伝えしました。

今回は、エクセルVBAでエラーが発生したときにそのエラーの内容をログファイルに書き出すプログラムを紹介します。

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

ログの書き出しについてのおさらい

前回作成したプログラムなのですが、少し改良して引数を受け取る形にしてみました。

Sub writeLog(ByVal strMsg As String)

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

Dim strPath As String
strPath = ThisWorkbook.Path & "\error.log"

With objFso
    If Not .FileExists(strPath) Then
        .CreateTextFile (strPath)
    End If
    With .OpenTextFile(strPath, 8) '8:ForAppending
        .WriteLine strMsg
        .Close
    End With
End With

Set objFso = Nothing

End Sub

引数を渡してwriteLogを呼び出すことで、error.logにログが追加されるというわけです。

便利そうでよね。

では、これを応用してエラーメッセージをログに書き出す方法をお伝えしていきます。

エラーが発生したらエラー処理ルーチンに飛ぶ

エクセルVBAではエラーが発生した際に、エラーが発生したとき用の処理にジャンプさせることができます。

On Errorステートメントを使いますね。

この場合、使い方としてはGotoステートメントと組み合わせて

On Error Goto ラベル名
‘色々な処理

ラベル名:
‘エラー時の処理

とします。On Errorステートメントを記述した箇所以降でエラーが発生したら、その時点でラベル名の位置に処理が移動し、エラー時の処理が実行されます。

「色々な処理」の最後にExit Subを入れるの忘れないように。いつでもエラー時の処理が実行されてしまいますから…。

さて、使用例としては以下のようなプログラムですね。

Sub calcUnitPrice()

On Error GoTo Err_line

'***** 計算処理 *****
Dim i As Long 'イテレータ
i = 2
With Sheet1
    Do While .Cells(i, 1).Value <> ""

        'C列D列で除算して、E列に結果を表示する
        .Cells(i, 4).Value = .Cells(i, 2).Value / .Cells(i, 3).Value

        i = i + 1
    Loop
End With

Exit Sub

'***** エラー処理 *****
Err_line:
MsgBox "エラーが発生しました。" 

End Sub

計算処理の間に何らかのエラーが発生すると「Err_line」のラベルの箇所まで処理がジャンプし、「エラーが発生しました」というメッセージボックスが表示され、プログラムが終了します。

エラーの内容をログに出力する

Errオブジェクトからエラー番号と詳細を取得する

エクセルVBAでは、Errオブジェクトというエラーが発生したときにその情報を格納しておいてくれる便利なオブジェクトがあります。

Errオブジェクトに対するNumberプロパティでエラー番号を、Descriptionプロパティでエラーの詳細を取得することができます。

Err.Number
Err.Description

これらはよくエラーメッセージで表示されるやつですね。Errオブジェクトを使えば、我々も取得することができるんです。

エラー処理としてエラーログをファイルに書き出す

例えば上記プログラムで言えば、エラー処理の箇所にこれらのプロパティの値をログファイルに書き出す処理を入れると良さそうですよね。

Sub calcUnitPrice()

On Error GoTo Err_line

'***** 計算処理 *****
Dim i As Long 'イテレータ
i = 2
With Sheet1
    Do While .Cells(i, 1).Value <> ""

        'C列D列で除算して、E列に結果を表示する
        .Cells(i, 4).Value = .Cells(i, 2).Value / .Cells(i, 3).Value

        i = i + 1
    Loop
End With

Exit Sub

'***** エラー処理 *****
Err_line:
Call writeLog( _
    Now & vbTab & _
    "エラー番号:" & Err.Number & vbTab & _
    "エラーの説明:" & Err.Description _
    )
MsgBox _
    "エラーが発生しました。" & vbNewLine & _
    "詳細はerror.logをご覧ください"

End Sub

冒頭で紹介したログファイルへの書き込むプロシージャwriteLogにエラー番号と詳細を渡しています。

プログラム実行時にエラーが発生した場合は、以下のようなメッセージが表示されるとともに

エクセルVBAでエラーを知らせるメッセージボックス

ログ用のファイル「error.log」に以下のようなメッセージが追加されます。

エクセルVBAでエラー番号と詳細をログファイルに書き出した

まとめ

エクセルVBAでエラーログをテキストファイルに書き出す方法についてお伝えしました。

On ErrorステートメントGotoステートメントによるラベルへのジャンプについては、エラー処理の基本になりますので、ぜひマスター頂ければと思います。

また、ErrオブジェクトのNumberプロパティ、Descriptionプロパティでエラー番号と詳細を取得する方法もお伝えしました。

次回は、Vlookupのエラーをログファイルに書き出す方法を紹介したいと思います。

どうぞお楽しみに!

連載目次:エクセルVBAでマクロの動作状況をログファイルに残す方法

マクロの動作状況やエラーの発生などをログファイルに記録しておきたいときありますよね。本シリーズではFileSystemオブジェクトを使ってログをテキストファイルに書き込む方法についてお伝えしていきます。
  1. エクセルVBAでマクロの動作をログファイルに記録する最も簡単なプログラム
  2. エクセルVBAでテキストファイルを新規作成するFileSystemオブジェクトの使い方
  3. エクセルVBAでエラーが発生したらエラーの内容をログファイルに書き出すプログラム

Google Apps ScriptでTrelloのリスト一覧とカード一覧を取得する

$
0
0

みなさん、こんにちは!
タダケン(@tadaken3)です。

前回は、TrelloをGoogle Apps Scriptで操作するために必要なKey、Token、Board IDを取得する方法をお伝えいたしました。今回は、ボードの中にあるリストの一覧、リストの中にあるカードの一覧を取得する方法をお伝えします。

Google Apps ScriptでTrelloを操作するはじめの一歩
Google Apps ScriptでTrelloをAPIで操作する方法を解説します。今回は認証に必要なkeyとtokenを取得する方法と、取得したkeyとtokenをつかってボードIDを取得する方法をお伝えします。

前回のおさらい

前回はUrlFetchAppのfetchメソッドを使って、ボードの名前とIDの一覧を取得しました。リストの一覧やカードの一覧も同様にUrlFetchAppのfetchメソッドで取得してきます。

function getListId() {
  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var userName = "kaban-chan";//ユーザ名を入力してください
  var url = 'https://trello.com/1/members/' + userName + '/boards?key=' + trelloKey + '&token=' + trelloToken + '&fields=name';
  res = UrlFetchApp.fetch(url, {'method':'get'});
  Logger.log(res);
}res);
}

Trelloのリスト一覧の取得

Trelloのリストを取得するには、以下のURLに対してGETメソッドを送ります。前回の記事で取得したKeyやToken、Board IDの情報を使います。

https://trello.com/1/boards/[ボードID]/lists?key=[キー]&token=[トークン]&fields=name

わからない方はこちら記事をご覧になってみてください。

Google Apps ScriptでTrelloを操作するはじめの一歩
Google Apps ScriptでTrelloをAPIで操作する方法を解説します。今回は認証に必要なkeyとtokenを取得する方法と、取得したkeyとtokenをつかってボードIDを取得する方法をお伝えします。

実際のコードは以下のようになります。

function getListId() {
  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var boardId = XXXXXX;//ボードIDを入力してください

  var url = "https://trello.com/1/boards/" + boardId + "/lists?key=" + trelloKey + "&token=" + trelloToken + "&fields=name";

  res = UrlFetchApp.fetch(url, {'method':'get'});
  Logger.log(res);
}

実行するとログにリスト名とIDが以下のような形で取得されているかと思います。

Trelloのカード一覧の取得

次にリストにぶら下がっているカードの一覧を取得してみましょう。やり方は、リストの一覧とほぼ同じで、アクセスするURLを以下のように変更します。

https://trello.com/1/lists/[リストID]/cards?key=[キー]&token=[トークン]&fields=name

実際のコードは以下のとおりです。

function getCardId() {
  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var listId = "XXXX";//リストIDを入力してください
  var url = "https://trello.com/1/lists/" + listId + "/cards?key=" + trelloKey + "&token=" + trelloToken + "&fields=name";

  res = UrlFetchApp.fetch(url, {'method':'get'});
  Logger.log(res);
}

実行するとログにカード名とIDが以下のような形で取得されているかと思います。

まとめ

今回は、ボードの一覧、カード一覧を取得する方法をご紹介しました。
次回は今回取得した情報を使って、スプレッドシートに保存する方法をお伝えしていきますね。

どうぞ、お楽しみに!

連載目次:Google Apps ScriptでTrelloを操作する

本シリーズではGoogle Apps Scriptで、Trelloを操作する方法をご紹介します。Trelloを操作することで、タスク管理も自動化することができます。
  1. Google Apps ScriptでTrelloを操作するはじめの一歩
  2. Google Apps ScriptでTrelloのリスト一覧とカード一覧を取得する

【Chrome拡張】FlowTimeを使ってタイムリミットを意識して仕事をする方法

$
0
0

FlowTImeでタイムリミットを意識して仕事をする方法TOP

みなさん、こんにちは!そして…はじめまして!

とくP(@toku_jpn)と申します。

 

これまではいつも隣にITのお仕事のひとりの閲覧者だった私が記事を投稿する側に…大変嬉しいです!これからよろしくお願いします!

 

さて、あなたは日頃の業務に集中して取り組めていますか?なんとなくダラダラして取り組んでいることはありませんか?

働き方改革を進めるにあたって、生産性を向上させるためにITの活用や業務内容の見直しなどを進められていると思いますが、働く人のダラダラ癖が残り仕事の能率が低いままでは、せっかくの対策もうまく機能しません。

そこで、今回はChrome拡張機能のFlowTimeを活用したタイムリミットを意識した働き方についてご紹介していきたいと思います。

FlowTimeとは

FlowTimeは主に以下の2種類の機能を持つChrome拡張機能です。

FlowTime利用イメージGIF

①タイマー機能

制限時間が来るとアラームでお知らせしてくれるタイマー機能です。

②平均作業時間記録機能

FlowTimeでは上記のタイマーで経過した時間を基に1日の作業時間が過去10日分記録として残ります。その記録から1日あたりの平均作業時間が算出され確認することができます。

 

機能自体はとてもシンプルでChrome上で気軽に活用することができるツールです。また、活用の仕方を工夫することで業務能率の向上や勤務中のムダを省くことができるようになります。

FlowTimeの導入

FlowTime Chrome ウェブストア

①Chrome ストアにアクセスします。(上記リンクよりアクセスできます!)

 

②インストール画面が開きますので、「Chromeに追加」のボタンをクリックして自身のChromeにFlowTimeをインストールしてください。

FlowTimeをChrome ストアでインストール

③Google Chrome右上にこのアイコンが表示されれば無事インストール完了となります。

FlowTImeの使い方

ここからはFlowTimeの使い方をご紹介していきます。

タイマー機能の使い方

まずはタイマー機能の使い方です。順を追って説明していきます。

①まずは、右上のタブをクリックしメイン画面を開きます。

FlowTimeでタイマーを設定するメイン画面

②次にタイマーの時間設定を行います。真ん中の選択肢の中から希望する設定時間を選択します。

 

「START」をクリックしてタイマーを開始します。

 

タイマー起動中は経過時間残り時間、タイムリミットのうち何%の時間が経過したのかがわかる完了率が表示されます。

また、途中でタイマーを中断させたい場合は「PAUSE」を、制限時間前にタイマーを終了させたい場合は「STOP」を押すことでタイマーが止まります。

 

FlowTimeで時間を計測をしている画面

④タイマーを停止させる、もしくは制限時間が満了になると下記のような画面が表示され終了となります。(下記はタイマーを途中停止させた画像)

制限時間満了で終了した場合は音楽のようなアラーム音が流れてタイマー終了を知らせてくれます。

 

FlowTImeのタイマー満了時の画面

 

「FINISH」をクリックし元の画面に戻ります。

 

平均作業時間を確認する

次に平均作業時間を確認する方法です。

右上のグラフマークをクリックすることで平均作業時間を確認できる画面に移動します。

 

FlowTimeで平均作業時間を確認する画面

 

こちらではタイマーを使い続けることで経過時間がどんどん記録されていくため、利用者側で別途操作をする必要はありません。

この画面から自分が過去10日間仕事にどれだけ打ち込めたか毎日平均で何時間仕事に取り組めているのかがわかります。

FlowTimeの設定をする

歯車のマークをクリックすると設定画面に移動できます。

こちらでは

・タイマーの時間の設定

・アラーム音の設定

ができます。時間の設定は1分単位で細く設定が可能となっています。

FlowTImeの設定画面

筆者のオススメは20分、30分、60分です。後述するFlowTimeの活用法において一番使いやすい時間設定なのではないかと思います。

アラームは全4種類で落ち着く感じのメロディや電子音タイプのアラームがあります。

FlowTimeの活用例

さて、ここでFlowTimeのオススメ活用法をご紹介します。機能はかなりシンプルなのでどれも使い方はほぼいっしょにはなるのですが、仕事に取り組む上での意識がそれぞれ違います。

1.タイムリミットを設定し、時間内にタスクをこなす

一番基本的な使い方です。大切なのはタスク単位で短くタイムリミットを区切ること。

「2時間の間にこれを仕上げる」

よりも

「20分でこの部分を仕上げる」

と短いタスクを繰り返したほうがメリハリが効き業務の能率を上げやすいです。書類作成業務会議で活用するといいと思います。

2.タイムリミットを設定し、こなせるタスク量を意識して取り組む

こちらは逆に時間内にいくつタスクをこなせるかを意識して取り組むことで生産性の向上を目指す手法です。

この方法においてもタイムリミットはなるべく短く区切るようにしてください。理由は前述したため割愛します。

 

使い方だけなら先程ご紹介した方法とは何ら変わりはないのですが、前述の方法は仕事を短時間でこなす方法に対して、こちらは業務スピードを上げるための訓練になります。

慣れてきたら、設定するタイムリミットを少しずつ伸ばしていき集中して仕事に取り組める時間を伸ばす訓練をしてみましょう。

3.1日あたりの平均作業時間を分析する

デスクワークがメインの方はぜひ平均作業時間を意識して働いていただきたいと思います。

 

例えば、1日8時間労働の職場で10日間働いた結果、FlowTimeで平均作業時間を算出した結果が5.5時間だったとします。

これを8時間に近づけていくために自身の働き方を見直していきます。小休憩が多くなかったか…社員同士の伝達時に無駄話が多くなかったか…など。

見直しをしていくうちに勤務時間中のムダを省くことができ、実労働時間を伸ばすことができます。

さいごに

 

FlowTImeを活用してタイムリミットを意識して仕事をする方法をご紹介しました。

カレンダー、To Doアプリでの締め切り管理とは違い、『今これを仕上げなければいけない!』という気持ちや環境を作れるのがタイマーアプリの良さだと感じています。

職場環境は良くなったのになかなか生産性が上がらないな…と悩んでいるところでぜひ活用していただき、働き方改革をさらに前進させていただければと思います!

それでは!

 

【エクセルVBA】保護しているシートでマクロの操作だけ有効にする方法

$
0
0

protect,unprotectオプション

皆様こんにちは、ノグチです。

前回は、 WorksheetオブジェクトのProtectメソッドとUnprotectメソッドを使ったシートの保護と保護の解除をご紹介しました。

【エクセルVBA】Protect/Unprotectメソッドでシートの保護設定と解除をする方法
ProtectメソッドとUnprotectメソッドを使って、VBAでシートの保護を設定したり、解除したりする方法をご紹介しています。VBAで作成したレポートを変更させたくない!という時にこのメソッドを加えておけば、シートの保護までVBAがやってくれますよ。シートの保護を忘れずに設定したい!という時におすすめです。

今回は、ProtectメソッドのオプションUserInterfaceOnlyを使って、手動のシートへの変更は不可にしつつ、VBAでのシート変更は可能にする方法をご紹介します!

保護されているシートはマクロからも操作できない

まず、シートの保護を設定すると、ユーザの手動によるシート操作のほか、マクロからのシート内の処理も制限されてしまいます。

シートの保護を設定したシート上でマクロを実行すると、以下のような実行時エラーになり、シート上での操作ができないようになっています。

vba,UserInterfaceOnly,マクロ,マクロ操作無効

「シートの保護でユーザの操作を制限するのはいいけど、マクロからは操作できるようにしたい…」

そんな時に有効なのが、ProtectメソッドのUserinterfaceOnlyオプションです。これはシートの保護をユーザの手動シート操作に対してのみ有効にするかどうか、という設定を行うものです。

言い換えると、対象のシート上でVBAだけがシート内の操作ができようにするかどうか?という設定をします。

このオプションを使って、ユーザによる手動のシート操作は制限しつつ、マクロでのシート操作は許可する方法をご紹介していきます。

UserInterfaceOnlyオプション

まず、UserInterfaceOnlyオプションの記述方法はこちら。

Worksheetオブジェクト.Protect UserInterfaceOnly:=True

このオプションで指定するのはTrueかFalseのどちらかです。

  • True :ユーザによるシート内操作に対してシートの保護を有効にする(VBAのみシート内操作が可能)
  • False :ユーザによるシート内の操作とVBAでのシート内の操作両方に対してシートの保護を有効にする

このオプションを指定しなければ、Falseを指定したとき同様、 ユーザの手動入力、VBAでの処理両方に対してシートの保護が有効になります。

マクロだけシート内の操作ができるシートの保護を設定する

UserInterfaceOnlyオプションの使用例

では、実際にUserInterfaceOnlyオプションを使って、マクロだけが操作できるシートの保護を設定してみましょう。

前回の記事で例としてお見せした、B列とC列の値をかけて、D列に表示するというコードの最後にUserInterfaceOnlyオプションを追加しました。

掛け算の処理が終わったら、ユーザの操作を制限するシートの保護を設定する、というコードにしています。

Sub 計算処理()

Dim rowc As Long '処理行数カウンター

'******************************
'計算処理
'******************************
rowc = 2

Do While Cells(rowc, 1).Value <> ""

'B列とC列を乗算して、D列に結果を表示する
Cells(rowc, 4).Value = Cells(rowc, 2).Value * Cells(rowc, 3).Value

'次の行へ
rowc = rowc + 1
Loop

ThisWorkbook.Worksheets("Sheet1").Protect UserInterfaceOnly:=True
End Sub

このコードの実行結果がこちら。

UserInterfaceOnly,実行結果,vba

見た目は特に変わったところはありませんが、セルの値を変更しようとすると…

UserInterfaceOnly,実行結果

この通り、シートの保護が設定されていて、手動でのシート変更ができないようになっていますね。

マクロでセルの値を変更してみる

ではこの状態で、VBAで先ほどの実行結果にある表のA2セルの値を、「あいうえお」から「みかん」に変更してみましょう。

コードはこちら。

Sub セルの値変更()

ThisWorkbook.Worksheets("Sheet1").Cells(2, 1).Value = "みかん"

End Sub

このコードを実行してみると…

UserInterfaceOnly,vba実行結果,表の値変更

この通り、実行時エラーになることもなく表のA2セルが「みかん」に変更できました。

では、シートの保護はちゃんと設定されたままになっているか確認してみます。

手動でシート上のセルを選択しようとすると…

UserInterfaceOnly,vba,実行結果,表の値変更,メッセージ

この通りメッセージが表示されて、手動の操作に対してシートの保護がかかっていることがわかりますね。

このように、ProtectメソッドのUserInterfaceOnlyのオプションを使えば、VBAのシート内の操作を許可しつつ、ユーザの手動操作に対してのみシートの保護を有効にすることができるのです。

最後に

今回は、ProtectメソッドのUserInterfaceOnlyオプションをご紹介しました。

このメソッドとオプションを使えば、ユーザの手動によるシートへの操作は制限しつつ、VBAからはシートへの操作を可能にすることができるようになりますよ!

手動操作もVBAでの操作も両方制限するのか、VBAのみなのかは、そのエクセルツールの種類や使う人によって変わるかと思いますので、場合によって使い分けてくださいね。

次回は、ProtectメソッドのPasswordオプションと、UnprotectメソッドのPasswordオプションを使った、パスワード付のシートの保護設定と解除の方法をご紹介していきます。

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

連載目次:エクセル&VBAでブックやシートの保護をするテクニック

エクセルやVBAで「このシートは消されると困る」とか、「シートの名前を変えられるとVBAが動かなくなる」といった悩み、ありますよね。そんな時は「保護」をして操作ができないようにすることができます。本シリーズではエクセルやエクセルVBAでブックやシートの保護をするテクニックについてお伝えします。
  1. 【Excel】勝手な編集は許しません!初心者向けのシート保護設定
  2. 【Excel】勝手なシート操作を防ぐ!初心者向けのブックの保護設定
  3. 【エクセルVBA】Protect/Unprotectメソッドでシートの保護設定と解除をする方法
  4. 【エクセルVBA】保護しているシートでマクロの操作だけ有効にする方法

祝・増刷決定!拙著「ExcelVBAを実務で使い倒す技術」が異例のスピードで達成しました!

$
0
0

ブックファースト新宿店にて「ExcelVBAを実務で使い倒す技術」を発見

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

先日4/20に発売されました拙著ExcelVBAを実務で使い倒す技術

ExcelVBA本なんて、それはもう山ほど出版されています。乱発されすぎてさすがに売れないのでは…?

そんな声もチラホラ聞こえてきたものですが…

なんと!

発売からたったの一カ月で!

増刷決定!!

デビュー作なので、自分にはよくわからなかったのですが、編集さん曰く「Office関連本では異例のスピード」だそうです。

皆さまのおかげです。ありがとうございます!

今回は、増刷決定のお知らせなので以上でも良いのですが、Amazonのランキングなどをずっとウォッチしていましたので、どのような推移だったのか、その要因などについてまとめておきたいと思います。

Amazon在庫切れ…ですが緊急増刷中です!

その前に、まず謝らなければいけないことがあります。

なんと、現在執筆時点では、Amazonでの通常購入できない状況のようです…

通常は「カートに入れる」ってボタンあるのですが、現時点では「すべての出品を見る」つまり、ショップの出品では買えるようなのですが、2,664円~ということで若干割高です。

ExcelVBAを実務で使い倒す技術のAmazon販売ページ

ですが、安心してください。

増刷がかかっています。それも緊急増刷です。

どうしてもすぐにご購入されたい場合は、楽天ブックスでは購入可能です。

また、書店では在庫ありますので、以下リンクからお近くの書店をチェックしてご購入下さいませ。

売れた要因を分析してみる

私、細かい性格なものですから、Amazonのランキングを毎日ちょこちょこチェックしているんですね。

Amazonのランキングは1時間ごとの更新ということで、なるべく朝9時台(日によってその限りではないのですが)に毎日1回の観測をしていました。

以下が、「本」の売れ筋ランキングの推移です。

「ExcelVBAを実務で使い倒す技術」Amazonランキング推移

各マークの意味は以下の通りです。

  • 青●:自前のブログ記事で告知
  • 赤●:ブロガーさんの書評公開
  • 橙★:Amazonのレビュー(数字は星の数)

予約開始直後は低迷も「ももね砲」で急上昇

Amazon予約開始時点では2,000番ちょっとくらいでスタートしたのですが、その後はぎゅーんと落ちて、4/13あたりは30000位台まで落ちました。

この間、自分のブログでは何記事かで告知をしたのですが、一定の効果はありつつも、そのままではしんどかったのかも知れません。

ですが、4/17に発動した「ももね砲」(タカハシ命名)で急激に回復。以下記事が大反響とのことで、プレゼント企画も60件以上の応募があったとのこと。

「ExcelVBAで何となくフォームが作れたけれど、これでいいのかしら?」 請求書を作成するために、ExcelVBAで自動化処理をして何となく作ってみたけれど、どうやって作ったのかさっぱり覚えていない・・。 何となくコー...

おかげで2,000番台まで一気に駆け上がりました。

感謝しかありません。

発売後はブロガーさん声が支えてくれた

4/20以降の発売後には、ブロガーさんたちが書評記事をたくさん書いて下さいました。

以下特設ページにて全て紹介していますので、ぜひご覧くださいませ。

書籍「ExcelVBAを実務で使い倒す技術」発売についてのお知らせ
「ExcelVBAを実務で使い倒す技術」という本を書きました!本ページは書籍「ExcelVBAを実務で使い倒す技術」の情報を発信していく特集ページ。お知らせ、関連記事、書評のご紹介などを随時更新していきます。

おかげで、以降2,000番台をキープすることができています。

やっぱり自分での発信も大事ですが、他の方に発信をして頂けるというのは大事だなと…つくづく思いました。

ところで、本書。

実は、ブロガーさんに書いて頂けるように、とある工夫がされているのです。

カバーが黒。これはこれで書店で目立つようになっている(他のExcel本は白地に緑が定番ですから)のですが、「マット」になっていますから、光が反射しない…つまり写真が撮りやすいんです。

気付いてました…?

編集さんのアイデアに脱帽です。

Amazonレビューのパワーを思い知る

そして、5/1以降はAmazonレビューがつくようになって、最近では安定して2000位以内、最高で592位に入りました。

書評記事よりはリアルな批判をもらう可能性もあるので、著者としてはドキドキして確認すました。

ですが、蓋を開けてみると飛び上がりたいくらい嬉しいコメントばかりでした。

この値段なのにカラーで見やすいですし、VBEを使い現場で業務をされる皆様におすすめです。著者の次の書籍にも期待しちゃいます。関係ないですが、大学の後輩なのも親近感(笑

面識はないですが、大学の後輩さん…最初に頂いたコメントだったので、すごく嬉しかったのを覚えています。

電通大で良かった…!

自分はExcel VBAのSE・プログラマーで、こういう本を読み漁ってたりしますが、今までで一番、『開発方法』に特化してる良書!!
自分が苦労して習得した事のほとんどがこの本にあってビックリし、感動しました。(あの時にこの本があれば、どれだけ苦労を減らせたか・・・)
Excel VBA ってこういう本がほんと無い…(あったとしても、自分は今のとこ出会ってないです…)

そうなんです!

私自身さんざん困ったことがたくさんありましたので、「こんな本があったらな~」というのをまとめましたので、読者の皆さまにもそう感じて頂けてとても嬉しいです。

ひとつだけ残念なのはVBEの画面写真が筆者オススメという黒画面に白文字のため、紙面では文字がつぶれかけて読みづらい点。特にコメントは判読に苦労した。それ以外は情熱を感じる語り口も見事で初心者から脱皮を目指す方々に自信を持ってお勧めできる良書だ。

なるほど…確かに、キャプチャ画像のコメント、誌面だと若干読みづらいかもですね。

勉強になりますね。

本屋で内容を確かめて買いました。
本屋で買うかどうかを決めることをおススメします。
なぜかというと、エクセル本にしては書いてあることが特殊だから。

おっしゃる通り、本書は数あるExcelVBA本がある中で誰も書いてこなかった「今までにないチャレンジ」を形にしたものでした。

内心、受け入れられるかどうかドキドキしていましたが、確かなニーズがありました!良かった…!

3日たらずで数年分の知識と知恵が身につくよう内容を整理整頓して書かれている。
著者のただならぬ思いがふしぶしから感じとれる。文句無しに星5の内容だ。

ただならぬ思い…そういうのも本で伝わるものなのでしょうか。

そのあたりは、また機会があれば記事にして書きたいと思います。

さいごに

増刷決定の著者の気持ち、味わうことができました。

この連絡をいただいたとき、私は電車の中にいたのですが、執筆していた時期はもちろん、仕事でやられていた時代のことも思い出して、思わず涙が出そうになっちゃいました。

本を書けるとなったときも嬉しかったですが、やっぱりそれ以上に書いたものが世の中に受け入れられるというのは、より一層嬉しいものですね。

ですが、まだまだスタートしたばかり。浮かれすぎずに、これからも頑張ります。

謙虚に、コツコツと。

書籍「ExcelVBAを実務で使い倒す技術」関連記事

書籍「ExcelVBAを実務で使い倒す技術」に関連して、本書自体や、本を書くということ、イベントレポートなどを連載していきます。
  1. 書籍「ExcelVBAを実務で使い倒す技術」発売についてのお知らせ
  2. なぜ、ExcelVBAの「実務」に特化した本が必要なのか
  3. ExcelVBAについて…ブログでは伝えられないことが書籍なら伝えられる
  4. ブログ開設からたった2年で私が出版のチャンスを得た理由
  5. ExcelVBA本を一冊書くには、どれだけの文字数と、どれだけの時間が必要だったか
  6. 祝・増刷決定!拙著「ExcelVBAを実務で使い倒す技術」が異例のスピードで達成しました!
その他、本書に関する裏話や出来事などについてレポートをしていきますね。 どうぞお楽しみに!

Google Apps ScriptでTrelloのカード一覧をスプレッドシートに保存する方法

$
0
0


みなさん、こんにちは!
タダケン(@tadaken3)です。

Google Apps ScriptでTrelloを操作するテクニックを紹介するシリーズです。前回はUrlFetchAppのfetchメソッドを使って、Trelloのリストの一覧やカードの一覧する方法をお伝えしました。

Google Apps ScriptでTrelloのリスト一覧とカード一覧を取得する
Google Apps ScriptでTrelloをAPIで操作する方法を解説します。今回はリストの一覧、カードの一覧を取得する方法をお伝えします。

今回は、取得したカード一覧をスプレッドシートに保存する方法をお伝えします。

前回のおさらい

前回はUrlFetchAppのfetchメソッドを使って、リストの一覧やカードの一覧を取得しました。前回のコードは以下のとおりです。

function getCardId() {
  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var listId      = "XXXXX";//リストIDを入力してください
  var url = "https://trello.com/1/lists/" + listId + "/cards?key=" + trelloKey + "&token=" + trelloToken + "&fields=name";
  res = UrlFetchApp.fetch(url, {'method':'get'});
  Logger.log(res);
}

fileldsというパラメータで値を指定して必要な情報のみ(カード名)に絞っていました。今回は登録日や担当者といったカード名以外の情報も利用したいので、URLのパラメータ指定しているfieldsの部分を削除します。

function getCardId() {
  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var listId      = "XXXXX";//リストIDを入力してください

  //URLの末尾の部分を変更します。
  var url = "https://trello.com/1/lists/" + listId + "/cards?key=" + trelloKey + "&token=" + trelloToken;

  res = UrlFetchApp.fetch(url, {'method':'get'});
  Logger.log(res);
}

取得したカードを整形する

それでは、取得した情報から必要な取り出していきましょう。Trelloから取得した情報はjson形式で保存されています。
そこで、まずはjson形式でデータを取り扱えるようパース(成形)していきます。

受け取ったJSONデータを取り扱う場合は

JSON.parse(レスポンス.getContentText())

とします。

getContentTextメソッドでテキストデータ部分だけを取り出し、JSON.parseメソッドでJSONデータを配列に格納します。

実際のコードは以下のようになります。

function getCardId() {

  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var listId    = "XXXXXX";//リストIDを入力してください

  var url = "https://trello.com/1/lists/" + listId + "/cards?key=" + trelloKey + "&token=" + trelloToken;
  var res = UrlFetchApp.fetch(url, {'method':'get'});
  var json = JSON.parse(res.getContentText()); //jsonとして保存します
}

取得したカードを取り出す

jsonから情報を取り出すやり方はいくつかあるのですが、今回は一覧のリストを作りたいため、必要な情報をまとめてとりだして、まとめてスプレッドシートに書き込むという方法でいきたいと思います。具体的な手順としてはcardsという大きな箱を作ってその中に必要なカードの情報を1枚分ずつforループで格納していきます。

配列の最後に要素を追加する場合は、Arrayオブジェクトに対するpushメソッドを使います。

書き方は

Arrayオブジェクト.push(要素)

となります。

function getCardId() {

  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var listId    = "XXXXXX";//リストIDを入力してください

  var url = "https://trello.com/1/lists/" + listId + "/cards?key=" + trelloKey + "&token=" + trelloToken;
  var res = UrlFetchApp.fetch(url, {'method':'get'});
  var json = JSON.parse(res.getContentText());

  var cards =[]; //箱を作る
  var maxRows = json.length; //格納されているデータの行数を取得
  for(var i = 0; i < maxRows; i++){

     //必要なデータのKeyを指定して値を取得する
     var name = json[i].name;
     var due = json[i].due;
     var idMembers = json[i].idMembers;
     var dateLastActivity = json[i].dateLastActivity;
     var shortUrl = json[i].shortUrl;

     //取得したここのデータをまとめて、ひとつのカード情報としてまとめる
     var card = [name, due, idMembers, dateLastActivity, shortUrl];

     //先程取得したcardsという箱に追加する
     cards.push(card);
  }
  Logger.log(cards);
}

するとこのようにデータが保存されます。

取得したデータをスプレッドシートに書き込む

最後に取得したデータをスプレッドシートに書きみます。
getRangeメソッドとsetValuesメソッドを使って、指定した範囲にデータ書き込みます。

詳しくは以下の記事もご覧になってください。

Google Apps Scriptのスプレッドシート読み書きを格段に高速化をする方法
Google Apps Scriptでスプレッドシートの操作をしていて実行速度が遅い!と感じたことがあると思います。今回はスプレッドシートを操作する場合に処理速度を格段に速くする方法をお伝えします。

function getCardId() {

  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var listId    = "XXXXXX";//リストIDを入力してください

  var url = "https://trello.com/1/lists/" + listId + "/cards?key=" + trelloKey + "&token=" + trelloToken;
  var res = UrlFetchApp.fetch(url, {'method':'get'});
  var json = JSON.parse(response.getContentText());

  var cards =[]; //箱を作る
  var maxRows = json.length; //格納されているデータの行数を取得
  for(var i = 0; i < maxRows; i++){

     //必要なデータのKeyを指定して値を取得する
     var name = json[i].name;
     var due = json[i].due;
     var idMembers = json[i].idMembers;
     var dateLastActivity = json[i].dateLastActivity;
     var shortUrl = json[i].shortUrl;

     //取得したここのデータをまとめて、ひとつのカード情報としてまとめる
     var card = [name, due, idMembers, dateLastActivity, shortUrl];

     //先程取得したcardsという箱に追加する
     cards.push(card);
  }

  Logger.log(cards);

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('list');//リストというシートに保存
  var lastRow = cards.length;
  var column = cards[0].length;
  sheet.getRange(2,1,lastRow,column).setValues(cards);
}

実行するとlistシートに、カードの一覧が出力されています。

まとめ

今回は、カード一覧から必要な情報を取り出す方法スプレッドシートに保存する方法をお伝えしました。次回もGoogle Apps ScriptでTrelloを取り扱うためのテクニックをお伝えしていきますね。

どうぞ、お楽しみに!

連載目次:Google Apps ScriptでTrelloを操作する

本シリーズではGoogle Apps Scriptで、Trelloを操作する方法をご紹介します。Trelloを操作することで、タスク管理も自動化することができます。
  1. Google Apps ScriptでTrelloを操作するはじめの一歩
  2. Google Apps ScriptでTrelloのリスト一覧とカード一覧を取得する
  3. Google Apps ScriptでTrelloのカード一覧をスプレッドシートに保存する方法

【エクセルVBA】VBAでパスワード付のシートの保護を設定・解除する方法

$
0
0
Protect,password,シートの保護解除,パスワード
皆様こんにちは、ノグチです。

前回は、ProtectメソッドのUseinterfaceOnlyオプションを使った、ユーザの操作は制限しつつ、VBAでのシート操作は許可するシートの保護設定の方法をご紹介しました。

【エクセルVBA】保護しているシートでマクロの操作だけ有効にする方法
ProtectメソッドのUserInterfaceOnlyオプションを使った、エクセルのシートの保護を設定する方法をご紹介しています。これを使えば、ユーザのシート内容の操作は制限しつつ、VBAはシート内の操作が可能なシートの保護が設定できますよ。

今回は、同じくProtectメソッドのPasswordオプションを使ったパスワード付のシートの保護設定と、UnpotectメソッドのPasswordオプションを使ったシートの保護解除の方法をご紹介していきます。

パスワード付シートの保護を設定する

パスワードなしのシートの保護は簡単に解除されてしまう

まずシートの保護を設定ですが、 手動で設定したか、前回ご紹介したVBAのProtectメソッドのUserInterfaceOnlyオプションで設定したかによらず、 そのままだとエクセルツールメニューの「シートの保護解除」で簡単に解除されてしまいます。

そんな事態を防ぐために使えるのが、同じくProtectメソッドのPasswordオプション。

Passwordオプションは、シートの保護に対してパスワードを設定することができるオプションです。

このオプションを使ってパスワード付のシートの保護を設定しておけば、エクセルツールメニューから「シートの保護解除」をクリックされたとしても、パスワードを知られていない限りシートの保護が解除されることはありません。

Password オプションの記述方法

Password オプションの記述方法はこちら。 
Worksheetオブジェクト.Protect  Password:=”指定したいパスワード”
ここで指定するパスワードは、手動のシートの保護設定のパスワードと指定と同様に、半角英数字を使うことができます。

使用例

passwordオプションの使用例はこんな感じです。

前回ご紹介したUserInterfaceOnlyオプションと組み合わせて、B列とC列の計算処理を行い、パスワード付のシートの保護を設定する内容にしています。

Sub 計算処理()

Dim rowc As Long '処理行数カウンター

'******************************
'計算処理
'******************************
rowc = 2

Do While Cells(rowc, 1).Value <> ""

  'B列とC列を乗算して、D列に結果を表示する
  Cells(rowc, 4).Value = Cells(rowc, 2).Value * Cells(rowc, 3).Value

  '次の行へ
  rowc = rowc + 1
Loop

ThisWorkbook.Worksheets("Sheet1").Protect Password:="Password001"

End Sub
VBAを実行してシートをクリックしてみると…
vba,エクセル,protect,password,実行結果

この通り、ちゃんとシートの保護が設定されていますね。

では、エクセルツールメニューから「シートの保護解除」をクリックしてみると…
vba,エクセル,protect,password,実行結果,パスワード入力
この通り、パスワード入力のウインドウが表示されて、パスワード付のシートの保護が設定されていることがわかります

シートの保護を解除する

Passwordオプションでパスワード付のシートの保護を解除する 

パスワード付のシートの保護設定をご紹介したところで、UnprotectメソッドのPasswordオプションを使った解除の方法のご紹介です。

Passwordオプションはパスワード付のシートの保護を解除するためのオプションで、このオプションを指定すると、パスワード付きのシートの保護が解除できます。

パスワード付のシートの保護を解除する際にこのオプションを指定しなかった場合は、手動でシートの解除を行うときと同様、パスワード入力のポップアップが表示されるようになります。

Passwordオプションの記述方法

Passwordオプションの記述方法はこちら。
Worksheetオブジェクト.Unprotect Password:=”シートの保護で指定したパスワード”

使用例

 UnprotectメソッドのPasswordオプションの使用例として、上のProtectメソッドの項で使った例で設定したシートの保護設定を解除するコードを用意しました。

ProtectメソッドのPasswordオプションで指定したパスワードを指定しています。

Sub UnprotectSheet()

ThisWorkbook.Worksheets("Sheet1").Unprotect Password:="Password001"

End Sub

これで、パスワード付のシートの保護が解除されます。

ちなみに、Unprotectメソッドでシートの保護を解除しても、特にメッセージなどは表示されないので、場合によってはUnprotectメソッドの後にMsgBox関数などを使って、シートの保護が解除された旨のメッセージを表示させるのもいいかもしれません。

最後に

今回は、ProtectメソッドとUnprotectメソッドのPasswordオプションをご紹介しました。

前回ご紹介したUserInterfaceOnlyオプションと組み合わせて使用すれば、エクセルを勝手にユーザに操作される心配も少なくなりますね

次回は、ブックの保護をVBAで行う方法をご紹介したいと思います。

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

連載目次:エクセル&VBAでブックやシートの保護をするテクニック

エクセルやVBAで「このシートは消されると困る」とか、「シートの名前を変えられるとVBAが動かなくなる」といった悩み、ありますよね。そんな時は「保護」をして操作ができないようにすることができます。本シリーズではエクセルやエクセルVBAでブックやシートの保護をするテクニックについてお伝えします。
  1. 【Excel】勝手な編集は許しません!初心者向けのシート保護設定
  2. 【Excel】勝手なシート操作を防ぐ!初心者向けのブックの保護設定
  3. 【エクセルVBA】Protect/Unprotectメソッドでシートの保護設定と解除をする方法
  4. 【エクセルVBA】保護しているシートでマクロの操作だけ有効にする方法
  5. 【エクセルVBA】VBAでパスワード付のシートの保護を設定・解除する方法

営業先情報を劇的に管理しやすくするGoogleマイマップとその使い方

$
0
0

みなさんこんにちは!とくP(@toku_jpn)です!

Google マップを日々の生活の中でご利用されている方は多いと思います。 場所を調べられるだけでなく、その場所の電話番号、ホームページ、お店の評価などについても知ることができるようになっていてほんとうに便利ですよね。

このGoogle マップを「自分用にアレンジしてみたいな」と一度は考えたことがある方もいらっしゃるのでは?と思います。

実は…Googleマイマップというサービスでそれができるんです!そして、営業の仕事で大活躍するツールなのです!今回はそんなGoogleマイマップをご紹介していきます!

Google マイマップとは?

Googleマイマップは営業先やお気に入りのお店などあなたの選んだ場所についての情報をまとめたマイマップを作成することができるGoogle マップ内のサービスです。

Googleマイマップを利用するメリットは3つあります。

場所情報へのアクセスが容易になる

自分の選んだ場所のみで作成された地図であるため、それらの場所の情報に簡単にアクセスすることができます。 例えば、担当する営業先をまとめたマイマップを作成すると営業先の場所がひと目で分かるようになり、最適な営業ルートを決めやすくなる、というメリットを得られます。

場所について自分のオリジナルの情報を記録することができる

Googleマイマップに登録した場所について自分オリジナルの情報を記録してまとめることができます。

例えば、営業先についての営業結果や売上数量などの情報を独自に記録することができます。

マイマップを共有・公開することができる

作成したマイマップは他のユーザーとデータを共有することができます。 また、ホームページなどをお持ちの場合は、ページ内にマイマップを埋め込むことも可能です。

 

マイマップの作成方法は次回にするとして、今回は実際に営業マンが外出時にマイマップを活用して営業先の情報を確認する例をご紹介したいと思います。

Google マイマップをスマートフォンで活用する

Google マイマップはスマートフォンのGoogle マップアプリでも利用できますので、営業マンが営業先を管理する際に大活躍します。

以下に、その活用方法を記します。

Google マップからマイマップを開く方法

マイマップを利用するためにはGoogle マップでアカウントのログインをする必要があります。ログインしていない方は左上のアイコンをタップしてからログインを選択してログイン処理をしてください。

 

②ログインした後に左上のアイコンをタップしてGoogle マップのメニューを開きます。

マイプレイスをタップしてください。


マイプレイスにはマイマップのデータだけでなくGoogle マップで設定した自宅や会社の地点のデータ、保存したお気に入りの地点などが記録されています。 今回はマイマップを開きたいので、右上のマップのタブをタップしてください。


⑤作成したマイマップが表示されますのでタップして表示します。今回は「サンプルマイマップ」を開きます。


⑥このような画面になれば成功です。通常のGoogle マップと違い、マイマップに登録された複数の地点にあらかじめピンが打たれている状態になります。

今回のサンプルで作成したマイマップは営業先の東京都内の大学をまとめた、という設定です。

マイマップで経路を検索する

先述したように、マイマップに登録した場所については経路検索も簡単に行うことができます。以下にその方法をご紹介します。

①経路検索したい場所のマーカーをタップします。


②道順を表示したい先の選択ができた場合このような画面になります。右下の車のマークをタップします。

③経路が表示されます。(筆者のプライバシー保護のため東京駅からの経路に差し替えました笑)右下のガイド表示(現在位置からの経路表示の場合はナビ開始)をタップします。


④目的地までの経路プレビュー、もしくはナビゲートが始まります。

マイマップで登録先の情報を確認する

マイマップでは登録した地点に独自の情報を記録することができます。

そして、スマホアプリからその情報を確認することができます。

 

マイマップで経路を検索する2番で紹介した画面のときに下部の地点名などが表示された部分をタップします。

②マイマップに記録した情報が表示されます。

今回の例では、各大学の住所や電話番号だけでなく、営業の進捗などを記録しています。

日頃からマイマップで営業進捗を管理するようにしておけば、営業中においてもこのような方法で情報を確認することができて大変便利です。

※住所の次に進捗3が並んでいるのは軽微なバグによるものと思われます。

おわりに

いかがでしたか? マイマップを活用するイメージが湧いてきましたか?

 

初めにお伝えしたように、Google マイマップを活用することで得られるメリットは

①データへのアクセスが容易になる

②場所情報について自分のオリジナルの情報を記録することができる

③マイマップを共有・公開することができる

の3つでした。今回の記事では営業マンがスマートフォンでマイマップを確認する例をご紹介して、①②のメリットを感じていただくことができたかと思います。

 

さて、気になるマイマップの作成方法は次回の記事にてご紹介したいと思います。

それでは!


「働く」ということについて2年間考え続けてわかったこと

$
0
0

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

ありがたいことに、独立・起業をしてから丸2年経ちまして、株式会社プランノーツも今月から3期目に入りました。

その間「働く」をテーマにお仕事をさせて頂いております。

今、「働き方改革」などという言葉がバズワードとなり、あちこちで目にするようになっていますが、皆さんの理想の「働き方」ってどんなものでしょうか?

  • クライアントからの感謝の量が多い仕事
  • 世の中に影響を与えられる仕事
  • 不労所得をいかに得られるか
  • 家族との時間を大切にできるような働き方

などなど、色々な意見があるものと思います。

起業当初は、働き方を効率化していくことは良いことだろうと思っていました。

だから「お仕事効率化」というキーワードをよく使っていたのですが、なんかあんまりシックリ来ないなと…。

それが、2年間活動をした最近になって、より正確に言語化というか、腑に落ちるようになってきたところがありまして、今回はそれについて書いておこうと思っています。

その答えは、一言で言うと「人を動かす」ということです。

「働」という字は「人を動かす」だ

「働」という文字ですが、「人」が「動く」でできているという説があります。

人が動いてエネルギー(というか時間)を消費をして、その代わりに生まれた価値に対して、対価をもらえるという考え方ですね。

そして、その「動き方」にも種類があって

  • 自らの意志で動くのか
  • 誰か他人の意志で動かされるのか

でいうと前者がいいよね、というような話になります。

わかるっちゃわかるし、全く違うとも思えないんですけど、もっといい解釈がある気がしたんですね。

で、あれこれよくよく考えて、ふと「が」ではなくて「を」に変えてみたところ

「人」を「動かす」

お?

これはいいのでは?と気づきました。

「人を動かす」というと、以下名著がありますね。バイブルのように読んでいました。

そっか、働くということは「人を動かす」ということなんですね。

受託開発の価値について

さて、ITのお仕事でいうと、受託開発というものがあります。

Webサイトや業務システムなど、その目的は様々ではありますが、その成果物を利用することで、クライアントはネットでの告知ができるようになったり、業務効率が上がったり、そのような恩恵に預かります。

ですが、自著「ExcelVBAを実務で使い倒す技術」の7章にもガッツリ書いているのですが、

システムの効果は導入時をピークに時間とともに低下をしていく

のです。

というのも、市場や事業には「変化」があるからでして、その変化に合わせてメンテナンスしないと、システムは相対的に劣化をします。

ですが、受託開発のほとんどは、「納品したらいくら」での契約になっていますから、その後のことは別料金になります。

Webサイトで一文字変更するのに1万円チャリン、業務システムで消費税率を変更するのに100万円チャリン。

そんなことがよくあります。

弊社でも受託開発のお仕事はあります。

自分が動いた工数分は報酬をもらえないと赤字になってしまうので、そのような見積を提出させていただくのですが、なんとなく心苦しいな…と思うようになっています。

その心苦しさの裏には、「人を(あんまり)動かせていない」という事実があります。

納品時は、時間短縮とか、できないことができるようになったとか、そういった意味では多少ながら人を動かしているというか、効果はあるとは思います。

ただ、その利用者はそのシステムに対して、あくまで受動的であり能動的にアクションを起こすことはできないんですね。

つまり、受け身。何かが起きたら反応をする。本質的に、その利用者自身が何か変わったのか?というと、残念ながらそうではない場合が多いかな、と。

教育の価値は無限に拡散する

一方で、弊社では開発と教育をセットで提案をすることがありまして、自画自賛になってしまいますが、これはいいサービスだと思うようになりました。

というのも、例えば納品したシステムをメンテナンスできるようにVBAのスキルを上げる研修を提供したとすると、もうその企業様は自前でシステムの劣化を防いだり、むしろさらにブラッシュアップしたりする可能性も生まれます。

さらに、そのスキルを身に着けた方が、社内で勉強会を開いたりすれば、他の方もそのスキルを身に着けて、いよいよ部署や会社全体がシステムを組む能力を身に着けていくことになります。

勢いを止めさえしなければ、その価値は無限大に拡散していきます。

これってすごく価値を生んでいると思いません?

だから、経営者の皆さんには声を大にして言います。教育に投資すべ気ですよ~!

システムだけは導入時がピークであとは劣化して負債に。

採用だけは人が増えるだけで足し算。

教育は指数的に価値が拡散します。

月に40万回の課題を解決する方法

ブログは無料で閲覧できますから、直接的には全く儲かりませんし、手間もものすごくかかります。

2年半くらい運営していますが、それでも1記事あたり2~3時間はかかります。

悲しいことに、最近は全くその時間がとれず、もう2週間近く更新していない…こんなことは初めてってくらいできていないのですが…

それでも価値があると断言できます。

Googleで検索して来て、欲しい情報をゲットできたらサヨナラ。

この一期一会の繰り返しなのですが、その数が半端ない。

このブログだけでも、日に1万5千回以上、月に40万回ほど行われています。

そして閲覧した方は、課題を解決して一歩前に進んでいる可能性があります。

他の方法で、そんなことできますか?

できませんでしょ?

出版をすることで人を動かす

出版については、何度か記事でも書いているのですが、ブログよりも多くの文字数を一気に提供できますから、より密度の濃い課題解決法を提供することができます。

ExcelVBAについて…ブログでは伝えられないことが書籍なら伝えられる
ご縁がありまして「ExcelVBAを実務で使い倒す技術」という本を書きました。こうして本を書いてみると「ブログで伝えられないこと」を「本であれば伝えられる」と確信しましたので、それについて書いています。

一つのテーマについて、数百ページを使って、これでもか!と伝えることができるんですね。

有料ですからブログよりは閲覧される方の数は少ないですが、それでも数千人という方に、いっぺんにお届けすることができます。

本書をきっかけに、数千人という単位の人たちが

  • VBEのセッティング
  • デバッグの仕方
  • コードの書き方
  • チームでのVBA管理

などを変える可能性が生まれ、行動をして頂ければその本質を身に着けます。

私が「人を動かす」を読んで、自らの行動や習慣を変えたように、拙著を読んで読者の皆さんが行動や習慣を変えて下さるのであれば、それはそれは価値のあることだと思うのです。

まとめ

働くことって幸せなことだと思います。

サラリーマン時代のことを思い出すと、それこそ「生きていくために働く」ということが大前提にありました。

多少は人のため、誰かのため、そんなキレイ事も言いながらでしたが、いざそこから飛び出して、市場原理に生身で晒され続けると、そこは全く別世界でありました。

よりお金を稼ぐ、より社員を増やす、起業で言うとそんな成長が一般的なのかも知れませんが、今の時代で大事なのはむしろ「影響力」

生存能力を高めようとすればするほど、人に影響を与えられる選択肢をとることになり、結果的にそれが自らの「働く」にも貢献感と価値を与えることになっているものと思います。

そう考えると、インターネット、Google検索エンジン、活版印刷、そのような発明の数々と、経済や市場原理、また先人たちが残してくれた知恵と知識に感謝せざるを得ないわけであります。

【エクセルVBA】シートの追加も削除も、名前さえ変えさせない!VBAでブックの保護を設定する方法

$
0
0

ブックの保護,eyecatch,protect,excel,vba
皆様こんにちは、ノグチです。

VBAでエクセルツールを作ったはいいけれど、「シートを追加されたり、削除されてしまうとマクロが動かなくなってしまう」「シートの名前を変えられるのも困る」

そんなお悩みはありませんか?

前回までにご紹介した、WorksheetオブジェクトのProtectメソッドを使ったシートの保護設定では、シート内容は編集できないようにできても、ブック内のシートの名前を変更したり、シートを追加・削除したりといったシートに対する操作に対しては管轄外なんですよね。

でもご安心を。ちゃんとブックの保護ができるメソッドも用意されていますよ。

それがWorkbookオブジェクトのProtectメソッドとUnprotectメソッド

今回はこのメソッドを使って、エクセルVBAでブックの保護設定と、ブックの保護を解除する方法をご紹介します!

ブックの保護とはなんぞや?や、何ができるのか?は下記記事でご紹介していますので、こちらをご覧くださいませ。

【Excel】勝手なシート操作を防ぐ!初心者向けのブックの保護設定
VBAでシート操作を行うエクセルツールにとって、使う人が勝手にシート構成を変更できてしまうのは避けたいところ。エクセルのシート操作(名前の変更、挿入、削除、移動、コピー)を制限する機能、ブックの保護の設定と解除方法をご紹介しています。パスワードを設定しておけば、特定の人だけが編集できるようにすることもできますよ。

ブックの保護を設定する

Protectメソッドの記述方法

VBAでブックの保護を設定するには、WorkbookオブジェクトのProtectメソッドを使います。

このメソッドは、Workbookオブジェクトに対してブックの保護を設定してくれるメソッドです。

記述方法はこちら。

Workbookオブジェクト.Protect

Protectメソッドでブックの保護を設定する

では早速Protectメソッドを使ってブックを保護してみましょう。

下の表のB列「数量」とC列「単価」を乗算して、D列「合計」にその計算結果を出力、最後にブックの保護を設定する、というコードを使います。

ブックの保護,protect,計算表,vba

コードはこちら。

Sub 計算処理後にブックを保護()

Dim rowc As Long '処理行数カウンター

'******************************
'計算処理
'******************************
rowc = 2

Do While Cells(rowc, 1).Value <> ""

  'B列とC列を乗算して、D列に結果を表示する
  Cells(rowc, 4).Value = Cells(rowc, 2).Value * Cells(rowc, 3).Value

  '次の行へ
  rowc = rowc + 1
Loop

'ブックの保護
ThisWorkbook.Protect

End Sub

このコードを実行して、シートの名前を変更しようとすると…

ブックの保護,protect,実行例,シート名変更

この通り、ブックの保護が設定されて、シートの名称変更ができないようになっています

さらに、シートにマウスカーソルを当てて右クリックをしてみると、

この通り、シートの挿入や削除、名前の変更やコピーまで選択できないようになっています。

これで、ブックの保護が設定できました!

ブックの保護を解除する

Unprotectメソッドの記述方法

ブックの保護が設定できたところで、お次はその解除方法をご紹介します。

ブックの保護を解除するために使うのは、ブックの保護を解除するためのメソッド、WorkbookオブジェクトのUnprotectメソッドです。

記述方法はこちら。

Workbookオブジェクト.Unprotect

このメソッドを使えば、Protectメソッドで設定したブックの保護だけでなく、手動で設定したブックの保護も解除することができます

Unprotectメソッドでブックの保護を解除する

では実際に、Unprotectメソッドを使ってブックの保護を解除してみます

Protectメソッドの項でお見せした、ブックの保護を設定したブックで下記のコードを実行してみます。

Sub ブックの保護を解除()

ThisWorkbook.Unprotect

End Sub

では、ちゃんとブックの保護が解除されたか確認するために、シートの名前を「表1」から「計算結果」に変更してみましょう。

ブックの保護,unprotect,シート名変更,vba

この通り、ブックの保護が解除されてシートの名前が「計算結果」に変更できるようになっています

念のためシートのタブにマウスカーソルを合わせて右クリックメニューを表示してみると…

ブックの保護,unprotect,vba,右クリックメニュー

こちらも図の通り、シートの挿入、削除、コピーも選択できるようになっていますね

これでブックの保護が解除できました!

最後に

いかがでしたでしょうか。

今回は、VBAでブックの保護設定と解除の方法をご紹介しました。

ツールによっては、VBAで計算やデータ加工した結果をユーザに見せるだけにしたい、というものあるでしょう。そんなときは、VBAのデータの加工処理のコードの後にシートとブックの保護を設定するコードを加えておけば、人間の手動によるシート内容の変更や、シートの追加や削除を防ぐことができます。

作成したツールや、変更させたくないものの内容によって、シートの保護とブックの保護を組み合わせたり、或いは使い分けてみてくださいね

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

連載目次:エクセル&VBAでブックやシートの保護をするテクニック

エクセルやVBAで「このシートは消されると困る」とか、「シートの名前を変えられるとVBAが動かなくなる」といった悩み、ありますよね。そんな時は「保護」をして操作ができないようにすることができます。本シリーズではエクセルやエクセルVBAでブックやシートの保護をするテクニックについてお伝えします。
  1. 【Excel】勝手な編集は許しません!初心者向けのシート保護設定
  2. 【Excel】勝手なシート操作を防ぐ!初心者向けのブックの保護設定
  3. 【エクセルVBA】Protect/Unprotectメソッドでシートの保護設定と解除をする方法
  4. 【エクセルVBA】保護しているシートでマクロの操作だけ有効にする方法
  5. 【エクセルVBA】VBAでパスワード付のシートの保護を設定・解除する方法
  6. 【エクセルVBA】シートの追加も削除も、名前さえ変えさせない!VBAでブックの保護を設定する方法

【Trello】Google Apps Scriptで明日締切のカード数をチャットワークで通知する方法

$
0
0

みなさん、こんにちは!
タダケン(@tadaken3)です。
ゼルダの伝説 ブレス オブ ザ ワイルドをクリアし、ハイラルに平和を取り戻しました。
これで無事にブログ執筆に専念できます。

さて、前回はTrelloのAPIで取得した情報をスプレッドシートに保存する方法をお伝えしました。

Google Apps ScriptでTrelloのカード一覧をスプレッドシートに保存する方法
Google Apps ScriptでTrelloのカード一覧をスプレッドシートに保存する方法をお伝えします。UrlFetchAppのfetchメソッドを使ってデータを取得し、getRangeメソッドとsetValuesメソッドでシートに保存します。

今回は、取得したカード一覧の中から、締め切りが明日のカードをカウントして、チャットワークに通知するところまでご紹介します。チャットワークに通知することで、タスクの締切忘れの予防につながります。タスク管理を自動化する流れを学んでいきましょう。

前回のおさらい

TrelloのAPIから取得したJSONの情報加工してをスプレッドシートに保存しました。
前回のコードは以下のとおりです。

function getCardId() {

  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var listId  = "XXXXXX";//リストIDを入力してください

  var url = "https://trello.com/1/lists/" + listId + "/cards?key=" + trelloKey + "&token=" + trelloToken;
  var res = UrlFetchApp.fetch(url, {'method':'get'});
  var json = JSON.parse(response.getContentText());

  var cards =[]; //箱を作る
  var maxRows = json.length; //格納されているデータの行数を取得
  for(var i = 0; i < maxRows; i++){

     //必要なデータのKeyを指定して値を取得する
     var name = json[i].name;
     var due = json[i].due;
     var idMembers = json[i].idMembers;
     var dateLastActivity = json[i].dateLastActivity;
     var shortUrl = json[i].shortUrl;

     //取得したここのデータをまとめて、ひとつのカード情報としてまとめる
     var card = [name, due, idMembers, dateLastActivity, shortUrl];

     //先程取得したcardsという箱に追加する
     cards.push(card);
  }

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('list');//リストというシートに保存
  var lastRow = cards.length;
  var column = cards[0].length;
  sheet.getRange(2,1,lastRow,column).setValues(cards);
}

明日締め切りのカード数をカウントする

今回はforループとif文を組み合わせて、条件に一致するカードの数をカウントします。

myCardsCntという変数を作成し、そこにdue(締切日)が、明日の日付とマッチする場合に、myCartdsCntをプラス1していきます。文字列に特定の文字が含まれているかを確認するには、matchメソッドを使用します

書き方は

文字列オブジェクト.match(検索したい文字列)

です。

日付の形式をTrelloと同じ形式にするにはUtilities.formatDateを使います。

このように

Utilities.formatDate(日付, タイムゾーン, フォーマット)

かきます。

詳しい解説は以下の記事も参考にしてみてください。

GASでチャットワークにGoogleアナリティクスの前日レポートを自動送信
以前、Googleアナリティクスの日次レポートを自動記録する方法をお伝えしましたが、今回はさらに発展をさせてそれをGoogle Apps Scriptを使ってチャットワークに毎朝自動で通知します。

function getCardId() {
  //省略
  //JSONデータから、明日締め切りのタスク数をカウントします。
  var myCardsCnt = 0;
  var date = new Date()
  date.setDate(date.getDate() + 1)//今日の日付に1を足して、明日の日付にする
  var tommorow = Utilities.formatDate(date, 'Asia/Tokyo' , 'YYYY-MM-dd');

  for(var i = 0; i < maxRows; i++){
    var due = json[i].due;
        if(due != null && due.match(tommorow)){ //空白の場合も除いています。
          myCardsCnt++
        }
   }
}

カウントした情報を元にチャットワークに通知するメッセージを作成する

if文を使って、チャットワークに通知するメッセージを出し分けます。明日締切のカードがない場合とある場合に分けて、メッセージを作成してみましょう。

実際のコードは以下のようになります。

function getCardId() {
  //省略
  //JSONデータから、明日締め切りのタスク数をカウントします。
  var myCardsCnt = 0;
  var date = new Date()
  date.setDate(date.getDate() + 1)//今日の日付に1を足して、明日の日付にする
  var tommorow = Utilities.formatDate(date, 'Asia/Tokyo' , 'YYYY-MM-dd');

  for(var i = 0; i < maxRows; i++){
      var due = json[i].due;
        if(due != null && due.match(tommorow)){ //空白の場合も除いています。
          myCardsCnt++
        }
   }

    //myCardsCntの数でチャットワークに送信するbodyの内容を作成
    var body;
    if (myCardsCnt==0){
      body = "明日(" + tommorow +")締切のタスクはありません。順調順調!";
    } else {
      body = "【 " +  parseInt(myCardsCnt) + " 個】 のタスクが明日、締切であります"
    }
}

チャットワークにメッセージを送信する

最後に作成したメッセージをチャットワークで通知します。今回はライブラリ「ChatWorkClient for GAS」を使って、送信します。

詳しくは以下の記事もご覧になってください。

Google Apps Scriptの第一歩、初心者でもチャットワークにメッセージを送れる
Google Apps Scriptの第一歩ですが、しょっぱなから真っ先にチャットワークを操作してしまいます。初回はGASのプロジェクトの作成、ライブラリの追加、スクリプトの記述と実行までです。

コードはこのようになります。

function getCardId() {
  //省略
  //JSONデータから、明日締め切りのタスク数をカウントします。
  var myCardsCnt = 0;
  var date = new Date()
  date.setDate(date.getDate() + 1)//今日の日付に1を足して、明日の日付にする
  var tommorow = Utilities.formatDate(date, 'Asia/Tokyo' , 'YYYY-MM-dd');

  for(var i = 0; i < maxRows; i++){
      var due = json[i].due;
        if(due != null && due.match(tommorow)){ //空白の場合も除いています。
          myCardsCnt++
        }
   }

    //myCardsCntの数でチャットワークに送信するbodyの内容を作成
    var body;
    if (myCardsCnt==0){
      body = "明日(" + tommorow +")締切のタスクはありません。順調順調!";
    } else {
      body = "【 " +  myCardsCnt + " 個】 のタスクが明日、締切です"
    }

    //チャットワークにメッセージを送信する
    var client = ChatWorkClient.factory({token: "XXXXXXXXXXXX"}); //チャットワークのトークンを入力して下さい
    var roomId = "12345678"//チャットワークのルームIDを入力してください。
    client.sendMessage({room_id: roomId, body: body});
}

前回のコードと今回作成したコードをまとめる

今回作成したコードと前回のコードを合わせてものを以下に記載しています。
少しずつ書き進めましたが、少し長めのコードが書けるようになりましたね。

function getCardId() {

  var trelloKey   = "XXXXXX";//keyを入力してください
  var trelloToken = "XXXXXX";//tokenを入力してください
  var listId  = "XXXXXX";//リストIDを入力してください

  var url = "https://trello.com/1/lists/" + listId + "/cards?key=" + trelloKey + "&token=" + trelloToken;
  var res = UrlFetchApp.fetch(url, {'method':'get'});
  var json = JSON.parse(response.getContentText());

  var cards =[]; //箱を作る
  var maxRows = json.length; //格納されているデータの行数を取得
  for(var i = 0; i < maxRows; i++){

     //必要なデータのKeyを指定して値を取得する
     var name = json[i].name;
     var due = json[i].due;
     var idMembers = json[i].idMembers;
     var dateLastActivity = json[i].dateLastActivity;
     var shortUrl = json[i].shortUrl;

     //取得したここのデータをまとめて、ひとつのカード情報としてまとめる
     var card = [name, due, idMembers, dateLastActivity, shortUrl];

     //先程取得したcardsという箱に追加する
     cards.push(card);
  }

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('list');//リストというシートに保存
  var lastRow = cards.length;
  var column = cards[0].length;
  sheet.getRange(2,1,lastRow,column).setValues(cards);
}

 //JSONデータから、明日締め切りのタスク数をカウントします。
  var myCardsCnt = 0;
  var date = new Date()
  date.setDate(date.getDate() + 1)//今日の日付に1を足して、明日の日付にする
  var tommorow = Utilities.formatDate(date, 'Asia/Tokyo' , 'YYYY-MM-dd');

  for(var i = 0; i < maxRows; i++){
      var due = json[i].due;
        if(due != null && due.match(tommorow)){ //空白の場合も除いています。
          myCardsCnt++
        }
   }

    //myCardsCntの数でチャットワークに送信するbodyの内容を作成
    var body;
    if (myCardsCnt==0){
      body = "明日(" + tommorow +")締切のタスクはありません。順調順調!";
    } else {
      body = "【 " +  myCardsCnt + " 個】 のタスクが明日、締切です"
    }

    //チャットワークにメッセージを送信する
    var client = ChatWorkClient.factory({token: "XXXXXXXXXXXX"}); //チャットワークのトークンを入力して下さい
    var roomId = "12345678"//チャットワークのルームIDを入力してください。
    client.sendMessage({room_id: roomId, body: body});
}

まとめ

今回は、カード一覧から明日締切のタスクをカウントして、チャットワークで送信する方法をお伝えいたしました。今回のテクニックを応用すれば、自分のタスクだけを通知したり、週のはじめに今週分のタスクを通知することもできます。タスク管理を自動化することで、より有益な仕事に時間をさくことができると思いますので、ぜひチャレンジしてみてください。

次回もTrelloに関するテクニックをお伝えしていきますね。どうぞ、お楽しみに!

連載目次:Google Apps ScriptでTrelloを操作する

本シリーズではGoogle Apps Scriptで、Trelloを操作する方法をご紹介します。Trelloを操作することで、タスク管理も自動化することができます。
  1. Google Apps ScriptでTrelloを操作するはじめの一歩
  2. Google Apps ScriptでTrelloのリスト一覧とカード一覧を取得する
  3. Google Apps ScriptでTrelloのカード一覧をスプレッドシートに保存する方法
  4. 【Trello】Google Apps Scriptで明日締切のカード数をチャットワークで通知する方法

Google マイマップで自分のオリジナルのマップを作成する方法【基礎編】

$
0
0

みなさんこんにちは!とくP(@toku_jpn)です!

前回はGoogle マイマップで営業先を管理する方法をスマートフォンを活用した例を挙げてご紹介しました。

営業先情報を劇的に管理しやすくするGoogleマイマップとその使い方
Google マイマップを活用することで自分がセレクトした場所についての情報をまとめることができます。営業情報を管理するのに適しており大変便利なツールです。今回は営業マンが活用するシーンを例にGoogle マイマップを活用するイメージをご紹介したいと思います。

今回はマイマップを作成する方法をご紹介します。 基礎編というタイトルにはしていますが、本内容だけでも営業活動に十分活用できるレベルのマイマップを作成することが可能です。

ちょっとやり方を覚えれば簡単にマイマップを作成できるようになります。本記事で作り方を学んでいきましょう!

Googleマイマップファイルを新規で作成する

まずは新規マイマップファイルを作成する方法をご紹介します。新規マイマップファイルを作成する主な方法は

  1. Google ドライブから作成する方法
  2. Google マップから作成する方法

の2パターンがあります。今回はスマートフォンではなくPCを準備してください!

どの方法を用いても、Google ドライブ内にGoogle マイマップファイルが作成されます。

Google ドライブから作成する方法

個人的には一番簡単な作成方法だと思いますので、まずはこの方法でマイマップを作成してみるといいと思います。

①Google ドライブで「新規」をクリックしてください。

②クリックして開いたメニューの中に「その他」がありますのでマウスポインターを合わせてください。すると、さらに選択肢が現れますのでその中の「Google マイマップ」をクリックしてください。

③新規マイマップファイルが作成され、マイマップ編集画面に移ります。簡単ですね〜。

Google マップから作成する方法

ドライブからの作成方法に比べると手順が複雑にはなりますが、Google マップを眺めている途中で「マイマップで情報をまとめたいな〜」と思うこともあると思いますので知っておいて損はないと思います。「あとでやろう」では大抵やりませんからね〜笑

Google マップの検索窓左横のメニューアイコンをクリックしメニューを開きます。

②開いたメニューで真ん中のあたりにある「マイプレイス」をクリックします。

「マイマップ」タブを選択します。

ここまではPCとスマートフォンとの違いはありますが、前回の記事中の「Google マップからマイマップを開く方法」でご説明した方法と同じです。

マイマップ以外の説明は割愛させていただきますが、マイマップをはじめ自宅情報やお気に入り登録した地点一覧など個人でまとめた情報についてはすべてこの「マイプレイス」に集約されていると覚えておくとGoogle マップをより便利に活用していけると思います。

④前回記事ではここで閲覧したいマイマップを選択していましたが、今回は新しくマイマップを作成したいので「地図を作成」をクリックします。

⑤新規マイマップファイルが作成され、マイマップ編集画面に移ります。

Google マイマップに場所を登録する

次はいよいよマイマップに場所を登録する方法をご紹介します。

やり方はとても簡単なのでサクサクと場所を登録していけます。

①登録したい場所の丸いマークをクリックします。(丸いマークの付いていない地点などを登録する方法もありますが、今回は説明を割愛します。)

②クリックした場所の詳細情報が表示されましたね。下部にある「地図に追加」をクリックしてください。

③選択した場所がマイマップに登録されます。登録されると「地図に追加」の表示が消え、代わりにその場所のジオコード(地理座標値のこと)が表示されます。

とっても簡単ですね!いくつか登録していくと…

これだけでも自分オリジナルのマップらしさが出てきましたね!

 

おわりに

今回はマイマップを作成する方法【基礎編】をご紹介しました。

これだけでも使えるようになれば、例えば新規営業先をリストアップしたいとき、マイマップを作成して、ポチッポチッと場所を登録して、訪問ルートを検討する、見直すのに最適なマップが完成…といった使い方ができます!ぜひ活用してみてください!

さて、次回はGoogleマイマップをさらに細かく編集するための方法をご紹介します。

  • 登録した場所に営業結果や担当者の情報などを記録したい
  • 場所ごとにピンの色を変えたりアイコンを変えたりしてひと目見て区分がわかるようにしたい

など…が解決する内容の記事になりますのでご期待ください!

それでは!

連載目次:営業マン必見!Googleマイマップの作り方と活用法

Googleマップを日々使われている方は多いですが、実は自分用のオリジナルのマップを作ることができる「Googleマイマップ」という機能があります。 本シリーズではGoogleマイマップの作り方から活用法までを一挙紹介していきます!
  1. 営業先情報を劇的に管理しやすくするGoogleマイマップとその使い方
  2. Google マイマップで自分のオリジナルのマップを作成する方法【基礎編】

エクセルVBAコーディングガイドライン【随時更新】

$
0
0
guide-line

photo credit: amsfrank DSC00201 via photopin (license)

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

弊社でお仕事をする場合に、「こういうコーディングルールでやろうね」というのを、自分自身または一緒にお仕事をするパートナーさんにお伝えすべく、エクセルVBAのコーディングガイドラインを作ろうということになりました。

GoogleドキュメントやEvernoteで共有してもいいのですが、拙著「ExcelVBAを実務で使い倒す技術 」にもほとんど書いてある内容ですし、別に企業秘密とするほどのことでもないので、せっかくなら記事にしてしまえ!

ということで、記事として書かせてもらっています。

あくまで、弊社ではこう…というものなので、いろいろとご意見、好み、その他、色々とあるかもしれませんが、一部でも皆様のご参考になれば幸いです。

命名規則

変数、定数、プロシージャなど、名前には意味が伝わる単語を使います。

例えば…

Dim test as Long, a as String, data as Variant

これではどんな役割を持つ変数なのかわかりません…。

なお、VBAにおける名前は短いに越したことはないですが、長くてもメンバー候補が使えますので、それほど気にしなくてもよいです。

【エクセルVBA】初心者にとっても便利なVBEの自動メンバー表示とその使い方
エクセルVBAの業務効率を上げるためのVBEのテクニックについてお伝えしています。今回は、VBEのステキ機能である「自動メンバー表示」とは何か、また自動メンバー表示を使いこなす方法についてです。

意味がわからないよりは、長いほうがマシです。

変数名

変数名はアルファベットのキャメル記法で書きます。

また、データ型に合わせて、以下接頭語で始めるようにしてください。

  • str:String
  • date:Date
  • rng:Range
  • ws:Worksheet
  • wb:Workbook
  • obj:Object

整数型や通貨型の場合はこの限りではないですが、状況に応じて以下接頭語を使うことを推奨します。

  • row:行
  • col:列
  • min:最小
  • max:最大
  • avg:平均

ただし、以下については短くてシンプルな名称でも可読性には影響を与えませんので、使っても問題なしです。

  • i, j, k:イテレータ
  • tmp, buf:一時的な変数
  • obj:一時的なオブジェクト変数

プロシージャ

メインルーチンなどそのマクロ独自のSubプロシージャは日本語名でもOKです。

ただし、他のプロシージャから頻繁に呼び出される可能性があるSubプロシージャ、またはFunctionプロシージャはアルファベットのキャメル記法でお願いします。

というのも、他のマクロに再利用する際を考えると、日本語名でないほうが都合がよい場合が多いからです。

また「~かどうか」を返すBoolean型のFunctionプロシージャに関しては

  • is~
  • has~
  • can~

を使うとわかりやすいですし、かっこいいです。

定数

定数はアルファベットのスネーク記法で命名をします。

Const TAX_RATE As Currency = 0.08 '消費税率
Const USER_PASSWORD As String = "hogehoge"

列挙体

「e + 単語」のキャメル記法でネーミングします。

Cellsプロパティの引数として列番号などによく使われますので、単語はなるべく短いワードが望ましいです。

また、ワークシートの列数を表す列挙体の場合は、そのオブジェクト名と同じワードを使うのがおすすめです。

例えばワークシートのオブジェクト名が「wsPref」であれば

Enum ePref
  都道府県名 = 1
  県庁所在地
  人口
  面積
End Enum

と命名します。

変数の宣言

まず、前提として、不要な変数は増やさないようにしたいところです。

変数が増えるということは、管理すべき対象が増えるということなので、無駄に増やすと可読性やメンテナンス性を低下させることになります。

変数を使うことが有効なのかどうかの見極めが大事ですね。

変数の宣言は強制する

VBEのオプション設定で変数の宣言を強制するようにします。

以下記事にある通り、VBEの「ツール」→「オプション」(アクセスキー Alt → T → O )の「編集」タブ、「変数の宣言を強制する」にチェックで、常に作用します。

エクセルVBA超入門!たった10分でスタート地点に立つための方法
エクセルVBA…まず何をしたら良いかわからない…!という声をよく耳にします。今回はVBAプログラミングをいざ書き始める直前の状態を目標に、エクセルVBAの最低限のセッティングの仕方についてお伝えします。

モジュールの宣言セクションに以下記載がある状態であれば、変数の宣言が必須となります。

Option Explicit

宣言を強制することで

  • 変数名のスペルミスの防止
  • 変数の型を明確にする

などのメリットがあります。

暗黙の型は使わない

型指定をしないとVariant型になりますが、変数の役割が見えづらくなりますので、特に理由がない限りは型を指定をすべきです。

また、以下のような書き方をすると、変数xがVariant型になってしまうので注意が必要です。

Dim x, y As Long

このように記述するのが正しい書き方です。

Dim x As Long, y As Long

また、オブジェクト変数でいうとObject型も便利ではありますが、同様の理由から、できるだけ型指定は詳細にするのが良いです。

スコープはできる限り小さく

原則、変数・定数はプロシージャレベルで宣言をすることで、可読性と安全性が高まります。理由もなくモジュールレベルやパブリックにはしないように…。

また、宣言をするのは、使用する直前での宣言が望ましいです。

プロシージャ冒頭にプロシージャ内で使用するすべての変数を宣言するというしきたりがあったりなかったりしますが、近くにあるほうが

  • 型は何か
  • 宣言時のコメント

といった情報がスクロールなしで得られるようになります。

ただし、定数の場合は、プロシージャの冒頭または宣言セクションでまとめて宣言をしておくのもよいでしょう。後で値を変更するときに、わかりやすい位置にあると便利です。

Integer型は使わない

整数はLong型で統一で問題ありません。

Integer型はメモリ領域をセーブできるというメリットも無きにしも非ずのように見えるかもなのですが、公式にこのように発言されています。

しかし、最近のバージョンでは、Integer型として宣言されていても、VBAはすべての整数値をLong型に変換します。したがって、Integer変数を使用することによるパフォーマンス上の利点はなくなりました。実際、Long変数はVBAで変換する必要がないため、少し速くなる可能性があります。

Currency型を使う

小数点を取り扱う金額はCurrency型(通貨型、固定小数点)を使います。

コンピュータはそもそも小数付の計算が苦手で、SingleやDoubleの計算では誤差が発生する場合があるのですが、Currencyなら安心して使えます。

Currencyは小数点以下4桁までを取り扱うことができ、計算時は1万倍して整数にしてから、計算後に1万で割って戻すという処理をしているので、小数付の計算による誤差が出ないのです。

ただし、小数点以下5桁以下は丸められてしまいますので、その点は知っておく必要があります。

コードのフォルム

ネストとインデント

ネストであれば必ずその深さの分のインデントを加えてください。理想としては深さは3つまでがいいですね。

For i = 1 To n
  For j = 1 To n
    Sheets1.Cells(i, j).Value = i * j
    If i = j Then
      Sheet1.Cells(i, j).Interior.ColorIndex = 3
    End If
  Next j
Next i

Withステートメントの活用

Withステートメントを使うとネストは増えてしまいますが、同じオブジェクトを何度も書かなくて済みますし、可読性も上がる場合が多く、コードを書くための強力な武器になります。

With ThisWorkbook.Worksheets("Sheet2")
  Point = .Cells(i, 1).Value 'A列から点数を取得

  '中略

  .Cells(i, 2).Value = grade 'グレードをB列に記入

End With

縦に揃える

一行が長いときには、アンダースコアによる行連結シーケンスによる改行が有効ですが、縦に揃えることを意識すると可読性が高まります。

長いメッセージを記述するときや

Dim m As String
m = ""
m = m & "既にデータが記録されています。" & vbCrLf
m = m & "「はい」をクリックするとデータを上書き、" & vbCrLf
m = m & "「いいえ」をクリックすると処理を中断します。"

引数の多い命令を記述するときに有効です。 

With ThisWorkbook.Worksheets("Sheet1")
  x = WorksheetFunction.SumIfs( _
  .Range("F:F"), _
  .Range("B:B"), .Cells(i, 2).Value, _
  .Range("C:C"), .Cells(i, 3).Value _
  )
End With

コメント

コードを見てわかるコメントは不要

一般的にコードを見ればわかるような内容についてのコメントは不要です。

例えば以下のようなパターン。

If n > 50 Then 'nが50より大きい場合
  MsgBox "50より大きい"
ElseIf n <= 50 Then 'nが50以下の場合
  MsgBox "50より小さい"
End If

コメント入れなくてもわかりますから…情報密度が薄くなっちゃいます。

プロシージャの説明

頻繁に呼び出されることのあるプロシージャであるなら、役割、引数、返り値などについてコメントを入れておきます。

例えば、以下のようなコメントです。

'-----------------------------------------------------------
' 機能: 範囲rngから値varを取得して行(または列)番号を返す
' 引数: rng/検索範囲、var/検索値、strDim/r→行、c→列
' 返り値: 行(または列)番号
'-----------------------------------------------------------
Function findCell( _
  ByRef rng As Range, _
  ByVal var As Variant, _
  Optional strDim As String = "r")

  '処理

End Function

役割や使い方がぱっとわかりますし、再利用もしやすくなります。

マジックナンバーは禁止

マジックナンバーは使用禁止です。メンテナンス性を著しく犠牲にします。マジックナンバー、絶対ダメ!

マジックナンバーになりやすいポイントとしては

  • 行数、列数
  • 係数
  • セルのアドレス
  • 配列やオブジェクトの要素数
  • 引数
  • ファイル名、パス名
  • パスワード
  • URLやメールアドレス

などがあります。

定数や列挙型を使うことで、マジックナンバーを避けましょう。

ユーザーの干渉・省略

テーブルの走査

テーブルの走査にはDo While~Loop文を使います。

繰り返し回数の指定を変更することなく、テーブルのレコード追加や削除に対応できます。

Dim i As Long
i = 2
Do While Sheet1.Cells(i, 1).Value <> ""
  '処理
  i = i + 1
Loop

コレクションの走査

コレクションの走査にはFor Each~Next文を使います。

コレクションのCountプロパティを使えば、For~Next文でも対応はできますが、For Each~Next文のほうがループ内でのオブジェクトの指定が簡潔になります。

Dim ws As Worksheet

For Each ws In ThisWorkbook.Worksheets
  Debug.Print ws.Name
Next ws

ワークシートの指定はオブジェクト名で

シートの指定はできる限りオブジェクト名を使います。

  • どのモジュールからでも同名でアクセスできる
  • 可読性が確保できる
  • シート名の変更の影響を受けない
  • 宣言が不要

など大量のメリットがあります。

宣言もセットも不要!エクセルVBAでワークシートをオブジェクト名で取り扱う方法
エクセルVBAで頻繁に取り扱うワークシート。実はオブジェクト変数を使わずに「オブジェクト名」を使って操作する方法があります。プロジェクト全体で定数のように使うことができ便利ですので、その使い方をお伝えします。

特に、インデックス番号による指定は、シートの並び順に依存するので危なっかしいです。

シート名を省略した場合は、暗黙的にActiveSheetへの処理となります。しかし、ActiveSheetはユーザーの操作によって想定しないシートが対象になることもあるので注意です。

ワークシートの新規作成をした直後であれば、戻り値を使ってオブジェクト変数にすぐさま格納するのが良いでしょう。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets.Add

ワークブックを明示する

以下のように親オブジェクトであるワークブックを省略することも避けるほうが良いです。

Worksheets("Sheet1").Name

この場合は、ActiveWorkbookが親オブジェクトとして認識されますが、ユーザーの操作によって想定しないオブジェクトが指定されたりします。

基本的にThisWorkbookを使うか、オブジェクト変数で特定をしましょう。

またActiveSheetと同様なのですが、ワークブックを新規作成をした直後には、戻り値を使ってオブジェクト変数に格納しちゃいましょう。

Dim wb As Workbook
Set wb = Workbooks.Open(ThisWorkbook.Path & "\hoge.xlsx")

コピー&ペースト

Selectメソッドは使わない

コピペ動作をマクロ記録すると

Sheets("Sheet1").Select
Range("A1").Select
Selection.Copy

Sheets("Sheet2").Select
Range("A1").Select
ActiveSheet.Paste

などといったコードが出力されますが、コピペにSelectメソッドは不要です。

Selectをするたびにアプリケーションの動作が入り、実行速度が犠牲になりますし、クリップボードを使うのはユーザーの干渉を受ける可能性があり危険です。

以下のよいうに、Copyメソッド一文でOKです。

Sheet1.Range("A1").Copy Sheet2.Range("A1")

セル範囲で処理できるなら一発で

Copyメソッドは範囲でも機能します。

単なるコピペであれば、繰り返しを使って1セルずつコピペをするのではなく、範囲で一気にコピペすることを優先しましょう。

Sheet1.Range("A:A").Copy Sheet2.Range("A1")

実行速度に圧倒的な差が生まれます。

高速化

特に理由がない限り、シートの処理をするのであれば、以下アプリケーションオブジェクトに関するプロパティ群を設定して、高速化を図ります。

'画面の再描画/自動計算/イベント受付を停止
With Application
  .Calculation = xlCalculationManual
  .ScreenUpdating = False
  .EnableEvents = False
End With

'処理

'画面の再描画/自動計算/イベント受付を再開
With Application
  .Calculation = xlCalculationAutomatic
  .ScreenUpdating = True
  .EnableEvents = True
End With

遅い…重い…そんなエクセルVBAプログラムの処理速度を劇的に改善する方法
エクセルVBAの実行速度が遅い・重いって時ありませんか?そんな時にエクセルVBAのプログラムの処理速度を速くするテクニックを紹介します。プログラムの実行時間を測定する方法も合わせてお伝えします。

日付リテラル

エクセルVBAにおいて日付の指定はダブルクォーテーション囲みでも許されていますが、「日付リテラル」つまりシャープ記号囲みがおすすめです。

というのも、日付リテラルを使うことで、日付として受け付けられない文字列をはじくこともできますし、入力後に規定のフォーマットに変換されるので、想定外の値が入力されることも防ぐことができます。

dateTmp = #6/9# '#6/9/2017#に自動変換
timeTmp = #13:15# '#1:15:30 PM#に自動変換

まとめ

以上、エクセルVBAのコーディングガイドラインでした!

どうぞご活用くださいませ。

良いガイドライン見つけたら、随時更新していきますね。

Viewing all 2077 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>