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

エクセルVBA3つループ処理For文・Do~While文・Do~Until文の使い分け

$
0
0

みなさんこんにちは!
テラドと申します。

エクセルVBAのループ処理では

  • For文
  • Do~While文
  • Do~Until文

と、3つの構文が使えます。

「とりあえずFor文を使っておこうかな」
「Do~While文・Do~Until文って、どう使い分けるんだろう」

このようにループ処理の構文を使うとき、自信がない方が意外と多いのではないでしょうか。

3つの構文をどう使いわければいいか、解説します!

For文を使うのは、どんな時?

繰り返す回数が決まっているとき

For文は、1~10回までなど 繰り返す回数が決まっている時に使います。

例として4行目~10行目のセルの背景色を変えるプログラムを書いてみます。

Sub sample()

Dim i As Long

For i = 4 To 10

  ThisWorkbook.Sheet1.Cells(i, 2).Interior.Color = RGB(255, 255, 0)

Next

End Sub

このプログラムを実行すると

↑セルの色が塗り変わりました。

この例のように、オブジェクトの状態・変数の値などの変化する状況に左右されず繰り返す回数が決まっている場合にFor文を使います。

さらに、ExcelVBAでよくある実例を使って理解を深めましょう。

ループ内で条件分岐がある場合

次の表データを見てください。

表データの3列目を走査(セルに設定されている値を順番に確認)して、地域が関東である都道府県名のセルに色をつけます。

ループ処理の中に条件分岐(地域=関東の場合)がありますが、走査する範囲が決まっている場合は「繰り返す回数」が決まっているため、For文の使用が適切です。

Sub sample()

Dim i As Long

For i = 3 To 12

With ThisWorkbook.Sheet1

  If .Cells(i, 3).Value = "関東" Then
  
   .Cells(i, 2).Interior.Color = RGB(255, 255, 0)
   
  End If

End With
  
Next

End Sub

このプログラムを実行すると

↑地域=関東の都道府県のセルの色が塗り替わりました。

表データの列を走査する範囲が決まっている場合は、For文を使うのが適切です。

ループ内の処理に条件分岐があっても、For文の利用が適切かどうかは、処理する回数(=走査する範囲)が決まっているかを基準にシンプルに考えてください。

データの追加がないか確認しよう

都道府県の表データに新しいデータ(レコード)が追加されると最終行が変化します。この場合、繰り返し回数が決まっていないため、For文は適していません。

表データを扱うプログラムでは、表データに追加があるか・ないかで使う構文が変わります。

Do~While文を使うのは、どんな時?

For文とDo~While文を比較してみよう

繰り返す回数が決まっていない場合は、For文は適していません。

この場合に使用するのがDo~While文です。

実は、For文で示した4行目~10行目のセルを塗る事例と同じ処理を、Do~While文を使っても、実現することが可能です。

Do~While文とFor文の違いを比較してみましょう。

Sub sample()

Dim i As Long

i = 4

Do While i <= 10
 
 ThisWorkbook.Sheet1.Cells(i, 2).Interior.Color = RGB(255, 255, 0)
 
 i = i + 1

Loop

End Sub

For文との違いがわかりましたでしょうか。

Do~While文の場合、変数の初期値の代入と、変数を1ずつ増やす処理を、自分で記述する必要があります。
(プログラムの5行目(i = 4)と11行目(i = i + 1))

繰り返す回数が決まっているループ処理は、Do~While文でも実現はできます。しかし、無駄な処理はバグ(不具合)の原因になります。

繰り返す回数が決まっている時は、無駄のないFor文を使いましょう。

では、どういう時にDo~While文を使うか、具体的な事例を見ていきます。

継続条件が変化する場合

Do~While文を使うときはFor文と違って、処理の継続条件が、オブジェクトの状態や変数の値など変化する状況の場合に使います。

下の画像は、さきほどFor文の事例で示したExcelとまったく同じものです。

この表の1列目が空白でない場合、2列目に100を加算するプログラムを書きます。

Sub sample()

Dim i As Long

i = 1

With ThisWorkbook.Sheet1

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

  .Cells(i, 2).Value = .Cells(i, 2).Value + 100

  i = i + 1

 Loop

End With

End Sub

このプログラムを実行すると

↑1列目が空白でないセルに、100が加算されました。

Cells(1, i).Value <> “” = セルの値が空白でない限り

表データのセルの状態が処理を継続する条件になっています。

その証拠に、表データを変化させて同じプログラムを実行してみましょう。

↑11行目、12行目に値を追加してみました。

再度、プログラムを実行すると

↑追加した11行目と12行目にも値が設定されたのがわかります。(1~10行目には、すでに100が設定されていたので、値が200になります。)

このように処理を継続する条件が、変化する状況の場合はDo~While文を使用します。

Do~Until文を使うのは、どんな時?

Do~Until文とDo~While文を比較してみよう

Do~Until文とDo~While文に、どういう違いがあるかわかりにくいですよね。

Do~While文で示した事例を、Do~Until文で書き換えると、違いがよくわかります。

Do~Until文を使ったプログラム

Sub sample()

Dim i As Long

i = 1

With ThisWorkbook.Sheet1

 Do Until .Cells(i, 1).Value = ""
 
  .Cells(i, 2).Value = .Cells(i, 2).Value + 100

  i = i + 1

 Loop

End With

End Sub

Do~While文を使ったプログラム

Sub sample()

Dim i As Long

i = 1

With ThisWorkbook.Sheet1

 Do While .Cells(1, i).Value <> ""
 
  .Cells(i, 2).Value = .Cells(i, 2).Value + 100

  i = i + 1

 Loop

End With

End Sub

違いがわかりましたか?

ループ処理の条件式(9行目)が、「<>」から「=」に反転していますね!

逆に言うと、それ以外の違いはまったくありません

Do~While文とDo~Until文は、やっていることは同じだが、条件が反転することを、覚えてください。

Do~Until文を使う場合は、Do~While文の場合の条件が反転するだけなので

終了条件が変化する場合

となります。

書籍、他のブログでの説明では

  • Do~While文は条件が真のときに処理を継続する
  • Do~Until文は条件が偽のときに処理を継続する

と書かれています。

でも、Do~Until文の偽のときに処理を継続するって、直感的に理解しにくくないですか?

  • Do~While文は「継続条件」を書く
  • Do~Until文は「終了条件」を書く

とシンプルに覚えましょう。

では、Do~While文とDo~Until文の使い分けを、条件が反転することを踏まえて考えてみます。

Do~While文とDo~Until文の使い分けは、理解のしやすさで判断

Do~While文とDo~Until文の使い分けはズバリ!

人間がみたときに条件を理解しやすいこと

これに尽きます!

例えば「あるデータを見つけたら、処理を終了したい」という仕様があったとき

Sub sample()
i = 1
 Do While ThisWorkbook.Sheet1.Cells(i,1).Value <> "終了"
  i = i + 1
 Loop
End With
End Sub

Sub sample()
i = 1
Do Until ThisWorkbook.Sheet1.Cells(i,1).Value = "終了"
 i = i + 1
Loop
End Sub

後者のほうが「あるデータを見つけたら、処理を終了したい」という仕様にマッチし、直感的に理解しすいと思います。

このようにDo~While文・Do~Until文は、やりたいことを直感的に表現できるほうを使いましょう!

Do~Until文はレアキャラかも?

複数人で開発をする時に、Do~Until文を使う場合は注意してください。

Do~Until文があるプログラミング言語は、意外と少ないのです。

私の知る限り、VB(VBA含む)・COBOL・Perlぐらいです。

Do~Until文になじみがないメンバーがいるかもしれません。少し乱暴ですがDo~While文・Do~Until文の使いわけで判断に迷うときは、Do~While文を採用しておけば間違いないと思います。

条件が反転しているだけで、やっていることに変わりはありませんから。

まとめ:For文・Do~Until文・Do~While文の使い分けフローチャート

エクセルVBAで使用できる、ループ処理の3つの構文について、それぞれの比較もしながら、説明してきました。

ノウハウとして使いやすいように、フローチャートで整理してみました。普段のプログラミング、チームメンバに説明するとき等に、ご活用ください。

フローチャートにしてしまうと、すごい簡単ですね!

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


エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法

$
0
0
tables

photo credit: dejankrsmanovic Empty Bar Chairs via photopin (license)

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

エクセルVBAで請求書作成マクロを題材としてテーブルを操作する方法をお伝えしています。

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

エクセルVBAでテーブル名を使用してテーブルを取得する方法
請求書マクロの作成を題材として、エクセルVBAでテーブルを操作する方法についてお伝えしています。今回は、テーブル名の変更する方法と、テーブル名を使用してテーブルを取得する方法について解説をしていきます。

テーブルを名前で取得する方法についてお伝えしました。

今回は、元となる請求データファイルのテーブルを使って、VBAから見たテーブルの構造について確認していきます。

では、エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法です。

行ってみましょう!

テーブルを構成する3つの「行」

前回 紹介した、「請求データ.xlsm」を題材として、テーブルがVBAでどのような構造になっているか、確認してみましょう。

テーブルの行の構成に注目です。

「データ」シートの「請求データ」テーブルを選択した状態で、リボンの「テーブルツール」→「デザイン」の「見出し行」と「集計行」のチェックを入れたり、外したりしてみましょう。

エクセルでテーブルの見出し行・集計行を設定する

すると、テーブルの行構成が以下の3つからできているということがわかるでしょう。

すなわち、以下の3種類です。

  • 見出し行
  • 行(いわゆるデータの行)
  • 集計行

エクセルのテーブルを構成する3つの行

エクセルVBAでテーブルの行範囲を取得する

VBAから見た場合、この3つの行の範囲をそれぞれ取得して取り扱うことができます。

例えば、以下のようなプロシージャを実行してみましょう。

Sub テーブルの行範囲の取得()

With wsData.ListObjects("請求データ")
    Debug.Print .HeaderRowRange.Address
    Debug.Print .DataBodyRange.Address
    Debug.Print .TotalsRowRange.Address
End With

End Sub

実行すると、イミディエイトウィンドウで以下のような結果が得られます。

エクセルVBAでテーブルの各行範囲のアドレスを取得

それぞれの行範囲を取得して、そのアドレスを出力しているという処理になりますね。

以下解説をしていきましょう。

テーブルの見出し行の範囲を取得する

テーブルの見出し行の範囲を取得するにはHeaderRowRangeプロパティを使います。

ListObjectオブジェクト.HeaderRowRange

見出し行は1行になりますので、1行分のセル範囲が得られます。

テーブルのデータ行の範囲を取得する

テーブルのデータ行の範囲を取得するにはDataBodyRangeプロパティを使います。

ListObjectオブジェクト.DataBodyRange

データ行は複数行あることが一般的ですね。

このプロパティでセル範囲を取得することができるのですが、実際にループ処理などをする場合には、ListRowsプロパティを使うほうが便利かも知れません。

ListRowsプロパティについては、また別途解説をします。

テーブルの集計行の範囲を取得する

テーブルの集計行の範囲を取得するにTotalsRowRangeプロパティを使います。

TotalRowRangeではなくて、TotalsRowRangeなので注意です。

ListObjectオブジェクト.TotalsRowRange

こちらも1行分のセル範囲になります。

テーブルに行追加をした場合のセル範囲

では、テーブルのメリットももうひとつ示していきましょう。

例えば、以下のように適当に1行 追加して、前述のプロシージャを実行してみましょう。

エクセルのテーブルに1行追加

すると、以下のような出力になります。

エクセルでテーブルに行追加した場合の行範囲をデバッグ出力

DataBodyRangeプロパティで取得できるデータ行のセル範囲は1行分、広がっていますし、TotalsRowRangeプロパティで取得できる集計行のセル範囲は1行分プラス方向にずれていますね。

このようにテーブル化をしておくと、それを構成する各要素の行範囲は、エクセルのほうでしっかりと管理してくれているんですね。

つまり、テーブルは行追加や削除などの変更に強いということなんです。

逆に、テーブルを使わない場合に、ユーザーの操作により「データ行が1行増えた」「集計行が1行ずれた」というのを感知するのは、かなり大変なのです。

このありがたみ、わかりますでしょうか?

まとめ

以上、エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法についてお伝えしました。

本文でお伝えしたとおり、テーブルにしておくと各行範囲はエクセルのほうで勝手に「ここからここまでだよね」というのを把握しておいてくれます。

テーブルはデータの追加や削除などの変更に強いのです。

さて、次回ですがListRowsコレクションを使って、データ行を走査する方法についてお伝えします。

どうぞお楽しみに!

連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る

エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。
  1. エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
  2. エクセルVBAでテーブル名を使用してテーブルを取得する方法
  3. エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法

エクセルVBAでOutlookメールの下書きを作成・表示して送信前に内容チェックする

$
0
0

vba,outlook,display

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

前回は、エクセルシートに一覧化された複数のメールアドレスに、本文を変えつつ、メールを一括送信する方法をご紹介しました。

【エクセルVBA】エクセルシートに一覧化された複数の連絡先に本文を変えつつOutlookでメールを一括送信する方法
エクセルVBAでOutlookを操作して、複数の送信先に、各メールの本文を変えつつ、メール送信する方法をご紹介しています。メールの冒頭部の宛名をコピペで作成していた方、もしかしたらこの方法でメール送信の手間が軽減できるかもしれません。

でも、一括送信できるとはいえ、送信前に内容チェックしたいな、ということもありますよね。

そんな時に使えるのが、MailItemオブジェクトのDisplayメソッドです。

今回は、このDisplayメソッドで、VBAで作成したOutlookのメールを、メール送信前に内容をチェックする方法をご紹介します!

MailItemオブジェクトとは何ぞや?については、こちらの記事でご紹介していますので、併せてご覧ください。

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

Displayメソッドとは

Displayメソッドは、Outlookのメール作成画面を開くメソッドです。

MailItemオブジェクトのプロパティに値をセットした後にこのメソッドでメール作成画面を開くと、宛先やメール本文が意図した通りにセットされているか?文章がおかしくないか?をチェックすることができるのです。

記述方法はコチラ。

MailItemオブジェクト.Display

メール送信前にメールの内容をチェックするコード

Displayメソッドでメール内容をチェックするコードは、例えばこんな感じになります。
Dim objOutlook As Outlook.Application
Dim objMail As Outlook.MailItem

Set objOutlook = New Outlook.Application
Set objMail = objOutlook.CreateItem(olMailItem)

With objMail
    .To = "xxxxxxx@xxxx.co.jp"       'メール宛先
    .Subject ="〇〇〇の件"               'メール件名
    .BodyFormat = olFormatPlain     'メールの形式
    .Body = "メール本文"                  'メール本文

    .Display
End With

CreateObjectメソッドでMailItemオブジェクトを作成して、MailItemオブジェクトのプロパティで値をセットした後、Displayメソッドでメール内容をチェックするというコードです。

当たり前ですが、Displayメソッドは、MailItemオブジェクトの各プロパティに値をセットした後に記述しましょう。

でないと、まっさらなメール作成画面が開いてしまうことになります。

VBAで作成したメールの内容をチェックする

実際に上のコードを実行して開いたメール画面がこちら。

vba,outlok,display,メール画面

この通り、Outlookのメール作成画面が開いて、VBAのコードでセットした内容をチェックできます。

Displayメソッドで開いたメール作成画面は、手動で「新しいメール」をクリックして開く画面と同じものなので、「送信」ボタンを押せばそのままメールが送信できますよ。

複数のメールをDisplayメソッドでチェックしたい場合

前回の記事でご紹介したような、複数の送信先にメールを送信したい場合にも、このDisplayメソッドでのメール内容チェックは使えます。

例えば、このワークシートにあるような複数送信先に対して、メールを送信したいとします。

vba,エクセルシート,送信先

上のコードの、MailItemオブジェクトをCreateItemメソッドで作成する部分から、MailItemオブジェクトのプロパティにメール内容をセットする部分、そしてDisplayメソッドでメール画面を表示する部分をループで挟んで、こんなコードにします。

Dim objOutlook As Outlook.Application
Dim i      As Long
Dim rowMax As Long
Dim wsList As Worksheet
Dim objMail As Outlook.MailItem

Set objOutlook = New Outlook.Application
Set wsList = ThisWorkbook.Sheets("送信先")

With wsList

    '送信先の件数
    rowMax = .Cells(Rows.Count, 1).End(xlUp).Row

    '送信先の件数分繰り返す
    For i = 2 To rowMax
        Set objMail = objOutlook.CreateItem(olMailItem)
        With objMail
            .To = wsList.Cells(i, 4).Value       'メール宛先
            .Subject = "〇〇〇の件"            'メール件名
            .BodyFormat = olFormatPlain          'メールの形式
            .Body = "メール本文"                 'メール本文
            .Display
        End With
    Next i

End With

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

vba,outlook,メール画面,複数

このように送信したいメール件数分、メール作成画面が表示されますので、メールの内容をチェックして「送信」をクリックしていけばOKです。

最後に

今回は、DisplayメソッドでOutlookでメールを送信する前に、メール内容をチェックする方法をご紹介しました。

これなら、メールを送信する前に、本文や送信先が自分の意図した通りにセットされているかチェックすることができますね。

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

エクセルVBAでテーブルのデータ行についてループ処理を行う方法

$
0
0

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

請求書マクロを題材にエクセルVBAでテーブル操作する方法をお伝えしています。

前回の記事はコチラ。

エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
エクセルVBAで請求書作成マクロを題材としてテーブルを操作する方法をお伝えしています。今回は、VBAから見たテーブルの構造を確認すべく、テーブルの見出し行・データ行・集計行の範囲の取得をする方法をお伝えします。

テーブルの見出し行、データ行、集計行について各セル範囲を取得する方法をお伝えしました。

さて、テーブルのデータ行ですが、追加・削除をしても可変で管理されているということですが、各行についてループ処理を行いたいときはどうすればよいでしょうか?

今回は、エクセルVBAでテーブルのデータ行についてループ処理を行う方法についてお伝えしていきます。

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

題材とするテーブルと今回の目標

以下のようなシートとテーブルがあったとします。

題材とするシートとテーブル
シートは「データ」シートで、そのオブジェクト名はwsDataとします。

テーブルは「請求データ」というテーブル名をつけているとします(もうひとつありますが、今回は置いておいてください汗)。

その場合、以下のようにして、テーブル「請求データ」をListObjectオブジェクトとして取得することができます。

wsData.ListObjects("請求データ")

さらに、以下のようにすることで、データ行の範囲を取得することができる、というのは前回お伝えしたとおりですね。

wsData.ListObjects("請求データ").DataBodyRange

ただ、このようにして得られるのはセル範囲、つまりRangeオブジェクトですね。

開始行と最終行の行数を調べて、For文を使って…って、ちょっと面倒な感じです。

ですが、テーブルならもっと簡単にループが回せるんです。

テーブルのデータ行についてループを回すプロシージャ

さて、テーブルのデータ行についてループを回す例として、以下のようなプロシージャを作成してみましょう。

Sub テーブルの行の操作()

With wsData.ListObjects("請求データ")
    Dim i As Long
    For i = 1 To .ListRows.Count
        Debug.Print .ListRows(i).Range.Address
    Next i
End With

End Sub

実行すると、イミディエイトウィンドウに以下のような出力が得られます。

VBAでテーブルのデータ行のアドレスをデバッグ出力

ちゃんとテーブルのデータ行についてだけ、各行のアドレスが出力されていますね。

上記のコードについて解説をしていきます。

テーブルのデータ行を表すListRowオブジェクト

さて、まず説明すべきはListRowオブジェクトです。

テーブルであれば使うことができるオブジェクトで、テーブルのデータ行の一行分を表すオブジェクトです。

そして、その一行一行の集合として、ListRowsコレクションがあります。

前述のプロシージャの5行目ですが、For文の最終値として「.ListRows.Count」が指定されていますね。

ListRowsプロパティですが、これはテーブルつまりListObjectからそれに含まれる行のコレクションを取得するプロパティです。

ListObjectオブジェクト.ListRows

これにより取得したListRowsコレクションに対して、Countプロパティを使うことで、その数つまりテーブルのデータ行の行数を取得することができます。

ListRowsコレクション.Count

ListRowsコレクションからインデックスでListRowオブジェクトを取得する

ListRowsコレクションに対して、インデックスを指定することで、各行のListRowオブジェクトを個別に取得することができます。

ListRowsコレクション(インデックス)

前述のコードの6行目では、インデックスとしてループのカウント用変数iをインデックスとして、Rangeプロパティでそのセル範囲を取得していますね。

ListRowオブジェクト.Range

さらに、そのセル範囲のアドレスをAddressプロパティで取得し、イミディエイトウィンドウに出力しているということになります。

For Each~Next文も使うことができますが、ループの順番が保証されていませんので、カウント用変数iを用いたFor文を使ったほうが確実な場合が多いと思います。

まとめ

以上、エクセルVBAでテーブルのデータ行についてループ処理を行う方法についてお伝えしました。

テーブル…便利ですよね!

ListRowsコレクションを使えば、行数とか開始行や最終行の行番号を気にすることなく、ループを回すことができるわけですから。

便利です…!

次回ですが、テーブルに新たなデータ行を追加する方法についてお伝えします。

どうぞお楽しみに!

連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る

エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。
  1. エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
  2. エクセルVBAでテーブル名を使用してテーブルを取得する方法
  3. エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
  4. エクセルVBAでテーブルのデータ行についてループ処理を行う方法

PythonとPhantomJs CloudでスクレイピングしたデータをBeautifulSoupで解析

$
0
0

黒部ダム
みなさん、こんにちは!うえはら(@tifoso_str)です。

JavaScriptで動作するWebページを色々な言語でスクレイピング】するシリーズの第七弾です。

前回は、「PythonでPhantomJs Cloudを利用してWebページをスクレイピング」しました。

PythonでPhantomJs Cloudを利用してWebページをスクレイピング
「JavaScriptで動作するWebページ(動的サイト)を色々な言語でスクレイピング」することをシリーズでお伝えしています。 今回よりPythonとPhantomJsCloudでJavaScriptで動作するWebページをスクレイピングしていきます。

GASと同じように色々な関数があるので、Pythonでも同じような書き方で実行出来ることがわかりました。

GASの場合、この後の処理はJSON形式のパース、matchメソッドと正規表現を使用して目的の値を取得する、という流れでした。

Pythonの場合も同じように、とやってもいいのですが、Pythonにはサードパーティ製のライブラリが豊富にあるので、少し楽できる方法をご紹介します。

今回は、Beautiful Soupというモジュールを利用して、目的のデータを取得していきます。

前回の確認

Beautiful Soupを使う前に前回のおさらいです。
PythonとPhantomJs Cloudでスクレイピングするコードは下記のようになりました。

import json
import urllib.parse
import requests

payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'}
payload = json.dumps(payload) #JSONパース
payload = urllib.parse.quote(payload,safe = '') #URIエンコード

key = '**-#####-*****-#####-*****-#####'
url = "https://phantomjscloud.com/api/browser/v2/"+ key+"/?request=" + payload

response = requests.get(url) #GETリクエスト
print(response.text)

リクエスト部分をJSON形式に変換して、URIエンコードしました。

また、URIエンコードするときに「/」スラッシュもエンコードする必要があるので、オプションで指定しました。

GETリクエストして返ってきた実行結果は下記のようでしたね。

Python_実行結果

GASのときと同じようにデータ取得できたので、次の処理へ移っていきます。

JSON形式から辞書型へ変換

Beautiful Soupを使う前にもう少し準備が必要です。

PhantomJs Cloudから返ってきたデータはJSON形式なので、Pythonで扱いやすいように辞書型に変換する必要があります。

JSON形式から辞書型への変換はJSONモジュールを使うのが一般的かもしれませんが、GETリクエストの時に利用したrequestsモジュールでもできます。

今回は、requestsモジュールを使ってみます。

requestsモジュールでJSON形式から辞書型への変換にはjson関数を使い、書き方は下記のようになります。

Responseオブジェクト.json()

はい、とっても簡単ですね!

また、GASで実行したときに「content」の「data」にあることがわかっているので、コードにすると下記のようになります。

import json
import urllib.parse
import requests

key = '**-#####-*****-#####-*****-#####'

payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'}
payload = json.dumps(payload) #JSONパース
payload = urllib.parse.quote(payload,safe = '') #URIエンコード

url = "https://phantomjscloud.com/api/browser/v2/"+ key+"/?request=" + payload

response = requests.get(url) #GETリクエスト

responseDict = response.json()
html = responseDict["content"]["data"]
print(html)

実行結果を確認すると以下のようになります。

Python_HTMLドキュメント

つらつらとHTMLドキュメントが取得できたと思います。

Beautiful Soupを使って目的の値を取得

HTMLドキュメントが取得できたので、いよいよBeautiful Soupモジュールを使っていきます。

Beautiful Soupモジュールは標準ライブラリではないので、インストールが必要です。

Beautiful Soupモジュールのインストール等は下記の記事で紹介しているので、こちらをご覧下さい。

Pythonで取得したWebページのHTMLを解析するはじめの一歩
初心者かつWindowsユーザー向けにPythonでWebスクレイピングをする方法についてお伝えしています。今回はPythonでWebページのHTMLを解析するはじめの一歩、Beautiful Soupモジュールの使い方です。

HTMLドキュメントを解析するには、まず、HTMLドキュメントからBeautifulSoupオブジェクトを作成する必要があります。

この作業をBeautiful Soupのドキュメントでは、スープの作成と呼んでいます。(本当です!)

kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)

BeautifulSoupオブジェクト(スープ)の作成は下記のようになります。

bs4.BeautifulSoup(HTMLドキュメント, パーサー)

パーサーの部分でどのような形式で解析するか決めます。

lxmlやhtml5libという形式がありますが、今回は標準ライブラリのhtml.parserを使用します。

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

soup = bs4.BeautifulSoup(html, "html.parser")

BeautifulSoupオブジェクト(スープ)が作成できたら、あとは目的の値を取得するだけです。

タイトルの取得

まずは、タイトルを取得してみます。

BeautifulSoupオブジェクトから特定のタグ要素を取得するには、下記のようになります。

BeautifulSoupオブジェクト.タグ名

タイトルを取得するにはタグ名を「title」にすればいいので、コードは下記のようになります。

import json
import urllib.parse
import requests
import bs4

key = '**-#####-*****-#####-*****-#####'

payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'}
payload = json.dumps(payload) #JSONパース
payload = urllib.parse.quote(payload,safe = '') #URIエンコード

url = "https://phantomjscloud.com/api/browser/v2/"+ key+"/?request=" + payload

response = requests.get(url) #GETリクエスト

responseDict = response.json()
html = responseDict["content"]["data"]

soup = bs4.BeautifulSoup(html, "html.parser")
print(soup.title)

実行してみます。

Python_TitleのHTML要素

取得できましたが、これは、HTML要素を表すTagオブジェクトです。

実際には、テキスト部分を抜き出したいですよね!

そんなときは、追加でgetTextメソッドを使用します。

Tagオブジェクト.getText()

先程のコードの20行を下記のように変更します。

print(soup.title.getText())

実行すると、下記のようにタグの中身だけを抜き出せます。

Python_Titleのテキスト

id属性で値を取得

次はid属性で値を取得してみます。

id属性は一つのページに一つしかないので、id属性がわかっていれば、簡単に値を取得できます。

BeautifulSoupオブジェクトからCSSセレクタを使って、Tagオブジェクトを取得するにはselectメソッドを使用します。

id属性から取得するには下記のようになります。

BeautifulSoupオブジェクト.select(#id名)

今回は日付のidは「chosui_hiduke」貯水率のidは「ritsu_today4」なので、コードは下記のようになります。

import json
import urllib.parse
import requests
import bs4

key = '**-#####-*****-#####-*****-#####'

payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'}
payload = json.dumps(payload) #JSONパース
payload = urllib.parse.quote(payload,safe = '') #URIエンコード

url = "https://phantomjscloud.com/api/browser/v2/"+ key+"/?request=" + payload

response = requests.get(url) #GETリクエスト

responseDict = response.json()
html = responseDict["content"]["data"]

soup = bs4.BeautifulSoup(html, "html.parser")
print(soup.title.getText())
print(soup.select('#chosui_hiduke').getText())
print(soup.select('#ritsu_today4').getText())

実行してみます。

Python_日付取得エラー

あれ、エラーが出てしまいましたね。

エラー内容を確認すると、「リストオブジェクトにはgetTextメソッドは使用できません。」となっています。

selectメソッドは複数の値を取得できるように、リスト形式でデータが返ってくるんですね。

リストであることを考慮してコードを修正します。

import json
import urllib.parse
import requests
import bs4

key = '**-#####-*****-#####-*****-#####'

payload = {'url':'https://www.eb.pref.okinawa.jp/kassui/','renderType':'HTML','outputAsJson':'true'}
payload = json.dumps(payload) #JSONパース
payload = urllib.parse.quote(payload,safe = '') #URIエンコード

url = "https://phantomjscloud.com/api/browser/v2/"+ key+"/?request=" + payload

response = requests.get(url) #GETリクエスト

responseDict = response.json()
html = responseDict["content"]["data"]

soup = bs4.BeautifulSoup(html, "html.parser")
print(soup.title.getText())
print(soup.select('#chosui_hiduke')[0].getText())
print(soup.select('#ritsu_today4')[0].getText())

Python_スクレイピング結果

はい、無事に目的の値を取得できました。

まとめ

今回はPythonとPhantomJs CloudでスクレイピングしたデータをBeautifulSoupで解析しました。

GASでは正規表現とmatch関数を使用した部分を、PythonではBeautifulSoupを利用することで、コードをスッキリとすることが出来ました。

今回はPhantomJs Cloudという外部サービスを利用しましたが、実はPython、VBAのようにブラウザを操作することも出来るんです。

次回はPythonでブラウザを操作するseleniumモジュールと Google Chromeのヘッドレスモードについて、お伝えします。

お楽しみに!

連載目次:JavaScriptで動作するWebページを色々な言語でスクレイピング

Webスクレイピングしていて、値が取得できないということはありませんか?

そんな時は、Webサイトの表示にJavaScriptを利用しているからです。

本連載では、色々な言語でその対応をご紹介します!

  1. GASやVBAでスクレイピングができない理由として考えるべきJavaScriptのこと
  2. VBAでIEを操作してJavaScriptで動作するWebページをスクレイピング
  3. GASでJavaScriptで動作するWebページをスクレイピングするPhantomJsとは
  4. GASでPhantomJSを利用してWebページをスクレイピング
  5. GASでスクレイピングしたデータからmatchメソッドと正規表現を使って目的の値を取得
  6. PythonでPhantomJs Cloudを利用してWebページをスクレイピング

エクセルVBAでテーブルのデータ行を追加して値を入力をする方法

$
0
0
list-add

photo credit: jeffdjevdet Shopping List via photopin (license)

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

請求書作成マクロを題材としてエクセルVBAでテーブルを操作する方法についてお伝えするシリーズです。

前回の記事はこちら。

エクセルVBAでテーブルのデータ行についてループ処理を行う方法
請求書マクロを題材にエクセルVBAでテーブル操作する方法をお伝えしています。今回は、ListRowsオブジェクトがポイント。テーブルのデータ行についてループ処理を行う方法についてお伝えしていきます。

テーブルのデータ行についてループ処理をする方法をお伝えしました。

今回は、エクセルVBAでテーブルのデータ行を追加して値を入力をする方法をお伝えしていきますね。

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

今回のお題

さて、今回やりたいことですが、こんなことをやりたいです。

まず、こちらのシートをご覧ください。

ひな形シートのひな形データテーブル

請求書のひな形を表現した「ひな形」シートです。

「ひな形データ」というテーブル名にしたテーブルがありますが、見出し行と集計行はありますが、データ行は一行もありません。

今回はこのデータ行に、行を追加して、さらにデータを入力していきたいと思います。

エクセルVBAでテーブルに行を追加してデータを入力する

では、まずはコードから紹介します。

Sub テーブルの行の追加()

Dim tbTemplate As ListObject
Set tbTemplate = wsTemplate.ListObjects("ひな形データ")

With tbTemplate.ListRows.Add
    .Range(1).Value = "テレビ"
    .Range(2).Value = 100000
    .Range(3).Value = 1
End With

End Sub

なお、テーブルの4列目「価格」フィールドには「=[単価]*[数量]」を入力しておくことにしますね。

こちらのプロシージャを3回実行してみましょうか。

こうなります。

エクセルVBAでテーブルに行を追加して値を入力する

テーブルに実行回数分行が追加され、値も入力することができましたね。

ポイントを以下解説をしていきます。

Addメソッドでテーブルのデータ行を追加する

まずは、6行目ですね。

Withステートメントの対象として「tbTemplate.ListRows.Add」を指定していますね。

これは、「ひな形データ」テーブルの、行コレクションに、新たな行を追加せよ、という命令です。

もう少しちゃんと説明すると、ListRowsコレクションのAddメソッドを使うことで、対象のテーブルに行を追加するということですね。

ListRowsコレクション.Add

Addメソッドの戻り値は追加したListRowオブジェクトになりますので、Withブロックの中は追加したListRowオブジェクトに対する処理となります。

追加したデータ行のセル範囲を取得する

7~9行目を解説しておきましょう。

ここは、追加したListRowオブジェクトについて、Rangeプロパティを使っているということになりますね。

つまり、追加したデータ行のセル範囲の取得になります。

ListRowオブジェクト.Range

試しにイミディエイトウィンドウに以下のように入力して Enter をしてみてください。

? wsTemplate.ListObjects("ひな形データ").ListRows.Add.Range.Address

「ひな形データ」テーブルに1行追加された上で、そのセル範囲が出力されるはずです。

一行のセル範囲からインデックスでセルを指定する

さらに、そのRangeオブジェクトに対して括弧で数値を指定していますよね。

これはインデックスです。

つまり、以下の書式になります。

ListRowオブジェクト.Range(インデックス)

Rangeオブジェクトのインデックスは、セル単位で左から右に、続いて上から下という順番に振られます。

今回の場合、データ行ですから一行分、つまりテーブルの列数の分まで1から順にインデックスが振られているということになりますね。

さらに、品目がA列つまり列番号は1ですから、この振られているインデックスと列番号は等しいということになります。

まとめ

以上、エクセルVBAでテーブルに行を追加する方法と、その行にデータを入力する方法をお伝えしました。

テーブルを使わない場合は、以下の記事のように色々と工夫する必要があったのですが、それも必要ないっすね。

【初心者向けエクセルVBA】行の数をカウントする&不要な行を隠す
今回は行数をカウントする、行を隠す、などの「行を取り扱うテクニック」を紹介しています。いずれもデータや帳票を扱ったエクセルVBAではかなり重宝するテクニックですので、知っておいて損はありませんよ。

テーブル様様です。

次回はいよいよテーブルを使った請求書マクロを作成していきます。

どうぞお楽しみに!

連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る

エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。
  1. エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
  2. エクセルVBAでテーブル名を使用してテーブルを取得する方法
  3. エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
  4. エクセルVBAでテーブルのデータ行についてループ処理を行う方法
  5. エクセルVBAでテーブルのデータ行を追加して値を入力をする方法

エクセルVBAでテーブルを走査して取引先ごとのブックを作るマクロ

$
0
0
tables

photo credit: Spiros Vathis just a kiss via photopin (license)

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

請求書の作成マクロを題材にエクセルVBAでテーブルを操作する方法をお伝えしています。

前回の記事はコチラ。

エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
請求書作成マクロを題材としてエクセルVBAでテーブルを操作する方法についてお伝えするシリーズです。今回は、テーブルのデータ行を追加して値を入力をする、Addメソッドの使い方をお伝えしていきますね。

テーブルに行を追加してデータを入力する方法をお伝えしました。

さて、テーブルの操作方法はだいぶ出揃ったので、今回からそれらをいかして、実際に請求書マクロを作成していきます。

まずは、エクセルVBAでテーブルを走査して取引先ごとのブックを作るところまでを作っていきます。

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

請求書マクロの仕組み

まず、目指す請求書作成マクロの仕組みについて解説をしていきます。

「請求データ.xlsm」というエクセルブックに2つのシートが含まれています。

一つは以下の「データ」シートで、そのオブジェクト名は「wsData」としています。

請求書作成マクロのデータシート

このシートには以下2つのテーブルが作られています。

  • 請求データ」テーブル:請求すべきデータを一覧しているテーブル
  • 取引先マスタ」テーブル:取引のある取引先リスト

なお、2つのテーブルは上記のテーブル名に変更済みです。

もう一つのシートが以下「ひな形」シートで、オブジェクト名は「wsTemplate」です。

請求書作成マクロのひな形シート

こちらのシートは、取引先ごとに作成する請求書のひな形になるシートです。

テーブルは「ひな形データ」というテーブル名で、データ行は含まれていないものです。

請求書マクロの流れ

請求書マクロの流れは、以下のような流れになります。

  1. 「取引先マスタ」テーブルの取引先の数だけ繰り返す
    1. 「ひな形」シートをコピーしてブックを作成
    2. 「請求データ」テーブルの行を走査する
    • その行の取引先が、該当の取引先であれば
      • 作成したブックの「ひな形データ」に行を追加
      • 追加した行に「請求データ」の該当データを転記する
        1. 請求金額を計算して入力する
        2. 請求先の社名や住所などを入力する
        3. ファイル名を決めて保存する

この流れでマクロを作成していきます。

テーブルを走査して取引先ごとにブックを作る

まずは大枠の分のマクロを作成してみました。

コチラです。

Sub 請求書作成()

Dim tbData As ListObject: Set tbData = wsData.ListObjects("請求データ")
Dim tbClient As ListObject: Set tbClient = wsData.ListObjects("取引先マスタ")
Dim rowClient As ListRow, rowData As ListRow

For Each rowClient In tbClient.ListRows
    Dim client As String: client = rowClient.Range(1).Value
    wsTemplate.Copy
    With ActiveSheet
        .Name = client
        '2. 「請求データ」テーブルの行を走査して転記処理などをする
   '3~5. 請求書に必要な他のデータを入力する
    End With
Next rowClient

End Sub

解説をしていきます。

ListObjectオブジェクトとしてテーブルを取得する

3,4行目は、各テーブルをListObjectオブジェクトとして取得する箇所です。

「請求データ」テーブルはtbDataとして、「取引先マスタ」テーブルはtbClientとして取り扱うことができるようになります。

WorksheetオブジェクトのListObjectsコレクションの取得についてはコチラ

エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
エクセルVBAでテーブルを操作する方法について丁寧に解説していきます。今回は、テーブルとは、エクセルのデータリストをテーブルに変換する方法、VBAでテーブルをオブジェクトとして取得する方法をお伝えします。

ListObjectsコレクションからテーブル名でテーブルを取得する方法はコチラですね。

エクセルVBAでテーブル名を使用してテーブルを取得する方法
請求書マクロの作成を題材として、エクセルVBAでテーブルを操作する方法についてお伝えしています。今回は、テーブル名の変更する方法と、テーブル名を使用してテーブルを取得する方法について解説をしていきます。

For Each文でテーブルの全ての行について繰り返す

7~15行目はFor Each文で「取引先マスタ」テーブルの全てのデータ行について繰り返す処理です。

どちらの取引先から処理をすべきか…といった順番は関係がないので、For Each文を使っちゃってます。

繰り返しのたびに、各データ行がrowClientという変数に格納されて、それをループ内で活用することができます。

データ行を表すオブジェクトはListRowオブジェクトです。

ListRowオブジェクトとそのループについては、以下の記事をご覧ください。

エクセルVBAでテーブルのデータ行についてループ処理を行う方法
請求書マクロを題材にエクセルVBAでテーブル操作する方法をお伝えしています。今回は、ListRowsオブジェクトがポイント。テーブルのデータ行についてループ処理を行う方法についてお伝えしていきます。

ListRowオブジェクトの特定の列のセルの値を取得する

8行目は、現在対象となっているデータ行の特定の列のセルの値を取得しています。

Rangeオブジェクトですが、インデックスが1なので、そのテーブルの

  • 現在の対象となっている行=rowClientの
  • 1列目=つまり「取引先名」のセル

のセルを表すRangeオブジェクトです。

Valueプロパティでその値を取得しているので、該当行の取引先名が取得できます。

このあたりは以下記事で紹介しています。

エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
請求書作成マクロを題材としてエクセルVBAでテーブルを操作する方法についてお伝えするシリーズです。今回は、テーブルのデータ行を追加して値を入力をする、Addメソッドの使い方をお伝えしていきますね。

シートのコピーを新規ブックに作成する

そして、9行目は、ひな形シートを新規ブックにコピーする命令です。

WorksheetオブジェクトのCopyメソッドは、引数を与えない場合は、その対象は新規ブックになります。

また、11行目では、そのコピーしたシートのシート名を取引先名に変更をしています。

エクセルVBAは、作成されたブックやシートが直後にActiveになりますから、その特性を利用しています。

実行結果

では、上記プロシージャの実行結果をみてみましょう。

以下のように、取引先の分だけブックが作成されましたね。

取引先ごとにブックを作成するマクロの結果

まとめ

以上、エクセルVBAでテーブルを走査して取引先ごとのブックを作成するマクロを紹介しました。

今回は大枠の処理を作りましたが、次回はその中身の作成を進めていきます。

どうぞお楽しみに!

連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る

エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。
  1. エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
  2. エクセルVBAでテーブル名を使用してテーブルを取得する方法
  3. エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
  4. エクセルVBAでテーブルのデータ行についてループ処理を行う方法
  5. エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
  6. エクセルVBAでテーブルを走査して取引先ごとのブックを作るマクロ

エクセルVBAでテーブル上の請求データを新規ブックに転記するマクロの作り方

$
0
0

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

エクセルVBAでテーブル機能を活用した請求書作成マクロの作成方法についてお伝えします。

前回の記事はコチラ。

エクセルVBAでテーブルを走査して取引先ごとのブックを作るマクロ
請求書の作成マクロを題材に、エクセルVBAでテーブルを操作する方法をお伝えしています。今回は、テーブルを走査して取引先ごとにブックを作成して、請求書のひな形シートをコピーするマクロを紹介します。

テーブルを走査して取引先ごとのブックを作るところまでマクロを作成しました。

今回は、その続きですね。

作成したブックのひな形テーブルに追加した新規データ行に請求データを転記する処理を作成していきます。

エクセルVBAでテーブル上の請求データを新規ブックに転記するマクロの作り方、行ってみましょう!

前回のおさらい

まずは、これまでのおさらいから進めていきます。

「請求データ.xlsm」ブックには、「請求データ」および「取引先マスタ」という2つのテーブルから構成されている「データ」シート(オブジェクト名は「wsData」)と

請求書作成マクロのデータシート

取引先ごとの請求書のひな形となる「ひな形」シート(オブジェクト名は「wsTemplate」)で構成されています。

請求書作成マクロのひな形シート

それで、前回作成したマクロはコチラです。

Sub 請求書作成()

Dim tbData As ListObject: Set tbData = wsData.ListObjects("請求データ")
Dim tbClient As ListObject: Set tbClient = wsData.ListObjects("取引先マスタ")
Dim rowClient As ListRow

For Each rowClient In tbClient.ListRows
    Dim client As String: client = rowClient.Range(1).Value
    wsTemplate.Copy
    With ActiveSheet
        .Name = client
        Dim tbTemplate As ListObject: Set tbTemplate = .ListObjects("ひな形データ")
        '2. 「請求データ」テーブルの行を走査して転記処理などをする
        '3. 請求金額、請求先の社名や住所などの情報を入力する
    End With
    '4. ファイル名を決めて保存する
Next rowClient

End Sub

「取引先マスタ」テーブルの取引先ごとに、「ひな形」シートをコピーした新規ブックを作成するものです。

あとは以下の部分を作っていけば、請求書作成マクロが完成します。

  • 2.それぞれの新規ブックに、「請求データ」のうち該当の取引先の分のデータを転記する
  • 3.請求書として必要な請求金額、請求先の情報
  • 4.ファイル名を決めて保存する

今回は「2」つまり、ブックに該当のデータを転記していく処理を作成していきます。

テーブルのデータ行を走査して値を転記する

上記のコードの「’2. 「請求データ」テーブルの行を走査して転記処理などをする」の部分ですが、以下の処理を挿入します。

Dim i As Long
For i = 1 To tbData.ListRows.Count
    Dim rowData As ListRow: Set rowData = tbData.ListRows(i)
    If rowData.Range(2).Value = client Then
        With tbTemplate.ListRows.Add
            .Range(1).Value = rowData.Range(3).Value
            .Range(2).Value = rowData.Range(4).Value
            .Range(3).Value = rowData.Range(5).Value
        End With
    End If
Next i

解説していきましょう。

テーブルの各行を順番どおりにループする

まず、2~11行目のFor文ですが、tbDataつまり「請求データ」テーブルのListRowsつまり各行についてのループです。

これは、「取引先マスタ」テーブルのループには、順番を考慮しなくて良いのでFor Each文を使用していましたが、「請求データ」テーブルには一応順番が大事かも知れないので、For文にしました。

そのあたりは、以下の記事を再度復習していただければと思います。

エクセルVBAでテーブルのデータ行についてループ処理を行う方法
請求書マクロを題材にエクセルVBAでテーブル操作する方法をお伝えしています。今回は、ListRowsオブジェクトがポイント。テーブルのデータ行についてループ処理を行う方法についてお伝えしていきます。

テーブルの値を別のテーブルの新規データ行に転記する

現在のデータ行つまりrowDataの取引先が、該当の取引先つまりclientのものであれば、「ひな形」テーブルに新規データ行を追加し、データを転記していきます。

新規データ行を追加しているのが5行目。ListRowsコレクションのAddメソッドです。

また、品目、単価、数量といった各データを転記をしているのが6~8行目です。ListRowのセルの位置を取得するにはRangeプロパティでしたね。

このあたりは、以下の記事で詳しく解説をしています。

エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
請求書作成マクロを題材としてエクセルVBAでテーブルを操作する方法についてお伝えするシリーズです。今回は、テーブルのデータ行を追加して値を入力をする、Addメソッドの使い方をお伝えしていきますね。

取引先ごとのブックに請求データを転記するマクロ

以上を組み合わせた、まとめのコードはコチラです。

Sub 請求書作成()

Dim tbData As ListObject: Set tbData = wsData.ListObjects("請求データ")
Dim tbClient As ListObject: Set tbClient = wsData.ListObjects("取引先マスタ")
Dim rowClient As ListRow

For Each rowClient In tbClient.ListRows
    Dim client As String: client = rowClient.Range(1).Value
    wsTemplate.Copy
    
    Dim wb As Workbook: Set wb = ActiveWorkbook
    With ActiveSheet
        .Name = client
        Dim tbTemplate As ListObject: Set tbTemplate = .ListObjects("ひな形データ")
        
        Dim i As Long
        For i = 1 To tbData.ListRows.Count
            Dim rowData As ListRow: Set rowData = tbData.ListRows(i)
            If rowData.Range(2).Value = client Then
                With tbTemplate.ListRows.Add
                    .Range(1).Value = rowData.Range(3).Value
                    .Range(2).Value = rowData.Range(4).Value
                    .Range(3).Value = rowData.Range(5).Value
                End With
            End If
        Next i

        '3. 請求金額、請求先の社名や住所などの情報を入力する
    End With
    '4. ファイル名を決めて保存する

End Sub

実行をすると、以下のように各取引先ごとのブックの「ひな形」テーブルに、それぞれ対象となるデータ行の値が転記されていることを確認できます。

請求書マクロで取引先ごとのブックに請求データを転記した

まとめ

以上、エクセルVBAでテーブル上の請求データを新規ブックに転記するマクロの作り方でした。

ほぼほぼ請求書作成マクロとしては完成に近づいてきましたね。

次回、あと一息、作り込んでマクロを完成をさせていきたいと思います。

どうぞお楽しみに!

連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る

エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。
  1. エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
  2. エクセルVBAでテーブル名を使用してテーブルを取得する方法
  3. エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
  4. エクセルVBAでテーブルのデータ行についてループ処理を行う方法
  5. エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
  6. エクセルVBAでテーブルを走査して取引先ごとのブックを作るマクロ
  7. エクセルVBAでテーブル上の請求データを新規ブックに転記するマクロの作り方

PythonでOpenPyXLを使いExcelのグラフを作成する〜グラフのつくりかた編〜

$
0
0

こんにちは。@katsuhisa__です。

PythonのOpenPyXLモジュールを使い、面倒で退屈なExcel作業をPythonで自動化する方法をお伝えする連載の十一記事目です!

連載一記事目はこちら。

PythonでExcel作業を自動化するOpenPyXLのはじめての使い方
Excel 間でのセルをコピーしたり、退屈な作業を、Pythonで自動化してみませんか?OpenPyXLを使えば、PythonでかんたんにExcel 作業を実現できます。本記事では、PythonでExcelファイルを操作するモジュールOpenPyXLのはじめての使い方(初心者向け)についてご紹介します!

前回は、OpenPyXLでExcelのグラフを作成するために利用するChartオブジェクトをご紹介しました。

今回は、具体的にグラフのつくり方について詳細をご説明いたします。

OpenPyXlでExcelのグラフを作成する

まずは、前回のサンプルコードを再度見てみましょう。

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
for i in range(10):
    ws.append([i])

from openpyxl.chart import BarChart, Reference, Series
values = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10)
chart = BarChart()
chart.add_data(values)
ws.add_chart(chart, "E15")
wb.save("SampleChart.xlsx")

作成されたExcelファイルはこちら。

前回は、Chartオブジェクト、Referenceオブジェクト、Seriesオブジェクトの使い方をご紹介しましたが、それぞれを組み合わせてグラフをつくる一連の流れについてはご説明しませんでした。

今回は、上記コードの解説をしながら、具体的にOpenPyXLでグラフをつくる方法をご説明します。

OpenPyXLでグラフをつくる方法

OpenPyXLでグラフをつくるには、以下3つのステップに大別されます。

  1. グラフの種類を決める
  2. グラフが読み込むデータを決める
  3. グラフをつくる

それぞれ解説します。

グラフの種類を決める

chart = BarChart()

前回、Chartオブジェクトについてご説明しましたが、Chartオブジェクトには、グラフの種類ごとにサブモジュールが用意されており、利用したいサブモジュールをインポートして利用します。

今回は、上記のサンプルコードからもわかるように、BarChart(棒グラフ)をインポートして利用しています。

Chartオブジェクトは、様々な属性を持っており、グラフのタイトルを変更したり、グラフ自体の大きさを変更することもできます。

例えば、以下のように書くことができます。

chart1 = BarChart()
chart1.title = "棒グラフ"
chart1.y_axis.title = 'Test number'
chart1.x_axis.title = 'Sample length'

グラフが読み込むデータを決める

次に、グラフが読み込むデータを決めます。サンプルコードでは、以下の部分がそれに該当します。

values = Reference(ws, min_col=1, min_row=1, max_col=1, max_row=10) 
chart.add_data(values)

前回、Referenceオブジェクトをご紹介しましたが、Referenceオブジェクトによって、範囲選択したセルのオブジェクトをつくります。

Chartオブジェクトのadd_dataメソッドで、Referenceオブジェクトで指定したデータを追加します。

ちなみに、add_dataメソッドは、titles_from_dataという引数を指定することができます。titles_from_data=Trueを指定すると、指定したデータ領域の先頭行を、グラフのラベルとして使用することができます

デフォルトでは、Falese(無効)になっています。

グラフをつくる

最後にグラフをつくりましょう。これはかんたんですね。

ws.add_chart(chart, "E15")

ワークブックオブジェクトは、add_chartというメソッドを持っており、add_chartを使用すれば、指定した位置にChartオブジェクトを配置することができます

上記サンプルコードでは、E15に、chartを置く、といった具合です。

さいごに

以上、OpenPyXLでExcelのグラフをつくる方法でした。

さて、これでOpenPyXLの基本的な使い方は一通りがすべて完了しました。次は、みなさんご自身が実際にOpenPyXLでExcel業務を効率化していく番です。

すべてのExcel業務をOpenPyXLで自動化していくのではなく、まずは繰り返し発生している手作業などに注目し、OpenPyXLを適用する範囲を見定めていくとよいでしょう。

では、長らく連載をお読みいただき、ありがとうございました。新しい連載にご期待ください!

新しい連載の更新情報は、管理人のタカハシ(@ntakahashi0505)さんのTwitterアカウントや、もちろん私のアカウント(@katsuhisa__)で配信していくので、もしよければ、フォローをお願いします!

連載目次:PythonでExcelを操作するモジュールOpenPyXL

OpenPyXLというモジュールを使うことでPythonでExcelファイルを操作することができます。本シリーズでは初心者向けにExcelファイルの作業をPythonで自動化する方法をお伝えします。
  1. PythonでExcel作業を自動化するOpenPyXLのはじめての使い方
  2. OpenPyXLで複数のセルの値を取得する方法
  3. OpenPyXLでExcelファイルの新規作成・保存を行う方法
  4. PythonでOpenPyXLを使ってExcelのシートを追加・削除する方法
  5. PythonでOpenPyXLでExcelのセルに値を入力する方法と編集する方法
  6. PythonでOpenPyXLを使いExcelのフォントを設定する方法
  7. PythonでOpenPyXLを使いExcelに数式を入力する方法
  8. PythonでOpenPyXLを使いExcelの行と列について色々な設定をする方法
  9. PythonでOpenPyXLを使いExcelの行と列を固定する方法
  10. PythonでOpenPyXLを使いExcelのグラフを作成する〜Chart関連オブジェクトの紹介〜
  11. PythonでOpenPyXLを使いExcelのグラフを作成する〜グラフのつくりかた編〜

エクセルVBAで請求書作成マクロをテーブルを活用して作る

$
0
0
invoice

photo credit: Andrew Stawarz Fenman’s Cottage via photopin (license)

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

エクセルVBAで請求書作成マクロのテーブルを活用したバージョンを作成しています。

前回の記事はコチラ。

エクセルVBAでテーブル上の請求データを新規ブックに転記するマクロの作り方
エクセルVBAでテーブル機能を活用した請求書作成マクロの作成方法についてお伝えしてます。今回は、テーブル上の請求データを走査して、取引先ごとの新規ブックに転記するマクロの作り方をお伝えしていきます。

請求書マクロの中枢部ともいっていい、請求データを該当の取引先用のブックのテーブルに転記をしていく処理を作成しました。

今回はいよいよ仕上げをして完成をさせます。

ということで、エクセルVBAで請求書作成マクロをテーブルを活用して作成する方法です。

行ってみましょう!

前回のおさらい

まずは、目指すべきマクロのゴールについてお伝えします。

ブック「請求データ.xlsm」には、まず以下の「データ」シート(オブジェクト名は「wsData」)があります。

請求書作成マクロのデータシート

「取引先マスタ」テーブルの分だけ、請求書を作る必要があり、その請求書には**「請求データ」テーブルの該当のデータを転記していきます。

そして、その取引先ごとに作る請求書のひな形となるのが以下の「ひな形」シート(オブジェクト名は「wsTemplate」)です。

請求書作成マクロのひな形シート

それで、前回までに作成したコードがコチラです。

Sub 請求書作成()

Dim tbData As ListObject: Set tbData = wsData.ListObjects("請求データ")
Dim tbClient As ListObject: Set tbClient = wsData.ListObjects("取引先マスタ")
Dim rowClient As ListRow

For Each rowClient In tbClient.ListRows
    Dim client As String: client = rowClient.Range(1).Value
    wsTemplate.Copy
    
    Dim wb As Workbook: Set wb = ActiveWorkbook
    With ActiveSheet
        .Name = client
        Dim tbTemplate As ListObject: Set tbTemplate = .ListObjects("ひな形データ")
        
        Dim i As Long
        For i = 1 To tbData.ListRows.Count
            Dim rowData As ListRow: Set rowData = tbData.ListRows(i)
            If rowData.Range(2).Value = client Then
                With tbTemplate.ListRows.Add
                    .Range(1).Value = rowData.Range(3).Value
                    .Range(2).Value = rowData.Range(4).Value
                    .Range(3).Value = rowData.Range(5).Value
                End With
            End If
        Next i

        '3. 請求金額、請求先の社名や住所などの情報を入力する
    End With
    '4. ファイル名を決めて保存する

End Sub

取引先ごとにブックを作り、ひな形シートをコピーし、該当の請求データを転記するまでの処理はできています。

あとは、以下の2つの処理を追加すればOKですね。

  • 3.請求金額、請求先の社名や住所などの情報を入力する
  • 4.ファイル名を決めて保存する

請求書に必要な情報を転記する

まずは「 3.請求金額、請求先の社名や住所などの情報を入力する」ですが、以下のようなコードを作りました。

Dim total As Long: total = .Range("D21").Value + .Range("D22").Value
.Range("A19").Value = "ご請求金額: " & Format(total, "#,##0") & " 円"

.Range("A3").Value = client & " 御中"
.Range("A5").Value = rowClient.Range(2).Value
.Range("A6").Value = rowClient.Range(3).Value
.Range("A7").Value = rowClient.Range(4).Value

Valueプロパティで取り出した値を、該当のセルのRangeオブジェクトに書き込んでいくだけですので、複雑な処理ではありません。

2行目のFormat関数については、以下の記事もご参考ください。

【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
エクセルVBAで文字列を連結する、文字列の書式を変更するなどの「文字列」に関するいくつかのテクニックを紹介しつつ、データ一覧から請求書を自動で作成するというシリーズ連載の序盤の完成を目指します。

ファイル名を決めて保存する

続いて、「4.ファイル名を決めて保存する」の処理です。

コチラです。

Dim fileName As String
fileName = ThisWorkbook.Path & "\" & Format(Date, "yyyymm") & "請求書_" & client & ".xlsx"
wb.SaveAs fileName
wb.Close

ファイル名を生成して、その名前で保存をして閉じるというものですね。

保存先は、現在マクロを書いているブック「請求データ.xlsm」と同じフォルダになります。

このあたりの処理については以下の記事で詳しく紹介しています。

【初心者向けエクセルVBA】ワークブックを別名で保存して閉じる方法
初心者向けエクセル VBAのシリーズとして、請求書を作成するマクロの作り方についてお伝えしています。今回は、ワークブックをSaveAsメソッドで別名で保存し、Closeメソッドで閉じる方法をお伝えします。

テーブルを使った請求書マクロ

さて、まとめのコードはコチラです。

Sub 請求書作成()

Dim tbData As ListObject: Set tbData = wsData.ListObjects("請求データ")
Dim tbClient As ListObject: Set tbClient = wsData.ListObjects("取引先マスタ")
Dim rowClient As ListRow

For Each rowClient In tbClient.ListRows
    Dim client As String: client = rowClient.Range(1).Value
    wsTemplate.Copy
    
    Dim wb As Workbook: Set wb = ActiveWorkbook
    With ActiveSheet
        .Name = client
        Dim tbTemplate As ListObject: Set tbTemplate = .ListObjects("ひな形データ")
        
        Dim i As Long
        For i = 1 To tbData.ListRows.Count
            Dim rowData As ListRow: Set rowData = tbData.ListRows(i)
            If rowData.Range(2).Value = client Then
                With tbTemplate.ListRows.Add
                    .Range(1).Value = rowData.Range(3).Value
                    .Range(2).Value = rowData.Range(4).Value
                    .Range(3).Value = rowData.Range(5).Value
                End With
            End If
        Next i

        Dim total As Long: total = .Range("D21").Value + .Range("D22").Value
        .Range("A19").Value = "ご請求金額: " & Format(total, "#,##0") & " 円"
        
        .Range("A3").Value = client & " 御中"
        .Range("A5").Value = rowClient.Range(2).Value
        .Range("A6").Value = rowClient.Range(3).Value
        .Range("A7").Value = rowClient.Range(4).Value

    End With
     
    Dim fileName As String
    fileName = ThisWorkbook.Path & "\" & Format(Date, "yyyymm") & "請求書_" & client & ".xlsx"
    wb.SaveAs fileName
    wb.Close
    
Next rowClient

End Sub

実行をすると、今回は新規作成されたブックは開きっぱなしにはならずに、一度閉じます。

以下のように、マクロを記述しているブックと同じフォルダに保管されます。

取引先ごとに作成したブックを保存したフォルダ

そして、それぞれを開くと以下のような内容になっています。

取引先ごとに作成した請求書ブックを開く

まとめ

以上、エクセルVBAでテーブルを使った請求書作成マクロについて紹介をしました。

今回、新たに追加した処理はテーブルかどうかに関わらずで活用できるものでしたね。

さて、全体を見渡すと、少しコードは長くなりましたが、テーブルを活用しているおかげでシート数も少なくて済みますし、可読性は比較的高いのではないかと思います。

全く同じ機能ではありませんが、以下の記事の完成コードと比較してみてください。

【初心者向けエクセルVBA】取引先別に請求書を作成するマクロを作る
初心者向けのエクセルVBAのシリーズとして、請求書を作成するマクロの作り方をお伝えしています。これまで紹介してきたテクニックを元に、取引先ごとに別のブックで請求書を作成するマクロを完成させていきます。

さて、これにて完成としてもいいのですが、よりよいコードを目指して、次回は列挙体を使ってみたいと思います。

どうぞお楽しみに!

連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る

エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。
  1. エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
  2. エクセルVBAでテーブル名を使用してテーブルを取得する方法
  3. エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
  4. エクセルVBAでテーブルのデータ行についてループ処理を行う方法
  5. エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
  6. エクセルVBAでテーブルを走査して取引先ごとのブックを作るマクロ
  7. エクセルVBAでテーブル上の請求データを新規ブックに転記するマクロの作り方
  8. エクセルVBAで請求書作成マクロをテーブルを活用して作る

チャットワークのユーザー会「ChatWork Café 東京 Vol.3 ~新サービス使いこなし術~」開催レポート

$
0
0

chatwork

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

さあ、開催されました「ChatWork Café 東京 Vol.3 ~ChatWorkの新サービス使いこなし術~」

いや~、今回もほんっ…とうにタメになりました。

今までのChatWork Café 東京では、特にテーマを決めていなかったので、「チャットワークの使い方」や「チャットワークの導入の仕方」が中心のお話になっていたのですが、今回フォーカスしたのは…

ChatWork 電話代行やChatWork アシスタントなどの新規サービス

…チャレンジしましたでしょ??

でも、あえてこのテーマにしたのは良かったかなと終わってみると思いますよ。

ということで、そんな「ChatWork Café 東京 Vol.3」のレポートをお届けしてまいります。

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

ChatWork Caféとは?

ChatWork Caféは、チャットワークのユーザー会です。

チャットワークの使い方や導入の仕方、ノウハウなどについて、ユーザーどうしで共有して学び合うコミュニティです。

今回も、ChatWorkさんのシアタールームをお借りしているので、「ChatWork主催でしょ?」って思われるかも知れませんが、そういうわけではないのです。

ユーザーのうち「はい、私やりまーす」という方々が集まって開催、運営をしているものです。

会場準備、受付、ケータリング、写真…そういったものは、有志によってお手伝いいただいています。感謝です。

また、とはいえ、ChatWorkさんにはだいぶお世話になってしまっています…感謝です。

ChatWork Café 東京 Vol.3のプログラム

今回は、はじめてテーマを決めました。

「ChatWorkの新サービス使いこなし術」ということで、ChatWork 電話代行、ChatWork アシスタントなどの新規サービスをメインに据えてみようというチャレンジブルなものでした。

そして、パネルディスカッション多め。

まあ、これまでも会場全員参加のパネルディスカッションみたいな雰囲気でしたので、なんとかなるかな…と思っていましたが。

さ、そんなイベントページはコチラ。

ChatWork Café東京Vol.3「ChatWorkの新サービス使いこなし術」 #cwcafe on EventOn
チャットワークユーザーが集まり、チャットワークについて主体的にかつ楽しく学び、共有するためのチャットワークユーザーコミュニティ「ChatWork Café」。東京での開催第3回目です。今回は「ChatWorkアシスタント」や「ChatWork電話代行」などの新サービスにフォーカス!サービス内容はもちろん、活用事例やその...

そして、ツイートまとめはコチラになりますので、合わせてご覧くださいね。

ChatWork Café 東京Vol.3「ChatWorkの新サービス使いこなし術」 #cwcafe
チャットワークユーザーが集まり、チャットワークについて主体的にかつ楽しく学び、共有するためのチャットワークユーザーコミュニティ「ChatWork Café」。東京での開催第3回目です。

ChatWorkの新規事業について

ChatWork Café 東京 Vol.3その1

まずは、ChatWork株式会社の守岡さんから、「新規事業」と呼ばれる以下3つのサービスの概要と、新規事業の役割についてお話いただきました。

もともとChatWorkには「世界の働き方を変える」というビジョンがあります。

チャットワークというプロダクト自体、それを目指していらっしゃるのですが、プロダクト以外でできまいか、というミッションを推進しているのが「新規事業」ということになります。

そして、現時点でリリースしているのが、上記3つ。

前回のChatWork Café 東京でも

チャットワークにサインアップしたら、武器がいっぱい揃ってる!というような存在

というお話があったとおり、あの手この手でビジョンを達成すべく進んでいらっしゃるんだな…と思います。

そして、これからも増えていく可能性も…?

今後の展開も楽しみです。

ChatWork電話代行について

ChatWork Café 東京 Vol.3その2

次のセッションは、「ChatWork電話代行について」のパネルディスカッションです。

パネラーは株式会社GoQSystem竹本さん、モデレータとして株式会社ネオラボ中岡さんで進行いただきました。

GoQSystem(ゴクーシステム)さんは、システム会社さん。社内で「一斉休憩制度」(昼休みと午後の決まった時間に3回)を導入しようとした際に、お客様からのサポート電話が課題となりました。

その「誰が電話に出るのか」問題の解決として導入したのがChatWork 電話代行ということになります。

そもそもChatWork 電話代行とは

ChatWork 電話代行は受けた入電の内容を指定のグループチャットに報告してくれるというサービス

これにより、皆さんは気兼ねなく「一斉休憩」できるようになりました。

このニーズは、けっこういろんな会社さんでもありますよね…?

月1万円から利用でき、かつ普段使っているチャットワークが使える…導入ハードルも低いので、ぜひご検討いただくと良いのではないでしょうか。

ちなみに、ユーザーさんたちからの要望としては

  • 「To:」をつけてもらえると嬉しい
  • 回線としては一斉に何件まで受けてもらえるの?

とか、様々な質問や要望が飛び交ってました。これも、ユーザー会ならではですね。

ChatWorkアシスタントについて

ChatWork Café 東京 Vol.3その3

続いては「ChatWork アシスタント」についてのパネルディスカッション

歯医者さん向けのシステムを提供されている株式会社ストランザの西島さん、マーケティングや制作依頼サービス「制作秘書」などを提供されているシクロマーケティング株式会社の山口さんのご両名にご登壇いただきました。

モデレータは、最近ChatWork アシスタントを活用しはじめた私、プランノーツ高橋です。

ChatWork アシスタントとは

ChatWork アシスタントはチャットワーク上で依頼できる様々な業務を依頼できるサービスです。

フロント担当さんがついてくださるので、そこに依頼を投げると、たくさんのアシスタントさんたちがいるネットワークから、スキルやスケジュールについてマッチした方をアシスタントさんを探し出して、こなしてくれるというサービスです。

料金は月7万円~で、月間30時間~のお仕事を依頼することができます。

外部&オンラインの強みとは

さて、ご登壇のお二人からたっぷりお話が聴くことができて、それだけで1本くらい記事かけそうなのですが、印象に残ったところを…

外部のほうが「頼みやすい」

ChatWork アシスタントはそもそも仕事を待ち受けてくださり、かつネットワーク上に様々なスキルの方がいるので、ひとまず投げてみるとヒットしたりするそう。

社内だと、スキルとか事情とか見えて、頼みづらいこと…ありますものね。

ChatWork アシスタントは「保険」

社内のメンバーに依存していると、その方が急に休むとき、退職するときなどに業務が回らなくなるというリスクがあります。

ChatWork アシスタントにお任せしている業務であれば、その心配はないと…なるほどですね!

依頼した内容のマニュアルを作ってもらう

色々と相談しながら依頼したら、そのマニュアルを納品してもらうというアイデアです。そうすることで、社内で新人さんが入社されたときなど、そのマニュアルを再利用できるとのこと。

…アイデアですね!

今回、お話を聴いてだいぶ印象が変わったのですが、「外部」「オンライン」というと限られた業務しか頼めないのでは?制約が多いのでは?というデメリットのイメージが湧くのですが、むしろ逆でした。

「外部」で「オンライン」だからこそ、安定性や確実性のある体制が組めるという考え方もあるんですね。

イメージがぶち壊されましたよ…!

チャットワークのビジョンとプロダクトについて

ChatWork Café 東京 Vol.3その4

最後にChatWork株式会社、チャットワークのPMを担当されている石田さんから、チャットワークのビジョンとプロダクトについてのこれからの予定についてお話いただきました。

オフレコだらけなので、あんまり詳しくかけないのが残念ですが…楽しみなアップデートが目白押しです。

そんなにお話いただいていいの?…てくらいお話いただいてしまいました。ま、このへんはユーザー会に参加した人だけの特権ですね。

以前から変わらず、チャットワークには「コミュニケーションの関係を良くする」というコンセプトがあり、既読のありなしとか、通知をどうするとか、細やかなところまでを考え抜かれて作られています。

チャットワークには既読がつかない、その優しい理由とは?
ビジネスにおいてコミュニケーションはとても重要です。それを強力にサポートするツールであるチャットワークですが、なぜ既読がつかないのか、その優しい理由についてお伝えしつつ、魅力に迫ってみたいと思います。

引き続き、それが徹底されているなぁ…と、とても安心かつホットな気持ちになりました。

ちょうど、先日もChatWork LiveのUI刷新のニュースがありましたね。

「ChatWork Live」のUI刷新!見やすくなったビデオ通話画面でテレワークも快適に | ChatWorkブログ
ChatWorkブログ: 「ChatWork Live」のUI刷新!見やすくなったビデオ通話画面でテレワークも快適に

これからも様々なアップデートを期待できるのではないかと思いますよ。

まとめ

ChatWork Café 東京 Vol.3その5

さて、ChatWork Café 東京 Vol.3のレポートをお送りいたしました。

今回、新規事業という切り口で勝負してみたのですが、一回のイベントでは足りない!ってくらいノウハウがありました。

私なんかも、多少は詳しいつもりでチャットワークを使っていますが、全然ですね。

世の中の「知」はまだまだたくさんあって、共有をするだけでシナジーが得られるケースってたくさんあるのではないかと思います。

しかも、自社では当たり前と思っていることが、他社では喉から手が出るほど欲しいノウハウだった、ということもあるんですよね。

ユーザー会としては、そのような場所と機会を提供するべく、引き続き運営をしていきたいと思います。

ぜひ、この記事をご覧の皆様。次回のChatWork Caféにて、チャットワークについての学び合いの場にご参加をいただければと思います!

エクセルVBAでテーブルと列挙体を組み合わせると最強のコードが書ける理由

$
0
0
tables-enum

photo credit: Sheep”R”Us Wedding decorations via photopin (license)

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

エクセルVBAでテーブルを活用して請求書を作成するマクロを作成しています。

前回の記事はコチラ。

エクセルVBAで請求書作成マクロをテーブルを活用して作る
エクセルVBAで請求書作成マクロのテーブルを活用したバージョンを作成しています。今回は、請求書に必要な情報を転記する、ファイル名を決めて別名で保存して閉じるなどの処理を追加し、仕上げをして完成をさせます。

もう、完成しちゃいました。

で、なぜ続きを書いているかというと、テーブルと列挙体の組み合わせが最強だからです。

なんじゃそりゃ?って感じですよね。列挙体を取り入れると、請求書マクロの可読性とメンテナンス性が一気に上るんです。

ということで本記事では、エクセルVBAを使う際にテーブルと列挙体とを組み合わせるメリットについてお伝えしていきますよ。

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

前回のおさらい

では、まず前回のおさらいからです。

作成したコードはコチラ。

Sub 請求書作成()

Dim tbData As ListObject: Set tbData = wsData.ListObjects("請求データ")
Dim tbClient As ListObject: Set tbClient = wsData.ListObjects("取引先マスタ")
Dim rowClient As ListRow

For Each rowClient In tbClient.ListRows
    Dim client As String: client = rowClient.Range(1).Value
    wsTemplate.Copy
    
    Dim wb As Workbook: Set wb = ActiveWorkbook
    With ActiveSheet
        .Name = client
        Dim tbTemplate As ListObject: Set tbTemplate = .ListObjects("ひな形データ")
        
        Dim i As Long
        For i = 1 To tbData.ListRows.Count
            Dim rowData As ListRow: Set rowData = tbData.ListRows(i)
            If rowData.Range(2).Value = client Then
                With tbTemplate.ListRows.Add
                    .Range(1).Value = rowData.Range(3).Value
                    .Range(2).Value = rowData.Range(4).Value
                    .Range(3).Value = rowData.Range(5).Value
                End With
            End If
        Next i

        Dim total As Long: total = .Range("D21").Value + .Range("D22").Value
        .Range("A19").Value = "ご請求金額: " & Format(total, "#,##0") & " 円"
        
        .Range("A3").Value = client & " 御中"
        .Range("A5").Value = rowClient.Range(2).Value
        .Range("A6").Value = rowClient.Range(3).Value
        .Range("A7").Value = rowClient.Range(4).Value

    End With
     
    Dim fileName As String
    fileName = ThisWorkbook.Path & "\" & Format(Date, "yyyymm") & "請求書_" & client & ".xlsx"
    wb.SaveAs fileName
    wb.Close
    
Next rowClient

End Sub

ちょいと長いですが、簡単に解説をしますね。

以下の「データ」シート(オブジェクト名は「wsData」)の「取引先マスタ」テーブルにある取引先の分だけ請求書を作ります。

請求書作成マクロのデータシート

それで、上記の「請求データ」テーブルの各データを各取引先ごとの請求書に転記していきたいんですね。

そして、その転記をする先となるひな形が以下の「ひな形」シート(オブジェクト名は「wsTemplate」)です。

請求書作成マクロのひな形シート

マジックナンバーを避けるべき理由

上記のプログラムで十分なのですが、もうちょっと良くしていきたいんですね。

どう良くしていきたいか…例えば、前述のプログラムの20~24行目をご覧ください。

With tbTemplate.ListRows.Add
    .Range(1).Value = rowData.Range(3).Value
    .Range(2).Value = rowData.Range(4).Value
    .Range(3).Value = rowData.Range(5).Value
End With

はい、ここだけ見て、何をどこに転記しているか、わかりますか?

わかりませんよね?

何が悪さをしているかというと、「数字」です。

1とか2とか3とか4とか書かれても、それが何者なのか、実際のテーブルの様子を見ないとわからないのです。

このように、コード内にベタ打ちで書かれた数値を「マジックナンバー」といいます。

マジックナンバーは数値以外の情報を持たないので、可読性を低下させる要因になりがち…、ですから基本的に避けるべきです。

それを防ぐ方法として、列挙体を使うという方法が有効です。

テーブルの列挙体を定義する

さて、列挙体の定義の方法をお伝えします。

モジュールの宣言セクションで以下のように定義をします。

Enum 列挙体名
 メンバー名1[ = 値1]
 メンバー名2[ = 値2]
 …
End Enum

これを宣言しておくことで、以下のように各メンバーの値を取り出すことができます。

列挙体名.メンバー名

詳しい定義の仕方は以下の記事をご覧くださいね。

エクセルVBAでシートの列の挿入も簡単に対応できちゃう列挙体の使い方
エクセルVBAで請求データ一覧から請求書を自動で作成する方法のシリーズ。今回は、Enumステートメントで定義する「列挙体」というものを使って、シートの列の挿入も簡単に対応する方法をお伝えします。

列挙体を使った請求書作成マクロ

では、列挙体を活用した場合に、請求書作成マクロがどのようなコードになるか紹介しましょう。

こうなります。

Enum eData
    納品日 = 1
    取引先名
    品目
    単価
    数量
    価格
End Enum

Enum eClient
    取引先名 = 1
    郵便番号
    住所1
    住所2
End Enum

Enum eTemplate
    品目 = 1
    単価
    数量
    価格
End Enum

Sub 請求書作成()

Dim tbData As ListObject: Set tbData = wsData.ListObjects("請求データ")
Dim tbClient As ListObject: Set tbClient = wsData.ListObjects("取引先マスタ")
Dim rowClient As ListRow

For Each rowClient In tbClient.ListRows
    Dim client As String: client = rowClient.Range(eClient.取引先名).Value
    wsTemplate.Copy
    
    Dim wb As Workbook: Set wb = ActiveWorkbook
    With ActiveSheet
        .Name = client
        Dim tbTemplate As ListObject: Set tbTemplate = .ListObjects("ひな形データ")
        
        Dim i As Long
        For i = 1 To tbData.ListRows.Count
            Dim rowData As ListRow: Set rowData = tbData.ListRows(i)
            If rowData.Range(eData.取引先名).Value = client Then
                With tbTemplate.ListRows.Add
                    .Range(eTemplate.品目).Value = rowData.Range(eData.品目).Value
                    .Range(eTemplate.単価).Value = rowData.Range(eData.単価).Value
                    .Range(eTemplate.数量).Value = rowData.Range(eData.数量).Value
                End With
            End If
        Next i

        Dim total As Long: total = .Range("D21").Value + .Range("D22").Value
        .Range("A19").Value = "ご請求金額: " & Format(total, "#,##0") & " 円"
        
        .Range("A3").Value = client & " 御中"
        .Range("A5").Value = rowClient.Range(eClient.郵便番号).Value
        .Range("A6").Value = rowClient.Range(eClient.住所1).Value
        .Range("A7").Value = rowClient.Range(eClient.住所2).Value

    End With
     
    Dim fileName As String
    fileName = ThisWorkbook.Path & "\" & Format(Date, "yyyymm") & "請求書_" & client & ".xlsx"
    wb.SaveAs fileName
    wb.Close
    
Next rowClient

End Sub

テーブルの列番号を列挙体で表すメリット

ご覧いただければわかりますが、各列挙体は以下のテーブルの列番号を表すものです。

  • 「請求データ」テーブルの列番号: eData
  • 「取引先マスタ」テーブルの列番号: eClient
  • 「ひな形データ」テーブルの列番号: eTemplate

例えば、44~46行目をご覧いただければ、「請求データ」テーブルの品目から数量の値を、「ひな形データ」テーブルの品目から数量の列に転記しているというのが、なんとなくわかりますよね。

つまり、どの列を表すのかの情報を直接見て取れるようになります。

また、それぞれテーブルになっていますので、列番号を1から整然と順に列挙することができます。

テーブルじゃなかったら、例えば取引先マスタの取引先名の列番号は「8」になったりするのです。

テーブルにしているから「1」にすれば済みますし、それ以降も順番に列挙すればOKです。

つまり、テーブルと列挙体の組み合わせ…最強、なわけです。

まとめ

以上、エクセルVBAでテーブルと列挙体を活用した請求書マクロを紹介しました。

このように、テーブルと列挙体をうまく組み合わせることにより、可読性が上がりますし、メンテナンス性も高く保持できます。

ぜひご活用くださいね。

以上で本シリーズは終了となります。

また、便利なテクニックを見つけたら紹介しますね、どうぞお楽しみに!

連載目次:エクセルVBAでテーブルを活用した請求書マクロを作る

エクセルのとっても便利な機能「テーブル」。VBAで操作するときも、テーブルならではの便利さを味わうことができます。請求書マクロを題材にVBAによるテーブルの操作方法をお伝えしていきます。
  1. エクセルVBAでテーブル操作~そのメリットと変換方法&ListObjectの取得
  2. エクセルVBAでテーブル名を使用してテーブルを取得する方法
  3. エクセルVBAでテーブルの見出し行・データ行・集計行の範囲の取得をする方法
  4. エクセルVBAでテーブルのデータ行についてループ処理を行う方法
  5. エクセルVBAでテーブルのデータ行を追加して値を入力をする方法
  6. エクセルVBAでテーブルを走査して取引先ごとのブックを作るマクロ
  7. エクセルVBAでテーブル上の請求データを新規ブックに転記するマクロの作り方
  8. エクセルVBAで請求書作成マクロをテーブルを活用して作る
  9. エクセルVBAでテーブルと列挙体を組み合わせると最強のコードが書ける理由

エクセルVBAでOutlookの連絡先を登録する方法

$
0
0

vba,outlook,contact,eyecatch

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

エクセルVBAでOutlookを操作してみようということで、前回まではエクセルシートに記入された内容を、Outlookのメールで指定した宛先に送信する方法をご紹介してきました。

【エクセルVBA】エクセルシートに一覧化された複数の連絡先に本文を変えつつOutlookでメールを一括送信する方法
エクセルVBAでOutlookを操作して、複数の送信先に、各メールの本文を変えつつ、メール送信する方法をご紹介しています。メールの冒頭部の宛名をコピペで作成していた方、もしかしたらこの方法でメール送信の手間が軽減できるかもしれません。
エクセルVBAでOutlookメールの下書きを作成・表示して送信前に内容チェックする
OutlookのMailItemオブジェクトのDisplayメソッドを使って、VBAで作成したOutlookのメール内容を、メール送信前にチェックする方法をご紹介しています。「VBAでメールを作成するのは便利だけど、内容をチェックしないでメール送信してしまうのは心配...」という方にお勧めです。

1件でも複数件でも、固定本文でも本文を変えながらでも、VBAなら簡単にメールが送信できる!ということをご紹介してきました。

しかし、Outlookの手動操作で煩わしいのはメールだけではありませんよね。

Outlookの連絡先も手で登録するのはなかなか面倒臭かったりします。

例えば、お仕事の引継ぎなどで前任者から取引先の連絡先をエクセルシートに記入されたリストで渡されたとしたら…?

それ、エクセルVBAで一括登録できちゃうかもしれませんよ。

ということで、今回はエクセルVBAでOutlookの連絡先を登録する方法をご紹介していきます。

Outlookの連絡先を操作するContactItemオブジェクト

Outlookの連絡先も、VBAでOutlookの新しいメールを作成する時に使用したMailItemオブジェクトのように、新しい連絡先を操作するためのオブジェクトがあります。

それは、ContactItemオブジェクト

このオブジェクトをCreateItemオブジェクトで作成すると、Outlookで「新しい連絡先」を開いたときのように、新しい連絡先を登録するための、氏名やメールアドレス、連絡先といった項目を指定するプロパティや、連絡先の保存などといったメソッドが使用できます。

CreateItemメソッドでContactItemオブジェクトを作成する

では、ContactItemオブジェクトを作成していきましょう。

まずはContactItem型変数の宣言をします。

Dim オブジェクト名 As Outlook.ContactItem

そして、CreateItemメソッドでContactItemオブジェクトを作成します。

パラメータにはContactItemオブジェクトを示すolContactItemを指定します。

Outlookアプリケーションオブジェクト.CreatItem(olContactItem)

ContactItemオブジェクトのプロパティ

ContactItemオブジェクトのプロパティには、例えば以下のようなものがあります。

プロパティ名 内容
FirstName 連絡先の名前
LastName 連絡先の姓
Email1Address 連絡先のメールアドレス1
Email1DisplayName 連絡先の表示名1
Companies 連絡先の勤務先
Department 連絡先の部署
JobTitle 連絡先の役職

Outlook XX.X Object Libraryの参照設定を忘れずに

ContactItem型変数の宣言や、CreateItemメソッドでContactItemオブジェクトを作成する前に、VBEでOutlook XX.X Object Libraryの参照設定は忘れずに行っておきましょう。

設定方法は、こちらの記事で紹介していますので、併せてご覧ください。

【エクセルVBA】エクセルVBAでOutlookを操作しよう!参照設定とOutlookアプリケーションオブジェクトの取得
エクセルVBAでOutlookのメール送信やタスク作成操作をする前準備として、VBEの参照設定や、Outlookアプリケーションオブジェクトの取得方法をご紹介しています。 VBAとOutlookを組み合わせて使うことで、既に便利に使えているメーラーを更に便利にできるかもしれませんよ。

Saveメソッドで連絡先を登録する

さて、Contactitemオブジェクトのプロパティに値をセットしたら、連絡先として登録してしまいましょう。

連絡先を登録するには、Saveメソッドを使います。

記述方法はとっても簡単。

ContactItemオブジェクト.Save

Outlookの連絡先を登録するコード

ContactItemオブジェクトとプロパティ、Saveメソッドで連絡先を登録しようとすると、こんな感じのコードになります。

Sub CreateCotact()
Dim objOutlook As Outlook.Application
Dim objContact As Outlook.ContactItem

Set objOutlook = New Outlook.Application
Set objContact = objOutlook.CreateItem(olContactItem)

'連絡先の作成
With objContact
    .FirstName = "連絡先の名前"
    .LastName = "連絡先の姓"
    .Email1Address = "abc@xxx.co.jp"
    .Email1DisplayName = "連絡先の表示名1"
    .Companies = "連絡先の勤務先"
    .Department = "連絡先の部署"
    .JobTitle = "連絡先の役職"
    
    .Save
End With
End Sub

そして上のコードを実行すると、Outlookの連絡先にはこのように登録されます。

vba,outlook,連絡先,登録このように、ContactItemオブジェクトのプロパティに指定した値で連絡先が登録されていますね。

最後に

今回は、エクセルVBAでOutlookの連絡先を登録する方法をご紹介しました。

実はOutlookにはエクセルリストやcsvファイルから連絡先をインポートできる機能があります。

しかし、例えば取り込みたい連絡先ファイルが複数ある、しかもリスト形式のデータではない(履歴書や、アンケートの回答のように、指定項目に連絡先が記入してあるようなファイル)といった場合には、今回ご紹介した方法が役立つかもしれません。

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

連載目次:エクセルVBAでOutlookを操作してみよう!

エクセルVBAでOutlookのメール作成、送信やタスク登録などの操作をする方法をご紹介しています。メーラーとして便利なOutlookですが、VBAと組み合わせて更に便利に使ってしまいましょう。

  1. 【エクセルVBA】エクセルVBAでOutlookを操作しよう!参照設定とOutlookアプリケーションオブジェクトの取得
  2. 【エクセルVBA】Outlookでメールを作成・送信する方法
  3. 【エクセルVBA】エクセルシートに一覧化された複数の連絡先に本文を変えつつOutlookでメールを一括送信する方法
  4. エクセルVBAでOutlookメールの下書きを作成・表示して送信前に内容チェックする
  5. エクセルVBAでOutlookの連絡先を登録する方法

GASのWebアプリケーションでクライアント側JavaScriptを使うための基礎知識

$
0
0

gears

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

以下の記事ではじまる「GASユーザーのための初めてのHTML・CSS講座」シリーズでお伝えしているとおり、GASではWebページを作成して公開をすることができます。

Google Apps Scriptで最も簡単なWebページを作成して公開する
GASユーザーかつHTMLページ・CSS初心者向けにWebページの作り方の基本中の基本を解説していきます。まず、その最初の一歩として、GASで最も簡単なWebページを作成して公開する方法をお伝えします。

面倒なサーバーの準備も不要、しかも無料…。

社内用アプリケーションとかちょっとしたツールを作る上で、どうしても必要になる技術があります。

それは、クライアント側のJavaScriptです。

クライアント側、つまりブラウザで動作するJavaScriptを使いこなすことで、作成したWebページに動きをつけたり、リアルタイムで更新や計算をしたり、さまざまなことが実現できるようになります。

このシリーズでは、はじめてクライアント側JavaScriptを動かすところからスタートし、人気急上昇中のフレームワークVue.jsを使ってWebアプリケーションを作成する方法を紹介していきます。

初回となる今回は、GASのWebアプリケーションでクライアント側JavaScriptを使うための基礎知識についてお伝えしていきます。

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

GASのWebアプリとJavaScript

そもそも、JavaScriptとは?

皆さんはGASユーザーなので、日頃からプログラミング言語JavaScriptは触れているはずです。

しかし、本来JavaScriptが主戦場としているのは、別の場所なのはご存知ですよね。

すなわち、JavaScriptはブラウザ上で動作し、Webページのコンテンツを操作するために生まれた言語で、その場合はユーザーが操作するPC(つまりクライアント)で動作します。

サーバー側とクライアント側のJavaScript

一方で、GASが動作をするのはGoogleのサーバー内です。

GASでWebアプリを作る際には、クライアント側のJavaScriptも埋め込むことができます。

つまり、JavaScriptを埋め込んだHTMLをユーザーのPCブラウザに渡して、何かしらかの処理をブラウザ上でさせることができるということです。

サーバー側JavaScript(GAS)とクライアント側JavaScript

そして、クライアント側とサーバー側とで相互に連携をさせて動作をさせることができます。

クライアント側JavaScriptでできること

クライアント側JavaScriptを使ってできることをもう少し深掘りしてみましょう。

クライアント側JavaScriptを使ってユーザーのブラウザ上で動作させることができる例として、以下のようなものがあります。

  • Webページやその要素に動きをつける
  • ページを切り替えずに表示の一部を更新する
  • リアルタイムに入力値のチェックや計算を行う
  • Webページで発生したイベントを受けて処理を呼び出す

よりリッチな表現や快適なUIが提供できるようになりますし、高度なデータの処理や受け渡しもできるようになります。

クライアント側JavaScriptを含めるGASのWebアプリのテンプレート

冒頭で紹介した「HTML・CSS講座」のシリーズは終えているものとして、本シリーズのテンプレートとなるファイル構成を紹介しておきます。

まず、サーバー側のGASスクリプト「main.gs」です。

function doGet() {
  var htmlOutput = HtmlService.createTemplateFromFile("index").evaluate();
  htmlOutput
    .setTitle('GAS+Vue.js')
    .addMetaTag('viewport', 'width=device-width, initial-scale=1')
  return htmlOutput;
}

吐き出したURLを受けてHTMLファイル「index.html」を表示するdoGet関数です。

タイトルと、metaタグはこちらで指定するようにしておきます。

以下が「index.html」です。


  
    
    != HtmlService.createHtmlOutputFromFile('css').getContent(); ?>
  
  
    
    != HtmlService.createHtmlOutputFromFile('js').getContent(); ?>
  

まだ、何もコンテンツがありません。

強制スクリプトレットタグで「css.html」「js.html」を読み込むようにしています。

名称の通り、それぞれCSSとクライアント側JavaScriptを記述するためのファイルですが、それらのファイルはまだ何も記述していない空のファイルとします。

お気づきかも知れませんが、GASではgsファイルか、htmlファイルかしか作ることができません。したがって、JavaScriptやCSSのファイルもhtmlファイルに記述します。

つまり、必然的にサーバー側はgsファイル、クライアント側はhtmlファイルに記述することになります。

まとめ

以上、GASのWebアプリケーションでクライアント側JavaScriptを使うための基礎知識についてお伝えしました。

GASのWebアプリでJavaScriptを使うメリットや、そのベースとなる知識はご理解いただいたのではないかと思います。

さて、GASユーザーがこのような方法でWebアプリに挑戦する意義は非常に大きいものと思います。

というのも、クライアント側JavaScriptのスキルを身につけることで、キャリアとして市場で人気のある「フロントサイドエンジニア」を視野に入れて、その足がかりにできるようになるからです。

ぜひ、業務システムやツールを練習台にして、クライアント側JavaScriptのスキルも身に着けていただければと思います。

さて、次回は実際にクライアント側JavaScriptを動作させてみましょう。

GASでクライアントJavaScriptを使用する超簡単なプログラム
GASでクライアント側にもJavaScriptを使用してWebアプリを作成する方法をシリーズでお伝えしています。今回は、GASでクライアントJavaScriptを使用する超簡単なプログラムについて紹介します。

どうぞお楽しみに!

連載目次:GASユーザーのためのVue.js&Webアプリ作成入門

Google Apps ScriptではHTML・CSSを使ってWebページを作成し公開することができます。このシリーズでは、その続きとしてはじめてクライアント側JavaScriptを動かすところからスタートし、人気急上昇中のフレームワークVue.jsを使ってWebアプリケーションを作成する方法をお伝えしていきます。
  1. GASのWebアプリケーションでクライアント側JavaScriptを使うための基礎知識
  2. GASでクライアントJavaScriptを使用する超簡単なプログラム

エクセルVBAによる運用業務で人為的ミスを減らす4つの方法

$
0
0

ミスを減らすアイキャッチ
みなさん、こんにちは!
フジタニ(@libartweb)です。

エクセルVBAで自動化されている業務。せっかく自動化されているのに、エクセルVBAの操作誤りなどでオペレーションミス多発・・・

ケアレスミスで重大な顧客クレームに繋がったり。そんな状態が続けば、ミスは減りませんし、顧客満足度も低下の一方です。

少し視点を変えてエクセルVBAに一工夫を加えるだけで小さなミスは大幅に減らすことが可能です。

実はすごくカンタンなチェック機能を追加するだけだったりします。

今回は、そういった工夫などを取り入れ、人為的な運用ミスを減らす4つの方法を紹介します。

業務でエクセルVBAを実際に運用されている方は必見です!

エクセルVBAを使用した運用で発生する人為的ミス

自動化していても、その中で手作業はどうしても発生します。

エクセルVBAの実行ボタンを押す、ファイルを選択する、ブックを開くなど…

どんなに小さな動作であっても、人が操作する以上、それは「人為的な作業」です。

人が入るとそこには必ずミスが発生します。

ミスが発生する前提で、それを防ぐにはどうすればいいか?を常に考えること。
処理の機能だけをエクセルVBAに記述するのではなく、ミスを減らすための記述も行うこと。

以上を意識するだけで大幅に人為的ミスを減らすことができます。

「工夫する」という意識が常に必要となってきます。

人為的なミスを減らす4つの方法

では具体的に、どのような実装ができるのか?今回は4つの方法とその例を紹介します。

今回紹介する内容から様々な改善のアイデアに繋がればと思います。

シートを保護する

例:シートの保護を活用し、誤入力を防ぐ

エクセルVBAで使用するデータは当然エクセル上に保存されている場合が多いです。

エクセルVBAのブックと同一ブック内にプログラムで使用するシート(データ)があった場合、何らかの拍子に意図せず人が編集してしまう恐れがあります。

そうなると、誤った処理結果が出力される原因となります。編集されたくないシートは保護をかけておきましょう!

エクセルシート
保護はカンタン。

①保護したいシートを右クリック
②「シートの保護」を左クリック

これだけです!

エクセルVBAで保護したシートを編集したい場合

しかし、保護したシートをエクセルVBAが編集をかける場合、保護したままだとエラーになってしまいます。

でも大丈夫。エクセルVBAでシートの保護と解除ができます。

Sub sheet_protect()
    '処理開始前にシートの保護を解除する
    Sheet1.Unprotect
    
    Call main
    
    '処理終了後はシートの保護を有効にする
    Sheet1.Protect
        
End Sub

ProtectメソッドとUnprotectメソッドを使ってシートの保護と保護の解除ができます。

ユーザに操作を求めずにシートの保護と解除を自動で行うことができます。シート内のデータをユーザが誤って編集しちゃうこともなくなりますね。

以下の記事でProtectメソッドとUnprotectメソッドについて説明しております。

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

人の誤操作をプログラムが検知する

例:日付を判定してボタンを押せなくする

15日締:毎月16日(休→翌営業日)に実施、末日締:毎月1日(休→翌営業日)に実施

以上の処理があったと仮定します。

vbaボタン

例えば、今回は15日締処理なのに、末日締のボタンを押してしまったら問題です。

エクセルVBAは日付を判定できますから、間違って押してしまっても気づけるようにすれば良いのです。

Sub matu_click()
    '末日締ボタンを押した日が16日以降だったら処理を中断する
    If Format(Date, "dd") > 15 Then
        MsgBox ("今回は15日締処理です!")
        Exit Sub
    End If
End Sub

Sub fifteen_click()
    '15日締ボタンを押した日が15日以前だったら処理を中断する
    If Format(Date, "dd") < 16 Then
        MsgBox ("今回は末日締処理です!")
        Exit Sub
    End If
End Sub

Date関数

システム日付をDate型(yyyy/mm/dd hh:mm:ss)で返します。

Date型は時間まで返してしまいますから特定の値を指定した書式に変換するFormat関数を使います。

Format(値, 書式)

Format関数でDate関数で取得したシステム日付を”dd”に変換。

Format関数の使い方の詳細は下記をご覧ください。

【初心者向けエクセルVBA】文字列の連結&Format関数での書式変更
エクセルVBAで文字列を連結する、文字列の書式を変更するなどの「文字列」に関するいくつかのテクニックを紹介しつつ、データ一覧から請求書を自動で作成するというシリーズ連載の序盤の完成を目指します。

ボタンを押されたタイミングが、想定されたタイミングではない場合にメッセージを出力します。

このようにメッセージを出してあげることでミスの半分以上は防ぐことができます。

インポートするファイルが正しいかどうかをチェックする

人の目では気づけない部分もあります。できる限り自動的にファイルの異常に気づける仕組みを取り入れましょう。

例:エクセルVBAでインポートするファイルが古いものでないかチェックする

他のシステムから吐き出した「本日分」のxlsxファイルやcsvファイルをインポートするエクセルVBAがあります。

ただ、ファイル名がいつも一緒なので、手作業でファイルを指定すると、うっかり前日以前のものをインポートしてしまうというミスが発生することがあります。

それを防ぐために、「ファイルの更新日」をチェックして、更新日が「本日」の日付じゃない(古い)場合にメッセージを出力します。

ファイルの更新日時異常

以下サンプルコードです。

Sub test()
    Dim filePath As String
    filePath = "C:\vba\sample.csv"
    
    'ファイルの更新日が、システム日付と一致するかをチェックする
    'Format関数で、比較対象を年月日のみにします。(時間まで取得されてしまうので)
    If Format(FileDateTime(filePath), "yyyymmdd") <> Format(Date, "yyyymmdd") Then
        If MsgBox(filePath & "の更新日が異常です。処理を続行しますか?", vbYesNo) = vbNo Then
            Exit Sub
        End If
    End If
End Sub

ファイル更新日時を調べるには以下の関数を使用します。

FileDateTime(ファイルパス)

FileDateTime関数はファイルの作成日時または最終更新日時をDate型(yyyy/mm/dd hh:mm:ss)で返します。

これをDate関数と比較することで、ファイルの作成(更新)日時とシステム日付が一致しているか?をチェックすることができます。

サンプルコードでは比較対象が「日付」で時間までは不要なので先ほど紹介したFormat関数で

「最終更新日時(FileDateTime関数で取得)」「システム日付(Date関数で取得)」

“yyyy/mm/dd hh:mm:ss” → ”yyyymmdd”に変換。

それぞれを同じ書式で比較できるようにしています。

ファイルを自動的に選択する

ファイル名に規則性があるのに、ファイルを手動選択させる運用をしていませんか?ファイル名に規則性がある場合はエクセルVBAでファイルの自動選択が可能です。

Sub Auto_Open()
    Dim wb      As Workbook
    Dim filePath As String 'ファイルパス

    '事前にファイルパスを格納する変数filePathにインポートするファイルのファイルパスを格納する
    filePath = "C:\vba\sample" & Format(Date, "yyyymm") & ".xlsx"
    
    If MsgBox("今回の処理対象ファイルは" & filePath & "ですか?", vbYesNo) = vbYes Then
        '処理対象ファイルの存在確認
        If Dir(filePath) = "" Then 'Dir関数
            MsgBox ("処理対象ファイルが存在しません!")
            Exit Sub
        End If
    Else
        'ファイル選択ダイアログを表示
        With Application.FileDialog(msoFileDialogFilePicker) 'FileDialogオブジェクト
            .Title = "ファイルを選択してください"
            .AllowMultiSelect = False '複数ファイルを選択させない
            .Show '表示
            filePath = .SelectedItems(1)  '選択したファイルのパス
        End With
    End If
    
    Set wb = Workbooks.Open(filePath)
  
End Sub

サンプルコードは本当にそのファイルパスで正しいか?を確認するメッセージボックスを出力して、正しければ処理続行。

間違っていたらファイル選択ダイアログを表示して、変数filePathの中身を更新する、という処理です。

前提条件はインポートするファイル名に規則性があることです。

規則性があれば、今回の記事で紹介しているDate関数などを駆使して自動的にファイルを選択する機能を追加することができます。

「人にできる限り操作をさせない」ことが、ミス削減に繋がります。

サンプルコードで使用しているDir関数とファイル選択ダイアログの説明は下記記事をご覧ください。

エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを開く
エクセルVBAでファイルを開く作業を自動化する方法についてシリーズでお伝えしています。今回は、エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを表示させる方法です。
エクセルVBAでDir関数を使って指定のファイルが存在するかどうかを判定する方法
エクセルVBAでファイルを開く作業を自動化する方法についてのシリーズ。今回は開くファイルの指定をエクセルシートに変更し、またファイルが存在するかどうかをDir関数で判定する方法についてお伝えします。

まとめ

今回紹介したミスを減らす4つの方法をまとめると以下の通りです。

  • シートを保護する
  • 人の誤操作をプログラムが検知する
  • インポートするファイルが正しいかどうかをチェックする
  • ファイルを自動的に選択する

どれもカンタンに導入ができる方法です。

少しの工夫でミスって大幅に減らすことができるんです。

メインの処理だけに偏りがちですが、人為的ミスを減らすことも業務効率化に繋がります。

是非、業務改善に役立ててください!


GASでクライアントJavaScriptを使用する超簡単なプログラム

$
0
0
hello

photo credit: holmes.josh Tokyo-Jan-2017-554.jpg via photopin (license)

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

GASでクライアント側にもJavaScriptを使用してWebアプリケーションを作成する方法をシリーズでお伝えしています。

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

GASのWebアプリケーションでクライアント側JavaScriptを使うための基礎知識
Google Apps ScriptではWebページを作成して公開をすることができます。今回は、GASのWebアプリケーションでクライアント側JavaScriptを使うための基礎知識についてお伝えします。

クライアント側のJavaScriptを使うとどのようなことが実現できるのか、またそのためのプロジェクトのテンプレートについてお伝えしました。

今回は、手始めとしてGASでクライアントJavaScriptを使用する超簡単なプログラムについて紹介したいと思います。

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

前回のおさらい

前回は、GASでクライアント側JavaScriptも使用した場合のプロジェクト構成のテンプレートとして、以下のようなものを紹介しました。

まず、GASでWebアプリケーションを公開した際に生成されるURLにアクセスした場合に呼び出されるのが、以下のmain.gsのdoGet関数です。

function doGet() {
  var htmlOutput = HtmlService.createTemplateFromFile("index").evaluate();
  htmlOutput
    .setTitle('GAS+Vue.js')
    .addMetaTag('viewport', 'width=device-width, initial-scale=1')
  return htmlOutput;
}

その際にブラウザに呼び出されるHTMLドキュメントの元になるのが、以下のindex.htmlになります。


  
    
    != HtmlService.createHtmlOutputFromFile('css').getContent(); ?>
  
  
    
    != HtmlService.createHtmlOutputFromFile('js').getContent(); ?>
  

CSSとクライアント側JavaScriptを記述する、「css.html」と「js.html」を埋め込めるように作成しています。

現時点では、それぞれ空のファイルで良いので用意しておいてください。

Webページに要素とイベントハンドラを設置する

では、このプロジェクトのうち、まずindex.htmlを変更してみましょう。


  
    
    != HtmlService.createHtmlOutputFromFile('css').getContent(); ?>
  
  
    

Hello GAS!

!= HtmlService.createHtmlOutputFromFile('js').getContent(); ?>

2つの要素を追加しています。

pタグによる段落要素とid属性

まず、段落を表すpタグ内に「Hello GAS!」という文字列です。

<p>段落</p>

このpタグには「hello」というid属性を付与しています。

<タグ id=”id名”>タグの内容</タグ>

id属性はそのページの要素のうち一つにだけ付与することが許されている「ラベル」のようなものですね。

pタグやid属性などについては、以下の記事たちが参考になると思います。

【GASユーザーのためのHTML入門】よく使う基本のHTMLタグを紹介します
GASユーザーのためのHTML・CSSによるWebページ制作入門をお伝えしています。今回は、Google Apps ScriptによるWebページをする際に、よく使う基本のHTMLタグについて解説をします。
【GASユーザーのためのHTML入門】好きな要素にだけCSSでスタイルを適用する
GASユーザーのためのHTML講座ということで、簡単なWebページの作り方を解説しています。今回はGASのWebページにid属性、class属性を使ってCSSのスタイルを好きな要素にだけ適用する方法です。

buttonタグによるボタン要素とonclick属性

もう一つの要素は、「テキスト変更!」というボタンです。

ボタン要素を追加するにはbuttonタグを使用します。

<button>表示テキスト</button>

また、buttonタグにonclick属性を付与しています。

onclick属性はマウスでクリックした際に、指定した処理を呼び出す機能を持ちます。

<タグ onclick=”id名”>タグの内容</タグ>

今回の場合は、「テキスト変更!」ボタンを押した際に「changeMessage()」が指定されていますから、この関数を呼び出すということになります。

イベント、イベントハンドラとは?

このように、「ボタンがクリックされた」など、Webページで発生した出来事イベントといいます。

  • ボタンがクリックされたとき
  • マウスが要素に乗っかったとき
  • セレクトボックスなどの選択肢が変更されたとき
  • ページが表示されたとき

など様々なイベントが用意されています。

これらのイベントの発生を待ち構えていて、実際に発生したときにキャッチする機能イベントハンドラと言います。

今回の例では、先程のonclick属性がイベントハンドラということになります。

クライアント側のJavaScriptでは、イベントハンドラを仕込んで、イベントにより処理を発生させることができるというのが、一つの重要な役割となり、そのおかげで動きのあるページ作成が可能となっています。

クライアント側JavaScript

続いて、空だったjs.htmlファイルに以下のように記述してみましょう。

ボタンが押下されたときに呼び出される関数changeMessageを定義しています。

scriptタグにJavaScriptを記述する

「js.html」はHTMLファイルで、その中にJavaScriptを記述します。

ご覧の通り、HTMLファイル内のJavaScriptはscriptタグ内に記述します。

<script>
 // スクリプト
</script>

JavaScriptでテキストを変更する

そして、3行目ですが、以下のような処理になります。

  • documentオブジェクト(つまりWebページ上の全ての要素を含むオブジェクト)から
  • getElementByIdメソッドで「hello」というid属性を持つ要素を取得し
  • そのテキスト(textContentプロパティ)を「Hello JavaScript!」に変更する

このシリーズでは、あとでVue.jsを使う予定なので、これらのJavaScriptのメソッドやプロパティについては、詳しくは説明しません。

処理の内容がだいたいわかればOKです。

GASによるWebアプリの動作

以上のようにプロジェクトの各ファイルを変更して、「ウェブアプリケーションとして導入」から最新のコードをテストしてみましょう。

まず、以下のようなページの表示を確認できます。

GASによる簡単なWebアプリ

では、「テキスト変更!」ボタンを押してみましょう。

GASのWebアプリをボタンで動作させる
テキストが「Hello JavaScript!」に変更しましたね。

まとめ

以上、GASでクライアントJavaScriptを使用する超簡単なプログラムを紹介しました。

クライアント側JavaScriptを使用することで

  • イベントハンドラでイベントをキャッチする
  • id属性などを使用して要素を取得して操作をする

ということができるということが、確認できたと思います。

ただ、このような処理をもっと簡単にしてくれる素晴らしいモノがあります。

フレームワークVue.js。次回はこれを紹介していきます。

どうぞお楽しみに!

連載目次:GASユーザーのためのVue.js&Webアプリ作成入門

Google Apps ScriptではHTML・CSSを使ってWebページを作成し公開することができます。このシリーズでは、その続きとしてはじめてクライアント側JavaScriptを動かすところからスタートし、人気急上昇中のフレームワークVue.jsを使ってWebアプリケーションを作成する方法をお伝えしていきます。
  1. GASのWebアプリケーションでクライアント側JavaScriptを使うための基礎知識
  2. GASでクライアントJavaScriptを使用する超簡単なプログラム

GASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩

$
0
0

vue.js

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

GASでWebアプリを作成するシリーズ。いよいよ今回からJavaScriptのフレームワークVue.jsが登場します。

前回の記事はコチラ。

GASでクライアントJavaScriptを使用する超簡単なプログラム
GASでクライアント側にもJavaScriptを使用してWebアプリを作成する方法をシリーズでお伝えしています。今回は、GASでクライアントJavaScriptを使用する超簡単なプログラムについて紹介します。

GASでクライアント側JavaScriptを使用する簡単な例を紹介しました。

さて、今回はGASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩を進めて行きましょう。

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

前回のおさらい

まず、前回作成したプロジェクト構成を紹介します。

URLリクエストを受け取ったら、後述するindex.htmlを受け渡すdoGet関数を含むmain.gsです。

function doGet() {
  var htmlOutput = HtmlService.createTemplateFromFile("index").evaluate();
  htmlOutput
    .setTitle('GAS+Vue.js')
    .addMetaTag('viewport', 'width=device-width, initial-scale=1')
  return htmlOutput;
}

そして、その際に表示するWebページを構成するindex.htmlがこちら。


  
    
    != HtmlService.createHtmlOutputFromFile('css').getContent(); ?>
  
  
    

Hello GAS!

!= HtmlService.createHtmlOutputFromFile('js').getContent(); ?>

クライアント側に渡して、ボタンをクリックした際に実行する処理changeMessageを含むのが、こちらのjs.htmlです。

表示されたページ内の「テキスト変更!」ボタンをクリックすると、「Hello GAS!」というテキスト表示が「 Hello JavaScript!」が変更される、というものです。

なぜJavaScriptフレームワークが必要なのか

JavaScriptのDOM操作の回りくどさを解決したい

何も知らないと、「そう書くのね、わかった!」となってしまうのですが、ちょっと待ってください。

このJavaScriptの処理、ちょっと面倒じゃないですか?

  1. イベントハンドラが発火する
  2. 操作対象となるDOM要素を取得する
  3. 操作対象のDOM要素をJavaScriptで記述されたデータに変更する

こんなダンドリで動作をしています。

特に、2と3に注目してください。

今回、操作する要素はid属性「hello」が付与されているpタグですよね。その要素のテキストを「Hello JavaScript!」に変更する可能性は十分にあります。というか、変えたい。

それなのに、処理の書き方として「要素を取得して、その要素を変更する」というダンドリをわざわざ書かなければいけないのは回りくどいですよね。

このような回りくどさは、HTML上に展開された要素(DOM要素といいます)と、JavaScriptで取り扱えるデータが切り離されて管理されていることに起因します。

JavaScriptフレームワークの効能

では、そのDOM要素の内容とJavaScriptで扱うデータが等しいものとしてリアルタイムに紐付いていたらどうなるか?

その場合、以下のような理想的なストレートな処理が可能になります。

  1. イベントハンドラが発火する
  2. 「操作対象となるDOM要素の内容=JavaScriptのデータ」を変更する

どうせ変更する予定なら、最初からJavaScriptにより操作するデータと連携しておこう、というわけです。

このような機能を含め、Webアプリケーションの枠組みを提供するのがJavaScriptフレームワークであり、その中で今回注目するのがVue.jsとなるわけです。

JavaScriptフレームワークVue.jsとは

Vue.jsはDOM要素とJavaScriptのデータでいうと、以下の図に示すような「Model-View-ViewModel」というパターンを前提に提供されているフレームワークです。

Vue.jsとMVVMモデル
引用: Vue.jsではじめるMVVM入門

それぞれの説明は以下の通りです。

  • Model: JavaScriptで操作するデータ(オブジェクト形式)
  • View: 表示するやつ、つまりDOM要素
  • ViewModel: Vueオブジェクト。DOM要素とJavaScriptのデータを取り持つ機能を持つ

つまり、Vue.jsが提供するVueオブジェクトが、DOM要素とJavaScriptのデータをリアルタイムに連携させる役割を持ってくれているということになります。

フレームワークVue.jsの特徴

JavaScriptのフレームワークには、React.jsやAngularなどいくつかの種類があり、いずれもバリバリ使用されていますが、ここではVue.jsの特徴と、なぜVue.jsをオススメするかについて解説します。

学習コストの低さ

GASユーザーにとって最大の魅力はこの学習コストの低さです。

GASでWebアプリを作る方はWebエンジニアとは限りませんから、学習にそこまで時間をかけられません。

ですから、学習コストが低いのは、超助かるわけです。

私がVue.jsを皆さんにオススメする最大の理由はコレです。

柔軟性の高さ

とはいえ、Vue.jsは手軽に始められる一方で、アプリケーションの要求に応じてその使い方を柔軟に変えていける「プログレッシブフレームワーク」として生み出されています。

つまり、やろうと思ったら規模の大きいのも行けるぜ!

ということですね。

Vue.jsを用いたGASのWebアプリ

では、例として冒頭のプロジェクトをVue.jsを用いて書き換えてみましょう。

まず、index.htmlは以下のように修正しました。


  
    
    != HtmlService.createHtmlOutputFromFile('css').getContent(); ?>
  
  
    
<p>{{ message }}</p>
!= HtmlService.createHtmlOutputFromFile('js').getContent(); ?>

9行目に二重波括弧という謎の表現、10行目に「@click=」という新鮮な属性がありますね。

続いて、js.htmlです。

こちらはだいぶ様子が変わりましたね。

1行目はCDNっぽいですね。

そして、3行目以降は、Newキーワードを使ってVueというインスタンスを生成しているようです。

若干複雑ですが、その引数はオブジェクト形式で、「el」「data」「methods」というプロパティやメソッドを設定しているようです。

詳しくは次回以降で解説をしていきましょう。

まとめ

GASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩についてお伝えしました。

JavaScriptフレームワークを使う意義、そしてVue.jsの特徴についてご理解いただけたのではないかと思います。

次回は、今回紹介したコードを詳しく解説していきます。

どうぞお楽しみに!

連載目次:GASユーザーのためのVue.js&Webアプリ作成入門

Google Apps ScriptではHTML・CSSを使ってWebページを作成し公開することができます。このシリーズでは、その続きとしてはじめてクライアント側JavaScriptを動かすところからスタートし、人気急上昇中のフレームワークVue.jsを使ってWebアプリケーションを作成する方法をお伝えしていきます。
  1. GASのWebアプリケーションでクライアント側JavaScriptを使うための基礎知識
  2. GASでクライアントJavaScriptを使用する超簡単なプログラム
  3. GASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩

Windowsのポチポチ業務を爆速化できるPowerShell、はじめのハードルぐーーんと下げてみます!

$
0
0

こんにちは!
テラドと申します。

普段の業務の中で毎日同じことをやる・大量のファイルを処理するようなルーティンワークはありませんか?

「この大量の画像データ、全部ファイル名変えないといけないの…まぁ15分あったら終わるか!」

そんな風にポチポチ…と手首と人差し指を酷使して毎日マウスを操作してませんか?

ポチポチ業務からあなたを解放するために紹介したいのがPowerShellです。

PowerShellはWindows7から標準搭載されているCUIのことです。

「CUIって何…?」

はい、聞き馴染みのない方は多いかもしれませんね。

後ほど詳しく説明しますが、CUIはポチポチ業務を自動化するための大きな武器になるんです!

PowerShellをオススメする理由と簡単な操作方法を連載形式でお伝えしていきます。

今回はPowerShellをオススメする理由を説明し、はじめのハードルをぐーーんと下げてみたいと思います!

それではいきましょう!

PowerShellとは

まずは、PowerShellとは何なのか見ていきしょう!

Windows標準のCUI

PowerShellはWindows7から標準搭載されているCUIのことです。

CUIとは「キャラクターユーザーインターフェース」の略です。キャラクタ=文字の入力によってプログラムを動かせますという意味です。

コマンドプロンプトであれば、聞いたことがある方は多いのではないようでしょうか。
PowerShellが登場する前はコマンドプロンプトがWindows標準のCUIでした。

この黒い画面、見たことありませんか?
このような画面上で文字を入力し、命令を実行することでプログラムを動かしていきます。

コマンドプロンプトはMS-DOSというWindowsより前に使われていたOSをエミュレータで動かしていただけでした。MS-DOS時代に作られたプログラムを稼働させるためです。難しい表現をしましたが、要はプレステ4でスーパーファミコンのソフトを動かしていたようなものだったんです。

これまでなんとか機能を継ぎはぎして使ってきましたが、Windowsの機能をフルに使いこなすためのCUIが必要でした。

そこで登場したのがPowerShellです。

これがPowerShellの画面です。画面の基本的なデザインはコマンドプロンプトと同じですが、青色になって少しは馴染みやすいですかね(笑)

マウス操作は直感的ではありますが、繰り返し作業するのはツラいし時間がかかります。一方、CUIであれば一度書いた命令は何度でも再利用することが可能ですし、何よりコンピュータに仕事をさせるのでマウス操作より、大幅に時間が削減できます。

コマンドレットで操作する

PowerShellにはコマンドレットというWindowsを操作する機能をまとめた命令が用意されています。このコマンドレットを入力することでWindowsの機能を実行していきます。

サンプルとして、フォルダとファイルを一覧化してみましょう。「Get-ChildItem」というコマンドレットを使います。

デスクトップのSampleフォルダ内にあるフォルダとファイルがすべて表示されました。
こうやってコマンドを打ち込んでいくことで機能を実行してきます。

PowerShellをオススメする2つの理由

PowerShellがどのようなもので、何ができるのかイメージは湧きましたでしょうか?

以上を踏まえて、PowerShellをオススメする2つの理由を解説します!

豊富な機能をもち分かりやすいコマンドレット

if文・for文・while文など制御構文が使える

コマンドレットはif文・for文・while文などと組み合わせて少し複雑な処理を書くことが可能です。処理対象のファイルが存在しなかった場合は処理を実行しない、など柔軟な処理が実現できます。

動詞―名詞の形式でわかりやすい

コマンドレットは動詞-名詞の形式でできており直感的に理解しやすいため記載するスピードも速く、また読みやすいのでメンテナンス性も高いです。

例えば

  • 「Get-ChildItem」 → Get=取得する + ChildItem=子アイテム
  • 「Start-Job」 → Start=開始する + Job=ジョブ

というようにイメージしやすくなっています。

PowerShellで現在の日付を取得したいと思った時は、「取得する=Get」と「日付=Date」を組み合わせて「Get-Date」かな?と推測することができます。

拡張された機能

Windowsのフォルダ・ファイルの操作をはじめとし、たくさんのコマンドレットが用意されていて、コマンドプロンプトより強力なCUIです。

以下にPowerShellでできることの例をあげてみます。

  • フォルダ・ファイルの操作:フォルダ名・ファイル名をリネームする
  • アプリケーションの起動:スケジューラに登録して決まった時間に起動する
  • Office365と連携:メールアドレスの一覧を取得する
  • テキスト操作:テキストをHTML・JSON・CSVに変換する
  • Web連携:Webページの画像データをダウンロードする

環境構築なしで使える、開発環境も用意されている

Windows7以降であればPowerShellが標準搭載されていますので、環境構築なしですぐ使い始めることができます

またPowerShell ISEという開発環境が用意されています。

制御構文と組み合わせてスクリプトを記述するときに使います。スクリプトとは複数のコマンドレットや制御構文を組み合わせた一つの単位と思ってください。

画像の右側に使用できるコマンドレットがすべて表示されており、検索・選択することができます。また制御構文が色分けされ見やすくなったり、コードの自動補完機能、ステップ毎に実行することが可能です。

このようなツールが用意されており初心者が使うハードルも低くなっています。

まとめ

いかがでしたか?

今回はPowerShellとは何か、またそれを使うメリットについてお伝えしました。

PowerShellは、Windowsユーザであれば環境構築なしですぐに使いはじめることができ、動詞-名詞形式でわかりやすく豊富な機能のコマンドレットをもつモダンなCUIです。

CUIは普段マウスで行なってる操作をコンピュータにさせることで爆速化してくれます。

「PowerShell使ってみようかな」
「CUIって便利そうだな」
と思っていただけましたでしょうか?

次回はコマンドレットの具体的な使い方をご紹介してきます。

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

GASにVue.jsを導入する方法とその動作確認、そしてVue.jsの超基本を解説

$
0
0
binding

photo credit: BY-YOUR-⌘ DesatRope via photopin (license)

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

初心者向けにGASとVue.jsによるWebアプリケーションの作り方についてお伝えしています。

前回の記事はコチラ。

GASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩
Google Apps ScriptでWebアプリを作成するシリーズ。今回はGASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩を進めて行きます。

Vue.jsについてその基礎知識と、GASユーザーがそれを学ぶメリットについてお伝えしました。

今回からいよいよ本格的にVue.jsとはなんぞやということについて解説していきます。

まずは、Vue.jsの公式ドキュメントを参考にしながらGASにVue.jsを導入する方法とその動作確認、そしてVue.jsの超基本を解説していきます。

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

Vue.jsの公式ドキュメント

最初にVue.jsの公式ドキュメントを紹介します。

コチラです。

Vue.jsの公式ドキュメント

バッチリ日本語にも翻訳されていて、とても見やすいです。

Vue.jsは学習コストは低いと言われているとはいえ、とても奥は深く、多機能です。

そして、本来はWebエンジニアがメインターゲットとなるフレームワークですから、GASユーザーにとっては遠回りになる情報も多くあります。

なので、最初のうちは、このブログのシリーズなどを参考にしながら進めたほうが良いかも知れません。

何かそれ以上に知りたいことがあるときには、この公式ドキュメントが頼りになると思います。

CDNを使用してVue.jsを導入する

Vue.jsのインストールについてお伝えしていきます。

Webエンジニアの皆さんはnpmなどを使うのでしょうけど、GASの場合はCDNが便利です。

CDNとはContent Delivery Networkの略

世界中に張り巡らされたCDN専用の配信ネットワーク(CDNプラットフォーム)を利用して、Webサイトにアクセスしようとするエンドユーザに最も近い配信拠点から効率的かつ高速にWebを配信する仕組みです。

引用: CDN(コンテンツ・デリバリ・ネットワーク)とは/What is CDN

つまり、何らかのコンテンツをネットワーク経由で、なるべく高速に取得するための手法ということですね。

まず、以下のリンクにアクセスしてください。

インストール — Vue.js
Vue.js - The Progressive JavaScript Framework

そして、以下の部分をコピーしましょう。

Vue.jsの公式サイトでCDNを取得する

この一文を、GASプロジェクトの「js.html」の冒頭に記述しますので、だいじにとっておいてください。

はじめてのVue.jsの準備

では、Vue.jsの公式サイトで紹介されているJSFiddle Hello World exampleを用いて、はじめてのVue.jsの動作確認をしてみましょう。

Vue 2.0 Hello World - JSFiddle
Test your JavaScript, CSS, HTML or CoffeeScript online with JSFiddle code editor.

まず、サーバー側のスクリプトmain.gsに以下doGet関数を仕込んでおきましょう。忘れがちですが、これがあることでURLアクセスを受けてWebページを展開できますからね。

function doGet() {
  var htmlOutput = HtmlService.createTemplateFromFile("index").evaluate();
  htmlOutput
    .setTitle('GAS+Vue.js')
    .addMetaTag('viewport', 'width=device-width, initial-scale=1')
  return htmlOutput;
}

GASでVue.jsの導入とインスタンスの生成をする

では、js.htmlを見ていきましょう、以下の通りです。

1行目は前述のCDNですね。コピーしたものを、そのまま貼り付ければOKです。

そして、3行目からnewキーワードを使ってVueインスタンスを生成しています。

書式は以下の通りです。

new Vue(options)

この引数optionsオブジェクト形式で様々なオプションを指定することができます。

Vue.jsのelオプションとdataオプションについて

おそらく、必ず指定するオプションは、以下の2つでしょう。

  • el: Vueオブジェクトと連携するDOM要素
  • data: DOMと連携するデータオブジェクト

例では、elオプションには「#app」を指定しています。これはid属性が「app」としている要素を生成したVueインスタンスの連携するDOM要素としてね、という意味です。

つまりid属性が「app」の要素が、Vue.jsの連携範囲となるわけです。

次にdataオプションですが、これはオブジェクト形式で、「プロパティ: 値」という形式でデータを列挙していきます。

すると、Vueインスタンスの連携するDOM要素の配下では、そのプロパティを介して、データの連携が可能になります。

このようにDOM要素とJavaScriptのデータオブジェクト(dataオプション)とを紐付ける仕組みを「データバインディング」といいます。

例では、messageというプロパティに「Hello Vue.js!」という文字列を設定しています。

では、そのデータバインディングしたデータをDOM要素から参照するにはどうしたら良いでしょうか?

DOM要素からdataオプションの値を参照する

それを明らかにするために、index.htmlを見てみましょう。


  
    
    != HtmlService.createHtmlOutputFromFile('css').getContent(); ?>
  
  
    
{{ message }}
!= HtmlService.createHtmlOutputFromFile('js').getContent(); ?>

まず、8~10行目のdiv要素に注目しましょう。

生成したVueインスタンスの適用範囲を表すid要素「app」が付与されていますね。この配下では、Vueインスタンスと連携が可能ということになります。

その子要素であるpタグ内に二重波括弧、そしてその中に「message」とありますね。

この二重波括弧「{{ … }}」という表現は「Mustache構文」と言います。読み方は「マスタッシュ」です。

Mustacheは「口ひげ」という意味です。まぁ、そう見えなくもないですね。

この二重波括弧、Mustache構文の中にdataオプションで指定したオブジェクトのプロパティを指定すれば、その位置にそのプロパティの値を連携して参照することができます。

dataオプションのデータとの連携方法は、このMustache構文を使う方法以外にもありますので、おいおい紹介していきます。

はじめてのVue.jsの表示結果

では、以上の内容でWebページを表示してみましょう。

以下のように「Hello Vue.js!」という文字列が表示されるはずです。

Vue.jsによる表示内容

これは

  • id属性「app」と新規で生成されたVueインスタンスが連携されている
  • Vueオブジェクトのdataオプションのmessageプロパティの値が、連携するDOM要素配下のMustache構文で参照されている

という動作によります。

まとめ

以上、GASにVue.jsを導入する方法とその動作確認、そしてVue.jsの超基本についてお伝えしました。

無事にVue.jsは動作しましたでしょうか?

今回は最も簡単な例を紹介しましたが、もっと色々な機能があり、様々な連携や操作が可能です。

次回以降、少しずつ見ていきましょう。

まずは、methodsオプションですかね。

どうぞお楽しみに!

連載目次:GASユーザーのためのVue.js&Webアプリ作成入門

Google Apps ScriptではHTML・CSSを使ってWebページを作成し公開することができます。このシリーズでは、その続きとしてはじめてクライアント側JavaScriptを動かすところからスタートし、人気急上昇中のフレームワークVue.jsを使ってWebアプリケーションを作成する方法をお伝えしていきます。
  1. GASのWebアプリケーションでクライアント側JavaScriptを使うための基礎知識
  2. GASでクライアントJavaScriptを使用する超簡単なプログラム
  3. GASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩
  4. GASにVue.jsを導入する方法とその動作確認、そしてVue.jsの超基本を解説

エクセルVBAでQueryTableオブジェクトを使って高速にCSVを取り込む方法

$
0
0

CSV取り込みアイキャッチ
みなさん、こんにちは!
フジタニ(@libartweb)です。

CSVの取り込みをエクセルVBAで行う場合は、ループを使って1行ずつ読み込んでいくのが一般的な方法です。

今回は、そんなCSV取り込みを、ループを一切使わずに、一発で取り込むもう一つの方法を紹介します。

大きなCSVの取り込み処理が月に数回、もしくは1日に何回も…という高い頻度で実施される方、速度をもっと速くしたい!という方は必見です!

CSVの取り込みがもっとラクに、速くできるようになりますよ!

通常のCSV取り込みの流れ

以下の記事でも紹介していますが、通常はCSVを、エクセルVBAでオープンした後、1行ずつセルに書き出していくのが一般的です。

100行や200行など小さなCSVだと処理速度の差は全く体感できないので、ループを使う方法で全く問題ありません。もし、大きなファイルを頻繁に扱う方は今回紹介する方法を検討してみてください!

エクセルVBAでCSVデータをカンマで区切ってワークシートに取り込む方法
エクセルVBAでCSVを取り込む方法です。今回は、Splitという命令と配列を使ってCSVのレコードをカンマで区切ってワークシートに転記をしていく方法について解説をしていきます。

過去の記事で紹介したソースコードは下記の通りです。

ループの中にループがあるので、CSVが大きいとどうしても処理速度で不利になってしまう場合があります。

'==================================
'CSVをループを使用して取り込むサンプル
'==================================
Sub getCSV()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets(1)
    
    Dim strPath As String
    strPath = "C:\Users\Noriaki\Dropbox\40_ブログ\vba-csv\test\ラーメン店アンケート.csv"
    
    Dim i As Long, j As Long
    Dim strLine As String
    Dim arrLine As Variant 'カンマでsplitして格納
    
    Open strPath For Input As #1 'CSVをオープン
    
    i = 1
    
    Do Until EOF(1)
       
        Line Input #1, strLine
        arrLine = Split(strLine, ",") 'strLineをカンマで区切りarrLineに格納
       
        For j = 0 To UBound(arrLine)
           
            ws.Cells(i, j + 1).Value = arrLine(j)
       
        Next j
        i = i + 1
    Loop
    
    Close #1

End Sub

QueryTableオブジェクトによるCSV取り込み

ループを使ったCSV取り込みが一般的であり、実際に使われている方もたくさんいらっしゃると思います。今回はあまり知られていない、QueryTableオブジェクトを使いますので、まずはその概要について解説します。

最初にサンプルコードを記載します。

Private Sub csvImport()
    Dim strPath As String
    Dim qtCsv   As QueryTable
    
    strPath = "C:\Users\hirom\Desktop\test.csv"
    Set qtCsv = Sheet1.QueryTables.Add(Connection:="TEXT;" & strPath, _
        Destination:=Sheet1.Range("A1")) '取り込むCSVパスと、取り込み先のシート、セルを指定
    
    With qtCsv
        .TextFileCommaDelimiter = True 'カンマ区切りの指定
        .TextFileParseType = xlDelimited   ' 区切り文字の形式
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) '項目(列)の型指定
        .TextFileStartRow = 1 '開始行の指定
        .TextFileTextQualifier = xlTextQualifierDoubleQuote '引用符の指定
        .TextFilePlatform = 932 '文字コード指定
        .Refresh 'QueryTablesオブジェクトを更新し、シート上に出力
        .Delete 'QueryTables.Addメソッドで取り込んだCSVとの接続を解除
    End With

End Sub

書き方がループを使用したCSV取り込みの方法とは大きく異なっており???となっていることでしょう。では解説していきます。

QueryTableオブジェクトとは

Microsoftの公式ページでは下記の通り解説されています。

SQL サーバーや Microsoft Access データベースなどの外部データ ソースから返されるデータに基づいて作成されるワークシート テーブルを表します。

QueryTable オブジェクト (Excel)

よくわからないですね・・・

カンタンに解説すると、データタブ→外部データの取り込みの機能を操作するオブジェクトです。

QueryTableオブジェクトでワークシート上に仮想のテーブルを作ってそこにCSVを取り込み、それをワークシート上に展開することができます。

CSV取り込み

文字コードはもちろん、区切り文字からダブルクォーテーションに至るまでプロパティ指定をすることが可能です。今回はCSVを対象に紹介しますが、通常のテキストファイルでも取り込み可能です。

各プロパティの解説は次回記事で実施予定です。

この方法がどのくらい速いか?

実際に上で紹介したサンプルコードを実行し、処理時間を計測してみました。
CSVの行数は54000行です。

★ループで取り込んだ場合
37秒

★QueryTableオブジェクトで取り込んだ場合
6秒

実に、魅力的な高速化ですね。10万行だと1分以上の差が開くことになります。

この方法は、CSVのサイズが大きくなればなるほど恩恵を受けられます。

そのCSVが1個だけでなく、複数あったら、更に差が開きます。

QueryTableオブジェクトが速い理由

通常のCSV取り込みは、ループを使って1行ずつ読み込んでいきます。それも1行ずつ物理的にWorksheet上に展開しています。

対してQueryTableオブジェクトは、いったん「クエリテーブル」上にCSVを展開。しかも1行ずつの取り込みではなく、一気に全行をまとめて取り込むイメージ。

これは例えるとスーパーで買い物をする際に、商品を手で1つずつレジに持って行くのが通常のCSV取り込み、カゴにたくさん入れて持っていくのがQueryTableです。

つまり、たくさんの商品を買う場合はカゴに入れた方が有利です。

普段取り込むCSVのサイズを見て、うまく使い分けましょう。

まとめ、次回予告

今回はQueryTableオブジェクトとは何か?といった概要を掴んでいただく内容でした。

・通常のCSV取り込みの流れ
・QueryTableオブジェクトによるCSV取り込み
・QueryTableオブジェクトとは
・QueryTableオブジェクトが速い理由

一般的な方法の他にもこんな取り込み方があるんだ!ということを知っていただけたと思います。

サイズの大きいCSVを取り込む際に大幅な時間短縮が可能なQueryTableオブジェクトを使用した方法に少し興味を持っていただいたところで次回予告とします。

次回はいよいよサンプルプログラムの解説と、QueryTableオブジェクトを活用してもらうための、メソッドやプロパティの解説を実施します。

使いこなすと、速いだけでなくソースコードもシンプルになり、とても便利なオブジェクトです。

お楽しみに!

Viewing all 2086 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>