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

GoogleスプレッドシートでWebデータを取得するIMPORTFEED関数の使い方

$
0
0

IMPORTFEED2サムネイル

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

前回の記事では、GoogleスプレッドシートのIMPORTFEED関数を紹介するシリーズの第一歩として、フィードURLの確認方法を紹介しました。

Webサイトの新着記事をいち早く取得!RSSフィードのURLを確認する方法
Webサイトの新着記事を自動で配信してくれる便利なフィードを活用しよう!「フィードとは何か?」「フィードのURLを確認する方法」についてお伝えします。

今回は、GoogleスプレッドシートのIMPORTFEED関数を使用して、フィードを取得する方法を紹介していきます。

スプレッドシート内で完結するSUM関数やIF関数などに比べると、外部接続する(Webデータを取得する)関数はちょっと不思議な感じがするかもしれませんね。

ていねいに解説していきますのでご安心ください!

前回のおさらい:フィードとは

フィードとは、Webサイトの概要・更新情報などを配信するデータのことです。

当ブログの「フィードのURL」がこちらです→https://tonari-it.com/feed/

フィードの中身はこのようなXMLファイルでしたね。

importfeed1-5

IMPORTFEED関数とは

IMPORTFEED関数とは、XML形式のフィードを、スプレッドシートにインポートする関数です。

関数の構文がこちらです。

IMPORTFEED(フィードURL, [クエリ], [見出し], [アイテム数])

引数が4つあります。

引数 省略の可否 説明
フィードURL 必須 フィードURLを指定する
クエリ 省略可 取得するデータの内容を指定する
見出し 省略可 先頭行に列見出しを含めるかを指定する
アイテム数 省略可 直近のアイテムから順に、取得するアイテムの数を指定する

それでは、実際に使いながら慣れていきましょう!

IMPORTFEED関数でフィードを取得する

IMPORTFEED関数は、Webサイトからデータを取得するため、インターネット接続が必要です。オフラインでは使用できません。

新規のスプレッドシートを開きます。

フィードを取得する[クエリ] は feed です。

A1セルに =IMPORTFEED() と入力し、引数を2つ指定します。

  1. フィードURL(https://tonari-it.com/feed
  2. クエリ(feed

引数をダブルクォートで囲むのをお忘れなく!

=IMPORTFEED("https://tonari-it.com/feed","feed")

タイトルやURLなどのフィード情報を含む1行が返されます。

importfeed2-2

 

第1引数のフィードURLは、「セルの参照」も可能です。

A1セル(黄色)に、あらかじめフィードURLを入力しておきます。
A2セルにIMPORTFEED関数を入力し、フィードURLはA1セルを参照します。

importfeed2-3

見出しの有無を指定する

第3引数で[見出し]の有無を指定できます。(指定しない場合、無しの扱いになります)

  • true = 先頭行に見出しが含まれる
  • false = 先頭行に見出しが含まれない

第3引数にtrueを指定して、列の見出しを付けた結果がこちらです。

=IMPORTFEED("https://tonari-it.com/feed","feed",true)

importfeed2-4

関数を入力するときの注意点

IMPORTFEED関数の結果が返されるセルに値が入力されている場合、取得結果が展開されずエラーとなります。

ここでは、A2セルに”あいうえお”と文字を入力しています。A1セルに関数を入力しても、結果が展開されずエラーとなります。

importfeed2-7

フィードのタイプを指定して取得する

第2引数[クエリ]に”feed <type>” を指定すると、フィードの特定の属性が返されます。

typeには下記の4種類があります。

引数の指定 取得できる内容
“feed title” タイトル
“feed description” 説明
“feed author” 作成者
“feed url” WebサイトのURL

いずれも、ダブルクォートで囲むのを忘れずに!

“feed title”を指定して、フィードの「タイトルのみ」を取得した結果です。

importfeed2-6

IMPORTFEED関数でアイテムを取得する

つぎに、アイテムを取得してみましょう。

アイテムとは「記事」のことです。今ご覧いただいているこのページが、IMPORTFEED関数が指す「アイテム」です。

件数を指定してアイテムを取得する

アイテム数を指定しない場合、フィードに現在公開されているすべてのアイテムが取得されます。スプレッドシート上で見にくくなるので、ここではアイテム数を指定します。

第2引数の[クエリ]に items を指定します。

=IMPORTFEED("https://tonari-it.com/feed","items",true,5)

列見出しあり・最新の5件を取得しています。

importfeed2-8

※タイムゾーンが日本時間でないWebサイトの場合、Date Createdが9時間遅れています。(経度0度のグリニッジ天文台と比べて日本は9時間進んでる、というアレです)

たとえば、キャプチャ2行目のアイテム「Thu, 17 Jan 2019 02:45:24」は、実際の投稿時刻は「Thu, 17 Jan 2019 11:45:24」です。

アイテムのタイプを指定して取得する

第2引数の[クエリ]に”items <type>”を指定すると、アイテムの特定の属性が返されます。

typeには、下記の4種類を指定できます。

  • title(アイテムのタイトル)
  • summary(ハイパーリンクと画像を除くアイテムのコンテンツ)
  • url(アイテムのURL)
  • created(アイテムの投稿日)のいずれかを指定します。

“items title”を指定した結果です。列見出しあり・最新の5件を取得しています。

importfeed2-8-2

最新のアイテムが取得できない場合の対処法

フィードを発信しているWebサイトの設定によっては、IMPORTFEED関数でリクエストされた結果をキャッシュとして残しているため、古い結果が配信される場合があります。

対処法を2つ紹介します。

方法1.フィードURLにトレイリングスラッシュ(末尾のスラッシュ)を付ける

https://tonari-it.com/feed/

方法2.フィードURLにパラメータを付与する

https://tonari-it.com/feed?d=1

毎日最新の情報を取得する場合

第1引数に指定するフィードURLを、任意のセルに用意しておきましょう。TODAY関数と結合して、フィードのパラメータに日付を含めます。

importfeed2-9

 

TODAY関数と結合したフィードURLを引数に指定します。TODAY関数の結果が毎日変わるので、パラメータが再作成され、毎日最新の情報を取得できるという仕組みです。

importfeed2-10

 

これらの方法が不要なWebサイトもありますので、もし、最新アイテムが取得できないときは、「こんな方法もあるんだな」と頭にいれておく程度で大丈夫です。

まとめ

今回の記事では、GoogleスプレッドシートのIMPORTFEED関数の使い方を紹介しました。

  • フィード・アイテムの情報を取得する
  • 列見出しの有無を指定する
  • 取得アイテム数を指定する
  • 最新アイテムが取得できない場合の対処法

次回は「IMPORTFEED関数の実践編」をお届けします。コミュニティメンバーのブログの最新記事を取得して、一覧にまとめる方法をお伝えします。

どうぞお楽しみに!

連載目次:IMPORTFEED関数でブログ情報を取得する

GoogleスプレッドシートのIMPORTFEED関数を使って、ブログ更新情報の一覧を作る方法を紹介しています。

  1. Webサイトの新着記事をいち早く取得!RSSフィードのURLを確認する方法
  2. GoogleスプレッドシートでWebデータを取得するIMPORTFEED関数の使い方

エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する

$
0
0

add

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

「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ連載をしております。

前回の記事はこちら。

エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
「初心者でもわかるエクセルVBAのクラスモジュール」というテーマでシリーズ連載をしております。今回は、エクセルVBAで自作コレクションの要素を取得するItemプロパティの作り方をお伝えします。

自作のコレクションから要素を取得するItemプロパティを作成しました。

さて、今回も自作のコレクションを便利にしていきますよ。

今回は、エクセルVBAで自作のコレクションに要素を追加するメソッドを作っていきます。

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

前回のおさらい

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

以下のようなエクセル表があります。

エクセルVBAでクラス化するエクセル表

この一行分のデータを表すPersonというクラスと、それを集合として取り扱うPersonsというクラスを作成しています。

Personクラスのコードはこちらです。

Private id_ As String
Public FirstName As String
Public Gender As String
Public Birthday As Date

Public Sub Greet()
    MsgBox Me.FirstName & "です、こんにちは!"
End Sub

Public Sub Initialize(ByVal rng As Range)
    id_ = rng(1).Value
    FirstName = rng(2).Value
    Gender = rng(3).Value
    Birthday = rng(4).Value
End Sub

Public Property Get IsMale() As Boolean
    IsMale = (Me.Gender = "male")
End Property

Public Property Get Id() As String
    Id = id_
End Property

Public Property Let Id(ByVal newId As String)
    If id_ <> "" Then
        Debug.Print "Idは上書きすることはできません"
    Else
        id_ = newId
    End If
End Property

Personのデータを格納するプロパティをはじめ、たくさんのメンバーを追加しました。

10~15行目の初期データをセットするInitializeメソッドについて、今回ちょっと変更を加えたりしますので、目を通しておいてくださいね。

Personsクラスのコードがこちらです。

Private items_ As Collection

Private Sub Class_Initialize()
    Set items_ = New Collection
    
    With Sheet1
        Dim i As Long: i = 2
        Do While .Cells(i, 1).Value <> ""
            Dim p As Person: Set p = New Person
            p.Initialize .Range(.Cells(i, 1), .Cells(i, 4))
            items_.Add p, p.Id
            i = i + 1
        Loop
    End With

End Sub

Public Property Get Item(ByVal key As Variant) As Person
    Set Item = items_.Item(key)
End Property

前回はこのPersonsクラスに、要素を参照するためのItemプロパティを追加しました。

それを検証するための標準モジュールがこちら。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons

With myPersons
    Debug.Print .Item(1).FirstName
    .Item("a02").Greet
End With

End Sub

独自コレクションに要素を追加するメソッド

現状のPersonsクラスですが、Class_Initializeプロシージャにより、インスタンス生成時に前述のエクセル表のデータが追加されるようになっています。

しかし、新たに要素を追加したい場合はどうしたらよいでしょうか?

前回、Collection型のオブジェクト変数items_を隠蔽した今、標準モジュールから新しい要素を追加するのは不可能になってしまいました…

ということで、今回は独自コレクションのPersonsに、新たに要素を追加するAddメソッドを作成していきます。

シンプルにAddメソッドを作成する

クラスPersonsのAddメソッドのコード

シンプルに考えるなら、クラスPersonsに以下のようなコードを追加すれば良さそうです。

Public Function Add(ByVal values As Variant) As Person
    Dim p As Person: Set p = New Person
    
    p.Id = values(0)
    p.FirstName = values(1)
    p.Gender = values(2)
    p.Birthday = values(3)
    
    items_.Add p, p.Id
    Set Add = p

End Function

エクセル表の1行分のデータに該当するデータを配列で渡してAddメソッドを呼び出すと、それを初期データとしたPersonオブジェクトを生成して、それをPersonsコレクションに追加するというものです。

Addメソッドの動作を確認する

標準モジュールに以下のようなコードを作成して、Stop時にローカルウィンドウを確認します。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons

Dim p As Person
Set p = myPersons.Add(Array("a04", "Jay", "male", #7/7/1995#))

Stop

End Sub

プライベート変数items_に新しい要素が追加されてますし、Addメソッドの戻り値として生成したPersonオブジェクトが取得できています。

PersonsコレクションのAddメソッドの検証

処理の共通化

ただ、先ほどのAddメソッドの初期データの追加の処理が、PersonクラスのInitializeメソッドとほんのり処理がかぶっているのが気になります。

PersonsクラスのAddメソッドから、PersonクラスのInitializeメソッドを呼び出すようにしたら、処理が共通化できて気持ちが良さそうです。

ただ、Initializeメソッドで受け取る引数はRangeオブジェクトで、Addメソッドで渡したいのは配列…

ちょっと工夫が必要ですね。

データのタイプにより分岐する

PersonクラスのInitializeメソッドで値をVariantで受け取って、そのデータのタイプを調べて分岐するという作戦はどうでしょうか。

TypeName関数を使えば、受け取った変数のデータタイプを調べることができます。

TypeName(変数名)

Rangeオブジェクトであれば「Range」、Array関数で生成した配列であれば「Variant()」が得られます。

その他のタイプの場合を知りたい場合はこちらへどうぞ。

TypeName 関数 (Visual Basic for Applications)

さて、それをベースに、Initializeメソッドを以下のように変更することができます。

Public Sub Initialize(ByVal values As Variant)

    Select Case TypeName(values)
        Case "Range"
            id_ = values(1).Value
            FirstName = values(2).Value
            Gender = values(3).Value
            Birthday = values(4).Value
        Case "Variant()"
            id_ = values(0)
            FirstName = values(1)
            Gender = values(2)
            Birthday = values(3)
    End Select

End Sub

Personsクラスの各メンバーをシンプルにまとめる

すると、PersonsクラスのAddメソッドは以下のようにシンプルにまとめることができます。

Public Function Add(ByVal values As Variant) As Person

    Dim p As Person: Set p = New Person
    p.Initialize values
    items_.Add p, p.Id
    
    Set Add = p

End Function

ついでに、PersonsクラスのClass_InitializeプロシージャもAddメソッドを使うことで、シンプルにまとめられます。

Private Sub Class_Initialize()
    Set items_ = New Collection
    
    With Sheet1
        Dim i As Long: i = 2
        Do While .Cells(i, 1).Value <> ""
            Me.Add .Range(.Cells(i, 1), .Cells(i, 4))
            i = i + 1
        Loop
    End With

End Sub

前述の標準モジュールのMySubを実行して、同じ結果が得られることを確認してください。

まとめ

以上、エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する方法をお伝えしました。

少し、難易度が上がってきた感じはありますが、いい練習になるのではないでしょうか。

ここまで来ると色々な選択肢があるので、ぜひ好みの組み方を見つけてみてください。

さて、次回はコレクションの要素の削除について見ていきたいと思います。

エクセルVBAで自作コレクションの要素を削除するメソッドの作り方
「初心者でもわかるエクセルVBAのクラスモジュール」シリーズをお送りしています。今回は、エクセルVBAで自作コレクションの要素を削除するRemoveメソッドの作り方についてお伝えしていきます。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセルVBAでクラスを作ろう

名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!
  1. 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
  2. エクセルVBAでクラスに最も簡単なプロパティを追加する方法
  3. エクセルVBAで自作クラスをインスタンス化する方法
  4. エクセルVBAでクラスに最も簡単なメソッドを追加する方法
  5. エクセルVBAで表の1行分のデータを表すクラスを作成する方法
  6. エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
  7. エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
  8. エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
  9. エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法
  10. エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
  11. エクセルVBAでインスタンスの集合をコレクション化する方法
  12. エクセルVBAでコレクション化したインスタンスを取り出す方法
  13. エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
  14. エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
  15. エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法
  16. エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
  17. エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
  18. エクセルVBAで自作コレクションの要素を削除するメソッドの作り方

ノンプロ研チーム大阪分科会Vol.1「プログラミング上達のための8つの約束」でコミュニティの意義を再認識した話

$
0
0

みなさんこんにちは、テラド(@terashin1226)です!

2019年1月15日、ノンプロ研チーム大阪分科会Vol.1「プログラミング上達のための8つの約束」が開催されました!!

昨年9月には私1人でしたが現時点でメンバーが7名と盛り上がってきたチーム大阪!アットホームな雰囲気の中行われたセミナーの様子をお伝えします!

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

前回の反省を活かして会場準備

主宰者のタカハシ(@ntakahashi0505))さんがはじめて来阪されたのは2018年9月15日、「ノンプログラマーのためのスキルアップ研究会&もくもく会 in 大阪」という大阪初のセミナーを実施した時です。

「ノンプログラマーのためのスキルアップ研究会&もくもく会 in 大阪」を開催しました!
ノンプログラマーがVBA・GAS・Pythonなどのプログラミングスキルを身に着けるためのコミュニティ「ノンプログラマーのためのスキルアップ研究会」、通称「ノンプロ研」。東京を中心に開催されていましたが、この度初めて大阪で開催!渾身のレポートをお届けします!

この時、わたくしテラド会場選びに大失敗しました。その反省を活かし今回は事前に3箇所、現地視察にいきました。

現地視察でチェックした内容は

  • wi-fiの強度
  • 立地(駅からの近さ)
  • 設備(プロジェクター、ホワイトボード、変換プラグ等のコード類)
  • 部屋の環境(騒音はないか、きれいさ、掃除用の設備、コンセント位置)

実際に会場を使ってみる」を意識し、プロジェクターを投影する、wi-fiはGASのスクリプトを起動して強度に問題がないか確認しました。

現地視察に行ってみての感想は「やっぱり実際に見ておいてよかった!」です。

設備にあまり違いはなかったのですが、となりの事務所から物音が聴こえたり、廊下にトイレのにおいが充満していたりとインターネット上ではわからないリアルな情報が収集できました

ということで前回の反省点はクリアし、当日を迎えることができました。

プログラミング上達のための8つの約束

今回は外部から5名の方がご参加、ノンプロ研メンバー6名も加え計11名の参加となりました。ご参加いただきありがとうございました!

タカハシさんによるセミナー「プログラミング上達のための8つの約束」のスタートです!

8つの約束とは以下のとおりです。

① 実務で使う
② 習慣化する
③ 構文どおりに書く
④ 調べる
⑤ 打たない
⑥ 構造化データ
⑦ リーダブルコード
⑧ アウトプット

セミナーの中で特に感銘を受けた2つの約束「実務で使う」「習慣化する」について、自身で考えたことも踏まえご紹介したいと思います。この2つはプログラミング上達以外にも活用できる普遍的な内容になっています。

実務で活用する

個人差はありますが、プログラミング習得には200時間~300時間の学習が必要です。

1日2,3時間としても100日、約3ヶ月かかります。学習時間を確保するのは非常に難しいですよね。

では、どうやって時間を捻出するのか。

タカハシさんの提案は…

「…仕事中に学べばいい」
「…会社にもメリットある」

これは逆転の発想で目から鱗がボロボロ落ちました!

またワーキングメモリから長期記憶への移行は自我関与が大きくかかわっているそうです。自身が関わっている業務を改善するのは脳科学的な観点からみても非常に学習効率がいいんです。

さらに、プログラミングの素晴らしいところは、スキルアップすると自動化により浪費している時間を削減し、再投資できる時間がどんどん増えるということです。

投資→スキルUP→効率化→時間捻出→さらに投資…とプログラミングを使って循環を回していくことは自分自身にも会社にもメリットがありますね!

習慣化する

行動を習慣するのってほんとに難しいですよね…。

でも習慣に関しては、ノンプロ研の活動が非常に大きな役割を果たしてくれています。

例えば、ノンプロ研のSlackに「ブログ書こうよ」というチャンネルがあります。期限を申請しておくと、メンバーのもり(@moripro3)さんが作成したBotが自動でお尻をたたいて背中を押してくれます。

Botだけではなく、ブログに関するいろいろな話が飛び交ったり、Botの非情な通知暖かな励ましに反応して焦ったりするみなさんの反応が面白かったり、みんなが頑張っているから自分もがんばろうと思える居心地のいい空間なんですよね。

また、タカハシさんがご紹介してくださったマーガレットサッチャーの名言が胸に刺さりました。

考えは言葉となり、言葉は行動となり、行動は習慣となり、習慣は人格となり、人格は運命となる。

みなさんもノンプロ研で習慣化して、運命を変えてみませんか?

ノンプロ研メンバによるLT

タカハシさんのセミナーに続いて、ノンプロ研メンバー6名によるLT(ライトニングトーク)!こうやってアウトプットの場があることもノンプロ研の活動の大きな特徴です!

実は、さきほどご紹介したノンプロ研メンバーで、当ブログ「いつも隣にITのお仕事」執筆チームのもり(@moripro3)さん、チーム大阪の活動を常にファシリテートしてくださっている、きのぴぃ(@kinopy_techhack)さんが東京から駆けつけてくださいました!

もりさんはプログラミングを学ぶ時の心構えについて、きのぴぃさんはプログラミングの学び方について具体的なノウハウを共有してくださいました!

株式会社JAMSTOREの経営者でもある松本さんはシステムを構築するため、まず「業務フローの設計に時間をかけた」という重要な視点が共有されました。

さらに新たに加入されたメンバーお二人は自己紹介も兼ねつつ、プログラミングを学ぶことでどう職場を変えていきたいかをお話をしてくださいました。

テラドのLT、前回はガチガチでしたが、今回はあまり緊張せずお話しできたと思います。ただし2分の時間オーバー…!また次回への改善点が見つかりました。

20190115_ノンプロ研で人生変わった話
「ノンプロ研で 人生変わった」の裏側 ~コミュニティ活動のススメ~ @terashin1226 福祉×IT ・はじめまして。 ・ノンプロ研大阪、初の大阪開催ということで、大変うれしく思っています!! ・今回運営もさせていただいております、てらどと申します。 自分をニューロン化しよう!というテーマで「コミュニティの意義」...

ここからが本番!?懇親会

さて、LT終了後は懇親会です。参加者12名中、11名と驚異の参加率でした!

お酒も飲みながら、話も弾みます。ある方が勤めている会社が転職活動中にテラドが面接で落ちた会社だったり(これはほんとにびっくり…!)、住まいが近くだったり、たくさん共通点が見つりました。

プログラミングを使って自身の会社でどういうことをしたいかという熱い気持ちも共有できました。

ノンプロ研は東京の活動でも懇親会の参加率が高いとは聞いていたのですが、東西に関わらずノンプロ研にはお酒好きの方が集まるのでしょうか!?

改めて感じたオフラインの重要性

チーム大阪では、きのぴぃさんのご協力を得ながら、計2回のもくもく会を実施、活動を積みかさねてきました。

Slack、Twitterなどオンラインのつながりも重要ですが、顔を見たことがある、声を聞いたことがあるというのはさらにコミュニケーションを促進するんだなぁと実感しました。

今回もセミナー終了直後から新たなメンバーの方とSlackでの交流も盛んですし、Twitterで時間管理のツールについて情報共有をしていただいたり、また暖かい繋がりが生まれました。活動がどんどん広がっていき、お仕事の上でもコラボレーションできたらうれしいなぁなんて妄想しています。

まとめ

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

今回のチーム大阪分科会はセミナーで普遍的に知識を学ぶとともに、一緒に学ぶ仲間というコミュニティの意義を再確認できた、アットホームで素晴らしい会になりました。

みなさんもノンプロ研に参加して、習慣変えて、人生変えてみませんか!?

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

エクセルVBAで自作コレクションの要素を削除するメソッドの作り方

$
0
0

remove

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

「初心者でもわかるエクセルVBAのクラスモジュール」ということでシリーズをお送りします。

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

エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ連載をしております。今回は、エクセルVBAで自作のコレクションに要素を追加するAddメソッドを作成する方法について見ていきます。

自作のコレクションに要素を追加するメソッドの作り方をお伝えしました。

追加するメソッドが作れましたので、今度は削除するメソッドを作ってみようと思います。

というとで、エクセルVBAで自作コレクションの要素を削除するメソッドの作り方です。

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

前回のおさらい

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

以下のエクセル表があったとして、これをクラスを使って扱おうというのがシリーズを通してのテーマとなっています。

エクセルVBAでクラス化するエクセル表

それで、まずエクセル表の1行ずつのデータを表すクラスであるPersonを作成しました。

そのコードがこちらです。

Private id_ As String
Public FirstName As String
Public Gender As String
Public Birthday As Date

Public Sub Greet()
    MsgBox Me.FirstName & "です、こんにちは!"
End Sub

Public Sub Initialize(ByVal values As Variant)

    Select Case TypeName(values)
        Case "Range"
            id_ = values(1).Value
            FirstName = values(2).Value
            Gender = values(3).Value
            Birthday = values(4).Value
        Case "Variant()"
            id_ = values(0)
            FirstName = values(1)
            Gender = values(2)
            Birthday = values(3)
    End Select

End Sub

Public Property Get IsMale() As Boolean
    IsMale = (Me.Gender = "male")
End Property

Public Property Get Id() As String
    Id = id_
End Property

Public Property Let Id(ByVal newId As String)
    If id_ <> "" Then
        Debug.Print "Idは上書きすることはできません"
    Else
        id_ = newId
    End If
End Property

エクセル表の各フィールドを格納するプロパティのほか、いくつかのメンバーを追加しています。

前回は、InitializeメソッドをRangeオブジェクトでも、配列でも実行できるように変更しましたね。

そして、そのPersonクラスから生成したインスタンスをコレクション的に扱うのが、以下のPersonsクラスです。

Private items_ As Collection

Private Sub Class_Initialize()
    Set items_ = New Collection
    
    With Sheet1
        Dim i As Long: i = 2
        Do While .Cells(i, 1).Value <> ""
            Me.Add .Range(.Cells(i, 1), .Cells(i, 4))
            i = i + 1
        Loop
    End With

End Sub

Public Property Get Item(ByVal key As Variant) As Person
    Set Item = items_.Item(key)
End Property

Public Function Add(ByVal values As Variant) As Person

    Dim p As Person: Set p = New Person
    p.Initialize values
    items_.Add p, p.Id
    
    Set Add = p

End Function

前回はAddメソッドを追加しましたので、それを検証するための標準モジュールがこちらです。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons

Dim p As Person
Set p = myPersons.Add(Array("a04", "Jay", "male", #7/7/1995#))

Stop

End Sub

ここしばらくは、こちらのPersonsクラスのほうにいろいろな機能を追加しているところですね。

自作のコレクションの要素を削除するメソッド

前回は、Personsクラスに要素を追加するAddメソッドを作成しました。

ということで、今回はその逆。

Personsコレクションから要素を削除するRemoveメソッドを作っていきたいと思います。

Collectionオブジェクトの要素を削除する

Personsクラスのコレクション機能は、蓋を開けてみるとCollection型のプライベート変数item_が担ってくれています。

ですから、item_が参照するCollectionオブジェクトから要素を削除してあげればよいわけですね。

Collectionオブジェクトから要素を削除するには、Removeメソッドを使えばOKです。

Collectionオブジェクト.Remove キー

ここでキー、整数で順に割り振られているインデックスまたは、設定されていれば文字通りのキーでもOKです。

助かりますね。

自作コレクションのRemoveメソッドのコード

では、それを使ってPersonsクラスにRemoveメソッドを作りましょう。

コードはこちらです。

Public Sub Remove(ByVal key As Variant)
    items_.Remove key
End Sub

おっと、シンプル!

整数型を受け取っても、文字列型を受け取っても処理ができるように、Variant型で引数を受け取るようにしています。

自作コレクションのRemoveメソッドの動作を確認

検証用のプロシージャを標準モジュールに書いて、自作コレクションの要素を削除するRemoveメソッドの動作確認をしてみましょう。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons

Dim p As Person
Set p = myPersons.Add(Array("a04", "Jay", "male", #7/7/1995#))

With myPersons
    .Remove 2
    .Remove "a01"
End With

Stop

End Sub

実行してStopステートメントの中断時のローカルウィンドウを見てみましょう。

自作コレクションの要素を削除した

初期状態のインデックス2の「Tom」と、IDが「a01」の「Bob」のデータが削除されていますね。

まとめ

以上、エクセルVBAで自作コレクションの要素を削除するメソッドの作り方をお伝えしました。

これまでの連載をご覧いただいていれば、今回の内容は簡単ですよね。

さて、次回はPersonクラスの内容をエクセル表に反映させるメソッドを作っていきます。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセルVBAでクラスを作ろう

名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!
  1. 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
  2. エクセルVBAでクラスに最も簡単なプロパティを追加する方法
  3. エクセルVBAで自作クラスをインスタンス化する方法
  4. エクセルVBAでクラスに最も簡単なメソッドを追加する方法
  5. エクセルVBAで表の1行分のデータを表すクラスを作成する方法
  6. エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
  7. エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
  8. エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
  9. エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法
  10. エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
  11. エクセルVBAでインスタンスの集合をコレクション化する方法
  12. エクセルVBAでコレクション化したインスタンスを取り出す方法
  13. エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
  14. エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
  15. エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法
  16. エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
  17. エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
  18. エクセルVBAで自作コレクションの要素を削除するメソッドの作り方

エクセルVBAでエクセル表のデータを反映するメソッドとクラスを使うメリット

$
0
0

separate

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

「初心者向けエクセルVBAではじめてのクラスモジュール」についてシリーズでお伝えしています。

前回の記事はこちら。

エクセルVBAで自作コレクションの要素を削除するメソッドの作り方
「初心者でもわかるエクセルVBAのクラスモジュール」シリーズをお送りしています。今回は、エクセルVBAで自作コレクションの要素を削除するRemoveメソッドの作り方についてお伝えしていきます。

自作のコレクションから要素を削除するメソッドを追加しました。

さて、エクセル表を表すクラスを作ってそれをオブジェクトとして操作するのはいいのですが、操作した結果をエクセル表に反映させなくてはいけませんよね。

ということで、今回はシリーズ最終回。

エクセルVBAで自作コレクションのデータをエクセル表に反映させるメソッドの作り方をお伝えします。

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

前回のおさらい

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

以下のようなエクセル表があります。

エクセルVBAでクラス化するエクセル表

このエクセル表のデータを取り扱うクラスを作成しておりますが、まずは1行分のデータを表すクラスPersonがこちらです。

Private id_ As String
Public FirstName As String
Public Gender As String
Public Birthday As Date

Public Sub Greet()
    MsgBox Me.FirstName & "です、こんにちは!"
End Sub

Public Sub Initialize(ByVal values As Variant)

    Select Case TypeName(values)
        Case "Range"
            id_ = values(1).Value
            FirstName = values(2).Value
            Gender = values(3).Value
            Birthday = values(4).Value
        Case "Variant()"
            id_ = values(0)
            FirstName = values(1)
            Gender = values(2)
            Birthday = values(3)
    End Select

End Sub

Public Property Get IsMale() As Boolean
    IsMale = (Me.Gender = "male")
End Property

Public Property Get Id() As String
    Id = id_
End Property

Public Property Let Id(ByVal newId As String)
    If id_ <> "" Then
        Debug.Print "Idは上書きすることはできません"
    Else
        id_ = newId
    End If
End Property

フィールドを表すプロパティのほか、便利そうなメンバーをいくつか追加しております。

そして、それを集合として扱うために、自作コレクションを作りました。それが、以下のPersonsクラスになります。

Private items_ As Collection

Private Sub Class_Initialize()
    Set items_ = New Collection
    
    With Sheet1
        Dim i As Long: i = 2
        Do While .Cells(i, 1).Value <> ""
            Me.Add .Range(.Cells(i, 1), .Cells(i, 4))
            i = i + 1
        Loop
    End With

End Sub

Public Property Get Item(ByVal key As Variant) As Person
    Set Item = items_.Item(key)
End Property

Public Function Add(ByVal values As Variant) As Person

    Dim p As Person: Set p = New Person
    p.Initialize values
    items_.Add p, p.Id
    
    Set Add = p

End Function

Public Sub Remove(ByVal key As Variant)
    items_.Remove key
End Sub

このPersonsコレクションは、Personオブジェクトを集合として取り扱うものなので、結果としてPersonsコレクションがエクセル表のデータ全体を表します。

前回は、このPersonsコレクションから要素を削除するRemoveメソッドを作成しました。

それを検証するための標準モジュールがこちらです。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons

Dim p As Person
Set p = myPersons.Add(Array("a04", "Jay", "male", #7/7/1995#))

With myPersons
    .Remove 2
    .Remove "a01"
End With

Stop

End Sub

データをオブジェクトで操作した結果をエクセル表に反映する

これで、なんとなくエクセル表のデータをクラス化して取り扱う全体の機能ができた感じです。

手順としては、以下の通り。

  1. エクセル表をもとに新規のPersonsコレクションを生成する
  2. Personsコレクションの要素を追加したり、削除したり、変更したりする
  3. Personsコレクションを再度エクセル表に反映する

こんな流れですね。

2の操作とかを、さらにユーザーフォームとかを使って操作できるようにしたら、アプリケーションぽい感じになります。

それで、お気づきの通り、3のPersonsコレクションを操作した結果をエクセル表に反映させるという処理がまだありませんので、今回はそれを作っていきます。

Personsコレクションのデータをエクセル表に反映する

Personsコレクションのデータをエクセル表に反映させるApplyToSheetメソッドを作成します。

戻り値などは必要ないので、Subプロシージャで作ります。

Public Sub ApplyToSheet()
    With Sheet1
        .Cells.Clear
        .Range(.Cells(1, 1), .Cells(1, 4)) = Array("Id", "FirstName", "Gender", "Birthday")
       
        Dim i As Long: i = 2
        Dim p As Person
        For Each p In items_
            .Range(.Cells(i, 1), .Cells(i, 4)) = Array(p.Id, p.FirstName, p.Gender, p.Birthday)
            i = i + 1
        Next p
    End With
End Sub

流れとしては以下のとおりですね。

  1. Sheet1をいったんクリア
  2. 1行目に見出しを再度書き出す
  3. Personsコレクションの要素の数だけ繰り返して
    1. 各要素のデータをエクセル表に書き出す
    2. 行を1つ追加

エクセル表への反映について動作確認

作成したPersonsコレクションのApplyToSheetメソッドの動作を確認します。

例えば、標準モジュールに以下のようなSubプロシージャを作りました。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons
With myPersons
    
    .Add (Array("a04", "Jay", "male", #7/7/1995#))
    .Remove 2
    With .Item("a01")
        .FirstName = "Bomb"
        .Birthday = #11/11/1993#
    End With
    
    .ApplyToSheet
End With

End Sub

確認をすると…

自作コレクションのデータをエクセル表に反映する

バッチリですね!

結局、クラスを使うと何がいいのか

さて、これまで19記事も使ってクラスを作ってきたのですが、エクセル表の操作になぜここまでゴチャゴチャする必要があるのか…と思いますか?

わざわざクラスを使う必要ないじゃないか…!?

と思ったりしますでしょうか。

このマクロには、エクセル表のデータを新規コレクションのインスタンスに取り込んだり、「こんにちは!」とメッセージを表示したり、男性かどうかを判定したり、追加したり、削除したり…といった機能があります。

ですが、前述の動作確認用の標準モジュールのコードを見ていただくと、想像以上にスッキリしていませんか?

色々な機能を実現するステートメントは、すべてクラスモジュールにかかれていますので、標準モジュール上では一切目にする必要がありません。

標準モジュールでは、それらの機能にアクセスするためのメンバーを呼び出すことしかしていないんです。

つまり、マクロのうち「機能」の部分をクラスモジュールに分離するということが実現できているのです。

おかげで、標準モジュールは、その機能を「操作」をするだけの役割に徹することができるのです。

  • 機能:クラスモジュール
  • 操作:標準モジュール

さらに、このエクセル表に何か新しい操作をしたくなったら、それもクラスモジュールに追加します。

マクロの機能は増えても、標準モジュールのステップ数を極小に保つことができます。

スッキリしますでしょ?

まとめ

以上、エクセルVBAで自作コレクションのデータをエクセル表に反映させるメソッドの作り方をお伝えしました。

また、ただのエクセル表をクラスとして取り扱うメリットについても触れました。

エクセル表を保護して、これらのクラスのメンバーをユーザーフォームなどで扱えるようにすると、さらにアプリケーションぽくなりますね。

さて、使い捨てのマクロでればクラス化はおそらく必要ありませんが、長いことお付き合いするデータ群であれば、クラス化をするとスッキリ管理と運用ができて、使い勝手も良くなるかも知れません。

ぜひ、検討をしてみてくださいね。

本シリーズは以上で終了となります。また、別のシリーズでエクセルVBAの活用法についてお伝えしていきますので、どうぞお楽しみに!

連載目次:初心者でもわかる!エクセルVBAでクラスを作ろう

名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!
  1. 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
  2. エクセルVBAでクラスに最も簡単なプロパティを追加する方法
  3. エクセルVBAで自作クラスをインスタンス化する方法
  4. エクセルVBAでクラスに最も簡単なメソッドを追加する方法
  5. エクセルVBAで表の1行分のデータを表すクラスを作成する方法
  6. エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
  7. エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
  8. エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
  9. エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法
  10. エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
  11. エクセルVBAでインスタンスの集合をコレクション化する方法
  12. エクセルVBAでコレクション化したインスタンスを取り出す方法
  13. エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
  14. エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
  15. エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法
  16. エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
  17. エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
  18. エクセルVBAで自作コレクションの要素を削除するメソッドの作り方

Windowsのポチポチ業務を爆速化するPowerShell、関数を作ってスクリプトから呼び出す方法

$
0
0

みなさんこんにちは、テラド(@terashin1226)です!

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

前回はタスクスケジューラと相性抜群なファイルバックアップのためのスクリプトをご紹介しました。

Windowsのポチポチ業務を爆速化するPowerShell、ファイルをバックアップするスクリプトの作り方
Windowsのポチポチ業務(=マウスを使った業務)を爆速化するPowerShell。前回ご紹介したタスクスケジューラと組み合わせて使いやすいファイルバックアップのスクリプトの作り方をご紹介します!

今回はPowerShellで関数を作ってスクリプトから呼び出す方法をお伝えします!

関数とは「入力を受け、処理を実行し、結果を出力するまで」の流れをひとまとまりにしたものです。

スクリプトを書いていく中で同じ処理を何度も書くのは面倒ですし、ミスによる不具合が増えてしまいます。よく使う処理は関数にして再利用しましょう!

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

関数とは

関数とは「入力を受け、処理を実行し、結果を出力するまで」の流れをひとまとまりにしたものです。

関数は「入力」「処理」「出力」の3つで構成されます。下図のように「工場」をイメージしてみてください。

関数は「一度、製造ラインを作ってしまえば、あとは素材を与えてやるだけで自動的に製品ができあがり出荷できる」というイメージを持っておくとわかりやすいでしょう。

例として、与えられた2つの数字を足し算して結果を出力する関数「Add-Number」を作りながら説明していきます。

関数の作り方

では、具体的にPowerShellで関数を作る方法についてご説明します。

functionキーワードを使った基本構文

PowerShellで関数を作るには、functionキーワードを使います。

構文は以下の通りです。

function 関数名(引数1,引数2,…){

処理内容

return 戻り値

}

詳しく説明していきますね。

関数名

関数名はfunctionキーワードの右側に書きます。製造ラインに名前をつけるイメージです。

PowerShellでの関数名の命名に特別なルールはなく、英数字や日本語も指定可能です。

しかしコマンドレットと合わせて「動詞-名詞」と命名をすることを勧めます。統一感があり、スクリプトが読みやすくなるためです。

今回は「Add-Number」(加える-数)とします。

function Add-Number

引数

引数は関数への入力です。製造ラインに流す「素材」にあたります。

引数は複数個指定することができます

関数名「Add-Number」の右側に()を書き、その中に変数で指定します。

Add-Numberは2つの数値を使用するので、以下のように2つ指定します。引数に使う変数名は任意につけることができます

function Add-Number($num1,$num2)

処理

処理は{}内に書きます。素材を加工する「製造ライン」にあたります。

今回は$num1と$num2を加算するので以下のように書きます。

{
    $answer = $num1 + $num2
}

引数の$num1、$num2は、処理の中で繰り返し使用できます。

2つを加算した結果を変数:$answerに格納します。これで$answerという製品が完成しました!

戻り値

戻り値は関数からの出力です。戻り値はreturnキーワードで指定します。さきほど作った$answerを「出荷」するようなイメージです。

return $answer

returnで戻り値を指定すると、スクリプト終了後に計算した結果を使用することができます。

スクリプトの全体像

以下のようなスクリプトが完成しました。

function global:Add-Number($num1,$num2){
    $answer = $num1 + $num2
    return $answer
}

これで素材の指定→製造ライン→出荷までの準備が整いました!

スクリプトから関数を呼び出す

作成した関数をスクリプトから呼び出してみましょう!

呼び出し方は以下の通りです。関数と引数に入力する値を並べて書くだけなので簡単ですね。

関数名 引数1に入力する値 引数2に入力する値

今回は$num1に1、$num2に2を入力することにし、以下のように書きます。

Add-Number 1 2

スクリプトは上から順に解釈され実行されます。そのため、関数の定義より下で呼び出すようにしてください。

function global:Add-Number($num1,$num2){
    $answer = $num1 + $num2
    return $answer
}

Add-Number 1 2

このスクリプトをISEに入力し、デスクトップに「sample.ps1」という名称で保存したら、実行します。

戻り値に指定した$answer(1+2の答え「3」)がコンソールに表示されました!

まとめ

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

今回はPowerShellで関数を作ってスクリプトから呼び出す方法をお伝えしました!関数は、工場のようなもの(素材(引数)→製造ライン(処理)→出荷(戻り値))とイメージで捉えてみてくださいね!

次回はコンソールからスクリプトを呼び出す方法PowerShellに関数を登録する「プロファイル」という仕組みをご紹介します!

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

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

Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
  1. Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
  2. Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
  3. Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
  4. Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
  5. Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
  6. Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
  7. Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備
  8. Windowsのポチポチ業務を爆速化するPowerShell、フォルダを作るスクリプトの作り方
  9. Windowsのポチポチ業務を爆速化するPowerShell、if文を使いフォルダの有無で処理を分岐させる方法
  10. Windowsのポチポチ業務を爆速化するPowerShell、ForEach-Objectで配列の全要素を処理する方法
  11. Windowsのポチポチ業務を爆速化するPowerShell、パイプラインを使いコマンドレット間で値を引き渡す方法
  12. Windowsのポチポチ業務を爆速化するPowerShell、ファイルを別フォルダにコピーし名称を変更する方法
  13. Windowsのポチポチ業務を爆速化するPowerShell、ファイル名を変更する方法
  14. Windowsのポチポチ業務を爆速化するPowerShell、正規表現で複雑なファイル名変更をする方法
  15. Windowsのポチポチ業務を爆速化するPowerShell、タスクスケジューラでスクリプトを決まった日時に起動する方法
  16. Windowsのポチポチ業務を爆速化するPowerShell、ファイルをバックアップするスクリプトの作り方

2019年版!仕事効率化ヲタク向けのiPhoneホーム画面を晒す

$
0
0

iphone

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

毎年、新年にはiPhoneホーム画面を晒す最新版の記事を書くようにしていました。

2017年版!仕事効率化ヲタク向けのiPhoneホーム画面を晒す
iPhoneはもう10周年となりました。もう、生活必需品ですよね。お仕事への活用はいかがですか?今回はiPhoneアプリをお仕事に活用いただくべく、お仕事効率化オタクのホーム画面と配置を紹介していきます!
2018年版!仕事効率化ヲタク向けのiPhoneホーム画面を晒す
年始恒例の企画、お仕事効率化ヲタクのiPhoneホーム画面を晒すシリーズの2018年版です。昨年との比較も踏まえて、「レギュラー」iPhoneアプリが全36アプリ。コメントを入れながら紹介していきますね。

実はこの記事書くの大変だし、最近そんなにホーム画面のようす変わってないし、今年はスルーかな~と思っていたのですが、隣ITの執筆陣でもあり、ノンプロ研のメンバーでもあるもりさん(@moripro3)から「今年は書かないんですか?」とプッシュいただきまして。

また、ノンプロ研でもちょっと話題になって、シンノさん(@y_stadio)も早速Android版を書かれてます。

【2019年版】Androidのホーム画面を晒してみます
今回は私の所属するコミュニティ:ノンプログラマーのためのスキルアップ研究会にて話題になったことを題材として記事を書きたいと思います.話題になったのはiPhoneのホーム画面.私の場合はiPhoneではなくPixel3というAndroid端末

じゃあ書くか…!ということで書きますよ~。

私のiPhoneホーム画面を晒すシリーズの2019版です。

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

お仕事効率化専用ホーム画面2019版

では、2017,2018,2019年のiPhoneホーム画面を比較でどうぞ1

2017年のiPhone6ホーム画面 2018年のiPhoneホーム画面 iPhoneホーム画面2019年版

お、意外と変わってますかね…。

あと、昨年まではiPhone6だったのですが、今年から一気にiPhoneXに変わっています。

そして、ドックのフォルダが2つに…面倒く、配置アプリの数が多くなっていますね!

引き続き、忘れんぼの私は、ホーム画面の1画面にふだん使用するアプリを配置するようにしています。

目に入らないアプリは存在を忘れちゃうのです。

ドック:とってもよく使うアプリとWorkフォルダ&便利ツールフォルダ

2018年のiPhoneのドック

2019年のiPhoneのドック

まずはドックからです。

ドックは一番下なので、最もタップしやすい位置になります。

しかし、使うアプリが多くなったのか、LINEを一段目に移動させてもらって、フォルダを1つ追加しています。

Gmail:メール

Gmailはいわずと知れたメールアプリですね。

Gmail - Eメール by Google
(2019.01.23時点)
posted with ポチレバ

ずっとInboxを愛用していたのですが、Googleさんの方針で、Inboxは終了してGmailにその機能を吸収していく…とのことでしたので乗り換えました。

実際に、スワイプでのアーカイブやスヌーズなどの機能は既に使えますし、機械学習による返信レコメンドや、複数アカウントの受信ボックスをまとめて見られるのも便利ですね。

Eureca:検索&ランチャー

Eurecaはずっと愛用している「なんでも検索アプリ」です。

Webはもちろん、アプリ、地図、Amazonなど、このアプリひとつでサクッと検索できるアプリです。

隣IT内検索も設定して、便利に使わせてもらっています。

新生!数多の検索を即実行できる神アプリ「Eureca」の超基本の使い方
EurecaはWEB検索をはじめ色々なアプリやサービスの検索をこれ一つで超簡単に行える検索アプリです。 間違いなく神アプリでしたので、その概要と基本の使い方について紹介をしたいと思います!

ただ、最近のバージョンアップとか、不具合とかの報告が多いので、大丈夫かな…とちょっと心配しています。

ドック内フォルダ:Workフォルダ

2019年のドックフォルダWork

Workフォルダはフォルダとはいえドック内にありますので、かなり高い頻度で利用するアプリが含まれています。

こちらのフォルダは主にGoogleドライブ系、Evernote系という感じですかね。

Googleドライブ・スプレッドシート・ドキュメント・スライド

Googleドライブ系はまとめて紹介します。

ドライブ・スプレッドシート・ドキュメント・スライドです。

Drive File Streamを使用していますので、PC内のすべてのファイルはGoogleドライブに格納されています。

ディスク容量を大幅削減かつ同期不要!Google Drive File Streamの基本とその導入方法
この度、正式版ローンチされたGoogle Drive File Streamとは何か、またその特徴などの基本とその導入方法について解説をしていきます。ディスク容量削減と同期不要…クラウドストレージ一択になりますよ…!

外部で閲覧したり、編集したりするときに、これらのアプリを使用します。

アプリなのであまり編集などの操作性は高くないですが、忘れないうちにちょこちょこ…という感じですね。

Google スプレッドシート
(2019.01.23時点)
posted with ポチレバ
Googleスライド
(2019.01.23時点)
posted with ポチレバ

MF経費:経費精算

MF経費は、経費精算アプリですね。

弊社ではがっつりマネーフォーワードクラウドシリーズを使っていますので。

このアプリは主に、レシートをパシャパシャ撮影して、アップする用です。

1ヶ月に1,2回くらいまとめてアップしていて、アップしたデータの修正はChatworkアシスタントさんにお願いしています。

フリーランス・副業の経理作業はMFクラウド確定申告を使うのが良いです
個人事業主にとって避けては通れない経理と確定申告…それを断然楽にするクラウド会計ソフト「MFクラウド確定申告」について、その素晴らしさとちょっとしたテクニックについて紹介したいと思います。

Google Keep:クラウドメモ

Google KeepGoogleのクラウドメモサービスですね。

ただ、ビジネス向けはほとんどEvernoteで事足りているので、Google Keepはどちらかというと買い物リストとか、息子の成長記録とかプライベート用に使っている感じです。

これから、Apps Scriptなどで操作できるようになれば面白いな~と思っています。

Evernote・FastEver2・Scannable

Evernoteとその関連アプリですね。

Evernoteはどちらかというと閲覧用、投稿はFastEver2で、資料のスキャンはScannableで、という使い分けになります。

Evernote
Evernote (無料)
(2019.01.23時点)
posted with ポチレバ
FastEver 2
FastEver 2 (480円)
(2019.01.23時点)
posted with ポチレバ
Evernote Scannable
(2019.01.23時点)
posted with ポチレバ

引き続き、情報収集から仕事の記録、ブログネタなどEvernoteにはかなり依存しています。

ブロガー必見!いつの間にか記事ネタが完成するEvernoteの使い方
お仕事でもブログ作成でももうなくてはならないオンラインメモサービスEvernote。今回はその様々な活用法の中から、いつの間にかブログの記事ネタができちゃう的なEvernoteの活用法を紹介します。

Evernoteの投稿はこれまではひな形を作れるEverGearというアプリを使っていたのですが、ひな形よりもサクッと感重視のFastEver2に切り替えました。

Scannableは引き続き大活用しています。

かさばる書類はスキャンしてEvernoteに保存、そしてシュレッダーです
お仕事をしていると、書類や資料などの紙の書類が増えていきます…。そんな「紙」の書類や資料たちをEvernoteにスキャンして保存することで上手に管理、整理する方法についてお伝えしていきます。

ドック内フォルダ:便利ツールフォルダ

2019年のドックフォルダ便利ツール

さて、ドックにはもう一つ便利ツールフォルダがあります。

こちらは、色々入っている感じですね。でも、よく使います。

Safari

Apple純正のブラウザアプリSafariです。

検索は主にEureca、ブックマークページの閲覧はChromeを使っているのですが、最近Pocketでの記事閲覧ができなかったり、シェアアイコンが表示されなくなったり、微妙にイマイチなので、Safariで開いて閲覧することが多くなりました。

EvernoteやTwitterとの連携はもちろんスムーズですし、さすが純正。安定感あります。

App Store・電話

App Store電話です。

あんまり使わないですが、たまに素早くアクセスしたいとき用でここに置いています。

YouTube

YouTubeアプリです。

YouTube
YouTube (無料)
(2019.01.23時点)
posted with ポチレバ

個人的にはあまりYouTubeを見る習慣はないのですが、一応「いつも隣にITのお仕事チャンネル」がありますので…チャンネル登録数を見たりもしています。

YouTubeチャンネル「いつも隣にITのお仕事」でVBAの解説動画を配信開始しました
エクセルVBAプログラミングの解説動画の配信を開始しました!ようやくです…。今回はYouTubeでの解説動画配信のお知らせとともに、なぜ解説動画を配信するしようと思ったのかについてお伝えします。

YouTube Studioというアナリティクス用のアプリもあるのですが…そちらはあんまり見てないですね。

Amazon・Kindle

AmazonKindleです。

Kindle
Kindle (無料)
(2019.01.23時点)
posted with ポチレバ

Amazonアプリは、ちょっとした備品とか、気になる書籍とかをすぐに購入できるので、すごく便利です。

そういえば、昨年はホーム画面にAmazonアプリなかったですね…なんでだろう。

Kindleアプリは、以前はリーダーとして使用していたのですが、昨年はKindle端末を買ったのでこちらはあまり使用しなくなっていると思います。

Microsoft Pix:カメラ

Microsoft Pixカメラアプリです。

ほぼ、イベント時のスライド撮影用です。

シャッター音が消せて、かつ、コンテンツ抽出機能で斜めからの撮影でも自動抽出で補正してくれます。

便利っす!

Togetter:ツイートまとめ

Togetterツイートまとめサービスです。

ノンプロ研をはじめてから、Togetterでツイートまとめをすることがとっても増えました。

基本的には、PCで作業をすることが多いのですが、新幹線などの移動中だとPC作業は乗り物酔いするので、その際にアプリ版を使用したりします。

プレゼンタイマ

プレゼンタイマーです。

プレゼンタイマー
(2019.01.23時点)
posted with ポチレバ

シンプルながら、時間や鳴らす回数などを設定できます。

ノンプロ研のLTの際に使用しています。

5,6列目:使用頻度が高いアプリ

2018年iPhoneのホーム5,6列目

2019年iPhoneXの5,6列目

5,6列目は、右手からも左手からも、親指が余裕で届きますので、使用頻度が高いアプリが配置されています。

2018年からの変更でいうと

  • LinkedIn、Qrio Lock、Slackが追加
  • Lineがドックから移動してきた
  • 電話はドックのフォルダに移動
  • Trello、Messengerを4列目に移動
  • NewsPicksがいなくなった

と、まあまあ変更ありますね。

チャットワーク・Slack・LINE:チャット

ビジネス用チャットアプリは、チャットワークとSlackの両方使いになりました。

あとプライベート用のLINEですね。

Chatwork
Chatwork (無料)
(2019.01.23時点)
posted with ポチレバ
Slack
Slack (無料)
(2019.01.23時点)
posted with ポチレバ
LINE
LINE (無料)
(2019.01.23時点)
posted with ポチレバ

ひとり社長としては、コンタクトをガンガンつないでチャットができるチャットワークが便利です。ビジネスのメインは引き続きチャットワークです。

Slackはノンプロ研で使い始めたのがきっかけで本格的に使い始めました。様々なカスタマイズが容易にできますし、GASとの連携もしやすいです。

LINEは主に家族やプライベートのやり取り用ですね。おそらく、人より使い倒せてないんじゃないかと思います。

Qrio Lock

Qrio Lockはいわゆるスマートロック用のアプリです。

ドアにQrio Lockをセッティングしておくと、このアプリを使ってドアの鍵の開け締めができるというすぐれものです。

鍵をカバンから出さずに開け締めできるのはもちろん、ドアに近づくだけで解錠するハンズフリー機能もあったり、昨年買ったガジェットでかなり上位に食い込む満足感です。

Twitter・Tweetbot

TwittertTweetbotです。

Twitter
Twitter (無料)
(2019.01.23時点)
posted with ポチレバ
Tweetbot 5 for Twitter
(2019.01.23時点)
posted with ポチレバ

閲覧は有料ですが高機能のTweetbotを使っています。

リストや登録してある検索結果をざっと閲覧するのが便利。お気に入りやリプライもスワイプで簡単にできます。

ちなみに、IFTTTを使って、お気に入りをすると、ツイート中のURLがPocketに入るように設定しています。

本家Twitterアプリは、通知の確認用として使っています。

Facebook

Facebookです。

Facebook
Facebook (無料)
(2019.01.23時点)
posted with ポチレバ

あんまり投稿には使っていなくて、通知確認&返信用という感じですね。

LinkedIn:ビジネスSNS

ビジネスSNSLinkedInです。

縁があって、LinkedInラーニングのお仕事をさせていただきましたので、それを機に使わせていただいています。

LinkedIn
LinkedIn (無料)
(2019.01.23時点)
posted with ポチレバ

まだ友達は少ないのですが、ビジネス特化なので良い活用法を模索中です。

TwitterやFacebookにプラスしてLinkedInへの投稿をうまく連携できると良いのですが…試行錯誤しております。

3,4列目:よく使うアプリ

2018年iPhoneのホーム3,4列目

2019年iPhoneXの3,4列目

続きまして、3,4列目です。

ここも私の手のサイズであれば、なんとか片手で届くという感じですかね。

なので、ここまでが主力ラインナップということになります。

2018年との比較では、以下の通りです。

  • Messenger、Trelloが5,6列目から移動
  • EverGear、Feedlyがいなくなった

Messenger:チャット

Facebookさんのチャット、Messengerです。

Messenger
Messenger (無料)
(2019.01.23時点)
posted with ポチレバ

普段のやり取りは、チャットワーク、Slack、そしてLINEが中心ですので、Messengerを使うときは、それ以外のやり取りになります。

週に数回という感じですかね。

Google Analytics

Google Analyticsです。

Webページのアクセス分析をすることができます。

Google Analytics
(2019.01.23時点)
posted with ポチレバ

当然、当ブログのアクセスチェックを日々行っております。

昨年は60万PVといっていましたが、最近では100万PVも間近…ありがたいことです。

Pocket:あとで読む

Pocketは定番のあとで読むサービスです。

Pocket
Pocket (無料)
(2019.01.23時点)
posted with ポチレバ

引き続き。とにかくあちこちで気になるタイトルの記事があればPocketにいったん突っ込んで、時間があるときに一気に読むというスタイルです。

良質なインプットを得るための情報収集(1)iPhoneアプリPocket
良いアウトプットをするためにどのようなインプットが必要なのかについて、またPocketを中心としたiPhoneアプリを活用して良質なインプットを得る情報収集の仕組みについてお伝えしていきたいと思います。

ただ、前述していますが、最近動作の調子よくないんですよね…Pocketアプリ。

ちょっと検討の時期が来ているのかも知れません。

Trello:タスク管理

Trelloはカンバン形式のタスク管理ツールです。

Trello
Trello (無料)
(2019.01.23時点)
posted with ポチレバ

私は個人のタスク管理と、当ブログの執筆チームの進行管理をTrelloを使っています。

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

Trelloの良いところはぱっと見で、タスクの進行状況やたまり具合がわかる点ですね。

あと、カンバンをドラッグしていくのが基本なので、PCとアプリで操作感がほとんど変わらないというのも良い点かと思います。

Calendars:カレンダー

カレンダーアプリは引き続き、Calendarsを使用しています。

Calendars by Readdle
(2019.01.23時点)
posted with ポチレバ

Googleカレンダーのクライアントとして使っていて、予定の追加、調整、Googleマップとの連携、相変わらず好きです。

お仕事効率化オタク向けのiPhoneカレンダー神アプリを探してみた
iPhone向けカレンダーアプリですがSunriseの代わりとなる神級アプリを探しました。PROPELa、Googleカレンダー、Calendars by Readdleの3つのアプリを紹介します。

Chrome:ブラウザ

ブラウザアプリChromeです。

前述の通り、EurecaやSafariも使っていますが、PCでのブックマークをそのまま使えるので、Chromeは主にブックマークを開く用になっています。

Google

Googleアプリは、レコメンド記事をチェックするニュースアプリ的なポジションで使用しています。

Google アプリ
(2019.01.23時点)
posted with ポチレバ

レコメンドの精度はどんどん上がっている気がしていて、お気に入りの記事がちゃんと上がってきてると思います。

また、最近では当ブログが掲載されてアクセスが跳ね上がる…ということもけっこうありますので、Analyticsアプリとともに、こまめにチェックをするようにしています。

Pokemon GO

Pokemon GOです。唯一のゲームアプリですね。

Pokémon GO
Pokémon GO (無料)
(2019.01.23時点)
posted with ポチレバ

特に最近は執筆があるので自宅作業が多く…どんどん妻に引き離されています。

1,2列目:たまに使うアプリ

2018年iPhoneのホーム1,2列目

2019年iPhoneXの1,2列目

さあ、ようやくたどり着きました1,2列目です。

はい、ご覧の通り、まったく変わっていませんね。

Google Maps

Google Maps…引き続き神アプリですね。

住所さえわかればなんとかなっちゃうのでホント助かります。

この位置なら右手の親指なら届きますし、前述のCalendarsから呼び出したり、Eurecaから呼び出すので、この位置でも大丈夫。

Yahoo!乗換案内

Yahoo!乗換案内は定番の乗換案内アプリですね。

Yahoo!乗換案内
(2019.01.23時点)
posted with ポチレバ

移動自体も少ないですし、だいたいGoogle Mapsでなんとかなっているので、あまり使わないですね。

電車について何か細かく調べたいときに使ってるかな、という感じです。

Simle Diet

Simple Diet体重の記録アプリです。

もうかれこれ数年使っていてだいぶレコーディングしていますが、全く成果出てないですね。

記録だけじゃ、だめです。

むしろ、昨年のグラーツ→正月→大阪とくいだおれまくっているので、やばいです。

1Password:パスワード管理

1Passwordはパスワード管理アプリです。

神です。

色々なアプリのシェアボタンから1Passwordを呼び出して、Face IDでパスワードを入れられるようになったので、本当に神です。

Googleフォト

GoogleフォトはGoogleによるクラウド写真管理サービスですね。

Google フォト
(2019.01.23時点)
posted with ポチレバ

iPhoneで撮影したものも、最近購入したPixel3で撮影したものも、全部Googleフォトに自動アップされます。しかも無制限…。

おかげで、カメラで撮影した写真をEvernoteに送ることはなりました。

写真・設定

写真はGoogleフォトにアップ済みの写真を削除するためだけにアクセスする感じですね。

他にも良い機能がたくさんあるっぽいですが…

設定も新たなWifiつなぐときくらいですかね。

Yahoo!天気

Yahoo!天気は定番天気アプリです。

Yahoo!天気
Yahoo!天気 (無料)
(2019.01.23時点)
posted with ポチレバ

Google MapsとGoogleフォト、1Passwordは大変重宝しています。

前は、降水確率がバッジ表示されていたのですが、なくなっちゃいました。

最近はApple Watchで天気予報を確認することができるので、特に困っていません。

まとめ

長らくお付き合いありがとうございます。

私の、iPhoneホーム画面に配置しているアプリの紹介、2019年版をお送りしました。

個人的には、思ったよりも変化があったと思いました。

コミュニティをはじめ色々な新しいことをはじめた結果ですかね…

ホーム画面がガチガチにならないように、アクティブに活動をしていきたいものです。

以上、iPhoneのホーム画面を晒しました!

本企画については、また来年お会いしましょう!!

会社員ノンプログラマーでもバリバリスキルを上げながら活躍する方法

$
0
0

business-man

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

多くのノンプログラマー会社員はこう思っているはず…。

朝早くから通勤して、会社では休む間もなく夜遅くまで大量の仕事をさばき、また電車に揺られて帰宅…

そんな毎日で、どうやってプログラミングを勉強すればいいのさ!?

と、そんな悩みに応えるべく開催された、コミュニティ「ノンプログラマーのためのスキルアップ研究会」定例会Vol.14「会社員でもバリバリスキルを上げる方法!」でございます。

プログラミングスキルをメキメキ磨きつつも、会社でバッチリ活躍されているスーパー会社員のお二人をゲストにお呼びしてご登壇をいただきました。

経理からデータサイエンティストに転身されて活躍されているタダケンさん(@tadaken3)と、Microsoft MVPを受賞し続けていらっしゃるハイパー情シス担当のきぬあささん(@kinuasa)のお二人をゲストにお呼びして登壇をいただきました。

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

ノンプロ研定例会Vol.14「会社員でもバリバリスキルを上げる方法!」
他の仕事を持っているノンプログラマーサラリーマンにとって、プログラミングを学習しスキルを磨く時間を確保するのは指南の技です。しかし、そのような中、バリバリにスキルを磨いて活躍しているサラリーマンが..

凡人でもキャリアをハックして成長する方法

最初はタダケンさんから「凡人でもキャリアをハックして成長する方法」というお話。

「タダケンさん」とは?

ブログ「タダケンのEnjoy Tech」やTwitterをフォローいただくと、タダケンさんの活躍と活動範囲、アグレッシブなところがすぐに見ていただけると思います。

タダケンのEnjoy Tech
楽しみながらラクに成果を上げる仕組みを考える

@tadaken

弊ブログでもいくつかの記事を執筆いただきました。

tadaken3 | いつも隣にITのお仕事
『プランノーツ』ではGoogle Apps Script、Pythonを使ってのツールの開発をしています。本業はとある会社のデータアナリストです。 ブログ『タダケンのEnjoy Tech』の管理人もやっています。「ラクして成果を上げる仕組みを考える」をモットーにPython、Google Apps Scriptを使って...

全然凡人には見えないのですが…

スキルの掛け算をする

さて、そんなタダケンさんですが、とある会社に入社して経理部に配属されたときに、「同期が強すぎる問題」にぶち当たります。

全員、素晴らしい資格を持っていて、しかも英語もできる。

会計・経理のスキルだけで勝負するのはかなり難しい…そんなときに、プログラミングに目をつけました。

そう、単一のスキルで勝負が難しいので、スキルの掛け算をしようと。

  • Objective-Cを勉強してiPhoneで「モグラたたき」を作る
  • Excel VBAを使って業務用ツールを作る

私、存じ上げてなかったのですが、タダケンさんもExcel VBAをされていたんですね。

20時間で習得したまあまあのスキルを掛け算

さて、その実りとして

  • 業務の自動化により時間を生み出せた
  • エンジニアリング的な考え方を仕事に活かす
  • エンジニアと話がしやすく、システム部門とのやりとりを任される

と、このような変化が起き、その成果や能力が認められてデータ分析部門への異動発令があったそう。

会計、ゲームの知識、プログラミング…個々のスキルはそれほど高くなくても、組み合わせると価値が出せるポジショニングになるということなんですね。

そして、その掛け算をするスキルは「20時間の法則」でOK。

経理部の中でもっともシステムがわかるレベルになれば十分に価値を発揮するということでした…なるほどですね!

そして、今はデータサイエンティスト×人事×デザインの掛け算を目指してらっしゃるそうですよ。

ノンプログラマーは掛け算を作りやすい

これは、ノンプログラマーにとってはチャンスになる話です。

もともと本職として経理なり、営業なり、マーケなり…皆さん何らかのスキルを持っているので、それにただ一つプログラミングをプラスすることで、既に掛け算になるということなんですね。

さらに、誰でも仕事以外に「好きなこと」や「得意なこと」、「興味があること」があったりします。

ノンプロ研の中にも、マンガ好き、アウトドア好き、ガジェット好き、タスク管理好き、デザイン好き…いろんな方がいらっしゃいます。これらも組み合わせることもできます。

組み合わせが難しいなら、前述の「20時間の法則」で増やしていってもOK。効果的そうだなというやつを見つけて、ちょっと頑張る。

これなら、確かに普通の人でもできそうですよ!

Microsoft MVP的自分語り

お次は、きぬあささんから、「Microsoft MVP的自分語り」のお話。

ほんといつも声がステキ。ぜひ、読者の皆さんにも直接聴いていただきたい。

「きぬあささん」とは?

お仕事はごく一般的な情シスさんとのことで、基幹システムの保守、皆さんのPCのセットアップ、プリンターのトナー交換などが主なお仕事で、VBA、VBS、PowerShellなどを駆使してお仕事をされています。

ブログ「初心者備忘録」やTwitterでは、Officeアドインをはじめ、VBAやGASのことも書かれていらっしゃいます。

初心者備忘録
Office アドイン(旧Office用アプリ)・リボンのカスタマイズ情報が満載

@kinuasa

私は、かねがねネット上では拝見させていただき、勉強をさせていただいておりました。

昨年開催させていただいたガイアックスさんの「Google Apps Script活用ミートアップ」というイベントで、直接ご挨拶させていただいたのを機に、今回の登壇も…とお願いした次第です。

Microsoft MVPとは

ですが、最も特長的なのはなんと言ってもMicrosoft MVPを取得されているという点です。

(他にもいくつか特長的なところがおありでしたが(^o^))

ノンプロ研の多くのメンバーはVBAを習得されている、または習得を目指されているのです
が、Microsoft MVPについては、あまり詳しく知らない方が多いようでした。

タカハシ自身も名前は聞いたことあるけど、「みんな、どうやって受賞してるの…?」と謎に思っておりました。

Microsoft MVPとは

Microsoft製品・サービスに関する最新情報の発信、バグ・技術資料の改善・機能提案、Microsoftへのフィードバックなど、 プロフェッショナルとして技術コミュニティで活躍されているコミュニティリーダーを表彰するアワード

のことで、現在国内に230名ほど受賞者がいらっしゃるそうです。

条件としては

  1. 年に一度の更新審査が必要
  2. 新規でMVPアワードに応募する場合、 Microsoftのフルタイム従業員、もしくは現役MVP受賞者による推薦が必要

とのこと。

きぬあささんに推薦してもらえればなれるのかな…?

詳しくはRie Moriguchiさん(@Rie_Moriguchi)のツイッターをフォローすると、Microsoft MVPの情報が手に入るそうですよ!

VBAをどのように勉強したか

きぬあささんのVBAの勉強法ですが、大変勉強になりました。ていうか、ストイックです。

  1. とにかく本を読む(Webではなくて本)
  2. Q&Aサイトにひたすら回答
  3. ブログでアウトプット

確かにちょっとやりたいことを調べるにはWeb検索は便利ですが、体系的にしっかりまとまったスキルを身につけたい場合は、本のほうが向いているかも知れません。

きぬあささんにご紹介いただいた書籍の中には、私の知らないくらい前に出版されたものもあり、たいへん興味深かったです。

あと、Q&Aか…私はほとんど回答したことがなかったのですが、なるほど~。あ、でもノンプロ研のSlackがそんな役割かも知れません。教えることは2度学ぶこと!

ブログはスマホで、プレッシャーをかけすぎずに

きぬあささんは、通勤時間が片道2時間とのこと。

いつ、書くんだ?という話ですよね。

実は、ブログの記事のネタ集めと、下書きをほとんどスマホのGmailアプリでされていらっしゃるそうです。

フリック、めちゃめちゃ速そうですね。

あと、書くことがストレスにならないように、更新頻度などの目標を立てずに「書きたいときに」されているそうです。

普通の人なら、そのままフェードアウトしそうなので、アドバイスとしてそのまま採用してよいものか…、正直悩みますねw

色々なスタンスがありますね。その人がうまくいくスタンスがベストですもんね。

はじめてゲスト登壇をお呼びしました

そんなお二人をお呼びして開催した今回の定例会。

ノンプロ研的には今回はチャレンジな定例会でした。

というのも、定例会でゲストにご登壇いただくのは初めてだったんです。

これまでは、タカハシがしゃべくり倒すスタイルだったのですが、ほら「会社員で活躍する」という話は、私はできないんです。

なにせ、私タカハシは会社員でうまく活躍できた経験がありませんもので…

自分にはできない話が、他の方ならできますからね。

皆さんのお力を借りて、どんどん知の交流を活発にしていければと思う次第でございます。

まとめ

以上、ノンプロ研定例会Vol.14「会社員でもバリバリスキルを上げる方法!」のレポートをお伝えしました。

私個人としては、自分の体験から、どうしても会社員にネガティブなイメージを持ってしまっているので、お二人にご登壇いただいて本当に良かったです。

お二人に共通しているのは、スキルだけでなく「ポジション取り」もちゃんとする、ということだなと思いました。

タダケンさんは戦略的にポジションを獲得されていきました。

きぬあささんも今のお仕事とご自身のテーマの親和性が高く、裁量もってやられている様子でした。

お二人のように、会社員でもプログラミングを武器に勝負していけるし、価値のある「働く」を武器にすることができます。

さて、次回も素敵なゲストをお呼びしています。

チャンネル登録者数27000人超え!「おさとExcel」を運営されているExcel×YouTuberの長内孝平さん(@osatoexcel)にご登壇いただきます。

テーマは「ノンプログラマーのためのブログ&動画発信術!」

おさとエクセル
Excelの使い方が学べる、おさとエクセルは「YouTubeで働き方を変える」ことを通じて「いい世の中をつくる個人を増やすこと」に貢献します。2019年までに90本のExcel動画をアップロードし、1,500,000回を超える視聴再生が行われました。コンテンツ高評価割合も90%以上を獲得しチャンネル登録者も27,...

どうぞお楽しみに!

「ノンプログラマーのためのスキルアップ研究会」定例会・分科会レポート

コミュニティ「ノンプログラマーのためのスキルアップ研究会」では、毎月1回、学びの質やモチベーションを高めるための定例会を開催していますので、こちらで過去のレポートをお送りしています。
教えることは二度学ぶこと!ノンプロ研定例会の参加レポートまとめました!
ノンプログラマーがVBA・GAS・Pythonなどのプログラミングを学ぶコミュニティ「ノンプログラマーのためのスキルアップ研究会」が絶賛活動中です!本ページはノンプロ研定例会の参加レポートまとめです。

コミュニティで40回以上イベントを開催してわかった会場選びのポイント

$
0
0
meeting-room

photo credit: Capture the planet The only one who cares? via photopin (license)

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

コミュニティ「ノンプログラマーのためのスキルアップ研究会」は発足1年になり、メンバーも50名を超える規模になってきました。

それで、特にここ最近では、大阪や仙台、都内でもいくつかの場所でイベントや勉強会を開催することが多くなってきました。

そうなると、必然的に必要になってくるのが「会場選び」

コミュニティ発足から40回以上のイベントをこなしてきましたが、どのように会場を選ぶのが良いのかのポイントについてお伝えしていきます。

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

会場を検索して探す

いつも使っている会場があればよいのですが、そうでない場合、まずは会場を検索して探すところから始まります。

最近では、ネットで会場を探せるサービスがいくつかあるので、部屋にいながらある程度の会場については目星をつけることができます。

スペースを探す「スペイシー」

ノンプロ研でよく使用しているのは「スペイシー」です。

貸会議室・レンタルスペースを格安で予約【スペイシー】1時間500円〜
東京、新宿、渋谷の貸し会議室・レンタルスペースの予約なら Spacee 。個室の貸会議室や研修、勉強会、セミナー会場をはじめ、レンタルキッチン、撮影スタジオ、パーティー用レンタルルームなど、格安からハイグレードまで豊富な情報と口コミを掲載しています。

比較的物件数も多く、予約もしやすく、決済もしやすいです。

他のサービスでも同じくらい良いサービスがあると思いますが、それほど使っていません。

理由としては、会場の日程確認と予約申し込みについてマニュアル化してをChatworkアシスタントさんにお願いしているという点があります。

他のサービスを使うと、それ用の指示とマニュアル作成を別途行う必要があるんです。

候補のリストアップ

はじめて開催するエリアであれば、目ぼしい会場をリストアップします。

必須条件としては

  • 最寄り駅から徒歩10分以内
  • 価格が予算内である
  • 予定している人数がテーブルありの着席で入る
  • Wifi設備がある
  • プロジェクターとスクリーン(またはスクリーン代わり)がある

が必須条件です。これに満たないものは除外して、満たすものをスプレッドシートにリストアップをしていきます。

地方だと件数が少ないこともあり、ヒットしないことがあるので、その場合は最寄り駅を増やしてみたり、価格を少し妥協したりします。

このリストアップ作業もChatworkアシスタントさんに依頼したりもします。

価格の決め方と無償貸出について

価格は時間あたりいくらという設定で、もちろん会場によって異なります。

オシャレだとメッチャ高かったりします。

コミュニティでは、オシャレさよりも、リーズナブルさのほうを重視しています。

なにせ、そのほうが、イベントの数を増やせますので。

あと、参加メンバーの所属企業など、無償で提供いただけるケースもあります。

ただ、ずっと無償で提供いただけるとは限りません。

使えなくなったときには有料で会場を確保しても成立するように、参加費などの設定バランスを考えておいたほうが良いと思います。

必ず下見をする

リストアップが完了したら、良さそうな会場の3件くらいについて、実際にそれぞれの会場について下見をします。

下見は必ず!!

というのも、はじめて大阪でイベントを行ったときに、なかなか焦るトラブルがありましたので…

「ノンプログラマーのためのスキルアップ研究会&もくもく会 in 大阪」を開催しました!
ノンプログラマーがVBA・GAS・Pythonなどのプログラミングスキルを身に着けるためのコミュニティ「ノンプログラマーのためのスキルアップ研究会」、通称「ノンプロ研」。東京を中心に開催されていましたが、この度初めて大阪で開催!渾身のレポートをお届けします!

ノンプロ研の場合は、エリアの有志の方に下見に行っていただいています。

会場によっては、空いていれば無料で下見が可能ですが、ほとんどの場合は30分または1時間予約をして、じっくり行えるようにしています。

下見をする際のポイント

下見のポイントは以下の通りです。

  • 駅からのわかりやすさ、入りやすさ
  • 解錠・施錠の方法(記載どおりに入れないことがある)
  • wi-fiがちゃんと繋がるか(イマイチなところもある)
  • プロジェクターを投影して見づらくないか(明るすぎて見えないとか、備品は揃ってるか)
  • ちゃんとテーブルありで想定人数が入るか(多くの会場は許容人数を「盛って」掲載しています)
  • 清潔さ(散らかってないか、掃除道具が揃っているか)

特にクリティカルなのは、Wifiとかプロジェクターの設備系、人数が入り切る広さかどうかという点です。

そこがアウトだとイベントが成立しない可能性があります。

その他は多少の妥協は可能ですが、実際にイベントを行うことを想定しながらチェックすると良いと思います。

継続してイベントや勉強会を開催する

お気に入りの会場を見つけたら、あとはひたすらその会場を使い続けます。

継続して使い続けると、その会場の使い方にも慣れてきますので、コスパが少し上がっていく感じはします。

ただし、人気の会場の場合は、2ヶ月前くらいに予約しないと確保できないこともあります。

その場合は、最初に会場を確保して、その後に企画を考えることもありますね。

まとめ

以上、イベントや勉強会などの会場選びのポイントについてお伝えしました。

継続してイベントを開催するのであれば、特にポイントとなるのは、以下かなと思います。

  • マニュアル化して誰でもできるようにする
  • ちゃんと下見をする
  • いいところはずっと使う

ぜひ、良い会場選びをして、有意義なイベントを開催しましょうね。

連載目次:「ノンプログラマーのためのスキルアップ研究会」開始からこれまで

ノンプログラマーがプログラミングを学ぶためのコミュニティ「ノンプログラマーのためのスキルアップ研究会」スタートからこれまでの足跡についてお伝えしていきます。
  1. コミュニティ「ノンプログラマーのためのスキルアップ研究会」を立ち上げます
  2. 「ノンプログラマーのためのスキルアップ研究会」12/1にスタートします! #ノンプロ研
  3. 「ノンプログラマーのためのスキルアップ研究会」で12/16にもくもく会を開催します #ノンプロ研
  4. 本日からコミュニティ「ノンプログラマーのためのスキルアップ研究会」がはじまりました! #ノンプロ研
  5. コミュニティ「ノンプログラマーのためのスキルアップ研究会」活動報告、スタートして4ヶ月どうだった?
  6. ノンプロ研をコミュニティを活発にするためのフレームワークに当てはめてみた
  7. 祝!コミュニティ「ノンプロ研」一周年記念!これまでの足跡と成し得たこと
  8. ノンプロ研の忘年会「1年の振り返り大BT大会」でちょっと感動しちゃった2つのこと
  9. コミュニティ連携型!初心者向けプログラミング講座開講のお知らせ
  10. コミュニティで40回以上イベントを開催してわかった会場選びのポイント

IMPORTFEED関数でブログの更新情報をスプレッドシートに一覧化する

$
0
0

importfeedサムネイル3

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

GoogleスプレッドシートのIMPORTFEED関数の使い方をシリーズでお届けしています。

前回の記事では、関数の基本的な使い方を紹介しました。スプレッドシートに「フィード」と「アイテム」のデータを取得しましたね。

GoogleスプレッドシートでWebデータを取得するIMPORTFEED関数の使い方
GoogleスプレッドシートのIMPORTFEED関数の使い方を紹介します。フィード・アイテムを取得する方法、属性を指定する方法、列見出しの有無の違い、取得アイテム数の指定などをお伝えします。

タカハシさん主宰のノンプロ研では、学習のアウトプットとしてブログを書いているメンバーが多数います。(私もそのひとり!)

そこで今回は、IMPORTFEED関数を活用して、コミュニティメンバーのブログ更新状況をスプレッドシートに一覧化してみます。

前回のおさらい:IMPORTFEED関数でアイテムを取得

IMPORTFEED関数とは、XML形式のフィードを、スプレッドシートにインポートする関数です。

IMPORTFEED(フィードURL, [クエリ], [見出し], [アイテム数])

引数が4つあります。

引数 省略の可否 説明
フィードURL 必須 フィードURLを指定する
クエリ 省略可 取得するデータの内容を指定する
見出し 省略可 先頭行に列見出しを含めるかを指定する
アイテム数(※) 省略可 直近のアイテムから順に、取得する数を指定する

    ※アイテムとは「記事」のことです。

    IMPORTFEED関数でスプレッドシートに一覧化する

    スプレッドシートにメンバーの一覧を作成します。ここでは、下記の列を作成します。

    • 手入力する項目
      • A列:メンバー名
      • B列:ブログのフィードURL
    • IMPORTFEED関数で取得する項目
      • C列:ブログタイトル
      • D列:最新記事のタイトル
      • E列:最新記事のURL
      • F列:最終更新日(最新記事の投稿時刻)

    イメージがこちらです。ここまで準備したら、C列~F列に関数を入れて、Webデータを取得していきましょう!

    importfeed3-1

    引数の共通設定

    IMPORTFEED関数の4つの引数のうち、第3引数と第4引数は全員共通にします。

    1. フィードURL
    2. クエリ
    3. 列見出しの有無
    4. 取得するアイテム数

    ・第3引数[列見出しの有無]
    false を指定します。スプレッドシート上に見出しを作成しているので、IMPORTFEED関数で取り込むときは見出し不要です。

    ・第4引数[アイテムの取得数]
    1 を指定します。最新の1件のみを取得するためです。

    ブログのタイトルを取得する

    C列に「ブログタイトル」を取得します。クエリは feed title です。

    C3セルに入力する数式
    =IMPORTFEED($B3,"feed title",false,1)

    importfeed3-2

    先頭行(ここでは3行目)に関数を入力したら、最終行までコピーしましょう。

    最新記事のタイトルを取得する

    D列に「最新記事のタイトル」を取得します。クエリは items title です。

    D3セルに入力する数式
    =IMPORTFEED($B3,"items title",false,1)

    importfeed3-3

    ※最新記事が取得できない場合の対処法は前回の記事をご覧ください。

    最新記事のURLを取得する

    E列に「最新記事のURL」を取得します。クエリは items url です。

    E3セルに入力する数式
    =IMPORTFEED($B3,"items url",false,1)

    importfeed3-4

    IMPORTFEED関数で取得したURLには、自動でリンクが作成されます。その記事を読みたい場合、すぐにアクセスできるので便利です!

    importfeed3-5

    最終更新日(投稿時間)を取得する

    F列に「最終更新日」を取得します。クエリは items created です。

    F3セルに入力する数式
    =IMPORTFEED($B3,"items created",false,1)

    importfeed3-6

     

    これで、メンバーのブログ更新状況の一覧ができました!

    一度関数を入力すれば、ブログが更新されるたびに、スプレッドシートにも自動で反映されます。

    最終更新日の日付形式を整える

    最後に、F列の「最終更新日」の表示形式を整えます。例えば3行目の「Tue, 22 Jan 2019 02:45:28 +0000」は「2019/1/22」と表示させたいですよね。

    importfeed3-7

     

    さらに、タイムゾーンが日本時間でないWebサイト(末尾が+0000)の場合、Date Createdが9時間遅れているので、時刻を判定して日付も調整します。

    スプレッドシートの関数を組み合わせて、日付を整形していきます。やりたいことはこの2つです。

    1. 9時間のズレを補正する
    2. YYYY/MM/DD形式の表示にする

    方針は、「Date Createdから年・月・日の3つを取得し、DATE関数で日付形式にする」です。

    DATE関数についてはこちらをご参照ください。

    GoogleスプレッドシートとExcelで使える日付関連の関数まとめ
    Googleスプレッドシートやエクセルで日付に関する処理をする場合も多いですよね。今回は、今日の日付、何か月後の日付、月末日をはじめ両方で全く同じく使える日付関連の関数を一通り紹介したいと思います。

    年月日・時刻を取得する

    スプレッドシートのmid関数で下記の4つを取得します。

    • 年(year)
    • 月(month)
    • 日(day)
    • 時刻(hour)
    =mid(文字列, 開始位置, セグメントの長さ)

    importfeed3-8

    取得結果がこちらです。

    importfeed3-9

     

    月の変換と日時補正

    次に、月の変換と日時補正をします。

    ①「月」の英語表記を数字に変換する
    ②9時間遅れのズレを補正する

    まずは①の「月」変換です。1月、2月、3月といった「月」の英語表記を数字に変換します。

    別シートに対応表を作成します。このシート名は「カレンダー」としておきます。

    importfeed3-10

    VLOOKUP関数で、英語表記を数字に変換します。関数の使い方はこちらをご覧ください。

    GoogleスプレッドシートのVLOOKUP関数で複数条件による検索を行う方法
    GoogleスプレッドシートでVLOOKUP関数を使う基本の方法とVLOOKUP関数で複数条件による検索をする方法についてです。またエラー表示を非表示にするIFERROR関数の使い方にも触れます。

     

    次に②の日時補正です。

    IMPORTFEED関数の取得結果が「Tue, 22 Jan 2019 21:00:00(1月22日 21時)」の場合、実際の投稿日時は、「Wed, 23 Jan 2019 06:00:00(1月23日 6時)」です。

    IF関数を使用して、日付を9時間補正します。

    ・時刻+9時間が24未満の場合 → 補正前の日付
    ・そうでない場合 → 補正前の日付+1(翌日)

    ①・②の関数を、K列・L列に入力します。

    importfeed3-11

    結果がこちらです。

    importfeed3-12

    YYYY/MM/DD形式に変換する

    ここまでで、年・月・日の3つが揃いました。DATE関数を使用して日付形式にします。

    importfeed3-13

     

    これで一覧の完成です!作業・整形用に使用した列(G列〜L列)はグループ化してたたみましょう。

    importfeed3-14

    まとめ

    今回の記事では、GoogleスプレッドシートのIMPORTFEED関数を使用して、ブログ更新状況の一覧を作成しました。

    • コミュニティメンバーのブログ更新状況をスプレッドシートにまとめる
    • 会社の業務に必要なWebサイトの更新状況をスプレッドシートに一覧化して、部署で共有する

    など、活用方法はたくさんありますね。

    IMPORTFEED関数の第2引数[クエリ]に指定できる全一覧は前回記事で紹介していますので、クエリの指定をアレンジして、ぜひオリジナルの一覧を作ってみてください!

    連載目次:IMPORTFEED関数でブログ情報を取得する

    GoogleスプレッドシートのIMPORTFEED関数を使って、ブログ更新情報の一覧を作る方法を紹介しています。

    1. Webサイトの新着記事をいち早く取得!RSSフィードのURLを確認する方法
    2. GoogleスプレッドシートでWebデータを取得するIMPORTFEED関数の使い方

    Windowsのポチポチ業務を爆速化するPowerShell、関数をコンソールで登録して呼び出す方法

    $
    0
    0

    みなさんこんにちは、テラド(@terashin1226)です!

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

    前回はPowerShellで関数を作ってスクリプトから呼び出す方法を方法をお伝えしました。

    Windowsのポチポチ業務を爆速化するPowerShell、関数を作ってスクリプトから呼び出す方法
    Windowsのポチポチ業務(=マウスを使った業務)を爆速化するPowerShell。今回はPowerShellで関数を作ってスクリプトから呼び出す方法をご紹介します!複雑な処理、記述量が多い処理は関数にしておくことで繰り返し使用でき便利です!

    今回はPowerShellで作った関数をコンソールで登録して呼び出す方法をお伝えします。

    コマンドレットのように自分で作った関数をコンソールから自由に呼び出しちゃいましょう。

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

    前回のおさらい

    前回は引数2つを加算した答えを返してくれる関数「Add-Number」を作成し、スクリプト内から呼び出しました。

    以下のようなスクリプトです。

    function Add-Number($num1,$num2){
        $answer = $num1 + $num2
        return $answer
    }
    
    Add-Number 1 2

    このように関数自体とその呼び出しを1つのスクリプト内で記述しました。

    スクリプトは上から順番に解釈されますので、実行すると

    1 関数がPowerShellに登録される
    2 登録された関数Add-Numberを呼び出す

    という処理の流れとなっています。

    スクリプト内で完結しているように思えますが、関数が一旦はPowerShellに登録されているということを覚えておいてください。

    コンソールから関数を登録して呼び出す方法

    では、関数「Add-Number」をPowerShellのコンソールで登録して呼び出す方法をお伝えしていきますよ!

    まずは以下のスクリプトをISEのスクリプトウィンドウに入力し、デスクトップに「sample.ps1」という名称で保存してください。前回作成した関数の呼び出しの部分は削除してくださいね。

    function Add-Number($num1,$num2){
        $answer = $num1 + $num2
        return $answer
    }

    PowerShellに関数を登録する

    さきほどご説明したとおり、まず関数をPowerShellに登録する必要があります。

    登録方法は簡単で、関数を書いたスクリプトのフルパスをコンソールから入力するだけです。

    エンターを押すと、なにも起こらずにプロンプトが再度表示されます。

    登録が無事完了しているか、関数を呼び出して確かめてみましょう!

    前回ご紹介した関数の呼び出し方は以下のとおりでしたね。コンソールから呼び出す場合もまったく同じです。

    関数名 引数1に入力する値 引数2に入力する値

    $num1に1、$num2に2を入力することにし、以下のように書きます。

    Add-Number 1 2

    コンソールで「Add-Number 1 2」として実行すると…

    あれ、以下のようにエラーになってしまいました。

    Add-Number : 用語 ‘Add-Number’ は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
    発生場所 行:1 文字:1
    + Add-Number 1 2
    + ~~~~~~~~~~
    + CategoryInfo : ObjectNotFound: (Add-Number:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

    用語 ‘Add-Number’ は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。」と書いてありますね。どうやら呼び出しがうまくいっていないようです。

    実はコンソールから関数を呼び出すにはスコープと言われる設定を変更する必要があります

    globalキーワードでスコープを変更する

    コンソールから関数を呼び出すにはもうひと手間、作業が必要です。

    関数名の前にglobalキーワードを付与します。

    function global:関数名(引数1,引数2,…){

    処理内容

    return 戻り値

    }

    globalキーワードを付与しない場合、関数を同一スクリプト内から呼び出すことは可能ですが…

    コンソールなど外部から呼び出すことができません。

    globalを指定することにより外部(コンソール、ほかのスクリプト)から呼び出しが可能になります。

    このように関数を呼び出せる範囲のことをスコープといいます。

    実行結果

    globalキーワードを付与すると、スクリプトは以下の通りとなります。

    function global:Add-Number($num1,$num2){
        $answer = $num1 + $num2
        return $answer
    }

    では、globalキーワードを付与して呼び出しが可能となったところで再度コンソールにフルパスを入力して関数を登録してください。

    その後にコンソールで関数名を途中まで入力すると…

    入力補完機能により「Add-Number」が表示されました。正しく関数が登録されている証拠です。

    最後まで入力し実行すると…

    $answer(1+2の答え「3」)が表示されました!

    今回ご紹介した方法では、PowerShellを終了しない限りは何度も関数を呼び出すことが可能です。ただし、PowerShellを終了すると登録された関数は削除されますのでご注意ください。(次回、PowerShellを終了しても関数の登録を保持する方法をご紹介します。)

    まとめ

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

    今回はPowerShellの関数をコンソールで登録して呼び出す方法をお伝えしました!関数をコンソールなど外部から呼び出すにはglobalキーワードでスコープを変更することが必要となります。

    次回はコンソールからの関数の登録が不要となるプロファイルに関数を登録する方法をご紹介します!

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

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

    Windowsのポチポチ業務(マウスを使った業務)を爆速化するために、PowerShellを使った効率化の方法をお伝えしています。
    1. Windowsのポチポチ業務を爆速化するPowerShell、はじめのハードルぐーーんと下げてみます!
    2. Windowsのポチポチ業務を爆速化するPowerShell、キーボードを使わずササっと起動する方法
    3. Windowsのポチポチ操作を爆速化するPowerShellの絶対条件!ディレクトリとその移動をマスターしよう!
    4. Windowsのポチポチ業務を爆速化するPowerShell、コマンドレットを腹の底から理解する!
    5. Windowsのポチポチ業務を爆速化するPowerShell、オンラインヘルプでコマンドレットを使い倒す!
    6. Windowsのポチポチ業務を爆速化するPowerShell、統合開発環境ISEを紹介します!
    7. Windowsのポチポチ業務を爆速化するPowerShell、スクリプトを実行するための準備
    8. Windowsのポチポチ業務を爆速化するPowerShell、フォルダを作るスクリプトの作り方
    9. Windowsのポチポチ業務を爆速化するPowerShell、if文を使いフォルダの有無で処理を分岐させる方法
    10. Windowsのポチポチ業務を爆速化するPowerShell、ForEach-Objectで配列の全要素を処理する方法
    11. Windowsのポチポチ業務を爆速化するPowerShell、パイプラインを使いコマンドレット間で値を引き渡す方法
    12. Windowsのポチポチ業務を爆速化するPowerShell、ファイルを別フォルダにコピーし名称を変更する方法
    13. Windowsのポチポチ業務を爆速化するPowerShell、ファイル名を変更する方法
    14. Windowsのポチポチ業務を爆速化するPowerShell、正規表現で複雑なファイル名変更をする方法
    15. Windowsのポチポチ業務を爆速化するPowerShell、タスクスケジューラでスクリプトを決まった日時に起動する方法
    16. Windowsのポチポチ業務を爆速化するPowerShell、ファイルをバックアップするスクリプトの作り方
    17. Windowsのポチポチ業務を爆速化するPowerShell、関数を作ってスクリプトから呼び出す方法

    エクセルVBAでクラスを使った請求書マクロの概要と使用するクラスの定義

    $
    0
    0
    document

    photo credit: wuestenigel Red pen on spreadsheet via photopin (license)

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

    弊ブログには「エクセルVBAで請求書を作る」という初心者向けのシリーズがありまして、たいへん人気のある連載となっています。

    こちらの記事からはじまるシリーズです。

    【初心者向けエクセルVBA】データ一覧から請求書を自動で作る
    初心者向けVBAの実用的な使い方について、請求データ一覧から請求書を自動で作成するを目標に進めます。初回はWorksheetオブジェクト、Rangeオブジェクトと、セルの値の操作についてお伝えします。

    反復、分岐、日付の操作、セルの読み書き、シートの操作、ブックの作成や保存など、ぜひ覚えておきたい要素がてんこ盛りなので、初心者向けの導入としては良い教材になるかと思います。

    ただ、一通りだいたいマスターして、クラスなども少しかじってみたとします。

    例えば、以下の記事からはじまる「初心者でもわかるエクセルVBAのクラスモジュール」のシリーズなどです。

    【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
    「初心者でもわかる!エクセルVBAのクラスモジュールの活用法」をテーマに、その使い方と便利さについてシリーズでお伝えしていきます。今回は、エクセルVBAで最も簡単なクラスを作る方法をお伝えしていきます。

    そうなると、「昔作った、請求書マクロ。クラス使ったらどうなるんだろ?」となりませんか?

    私はなりました。

    ということで、本記事から新シリーズとして「エクセルVBAでクラスを使って請求書マクロを作る」を開始したいと思います。

    「クラスってなんぞや?」という方は、前述の「初心者でもわかるエクセルVBAのクラスモジュール」のシリーズを一通り触ってみてください。

    今回は、エクセルVBAでクラスを使った請求書マクロの概要と使用するクラスの定義ということでお送りします。

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

    請求書マクロのシート構成

    まず、請求書マクロの元となるデータやひな形について確認しておきましょう。

    エクセルファイル「請求データ.xlsm」は3つのシートで構成されています。

    請求データ

    まず、「請求データ」シート。

    請求データシート
    これは、各社へ請求すべき元データを品目別にまとめているシートになります。

    このデータが請求書の元データとなります。

    取引先マスタ

    次が「取引先マスタ」シート。

    取引先マスタシート

    これは、現在取引のある取引先の基本情報をまとめたマスタシートです。

    毎月締めたところで、これらの取引先のうち、請求すべきデータが存在する取引先に、それぞれ請求書を作成する必要があります。

    請求書ひな形

    最後が「請求書」シートです。

    請求書シート

    これが、毎月作成する請求書のひな形となるシートとなります。

    21行目から50行目まで、請求する品目と単価、数量を入力できるようになっています(図では一部の行について非表示にしています)。

    このシートをベースに取引先ごとに請求書を作ることになります。

    請求書マクロの動作

    作りたい請求書マクロはこのようなものです。

    1. 実行するとInputBoxで年月の入力を受け付ける
    2. 取引先マスタに存在する取引先の分だけ、該当の年月に納品した請求データがあれば別のエクセルブックとして請求書を作成する
      1. ひな形のD15,D16セルに該当の年月から算出した請求日、支払期限を入力
      2. ひな形のA21~C50セルに該当の年月、該当の取引先の請求データを転記
      3. ひな形のA3~A7セルには取引先マスタから社名、郵便番号、住所を転記

    ひな形のその他の部分は、ひな形にベタ打ち、もしくは数式で自動計算となっています。

    データ行を表すクラスを作成する

    さて、それで作成する請求書マクロですが、「クラス」を使うとお伝えしました。

    どんなクラスを用意するか…なのですが、「初心者でもわかるエクセルVBAのクラスモジュール」のシリーズでお伝えした通り、エクセル表の1行分のデータは、クラス化すると便利だったりします。

    クラスのプロパティの作成については以下の記事もご覧ください。

    エクセルVBAでクラスに最も簡単なプロパティを追加する方法
    「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにお送りしています。今回はエクセルVBAで、クラスモジュールにパブリック変数を宣言して、クラスに最も簡単なプロパティを追加する方法です。

    請求データを表すDataクラス

    なので、まず「請求データ」シートの1行分を表すDataクラスを作ります。

    納品日、取引先名、品目、単価、数量を表すプロパティを持たせれば良さそうですね。あ、「価格」は「単価×数量」で計算できるので、プロパティとしては追加せずに、いったん置いておきます。

    なので、クラスモジュール「Data」はこんなコードを作りました。

    Public DeliveryDate As Date
    Public ClientName As String
    Public ItemName As String
    Public Price As Long
    Public Quantity As Long

    Dataクラスをインスタンス化するとDataオブジェクトになり、以下の部分のデータを持つことができるようになります。

    Dataオブジェクト

    取引先を表すClientクラス

    続いて、「取引先マスタ」シートの1行分を表すClientクラスです。

    こっちはわかりやすいですね。

    取引先名、郵便番号、住所1、住所2をプロパティとして、クラスモジュール「Client」に以下のようなコードを書きます。

    Public Name As String
    Public PostalNumber As String
    Public Address1 As String
    Public Address2 As String

    Clientクラスをインスタンス化すると、以下の部分のデータを持つことができます。

    Clientオブジェクト

    まとめ

    以上、エクセルVBAの請求書マクロの概要と、使用するクラスの定義をしました。

    まだはじまったばかりなので、全容がなかなか見えないかも知れませんが、一歩ずつ着実に進めていきますので、ぜひお付き合いください。

    次回は、今回作成したクラスのインスタンスをコレクション化する部分を作っていきます。

    エクセルVBAでシートモジュールに請求書マクロのデータをコレクション化する処理を書く
    エクセルVBAでクラスを使って請求書マクロを作るシリーズをお送りしています。今回は、エクセルVBAで請求書マクロのシートのデータをシートモジュール上のインスタンスのコレクションとして格納する方法です。

    どうぞお楽しみに!

    連載目次:エクセルVBAでクラスを使って請求書マクロを作る

    エクセルVBAの題材として実務でもよく利用される「請求書マクロ」。ある程度スキルを磨いたら「これをクラスを使って実装したら?」という疑問が出てくるもの…このシリーズで実際に作ってみましょう。
    1. エクセルVBAでクラスを使った請求書マクロの概要と使用するクラスの定義
    2. エクセルVBAでシートモジュールに請求書マクロのデータをコレクション化する処理を書く

    エクセルVBAでシートモジュールに請求書マクロのデータをコレクション化する処理を書く

    $
    0
    0
    collection

    photo credit: RÉTRO BUS RENNAIS Collection Orain (03) via photopin (license)

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

    エクセルVBAでクラスを使って請求書マクロを作るシリーズをお送りしています。

    前回の記事はこちら。

    エクセルVBAでクラスを使った請求書マクロの概要と使用するクラスの定義
    新シリーズとして「エクセルVBAでクラスを使って請求書マクロを作る」を開始します。今回は、エクセルVBAでクラスを使った請求書マクロの概要と使用する2つのクラスの定義ということでお送りします。

    シリーズ最初の記事でしたが、作成するマクロの概要とクラスの定義までを進めました。

    今回は作成したクラスのインスタンスをコレクション化して、シートのデータを格納するまでを進めていきます。

    エクセルVBAで請求書マクロのシートデータをインスタンスのコレクションとして格納する方法です。

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

    前回のおさらい

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

    目標とするマクロとしては、以下の「請求データ」に蓄積されたデータを

    請求データシート
    これは、各社へ請求すべき元データを品目別にまとめているシートになります。

    この「取引先マスタ」にある取引先の分だけ

    取引先マスタシート

    この「請求書」シートをひな形として請求書を作りたい、というものです。

    請求書シート

    それで、まずは「請求データ」シートの1行分のデータを表すクラスDataと

    Public DeliveryDate As Date
    Public ClientName As String
    Public ItemName As String
    Public Price As Long
    Public Quantity As Long

    「取引先マスタ」シートの1行分のデータを表すClientクラスを作成しました。

    Public Name As String
    Public PostalNumber As String
    Public Address1 As String
    Public Address2 As String

    Collectionオブジェクトをどこに持つか

    Dataクラスのインスタンスは「請求データ」シートの1行分のデータを格納できますから、各行をインスタンスに放り込んだものをコレクションに追加していけば、表全体のデータを格納できます。

    Clientクラスについても同様の考え方で、表全体のデータを取り扱えます。

    それで、Collectionオブジェクトをどこに持つかなのですが、「初心者でもわかるエクセルVBAのクラスモジュール」のシリーズでは、コレクション用のクラスを別途作ってたんですね。

    エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
    「初心者でもわかるエクセルVBAのクラスモジュール」ということでシリーズでお伝えしております。今回は、エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法をお伝えします。

    しかし、Clientsとか、Datas(というかそもそも単語がおかしい)とかのクラスをさらに追加…ってちょっとモジュールが増えすぎて邪魔くさい感じがします。

    シートモジュールにデータをコレクション化して持つ

    それで、各データはもともとはシートにあるんだから、そしたらシートオブジェクトにCollectionオブジェクト持てばいいんじゃね?

    というアイデアを思いつきました。

    というのも、シートモジュールは、既にインスタンス化されているという点を除くと、クラスモジュールに近いイメージで使用できます。

    つまり、そのシートオブジェクトに対して以下のようなことが実現できます。

    • プロパティやメソッドを追加できる
    • イベントプロシージャを追加できる

    例えば、シートから取得したデータ群をコレクションとして格納して、プロパティとして持って置けば、他のモジュールからアクセスすることができますよね。

    シートモジュールのコード

    それでは、まず簡単そうな「取引先マスタ」のほうから。

    「取引先マスタ」シートのシートオブジェクト名をwsClientに変更して、そのシートモジュールwsClientに以下のようなコードを作りました。

    Public Clients As Collection
    
    Public Sub Store()
        Set Clients = New Collection
        
        Dim i As Long: i = 2
        Do While Cells(i, 1) <> ""
            Dim c As Client: Set c = New Client
            c.Init Range(Cells(i, 1), Cells(i, 4))
            Clients.Add c, c.Name
            i = i + 1
        Loop
    
    End Sub

    パブリック変数ClientsをCollection型で宣言します。

    これが、Clientクラスのインスタンス、つまりClientオブジェクトを追加していくコレクションになります。

    パブリック変数なので、そのまま読み書き可能なプロパティとして外部からアクセスできます。

    SubプロシージャStoreは、シートのデータを取り込むためのメソッドで、以下のような処理を行います。

    1. コレクションClientsを初期化
    2. 「取引先マスタ」の各行について
      1. Clientクラスのインスタンスを生成
      2. ClientのインスタンスのInitメソッドにRangeオブジェクトを渡して初期データを投入
      3. コレクションClientsにClientのインスタンスを追加

    このStoreメソッドをマクロの最初に実行して、シートのデータをオブジェクトのコレクションとして持たせちゃおうという作戦です。

    インスタンスに初期データを投入するInitメソッド

    それで、上記wsClientのStoreメソッド内で使用していた、Clientのインスタンスに初期データを投入するInitメソッドを定義していませんでしたね…

    以下のメソッドをクラスモジュールClientに追加します。

    Public Sub Init(ByVal values As Range)
        Name = values(1).Value
        PostalNumber = values(2).Value
        Address1 = values(3).Value
        Address2 = values(4).Value
    End Sub

    Rangeオブジェクトを受け取って、1番目のセルから順番に各プロパティに格納していきます。

    データをコレクション化の動作確認

    では、標準モジュールに動作確認用のプロシージャを作って確認しましょう。

    ちなみに、標準モジュールのモジュール名を「Main」に変更しています。

    Sub New請求書マクロ()
    
    wsClient.Store
    Dim myClients As Collection: Set myClients = wsClient.Clients
    Stop
    
    End Sub

    実行してStop時にローカルウィンドウを確認すると、以下のようにデータが取得できていることを確認できます。

    取引先マスタのコレクションを確認

    「請求データ」シートのコレクション化

    「請求データ」シートも全く同様の流れで作っていきます。

    まず、「請求データ」シートのシートモジュールのモジュール名をwsDataとして、そこに書くコードはこちら。

    Public Data As Collection
    
    Public Sub Store()
        Set Data = New Collection
        
        Dim i As Long: i = 2
        Do While Cells(i, 1) <> ""
            Dim d As Data: Set d = New Data
            d.Init Range(Cells(i, 1), Cells(i, 5))
            Data.Add d
            i = i + 1
        Loop
    
    End Sub

    こちらもインスタンスのデータ初期化用のInitメソッドが必要なので、同じノリでクラスモジュールDataに追加。

    Public Sub Init(ByVal values As Range)
        DeliveryDate = values(1).Value
        ClientName = values(2).Value
        ItemName = values(3).Value
        Price = values(4).Value
        Quantity = values(5).Value
    End Sub

    標準モジュールMainを以下のようにコード追加して、動作確認します。

    Sub New請求書マクロ()
    
    wsClient.Store
    Dim myClients As Collection: Set myClients = wsClient.Clients
    
    wsData.Store
    Dim myData As Collection: Set myData = wsData.Data
    Stop
    
    End Sub

    請求データシートのコレクションを確認

    なんとなく似たような処理なので共通化したい気もするのですが…難しい気もしますし、そこまで効果的に使い回せるのか、ちょっと疑問があるのでひとまずここで着地させときます。

    まとめ

    以上、エクセルVBAで請求書マクロのシートデータをインスタンスのコレクションとして格納する方法をお伝えしました。

    コレクションの置き場として、シートモジュールを使ってみました。

    シートからのデータの読み取りなので、わりとこの方法も良さそうな気がします。

    では、次回は生成したコレクションを使って取引先ごとの請求データを取り出す処理を作っていきます。

    どうぞお楽しみに!

    連載目次:エクセルVBAでクラスを使って請求書マクロを作る

    エクセルVBAの題材として実務でもよく利用される「請求書マクロ」。ある程度スキルを磨いたら「これをクラスを使って実装したら?」という疑問が出てくるもの…このシリーズで実際に作ってみましょう。
    1. エクセルVBAでクラスを使った請求書マクロの概要と使用するクラスの定義
    2. エクセルVBAでシートモジュールに請求書マクロのデータをコレクション化する処理を書く

    エクセルVBAでクラスとコレクションを使うと簡単に請求書のデータ抽出できる

    $
    0
    0
    extract

    photo credit: trpnblies7 Homemade Extracts (Day 1) via photopin (license)

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

    エクセルVBAでクラスを使って請求書マクロを作るシリーズをお送りしています。

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

    エクセルVBAでシートモジュールに請求書マクロのデータをコレクション化する処理を書く
    エクセルVBAでクラスを使って請求書マクロを作るシリーズをお送りしています。今回は、エクセルVBAで請求書マクロのシートのデータをシートモジュール上のインスタンスのコレクションとして格納する方法です。

    各シートのデータを、そのシートモジュールが持つプロパティにコレクションとして格納するところまでをお伝えしました。

    今回はその続きで、請求データの中から該当の取引先のデータだけを抽出する方法です。

    これは、クラスとコレクションを使うと、実にスマートに実現できるんです。

    ということで、エクセルVBAでクラスとコレクションを使って簡単に請求書のデータ抽出をする方法です。

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

    前回のおさらい

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

    「請求データ」シートとそのコレクション化の処理

    請求書マクロは3つのシートから成り立っていまして、取引先別の請求書を作成するためのもととなるデータが蓄積されているのが、以下の「請求データ」シートです。

    請求データシート

    この「請求データ」の1行分を表すDataクラスというのを定義していまして、それがこちら。

    Public DeliveryDate As Date
    Public ClientName As String
    Public ItemName As String
    Public Price As Long
    Public Quantity As Long
    
    Public Sub Init(ByVal values As Range)
        DeliveryDate = values(1).Value
        ClientName = values(2).Value
        ItemName = values(3).Value
        Price = values(4).Value
        Quantity = values(5).Value
    End Sub

    その1行分のデータを表すDataクラスのインスタンス、つまりDataオブジェクトをコレクション化することで、データ全体を表現できます。

    それを「請求データ」シートのシートモジュールwsDataに持ってしまおう、ということで作ったのが以下のDataプロパティと、Storeメソッドです。

    Public Data As Collection
    
    Public Sub Store()
        Set Data = New Collection
        
        Dim i As Long: i = 2
        Do While Cells(i, 1) <> ""
            Dim d As Data: Set d = New Data
            d.Init Range(Cells(i, 1), Cells(i, 5))
            Data.Add d
            i = i + 1
        Loop
    
    End Sub

    「取引先マスタ」シートとそのコレクション化の処理

    続いて、「取引先マスタ」シートです。

    取引先マスタシート

    ここに記載されている、取引先の分だけ請求書を作ります。

    これも「請求データ」シートと同じノリで、1行分のデータを表すClientクラスと、シートモジュールにコレクション化する処理を作成しました。

    Public Name As String
    Public PostalNumber As String
    Public Address1 As String
    Public Address2 As String
    
    Public Sub Init(ByVal values As Range)
        Name = values(1).Value
        PostalNumber = values(2).Value
        Address1 = values(3).Value
        Address2 = values(4).Value
    End Sub

    Public Clients As Collection
    
    Public Sub Store()
        Set Clients = New Collection
        
        Dim i As Long: i = 2
        Do While Cells(i, 1) <> ""
            Dim c As Client: Set c = New Client
            c.Init Range(Cells(i, 1), Cells(i, 4))
            Clients.Add c, c.Name
            i = i + 1
        Loop
    
    End Sub

    ひな形となる「請求書」シート

    もうひとつが「請求書」シートで、これをひな形として請求書を作ります。

    請求書シート

    クラスとコレクション化の動作確認用マクロ

    以上までの動作確認をするために前回作成したのが以下のMainのコードです。

    Sub New請求書マクロ()
    
    wsClient.Store
    Dim myClients As Collection: Set myClients = wsClient.Clients
    
    wsData.Store
    Dim myData As Collection: Set myData = wsData.Data
    Stop
    
    End Sub

    請求書を作るまでの処理の流れ

    請求書を作る処理の流れを確認しておきましょう。

    まず、取引先の数だけ請求書を作る必要がありますので、「取引先の数だけループする」という処理が必要ですね。

    その上で、「請求データ」からその該当の取引先のデータを抽出して、それぞれの取引先用の請求書に転記したいわけです。

    あ、あと年月も重要ですね。

    今の「請求データ」には2019年1月のデータしか入っていませんが、月ごとに締めたいので、Mainを実行時に年月を入力して、その年月のデータかどうかという判定も必要です。

    つまり、以下のような流れを作りたいです。

    1. 実行時にユーザーに年月を入力してもらう
    2. 取引先の数だけループする
      • 請求データの数だけループする
        • 請求データの年月が入力した年月と等しく、かつ、 該当の取引先のデータであれば
          • そのデータは転記対象となる

    てなわけですね。

    ややこしそうですか?

    取引先のループにコレクションが有効

    まず、取引先の分だけループするというところを作ってみましょう。

    クラスを使わないマクロであれば、i=2から最終行まで…みたいなループのしかたをさせていたのですが、今回はデータをコレクション化しているものですから、もっとクールにいけます。

    コレクションに対してFor Each~Next文を使ってループできます。

    それで、取引先のコレクションはどこにあるかというと、シートモジュールwsClientのClientsプロパティに確保したのでした。

    それでループのたびにClientsプロパティから取り出す要素は、Clientオブジェクトですから、Clientクラスで定義した各プロパティを使って、取引先のデータにアクセスできます。

    さらに、打っていただくとわかりますが、Clientオブジェクトのメンバーである各プロパティは、自動メンバー表示の候補に上がるので、コーディングもさくさく進みます。

    以下のような処理を作成して、実行すると…

    Sub New請求書マクロ()
    
    wsClient.Store
    Dim c As Client
    For Each c In wsClient.Clients
        Debug.Print c.Name, c.PostalNumber, c.Address1, c.Address2
    Next c
    
    End Sub

    ほら、取引先についてループして、各データを取り出せましたね。

    コレクションをループしてデータを取り出す

    該当の取引先の請求データを抽出する

    続いて、前述の取引先のループの中に、請求データのループを入れ子にしていきます。

    それで、ループの対象となっている取引先と、請求データの取引先が等しければ、そのデータを抽出するのです。

    請求データのほうもwsDataのDataプロパティにコレクションが格納されているので、それでループを回せますね。

    かつ、その要素はDataオブジェクトですから、定義したプロパティで好きにデータを取り出すことができます。例えば、取引先名であれば、「Dataオブジェクト.ClientName」です。

    それが、「c.Name」と等しければヒット!データを抽出すればよいわけです。

    それを実現したのが、以下のコードですね。

    Sub New請求書マクロ()
    
    wsClient.Store
    wsData.Store
    
    Dim c As Client, d As Data
    For Each c In wsClient.Clients
        
        Debug.Print "■", c.Name
        For Each d In wsData.Data
            If c.Name = d.ClientName Then
                Debug.Print d.ClientName, d.DeliveryDate, d.ItemName, d.Price, d.Quantity
            End If
        
        Next d
    Next c
    
    End Sub

    実行すると…

    コレクションの入れ子でデータを抽出

    いい感じに抽出できましたね!

    まとめ

    以上、エクセルVBAでクラスとコレクションを使って簡単に請求書のデータ抽出をする方法についてお伝えしました。

    前回までに定義したクラスとシートモジュールのコレクションがかなり有効ですね。

    簡単にデータを取り出せるようになりました。

    さて、次回は年月を比較するなど、日付関連のところを進めていきます。

    エクセルVBAでクラスを使った請求書でクロの日付関連の処理を作る
    エクセルVBAでクラスを使って請求書マクロを作ろう!のシリーズです。今回は、ユーザーが入力した対象の年月から、月末日と翌月末日を求める処理、対象の年月のデータだけを抽出する判定処理を作っていきます。

    どうぞお楽しみに!

    連載目次:エクセルVBAでクラスを使って請求書マクロを作る

    エクセルVBAの題材として実務でもよく利用される「請求書マクロ」。ある程度スキルを磨いたら「これをクラスを使って実装したら?」という疑問が出てくるもの…このシリーズで実際に作ってみましょう。
    1. エクセルVBAでクラスを使った請求書マクロの概要と使用するクラスの定義
    2. エクセルVBAでシートモジュールに請求書マクロのデータをコレクション化する処理を書く
    3. エクセルVBAでクラスとコレクションを使うと簡単に請求書のデータ抽出できる
    4. エクセルVBAでクラスを使った請求書でクロの日付関連の処理を作る

    エクセルVBAでクラスを使った請求書でクロの日付関連の処理を作る

    $
    0
    0
    calendar

    photo credit: Charos Pix Measurement via photopin (license)

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

    エクセルVBAでクラスを使って請求書マクロを作ろう!のシリーズです。

    前回の記事はこちら。

    エクセルVBAでクラスとコレクションを使うと簡単に請求書のデータ抽出できる
    エクセルVBAでクラスを使って請求書マクロを作るシリーズをお送りしています。今回は、請求データの中から該当の取引先のデータだけを抽出する方法です。これは、クラスとコレクションを使うと、実にスマートに実現できるんです。

    クラスとコレクションで取り込んだ各データから、請求書に転記するデータを抽出する方法をお伝えしました。

    今回は、日付について見ていきます。

    具体的には、ユーザーからの対象の年月の入力をもとに、月末日、翌月末日を求める処理、対象の年月のデータだけを抽出するようにする判定処理です。

    ということで、エクセルVBAのクラスを使った請求書マクロの日付関連の処理を作って行きます。

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

    前回のおさらい

    では、前回のおさらいから見ていきましょう。

    「請求データ」シートとデータのコレクション化

    まず、請求書を作成する元データとなる、「請求データ」シートがあります。

    請求データシート

    この「請求データ」の1行分を表すクラスを作成したのが、クラスモジュールDataです。

    Public DeliveryDate As Date
    Public ClientName As String
    Public ItemName As String
    Public Price As Long
    Public Quantity As Long
    
    Public Sub Init(ByVal values As Range)
        DeliveryDate = values(1).Value
        ClientName = values(2).Value
        ItemName = values(3).Value
        Price = values(4).Value
        Quantity = values(5).Value
    End Sub

    その「請求データ」の各行についてDataオブジェクトとしてインスタンスを生成して、それをコレクション化する処理を、シートモジュールwsDataに記載しています。

    Public Data As Collection
    
    Public Sub Store()
        Set Data = New Collection
        
        Dim i As Long: i = 2
        Do While Cells(i, 1) <> ""
            Dim d As Data: Set d = New Data
            d.Init Range(Cells(i, 1), Cells(i, 5))
            Data.Add d
            i = i + 1
        Loop
    
    End Sub

    この「請求データ」をそれぞれ、該当の取引先ごとに、かつ該当月の分だけ抽出して請求書のひな形に転記していきたいのです。

    「取引先マスタ」シートとデータのコレクション化

    その取引先のデータを記載しているのが、以下の「取引先マスタ」シートです。

    取引先マスタシート

    「請求データ」シートと同様に、1行分のデータを表すクラスの定義をクラスモジュールClientに、またそのインスタンスの生成とコレクション化の処理をシートモジュールwsClientに作成しています。

    Public Name As String
    Public PostalNumber As String
    Public Address1 As String
    Public Address2 As String
    
    Public Sub Init(ByVal values As Range)
        Name = values(1).Value
        PostalNumber = values(2).Value
        Address1 = values(3).Value
        Address2 = values(4).Value
    End Sub

    Public Clients As Collection
    
    Public Sub Store()
        Set Clients = New Collection
        
        Dim i As Long: i = 2
        Do While Cells(i, 1) <> ""
            Dim c As Client: Set c = New Client
            c.Init Range(Cells(i, 1), Cells(i, 4))
            Clients.Add c, c.Name
            i = i + 1
        Loop
    
    End Sub

    ひな形となる「請求書」シート

    もうひとつのシート、「請求書」シートは請求書のひな形となるものです。

    請求書シート

    コレクションからのデータの抽出

    「請求データ」シートと「取引先マスタ」シートのデータを、オブジェクトのコレクションとしているので、そこからデータの抽出をすることになります。

    その部分を前回作成したわけですが、それが以下の標準モジュールMainです。

    Sub New請求書マクロ()
    
    wsClient.Store
    wsData.Store
    
    Dim c As Client, d As Data
    For Each c In wsClient.Clients
        
        Debug.Print "■", c.Name
        For Each d In wsData.Data
            If c.Name = d.ClientName Then
                Debug.Print d.ClientName, d.DeliveryDate, d.ItemName, d.Price, d.Quantity
            End If
        
        Next d
    Next c
    
    End Sub

    今回のお題:該当の年月のデータのみを抽出したい

    データの抽出条件として、もう一つ「日付」がありました。

    つまり、以下のような処理を追加していきたいのです。

    • ユーザーから入力ダイアログで請求書を作成する年月を入力してもらう
    • 「請求データ」の1列目「納品日」が、入力した年月と等しいデータのみを対象とする

    この部分を今回作成していきます。

    対象月の年月を入力したときの処理

    さて、請求書作成マクロを実行したらInputBoxメソッドで対象月の年月を入力してもらうのですが、普通はそのデータをDate型の変数に入れますよね??

    ですが、今回はちょっとヒネリを入れて、「請求書」シートのシートモジュールwsTemplateのプロパティに格納したいと思います。

    なぜかというと、Property Letプロシージャでプロパティに格納するようにすれば、ただ格納するだけでなく、「何らかの処理をしながら」プロパティに格納できるんです。

    「請求書」シートのD15セルとD16セルをご覧ください。

    「請求日」と、「お支払期限」がありますよね?

    これは、対象の年月を入れれば、その月末、そしてその翌月末というように、その値が一意に決まります。

    ですから、その請求日とお支払期限の書き込み処理を、プロパティの設定時点でまとめてやっちゃおうという魂胆です。

    シートモジュールのプロパティに設定するプロシージャ

    シートモジュールwsTemplateに以下のようなコードを追加します。

    Private dayCutoff_ As Date
    
    Public Property Let DayCutoff(ByVal newDayCutoff As Date)
        
        Range("D15").Value = DateSerial(Year(newDayCutoff), Month(newDayCutoff) + 1, 0)
        Range("D16").Value = DateSerial(Year(newDayCutoff), Month(newDayCutoff) + 2, 0)
        
        dayCutoff_ = newDayCutoff
        
    End Property
    
    Public Property Get DayCutoff() As Date
        DayCutoff = dayCutoff_
    End Property

    プライベート変数dayCutoff_を実際の設定先にして、その出し入れをするために、Property Letプロシージャと、Property Getプロシージャを定義します。

    合わせ技で、wsTemplateのDayCutoffプロパティが完成しますね。

    Property Letプロシージャがミソで、プロパティ設定時に、請求書の請求日とお支払期限の書き込みも終えてしまおうというものです。

    日付入力時の動作を確認する

    では、ここまでの動作を確認してみましょう。

    標準モジュールMainを以下のようにして実行します。

    Sub New請求書マクロ()
    
    wsTemplate.DayCutoff = Application.InputBox("年月を入力してください", "対象年月を入力", Format(Date, "yyyy/mm"))
    Debug.Print wsTemplate.DayCutoff
    
    'wsClient.Store
    'wsData.Store
    '
    'Dim c As Client, d As Data
    'For Each c In wsClient.Clients
    '
    '    Debug.Print "■", c.Name
    '    For Each d In wsData.Data
    '        If c.Name = d.ClientName Then
    '            Debug.Print d.ClientName, d.DeliveryDate, d.ItemName, d.Price, d.Quantity
    '        End If
    '
    '    Next d
    'Next c
    
    End Sub

    例えばInputBoxメソッドで「2019/01」と入力すると、wsTemplate.DayCutoffの値「2019/01/01」が出力されます。

    さらに、「請求書」シートを覗いてみると…

    請求書シートの請求日とお支払期限

    ちゃんと入力がされていますね。

    年月を比較する関数

    さて、次はそのユーザーが入力した年月と、各請求データの年月が等しいかどうか、というのを判定する処理が必要です。

    2つの日付の年をYear関数で、月をMonth関数で取り出してそれぞれ比較して両方とも等しければOKなのですが、標準コードにじゃんじゃん書いていくと邪魔くさそうです…

    ということで、以下のように2つの日付の年月を比較する関数MonthEqualsを作成しました。

    Public Function MonthEquals(ByVal d1 As Date, ByVal d2 As Date) As Boolean
        MonthEquals = (Year(d1) = Year(d2) And Month(d1) = Month(d2))
    End Function

    すると、データの抽出部分に日付の判定も加えると以下のようになります。

    Sub New請求書マクロ()
    
    wsTemplate.DayCutoff = Application.InputBox("年月を入力してください", "対象年月を入力", Format(Date, "yyyy/mm"))
    
    wsClient.Store
    wsData.Store
    
    Dim c As Client, d As Data
    For Each c In wsClient.Clients
    
        Debug.Print "■", c.Name
        For Each d In wsData.Data
            If MonthEquals(wsTemplate.DayCutoff, d.DeliveryDate) And (c.Name = d.ClientName) Then
                Debug.Print d.ClientName, d.DeliveryDate, d.ItemName, d.Price, d.Quantity
            End If
    
        Next d
    Next c
    
    End Sub

    実行すると、以下のようにイミディエイトウィンドウにデータのリストが出力されます。

    対象月のデータを取引先別に出力

    まとめ

    以上、エクセルVBAでクラスを使った請求書マクロの日付関連の処理の作り方についてお伝えしました。

    ここは紹介した以外に、普通に変数で日付を持って処理する方法もありますし、日付をクラスとして扱う方法も考えられるかも知れません。

    色々と試してベストな方法を見つけてみてください。

    次回は、該当データを請求書に転記していく部分の処理を作っていきます。

    どうぞお楽しみに!

    連載目次:エクセルVBAでクラスを使って請求書マクロを作る

    エクセルVBAの題材として実務でもよく利用される「請求書マクロ」。ある程度スキルを磨いたら「これをクラスを使って実装したら?」という疑問が出てくるもの…このシリーズで実際に作ってみましょう。
    1. エクセルVBAでクラスを使った請求書マクロの概要と使用するクラスの定義
    2. エクセルVBAでシートモジュールに請求書マクロのデータをコレクション化する処理を書く
    3. エクセルVBAでクラスとコレクションを使うと簡単に請求書のデータ抽出できる
    4. エクセルVBAでクラスを使った請求書でクロの日付関連の処理を作る

    Slackにカスタム絵文字を追加して社内コミュニケーションを楽しもう!

    $
    0
    0

    slackemojiアイキャッチ2

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

    会社やコミュニティなどでSlackを使ったことはありますか?

    2017年に日本語版Slackがリリースされてから、会社やコミュニティでの利用が加速していますよね。当ブログをご覧の方で、Slackをお使いの方も多いはず!

    さて、今回の記事では、Slackに「カスタム絵文字」を追加する方法を紹介します。

    オリジナルの絵文字をたくさん追加して、Slackをより便利に、そして、チーム内のコミュニケーションを活性化しましょう!

    Slackのカスタム絵文字とは

    Slackには、あらかじめたくさんの「絵文字」が用意されています。

    slackemoji1-15

     

    「カスタム絵文字」とは、ワークスペース(※)固有の絵文字です。あらかじめ用意されている絵文字に加えて、そのワークスペースのみで使用できる「絵文字」を登録することができます。

    (※ワークスペースって何?については後述します)

    会社での会議通知の一例です。下記の2つが「カスタム絵文字」です。

    [ 了解です ]
    [ 欠席します ]

    slackemoji1-1

    こんな風に、絵文字だけで応答ができたら便利ですね。

    カスタム絵文字を導入するメリット

    タカハシさん主宰のノンプロ研でも、Slackでコミュニケーションをとっています。

    私が感じているメリットは大きく2つ、

    • Slackを使うのが楽しくなり、メンバーとのコミュニケーションが活発になる
    • 読み手のリアクションが簡単になる

    Slackにはメッセージの「既読」表示が無いので、何も応答がないと読んでもらえたか不安になることもあります。

    メッセージの発信者は、チーム全員から返信がくると「読んでくれたな」と確信がもてる一方で、大量の返信が届くと鬱陶しく感じることもありますね。

    メッセージの受信者も、絵文字をワンクリックするだけなのでラクです。メールなどの返信はもちろん、Slackでも、簡単な要件であれば、一瞬の操作で終わらせたいですよね。

    ワークスペースのカスタム権限を確認する

    まず、自分の権限を確認しましょう!ワークスペースの設定によっては、カスタム絵文字の追加が制限されている場合があります。

    Slackには、2つのユーザ権限があります。

    • 管理者ユーザ
    • 一般ユーザ

    初期設定では全メンバーにカスタム権限がありますが、ワークスペースの管理者が制限をかけている場合もあります。

    ワークスペースとは

    ワークスペースとは、メンバーとコミュニケーションをとるための「共有スペース」です。(ちなみに私は現在5つのワークスペースに参加しています。)

    slackemoji1-17

     

    「カスタム絵文字」は、「ワークスペース」ごとに追加します。そのため、ワークスペース1に追加した「カスタム絵文字」は、ワークスペース2では使用できません。

    ワークスペースの権限を確認する

    カスタム絵文字を追加したい「ワークスペース」にログインして、適当なチャンネルのメッセージ入力欄で、絵文字入力のマークをクリックします。

    slackemoji1-2

    絵文字の一覧が表示されます。Slackのアイコンをクリックすると、「カスタム」絵文字のカテゴリにジャンプします。

    (※Slackのアイコンが非表示の場合は、スクロールバーで末尾までスクロールしましょう)

    slackemoji1-3

    「+カスタム絵文字をここから追加することができます」が表示されていればOKです。

    (表示されていない方は残念。ワークスペースの管理者に問い合わせてみましょう。)

    ここまでの確認ができた方は、ぜひ作ってみましょう。カスタム絵文字の追加手順は下記の2ステップです。

    1. カスタム絵文字を作成する
    2. 作成した絵文字をSlackに追加する

    それではいってみます!

    カスタム絵文字を作成する

    もりオススメの「絵文字ジェネレータ」がこちら。Slack用の絵文字を無料で作成できます。

    絵文字ジェネレーター – Slack 向け絵文字を無料で簡単生成

    使い方は簡単!4ステップ

    下記の4ステップです!

    1. テキストを入力
    2. フォントを選択
    3. カラーを選択
    4. 生成する(PNGファイルが生成されます)

    slackemoji1-4

     

    ※絵文字の生成履歴を残したくない場合は、「生成履歴に絵文字を表示する」のチェックを外しておきましょう。

    slackemoji1-5

    絵文字を作成する

    下記の3つを入力・選択して、最後に「生成する」ボタンをクリックします。「生成する」はプレビュー機能なので、何度押しても大丈夫です!

    1. テキスト
    2. フォント
    3. カラー(※設定方法は一つ下の画像で説明します)

    slackemoji1-6-2

    文字の色・透明度をスライドバーで選択できます。

    slackemoji1-7

     

    簡単に絵文字が生成されました!
    slackemoji1-8

     

    フォントを変更して再生成してみます。
    slackemoji1-9

    絵文字作成のコツ

    Slack上での絵文字表示はとても小さいので、文字数が多いと読みにくくなります。文字数はなるべく少なくして、4文字以上の場合は改行を入れると見やすいです。

    slackemoji1-18

    生成した絵文字をダウンロードする

    お気に入りの絵文字ができあがったらダウンロードしましょう。「ダウンロード」をクリックします。

    slackemoji1-10

     

    所定の「ダウンロード」フォルダに、画像がダウンロードされています。

    Windowsの場合は「PC > ダウンロード」のフォルダを確認しましょう。

    slackemoji1-11

    画像ファイルの作成が完了しました!

    カスタム絵文字をSlackに追加する

    作成したPNGファイルをSlackにアップロードします。適当なチャンネルのメッセージ入力欄で「絵文字ボタン」をクリックします。

    slackemoji1-2

     

    「+カスタム絵文字をここから追加する」をクリックしましょう。

    slackemoji1-16

     

    この画面で、ワークスペースのカスタマイズができます。「絵文字」タブの「カスタム絵文字を追加する」をクリックします。slackemoji1-12

     

    ①画像をアップロードする
    →さきほど作成したPNGファイルをアップロードします。

    ②名前を付ける
    →2つのコロン(:)の間に、適当な名前を入力します。ここでは「すごい」にします。

    ③保存する
    slackemoji1-13

    絵文字一覧の「カスタム」カテゴリに表示されていますね。これで使えるようになりました!

    slackemoji1-14

    まとめ

    Slackのワークスペースに「カスタム絵文字」を追加する方法を紹介しました。

    ノンプロ研のワークスペースには、約70個のカスタム絵文字が登録されています。「すごい!」などのリアクションがもらえると嬉しいです。

    会社でも、「了解です」などの短い応答フレーズを追加しておくと、返信の手間が省けて効率的ですね。

    このように、カスタム絵文字が充実しているだけで、Slackでのコミュニケーションがスムーズになり、活性化します!

    リアクション「する人」も「もらう人」も、両方が楽しめる「カスタム絵文字」をたくさん追加して、Slackを楽しく使い倒しましょう!

    エクセルVBAでクラスを使った請求書マクロのシートへの転記処理の作り方

    $
    0
    0

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

    エクセルVBAでクラスを使って請求書マクロを作ろう!ということでシリーズをお送りしています。

    前回の記事はこちら。

    エクセルVBAでクラスを使った請求書でマクロの日付関連の処理を作る
    エクセルVBAでクラスを使って請求書マクロを作ろう!のシリーズです。今回は、ユーザーが入力した対象の年月から、月末日と翌月末日を求める処理、対象の年月のデータだけを抽出する判定処理を作っていきます。

    クラスを使った請求書マクロの日付関連の処理についてお送りしました。

    今回は、抽出したデータを請求書シートに転記する処理を作成していきます。

    ということで、エクセルVBAでクラスを使った請求書マクロのシートへの転記処理の作り方です。

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

    前回のおさらい

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

    「請求データ」シートとその関連処理

    まず、請求書に記載する元となるデータが、以下の「請求データ」シートに蓄積されています。

    請求データシート

    これらのデータのうち、対象月の分のデータについて、取引先別に取り分けて請求書を作りたいのです。

    それで、その準備として、「請求データ」の1行分を表すクラスを作成しました。

    それがこちらのDataクラスです。

    Public DeliveryDate As Date
    Public ClientName As String
    Public ItemName As String
    Public Price As Long
    Public Quantity As Long
    
    Public Sub Init(ByVal values As Range)
        DeliveryDate = values(1).Value
        ClientName = values(2).Value
        ItemName = values(3).Value
        Price = values(4).Value
        Quantity = values(5).Value
    End Sub

    そして、このDataクラスのインスタンスをコレクションとして取り出す処理を、「請求データ」シートのシートモジュールwsDataに書いています。

    Public Data As Collection
    
    Public Sub Store()
        Set Data = New Collection
        
        Dim i As Long: i = 2
        Do While Cells(i, 1) <> ""
            Dim d As Data: Set d = New Data
            d.Init Range(Cells(i, 1), Cells(i, 5))
            Data.Add d
            i = i + 1
        Loop
    
    End Sub

    「取引先マスタ」シートとその関連処理

    以下が「取引先マスタ」シートです。

    取引先マスタシート

    ここに記載されている取引先の分だけ、毎月請求書を作成します。

    「取引先マスタ」シートも、DataクラスとwsDataモジュールと同様に、1行分を表すクラスの作成と、それをコレクションとして取り込み処理を作成しました。

    以下のクラスモジュールClientと、シートモジュールwsClientです。

    Public Name As String
    Public PostalNumber As String
    Public Address1 As String
    Public Address2 As String
    
    Public Sub Init(ByVal values As Range)
        Name = values(1).Value
        PostalNumber = values(2).Value
        Address1 = values(3).Value
        Address2 = values(4).Value
    End Sub

    Public Clients As Collection
    
    Public Sub Store()
        Set Clients = New Collection
        
        Dim i As Long: i = 2
        Do While Cells(i, 1) <> ""
            Dim c As Client: Set c = New Client
            c.Init Range(Cells(i, 1), Cells(i, 4))
            Clients.Add c, c.Name
            i = i + 1
        Loop
    
    End Sub

    「請求書」シートとその関連処理

    さらに、以下が請求書のひな形となる「請求書」シートです。

    請求書シート

    このシートのシートモジュールwsTemplateにもコードを記述しております。

    Private dayCutoff_ As Date
    
    Public Property Let DayCutoff(ByVal newDayCutoff As Date)
        
        Range("D15").Value = DateSerial(Year(newDayCutoff), Month(newDayCutoff) + 1, 0)
        Range("D16").Value = DateSerial(Year(newDayCutoff), Month(newDayCutoff) + 2, 0)
        
        dayCutoff_ = newDayCutoff
        
    End Property
    
    Public Property Get DayCutoff() As Date
        DayCutoff = dayCutoff_
    End Property

    これは前回作成した処理ですね。

    請求書マクロを動作させたときに、InputBoxメソッドで請求書を作成する対象年月をユーザーに入力してもらうのですが、それを格納するプロパティDayCutoffを定義しています。

    このプロパティの設定時に、請求書の請求日と支払日も入力しています。

    請求書作成マクロ

    そして、まだ作成途中ではありますが、メインの請求書作成マクロを記述している標準モジュールがこちらです。

    Sub New請求書マクロ()
    
    wsTemplate.DayCutoff = Application.InputBox("年月を入力してください", "対象年月を入力", Format(Date, "yyyy/mm"))
    
    wsClient.Store
    wsData.Store
    
    Dim c As Client, d As Data
    For Each c In wsClient.Clients
    
        Debug.Print "■", c.Name
        For Each d In wsData.Data
            If MonthEquals(wsTemplate.DayCutoff, d.DeliveryDate) And (c.Name = d.ClientName) Then
                Debug.Print d.ClientName, d.DeliveryDate, d.ItemName, d.Price, d.Quantity
            End If
    
        Next d
    Next c
    
    End Sub
    
    Public Function MonthEquals(ByVal d1 As Date, ByVal d2 As Date) As Boolean
        MonthEquals = (Year(d1) = Year(d2) And Month(d1) = Month(d2))
    End Function

    各取引先ごとに転記するデータを抽出してイミディエイトウィンドウに出力するとこまで作成しました。

    抽出したデータの転記と請求書作成の流れ

    目標としては、抽出したデータをイミディエイトウィンドウではなく、「請求書」シートに転記をする必要がありますね。

    それで、取引先ごとにそれを行って、それぞれ別のエクセルファイルとして保存したいわけです。

    手順としては以下の手順になります。

    • 取引先ごとに繰り返す
      1. 「請求データ」から対象のデータを抽出する
      2. 「請求書」シートをクリアする
      3. 「請求書」シートに抽出したデータを書き込む
      4. 「請求書」シートを新規ブックにコピーして別名で保存して閉じる

    前回は1の部分を作りました。

    今回は3の部分の処理を作っていきますよ。

    抽出したデータを「請求書」シートに転記する

    まずは、取引先ごとに抽出したデータを「請求書」シートに転記していきたいと思います。

    せっかく今回はシートモジュールを大活用しているので、そのデータもシートモジュールのプロシージャに渡して処理してあげたいですよね。

    では、そのデータをどういう形で渡すのが良いでしょうか。

    データの集合をシートモジュールに渡す

    「請求データ」の1行分のデータが、複数ある集合になりますよね…

    集合なら、配列か、辞書か、コレクション…

    …!

    ということは、Dataクラスのコレクションで渡せば良さそうですね。

    targetDataというCollection型のオブジェクト変数を用意して、そこにAddしていって渡すようにしましょう。

    標準モジュールMainのSubプロシージャNew請求書マクロを以下のように変更しました。

    Sub New請求書マクロ()
    
    wsTemplate.DayCutoff = Application.InputBox("年月を入力してください", "対象年月を入力", Format(Date, "yyyy/mm"))
    
    wsClient.Store
    wsData.Store
    
    Dim c As Client, d As Data
    For Each c In wsClient.Clients
    
        Dim targetData As Collection: Set targetData = New Collection 'ひな形に貼り付けるデータのコレクション
        For Each d In wsData.Data
            If MonthEquals(wsTemplate.DayCutoff, d.DeliveryDate) And (c.Name = d.ClientName) Then
                targetData.Add d
            End If
        Next d
        wsTemplate.WriteData targetData, c
    Next c
    
    End Sub

    targetDataにすべてのDataオブジェクトが追加できたら、wsTemplateのWriteDataというメソッドを呼び出します。

    あと、ついでにオブジェクト変数c、これは現在対象となっている取引先のデータを表すClientオブジェクトですが、これも渡しておきます。

    後々、便利ですので。

    受け取ったコレクションからシートに書き込む

    一方で、受け取ったコレクションtargetDataとClientオブジェクトを使って、シートに転記するのが、以下のwsTemplateのWriteDataメソッドです。

    Public Sub WriteData(ByVal targetData As Collection, ByVal myClient As Object)
        
        Dim i As Long: i = 21
        Dim d As Object
        For Each d In targetData
            Range(Cells(i, 1), Cells(i, 3)) = Array(d.ItemName, d.Price, d.Quantity)
            i = i + 1
        Next d
            
        Rows(i & ":50").Hidden = True  'データがない行を隠す
            
        With myClient
            ClientName = .Name
            Range("A3").Value = .Name & "御中"
            Range("A5").Value = "〒" & .PostalNumber
            Range("A6").Value = .Address1
            Range("A7").Value = .Address2
        End With
        
        Stop
        
    End Sub

    受け取ったコレクションtargetDataについてループをしてその要素の数だけ、21行目から順番に、品目、価格、数量を書き込んでいきます。

    終わったら、Hiddenプロパティを使って、余計な行を隠します。

    また、ついでにA3セルからA7セルに取引先情報を書き込みます。

    このために、Clientオブジェクトを引数で渡していたんですね。

    また、これをいったんClientNameプロパティに確保しておきます。また後で使いますので。

    抽出したデータの転記の動作確認

    では、New請求書マクロを実行して動作を確認してみましょう。

    WriteDataメソッドでStopステートメントを仕込んでいますので、中断の際に確認しましょう。

    まず、一回目の中断です。

    1社目の取引先の請求書

    ABC株式会社の請求書…良さそうです。

    次に、二回目の中断です。

    2社目の取引先の請求書

    株式会社ホゲホゲの請求書…良さそうですが、ちょっと待って下さい。

    行の非表示を解除してみましょう。

    行の非表示を解除

    ありゃー、ダメですね。

    21,22行目までは正しく入力されていますが、23行目以降にABCさん向けのデータが消されずに残っちゃっていましたね。

    この部分は対策する処理を入れないといけませんね。

    まとめ

    以上、エクセルVBAでクラスを使った請求書マクロのシートへの転記処理の作り方についてお伝えしました。

    クラスモジュール、あんまり使っていないように見えますが、オブジェクトとコレクションを作っておくと、モジュール間のやり取りに便利ですよね。

    では、次回はいよいよ請求書ファイルを作成して保存する部分を作成して完成まで持っていきましょう。

    どうぞお楽しみに!

    連載目次:エクセルVBAでクラスを使って請求書マクロを作る

    エクセルVBAの題材として実務でもよく利用される「請求書マクロ」。ある程度スキルを磨いたら「これをクラスを使って実装したら?」という疑問が出てくるもの…このシリーズで実際に作ってみましょう。
    1. エクセルVBAでクラスを使った請求書マクロの概要と使用するクラスの定義
    2. エクセルVBAでシートモジュールに請求書マクロのデータをコレクション化する処理を書く
    3. エクセルVBAでクラスとコレクションを使うと簡単に請求書のデータ抽出できる
    4. エクセルVBAでクラスを使った請求書でクロの日付関連の処理を作る

    エクセルVBAでクラスを使った請求書マクロでシートのコピー&保存処理を作る

    $
    0
    0
    book-close

    photo credit: Phototravelography Reading enlightens via photopin (license)

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

    エクセルVBAでクラスを使って請求書マクロを作ろう!のシリーズをお送りしております。

    前回の記事はこちら。

    エクセルVBAでクラスを使った請求書マクロのシートへの転記処理の作り方
    エクセルVBAでクラスを使って請求書マクロを作ろう!ということでシリーズをお送りしています。今回は、エクセルVBAでクラスとコレクションを使った請求書マクロのシートへの転記処理の作り方です。

    請求書マクロのシートへの転記処理の部分を進めました。

    さて、いよいよクライマックスです。

    続いて、シートの書き込みをする前にクリアをする処理と、書き込み後に別ブックに保存して閉じる処理を追加していきます。

    ということで、今回はエクセルVBAでクラスを使った請求書マクロでシートのコピー&保存処理を作成していき、請求書マクロを完成させます。

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

    前回のおさらい

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

    「請求データ」シート

    請求書マクロの「請求データ」シートは、作成する請求書の元となるデータを蓄積するシートです。

    請求データシート

    これらのデータの1行分を表すクラスとして、Dataクラスを作成しています。

    Public DeliveryDate As Date
    Public ClientName As String
    Public ItemName As String
    Public Price As Long
    Public Quantity As Long
    
    Public Sub Init(ByVal values As Range)
        DeliveryDate = values(1).Value
        ClientName = values(2).Value
        ItemName = values(3).Value
        Price = values(4).Value
        Quantity = values(5).Value
    End Sub

    そして、このDataクラスを活用して、「請求データ」シートのデータをコレクション化する処理を、シートオブジェクトwsDataに作成しました。

    Public Data As Collection
    
    Public Sub Store()
        Set Data = New Collection
        
        Dim i As Long: i = 2
        Do While Cells(i, 1) <> ""
            Dim d As Data: Set d = New Data
            d.Init Range(Cells(i, 1), Cells(i, 5))
            Data.Add d
            i = i + 1
        Loop
    
    End Sub

    このクラスによるオブジェクト化と、コレクション化が後々標準モジュールを快適にしてくれるんですよね…!

    「取引先マスタ」シート

    「取引先マスタ」シートは、取引先のデータのマスタです。

    取引先マスタシート

    ここに記載のある取引先の分だけ、毎月請求書を作るということになります。

    「請求データ」シートと同様に、各行を表すクラスと、それをコレクション化する処理とを作成していまして、それが以下のクラスモジュールClientと、シートモジュールwsClientになります。

    Public Name As String
    Public PostalNumber As String
    Public Address1 As String
    Public Address2 As String
    
    Public Sub Init(ByVal values As Range)
        Name = values(1).Value
        PostalNumber = values(2).Value
        Address1 = values(3).Value
        Address2 = values(4).Value
    End Sub

    Public Clients As Collection
    
    Public Sub Store()
        Set Clients = New Collection
        
        Dim i As Long: i = 2
        Do While Cells(i, 1) <> ""
            Dim c As Client: Set c = New Client
            c.Init Range(Cells(i, 1), Cells(i, 4))
            Clients.Add c, c.Name
            i = i + 1
        Loop
    
    End Sub

    「請求書」シート

    「請求書」シートは請求書のひな形となるシートです。

    請求書シート

    このシートモジュールwsTemplateに仕込んでいるコードが以下の通りです。

    Private dayCutoff_ As Date
    Public ClientName As String
    
    Public Property Let DayCutoff(ByVal newDayCutoff As Date)
        
        Range("D15").Value = DateSerial(Year(newDayCutoff), Month(newDayCutoff) + 1, 0)
        Range("D16").Value = DateSerial(Year(newDayCutoff), Month(newDayCutoff) + 2, 0)
        
        dayCutoff_ = newDayCutoff
        
    End Property
    
    Public Property Get DayCutoff() As Date
        DayCutoff = dayCutoff_
    End Property
    
    Public Sub WriteData(ByVal targetData As Collection, ByVal myClient As Object)
        
        Dim i As Long: i = 21
        Dim d As Object
        For Each d In targetData
            Range(Cells(i, 1), Cells(i, 3)) = Array(d.ItemName, d.Price, d.Quantity)
            i = i + 1
        Next d
            
        Rows(i & ":50").Hidden = True  'データがない行を隠す
            
        With myClient
            ClientName = .Name
            Range("A3").Value = .Name & "御中"
            Range("A5").Value = "〒" & .PostalNumber
            Range("A6").Value = .Address1
            Range("A7").Value = .Address2
        End With
        
    End Sub

    DayCutoffプロパティは、請求対象となる年月を表すプロパティで、ユーザーからの入力を受けてこのプロパティに値を設定する際に、「請求書」シートの「請求日」「お支払期限」もついでに入力するという処理を入れています。

    WriteDataメソッドは、「請求データ」から抽出したデータや、取引先情報を「請求書」シートの該当箇所に書き込むメソッドです。

    このようにシートに対して書き込む処理をシートモジュールに寄せておくと、標準モジュールがスッキリしてきます。

    標準モジュールの請求書作成マクロ

    それで、その標準モジュールMainがこちらです。

    Sub New請求書マクロ()
    
    wsTemplate.DayCutoff = Application.InputBox("年月を入力してください", "対象年月を入力", Format(Date, "yyyy/mm"))
    
    wsClient.Store
    wsData.Store
    
    Dim c As Client, d As Data
    For Each c In wsClient.Clients
    
        Dim targetData As Collection: Set targetData = New Collection 'ひな形に貼り付けるデータのコレクション
        For Each d In wsData.Data
            If MonthEquals(wsTemplate.DayCutoff, d.DeliveryDate) And (c.Name = d.ClientName) Then
                targetData.Add d
            End If
        Next d
        wsTemplate.WriteData targetData, c
    Next c
    
    End Sub
    
    Public Function MonthEquals(ByVal d1 As Date, ByVal d2 As Date) As Boolean
        MonthEquals = (Year(d1) = Year(d2) And Month(d1) = Month(d2))
    End Function

    請求書マクロの完成フローは以下の通りです。

    • 取引先ごとに繰り返す
      1. 「請求データ」から対象のデータを抽出する
      2. 「請求書」シートをクリアする
      3. 「請求書」シートに抽出したデータを書き込む
      4. 「請求書」シートを新規ブックにコピーして別名で保存して閉じる

    前回までで、取引先ごとに抽出したデータをコレクションtargetDataに追加して、それをwsTemplateモジュールのWriteDataメソッドに渡す部分、つまり手順の1と3を作成しました。

    今回は、残りの2と4を作成していきます。

    「請求書」シートのクリア

    とある取引先のデータを「請求書」シートに書き込む際に、前回書き込んだ内容が残ってしまうことがあります。

    なので、書き込みのWriteDataメソッドを呼び出す前に、「請求書」シートをクリアする必要があります。

    これも「請求書」シート固有の処理なので、wsTemplateに追加していきます。以下ClearDataメソッドです。

    Public Sub ClearData()
        
        Range("A3:A7").ClearContents
        Range("A21:C50").ClearContents
        
        Rows.Hidden = False
    
    End Sub

    行の非表示も行っていたので、これも解除しておきますね。

    「請求書」シートをコピーして別名で保存

    「請求書」シートをClearDataメソッドでクリアして、WriteDataメソッドで書き込みをしたら、そのシートを新規ブックにコピーして、別名で保存して、閉じるという手順を行います。

    これで、取引先ごとの請求書を作成できますね。

    その処理を行うのが以下のSaveAsNewBookメソッドです。これもシートモジュールwsTemplateに記述しています。

    Public Sub SaveAsNewBook()
        Dim wb As Workbook
        Copy
        Set wb = ActiveWorkbook
        
        Dim fileName As String
        fileName = ThisWorkbook.Path & "\" & Format(dayCutoff_, "yyyymm") & "請求書_" & ClientName & ".xlsx"
        
        Application.DisplayAlerts = False
        wb.SaveAs fileName
        wb.Close
        Application.DisplayAlerts = True
    End Sub

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

    このメソッドで1つ目のポイントが、3行目のCopyメソッドですね。

    WorksheetオブジェクトのCopyメソッドは、対象のシートを新しいブックにコピーするというもので、本来は以下の構文なのです。

    Worksheetオブジェクト.Copy

    ですが、ここではシートモジュールに書いているので自身のオブジェクトが対象であれば省略して単純に「Copy」と書けます。

    そして、新しく作成されたブックはActiveになりますので、すかさず4行目でオブジェクト変数wbにセットさせてもらっています。

    アラートダイアログを非表示にする

    もう1つのポイントが、9行目と12行目。

    ApplicationオブジェクトのDisplayAlertsプロパティです。

    これはアラートダイアログを表示するかどうかを指定するプロパティです。

    以下の構文でTrueにすると表示、Falseにすると非表示にします。

    Application.DisplayAlerts = ブール値

    アラートダイアログをオンにしたままSaveAsNewBookメソッドを実行すると、以下のような「次の機能はマクロなしのブックに保存できません」というダイアログが都度表示されて、「はい」を押さないといけなくなります。

    アラートダイアログ「次の機能はマクロなしのブックに保存できません」

    面倒っす。

    これが表示されてしまう理由ですが、Copyメソッドでシートをコピーするのですが、このときシートモジュールに書き込まれているコードもコピーされるんですね。

    コードも含まれているので、Closeメソッドでファイルを閉じるときに「マクロなしのブックには保存できませんけど、いいですね?」と問われるようになってしまうということです。

    これを表示させないように、DisplayAlertsプロパティをいったんFalseに設定しているのです。

    請求書マクロの実行結果

    では、これらのメソッドをNew請求書マクロから呼び出せるようにしましょう。

    Sub New請求書マクロ()
    
    wsTemplate.DayCutoff = Application.InputBox("年月を入力してください", "対象年月を入力", Format(Date, "yyyy/mm"))
    
    wsClient.Store
    wsData.Store
    
    Dim c As Client, d As Data
    For Each c In wsClient.Clients
    
        Dim targetData As Collection: Set targetData = New Collection 'ひな形に貼り付けるデータのコレクション
        For Each d In wsData.Data
            If MonthEquals(wsTemplate.DayCutoff, d.DeliveryDate) And (c.Name = d.ClientName) Then
                targetData.Add d
            End If
        Next d
        
        With wsTemplate
            .ClearData
            .WriteData targetData, c
            .SaveAsNewBook
        End With
        
    Next c
    
    End Sub

    標準モジュールのほうには、2つのメソッドを追加するだけですね…スマート!

    実行すると、マクロファイルと同じフォルダに以下のようにそれぞれのファイルが作成されます。

    請求書マクロで作成されたブック

    「ABC株式会社」のほうを開くと…

    請求書マクロで作成した請求書

    問題なさそうですね。

    もう一社のほう、前回は他のデータが残っていたんですよね。

    開いて、行の非表示を解除してみると…

    請求書の前のデータはクリアされている

    前の実行で書き込まれたデータもちゃんとクリアされていますね。

    まとめ

    以上、エクセルVBAでクラスを使った請求書マクロでシートのコピー&保存処理を作る方法についてお伝えしました。

    以上で、クラスを使った請求書マクロは完成です。

    クラスモジュールというよりは、シートモジュールが大活躍でしたね…汗

    ただ、オブジェクトやシート・ブックに固有の処理は、それぞれのモジュールに独立させて書いていくことで、標準モジュールがごちゃつかずに済むようになります。

    皆さんも、ぜひお手元のマクロでチャレンジをしてみてくださいね!

    連載目次:エクセルVBAでクラスを使って請求書マクロを作る

    エクセルVBAの題材として実務でもよく利用される「請求書マクロ」。ある程度スキルを磨いたら「これをクラスを使って実装したら?」という疑問が出てくるもの…このシリーズで実際に作ってみましょう。
    1. エクセルVBAでクラスを使った請求書マクロの概要と使用するクラスの定義
    2. エクセルVBAでシートモジュールに請求書マクロのデータをコレクション化する処理を書く
    3. エクセルVBAでクラスとコレクションを使うと簡単に請求書のデータ抽出できる
    4. エクセルVBAでクラスを使った請求書でクロの日付関連の処理を作る

    【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識

    $
    0
    0
    base

    photo credit: mikecogh Empty Arbra via photopin (license)

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

    ノンプログラマーにとって理解が難しいと言われる「クラス」

    Google Apps Scriptでは、クラスやその仕組みがわからなくてそれなりのツールを作ることはできます。

    ただ、以下の記事で書いている通り、早い段階で理解をしていたほうがメリットが大きいと感じています。

    ノンプログラマーでも「クラス」を学ぶべき理由
    ノンプログラマーがVBAやGASを学習していくと、その先に謎の言葉ばかりが登場する恐怖のエリア登場します。「クラス」です。今回は、「なぜノンプログラマーがクラスを学ぶべきなのか」について書きたいと思います。

    オブジェクトの理解が深くなり、クラスを使うという選択肢が増えます。

    実際、拙著「詳解!Google Apps Script完全入門」では、簡単ではありますが6章で紹介するようにしました。

    ブログではページ数などを気にせず、初心者でもわかるように「これでもか!」とじっくり着実にクラスを解説することができます。

    ということで、今回から「初心者でもわかるGoogle Apps Scriptのクラス」をテーマに、その使い方と便利さについてお伝えしていきます。

    初回の今回は、Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識についてお伝えしていきます。

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

    「クラス化」を目指すお題について

    さて、シリーズを通してどのようなクラスを作るのかを先にお伝えしておきます。

    こちらです。

    スプレッドシートのテーブル
    ただの、スプレッドシートの表ですね。

    おそらく、多くのGAS初心者にとって最も身近なデータの扱い方とも言えますからね。

    イメージしやすいであろう、このスプレッドシートの表について「クラス化」を目指していきます。

    クラスのためのオブジェクトの知識

    それで、クラスを理解するためには、まずオブジェクトをちゃんと理解しておく必要があります。

    というのも、クラスはオブジェクトを作るものだからです。

    オブジェクトとは

    Google Apps Script(というか、JavaScript)では、データの集合を表す方法が2つあります。

    1つはみんな大好き「配列」。

    そして、もう一つが「オブジェクト」です。

    オブジェクトとは、データの集合を表す一つのかたちで、別名「連想配列」とも呼ばれます。

    以下の図のように、オブジェクトの中に任意の名前を付けた箱を用意して、その中に値を格納することができます。

    Google Apps Scriptのオブジェクト

    また、箱の名前をプロパティといいます。

    オブジェクトの定義

    GASでオブジェクトを定義するときには、以下のように波かっこの中に、プロパティと値をコロン(:)でつないだセットを、カンマ区切りで列挙します。

    {
     プロパティ1: 値1,
     プロパティ2: 値2,
     …
    }

    この表記をオブジェクトリテラルと言いますね。

    オブジェクトのプロパティを参照する

    定義したオブジェクトについて、プロパティを参照するには、以下のようにオブジェクトに続いて、ピリオド(.)とプロパティを記述します。

    オブジェクト.プロパティ

    オブジェクトを作成するスクリプト

    例えば、前述のスプレッドシートのメンバーリストのBobさんのデータを表すのであれば、以下のようにオブジェクト化することができます。

    function myFunction() {
      
      var p = {
        id: "a01",
        name: "Bob",
        gender: "male",
        birthday: new Date(1993, 0, 1) //1月は「0」
      };
      
      Logger.log(p);
      Logger.log('id:%s name:%s, gender:%s, birthday:%s', p.id, p.name, p.gender, p.birthday);
    }

    スプレッドシートの見出しに対応した、id、name、gender、birthdayというプロパティにそれぞれの値を格納します。

    実行して、変数pの中身についてのログをスクリプトエディタのメニュー「表示」→「ログ」で確認してみましょう。

    作成したオブジェクトをログ出力

    オブジェクトの作成と参照はうまくいっているようですね。

    オブジェクトはこのような形にデータを集める方法です。

    メソッドとその呼び出し

    さて、オブジェクトのプロパティには値を格納することができますが、Google Apps Script(というかJavaScript)では値として「関数」も格納することができます。

    プロパティに関数を格納したとき、その要素をプロパティとは言わずにメソッドと呼ぶようになります。

    オブジェクトリテラルでいうと、メソッドの定義は以下のようになります。

    {
     …
     メソッド: function (仮引数1, 仮引数2, …){
      //処理
     }
     …
    }

    オブジェクトのメソッドを呼び出すには、以下のようにオブジェクトに続いて、ピリオド(.)とメソッドそして丸かっこ内に必要に応じて引数を記述します。

    オブジェクト.メソッド(引数1, 引数2, …)

    オブジェクトのメソッドを呼び出すスクリプト

    では、前述のスクリプトを修正して、メソッドも追加してみましょう。

    function myFunction() { 
    
      var p = {
        id: "a01",
        name: "Bob",
        gender: "male",
        birthday: new Date(1993, 0, 1),  //1月は「0」
        greet: function(){
          Browser.msgBox(p.name + "です、こんにちは!");
        }
      };
    
      p.greet();
    }

    スプレッドシート上にメッセージダイアログを表示するgreetメソッドを追加しました。

    実行して、スプレッドシートを確認してみると

    オブジェクトのメソッドを呼び出す

    このように、メソッドがちゃんと実行されていることが確認できますね。

    まとめ

    以上、Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識についてお伝えしました。

    まずはクラスを理解するための基礎知識として、以下を抑えておきましょう。

    • オブジェクトとは何か
    • オブジェクト、プロパティ、メソッドの定義の方法

    次回は、クラスとインスタンス化についてお伝えしていきます。

    どうぞお楽しみに!

    初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法

    $
    0
    0

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

    「初心者でもわかるGoogle Apps Scriptのクラス」についてシリーズでお伝えしています。

    前回の記事はこちら。

    【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
    「初心者でもわかるGoogle Apps Scriptのクラス」をテーマに、その使い方と便利さについてお伝えしていきます。今回は、GASでクラスを理解するためのオブジェクトの基礎知識についてお伝えしていきます。

    クラスを理解するために前提知識として必要なオブジェクトについてじっくり解説をしました。

    さて、オブジェクトがわかったところで、今回はいよいよクラスを作っていきます。

    Google Apps Scriptで最も簡単なクラスを作ってみよう!です。

    new演算子、インスタンス、コンストラクタという難しそうなワードも超丁寧に解説していきますよ。

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

    最も簡単なGASのクラス

    ひとまず、最も簡単なGASのクラスの作り方をお伝えします。

    とっても簡単なので、細かいことは気にせずひとまずやってみましょう。

    コードはこちらです。

    function myFunction() {
      
      var person = function(){};
      
    }

    これだけ。

    …よく見ると、ただの関数(しかも空っぽの)を変数personに代入しているだけですね。

    当然、実行しても何にも起きません。

    確か、クラスってオブジェクトを作るものだったはず…

    ただの空っぽの関数が、なぜクラスなのでしょう?

    new演算子によるスクリプト

    その謎は、先ほどの一文に加えてnew演算子を使うことで明らかになります。

    以下のように2行ほどコードを追加してみましょう。

    function myFunction() {
      
      var person = function(){};
      var p = new person();
      Logger.log(p);
      
    }

    4行目にnew演算子が登場していますね。そして、その後ろに先ほど変数personに格納した関数を呼び出しているような感じです。

    Logger.logメソッドで変数pのログ出力をしていますので、スクリプトを実行してログを確認してみましょう。

    空っぽのオブジェクトのログ出力

    ログには「{}」が出力されています。

    つまり、変数pの中身は空のオブジェクトのようです。

    GASでオブジェクトを作る仕組み

    new演算子とその書式

    new演算子は何かというと、オブジェクトの型を定義する関数を呼び出して、新たなオブジェクトを生成する演算子です。

    new演算子の書式は以下の通りです。

    var 変数 = new 関数名(引数1, 引数2,…)

    new演算子によるステートメントが実行されると、以下の2つの処理が行われます。

    1. 新しいオブジェクトが生成される
    2. 新しいオブジェクトを定義するための関数が呼び出される

    こうして生成・定義されたオブジェクトが戻り値として、変数に格納されます。

    以下で、これらの2つの処理について詳しく解説をしていきます。

    インスタンスとは

    まず、new演算子によるステートメントが実行されると、「新しいオブジェクトが生成」されます。

    この新しいオブジェクトをインスタンスといいます。

    インスタンス…わかりづらい横文字ですが、new演算子のステートメントで作られたオブジェクトのことを指します。

    ただ、生成されたはいいですが、どんなオブジェクトでしょうか…?

    コンストラクタとは

    生成されたオブジェクトがどういうものかを定義する処理を行う関数が、コンストラクタです。

    new演算子の後ろに記述される関数がコンストラクタです。

    そして、new演算子が実行されると、まずコンストラクタが呼び出されます。

    今回でいうと、コンストラクタは関数personということになります。

    本来、オブジェクトはデータを表すプロパティと、処理を表すメソッドを持つものでしたね。

    ですから、オブジェクトの定義するコンストラクタ内には

    • プロパティの定義
    • メソッドの定義

    などといったコードが記述されます。

    ただ、今回のコンストラクタpersonは定義も何もない空っぽの関数でしたね。

    なので、呼び出されても何にもしないわけです。

    あと、一般的にはコンストラクタ名は通常の関数名と区別するために、先頭を大文字にします。

    ですから、今回の例も以下のようにPersonとするべきですね。

    function myFunction() {
      
      var Person = function(){};
      var p = new Person();
      Logger.log(p);
      
    }

    new演算子の戻り値

    new演算子は新しいオブジェクトを生成し、それについてコンストラクタで処理をした結果を戻り値として返します。

    ただ、今回のコンストラクタpersonでは何にもしていないので、空っぽのオブジェクトがそのまま戻り値となり、変数pに格納されたということになります。

    GASのクラスとは

    さて、本記事ではクラスというワードがあまり出てきませんでしたね…汗

    クラスというのは、一般的に「オブジェクトの型となるもの」のことをいいます。

    そして、クラスをもとにしてオブジェクトを生成することをインスタンス化、そしてそれにより生成されたオブジェクトをインスタンスといいます。

    GAS(というかJavaScript)では、コンストラクタがクラスの役割を担っているということになりますね。

    コンストラクタを作ることが、すなわちクラスを作ることということになります。

    まとめ

    以上、Google Apps Scriptで最も簡単なクラスを作る方法についてお伝えしました。

    また、new演算子の使い方、インスタンスおよびコンストラクタとは何かについても解説をしました。

    今回は、クラスから空っぽのオブジェクトしか作れていませんので、中身のあるオブジェクトが作れるクラスを作る必要がありますね。

    次回以降、その方法についてお伝えしていきます。

    どうぞお楽しみに!

    連載目次:初心者向けGoogle Apps Scriptでクラスを作ろう

    使いどころやそのメリットが分かりづらいGASの「クラス」。本シリーズでは、初心者でもわかるように「これでもか!」とじっくり着実にクラスとそのメリットについて解説をしていきます。
    1. 【初心者向け】Google Apps Scriptでクラスを理解するためのオブジェクトの基礎知識
    2. 初心者でもできるGoogle Apps Scriptで最も簡単なクラスを作る方法
    Viewing all 2073 articles
    Browse latest View live


    <script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>