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

【エクセル区切り位置】ダブルクォートで囲まれたカンマ区切りのデータを一瞬で分割する

$
0
0

区切り位置ダブルクォート

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

エクセルの隠れ優秀機能「区切り位置」の魅力をシリーズを通して紹介しています!

前回の記事では、最初の一歩としてこの2点を紹介しました。

  • エクセルの「区切り位置」とは?
  • 「区切り位置」を使用して、スペースが含まれる氏名データを分割する方法
【エクセル区切り位置】スペースが含まれるデータを一瞬で分割する
エクセルの「区切り位置」を紹介するシリーズ。第一回目は「区切り位置とはどのような機能か?」「区切り位置を使用して、スペースが含まれる氏名データを姓・名に分割する方法」を紹介しています。

今回の記事では、「各フィールドの値がダブルクォートで囲まれているカンマ区切りのデータ」を「区切り位置」で分割する方法を紹介します。

「区切り位置」でカンマ区切りのデータを分割する

「区切り位置」とは、エクセルシート上の、1つの列に入っているデータを「区切り文字」を目印にして複数の列に分割する機能です。

「区切り文字」には、代表的な4つ+任意の文字を指定可能です。

  1. タブ
  2. セミコロン
  3. カンマ
  4. スペース

手順のおさらいもかねて、まずは「ダブルクォートなし・カンマ区切り」のデータを分割してみます。

システムからダウンロードしたテキストファイルは、このようにカンマで区切られていることがありますね。(※なんちゃって個人情報というサイトから取得したダミーのデータです。)

区切り位置2-1

テキストデータをエクセルに貼り付ける

事前準備として、テキストファイルのデータをエクセルに貼り付けましょう。

テキストデータ全体をコピーします。Ctrl + A で全範囲の選択ができます。

区切り位置2-1-2

 

コピーしたデータをエクセルシートのA1セルに貼り付けます。

貼り付け後、分割するデータの範囲を選択します。ここではA1~A11セルを選択しています。

区切り位置2-2

「区切り位置」の画面を開く

データ範囲を選択した状態で、①データ→②区切り位置を選択します。

区切り位置1-1-2

 

「カンマやタブなどの区切り文字によってフィールドごとに区切られたデータ」を選択し、「次へ」をクリック。

区切り位置2-2-2

区切り文字を選択する

「区切り文字」の項目で「カンマ」を選択して、「完了」をクリックします。

「次へ」を押すと、区切ったあとの列のデータ形式を設定する画面に進みますが、前回の記事で、すべての列のデータ形式が初期値「G/標準」であることをお伝えしました。ここでは初期値「G/標準」のままにするので、設定は飛ばします。

区切り位置2-3

 

なんと簡単!一瞬で分割されて各セルに配置できました!

区切り位置2-4

 

各フィールドの値がダブルクォートで囲まれたデータを分割する

次に、「ダブルクォートあり・カンマ区切り」のデータを分割してみます。

各フィールドの値がダブルクォート(”)で囲まれている場合、ダブルクォートは削除して、ダブルクォートに囲まれた部分のみをエクセルシートに取り込みたいですよね。

区切り位置2-5

 

実は「ダブルクォートなし・カンマ区切り」のデータを分割した手順とまったく同じ操作で可能です。

なぜなら、この2つの処理が実行されているからです。

  • 各フィールドの値をカンマで区切る
  • ダブルクォートを削除する

実行前・実行後の結果だけを紹介します。

エクセルシートにデータを貼り付けて、データ範囲を選択して「区切り位置」の画面を開きます。この先も操作手順は同じなので省略します。

区切り位置2-5-2

 

実行結果がこちらです。各フィールドの値がカンマで区切られて、ダブルクォートも削除されていますね。

区切り位置2-7

 

自動でダブルクォートを削除してくれるポイントは「文字列の引用符」です。その仕組みを見ていきましょう。

文字列の引用符とは

文字列の引用符とは、エクセルに「このマークで囲まれた範囲が文字列ですよ」と伝えるものです。

引用符に指定できるのはこの3種類です。

  1. ダブルクォート(“)
  2. シングルクォート(‘)
  3. なし

デフォルトの引用符はダブルクォート

「文字列の引用符」には、デフォルト(初期設定)で「ダブルクォート」が選択されています。

区切り位置2-6

 

“タカハシ ノリアキ”というデータの場合、ダブルクォートに挟まれたタカハシ ノリアキが文字列として認識されます。

区切り位置2-10

この初期設定のおかげで、「ダブルクォートで囲まれた部分のみが文字列と認識されて、ダブルクォートが自動で削除された」というカラクリです。

文字列の引用符「なし」を選択した場合

文字列の引用符「なし」の場合は、ダブルクォートも含むすべてのデータが文字列として認識されます。

区切り位置2-11

 

この動作を確認するために「ダブルクォートあり・カンマ区切り」のデータで、文字列の引用符「なし」を選択してみます。

区切り位置2-8

 

実行結果がこちらです。ダブルクォートが文字列として認識されたので、削除されずに残りました。

区切り位置2-9

 

ダブルクォートが文字列の引用符として扱われることが多いので、初期設定でダブルクォートが引用符として選択されているのは便利ですね。

各フィールドの値がシングルクォートで囲まれたデータを区切る場合は、文字列の引用符「シングルクォート」を選択しましょう。

まとめ

今回の記事では「各フィールドの値がダブルクォートで囲まれているカンマ区切りのデータ」をカンマで区切り、かつ、ダブルクォートを削除する方法を紹介しました。

(えっ、いままで頑張ってマクロを組んでたのに…)と、ため息が聞こえてきそうなほどの便利機能ですね。

この「区切り位置」を使いこなして、オフィスワークをとことんラクしちゃいましょう。

次回は、「データ形式」を使いこなす方法を紹介します。

  • 先頭がゼロで始まるデータが数値形式になってゼロが消えてしまう…
  • 日付形式の値を含むデータが上手く表示されない…

そんなお悩みを解決しますよ!どうぞお楽しみに!


エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法

$
0
0

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

「初心者でもわかるエクセルVBAのクラスモジュール」について連載でお送りしております。

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

エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマに連載をお伝えしています。今回はエクセルVBAでプロパティをプライベート変数で作成して他のモジュールからアクセスできないようにする方法です。

クラスにプライベート変数を宣言して、他のモジュールからアクセスできないプロパティを作成しました。

…って、他のモジュールからアクセスできないんじゃ、プロパティとして意味ないんじゃ…?

って思います?

私もそう思っていました。

ですが、大丈夫です。

直接アクセスできないのですが、間接的にはアクセスできるんです。

Propertyプロシージャを使ってね。

ということで、今回はエクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法をお伝えします。

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

前回のおさらい

前回までのおさらいです。

まず、以下のようなエクセル表がありまして、この1行分のデータを表すクラスの作成を目指しています。

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

クラス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 Property Get IsMale() As Boolean
    IsMale = (Me.Gender = "male")
End Property

エクセル表の見出しに対応するプロパティをモジュール変数として定義。あと、便利そうなメソッドとプロパティを一つずつ追加しています。

確認用のSubプロシージャを記述している標準モジュールがこちらです。

Sub MySub()

Dim p As Person: Set p = New Person

Dim i As Long: i = 2
With Sheet1
    p.Id = .Cells(i, 1).Value
    p.FirstName = .Cells(i, 2).Value
    p.Gender = .Cells(i, 3).Value
    p.Birthday = .Cells(i, 4).Value
End With

Stop
'p.Greet

End Sub

ただ、残念現在は以下のようなコンパイルエラーが発生してしまうという状況なのです。

コンパイルエラー: データメンバーが見つかりません

なぜコンパイルエラーが出ているのか:これまでの経緯

事の発端はこうです。

まず、クラスPersonのIdプロパティはもともとはパブリック変数として定義していました。

ただ、パブリック変数で定義しちゃうと、Idプロパティを一度設定した後も、何度でも上書き、変更ができてしまう…それって、Idとしてドウなの?というわけです。

それを解決するために、Idプロパティをプライベート変数「id_」として定義をするように変更しました。

ですが、そうすると他のモジュールからアクセスできないわけで、インスタンスを生成したときに最初の正しいIdを設定するときにもアクセスできない…

こんなジレンマを抱えています。

それを解決するのが、今回の記事というわけです。

他のモジュールからプライベート変数にアクセスする方法

では、他のモジュールからプライベート変数にアクセスする方法について、ちょっと状況を整理しながら作戦を練りましょう。

まず、クラスモジュールPersonに定義したプライベート変数id_は、他のモジュールからはアクセスできません。これについてはお伝えした通りです。

プライベート変数は他のモジュールからアクセスできない

逆に考えてみましょう。

じゃあ、プライベート変数id_はどこからアクセスできるんでしたっけ??

と考えると、ほらクラスモジュールPerson内に記述したいずれかのプロシージャからであれば、変数id_はアクセスが可能なわけです。

プライベート変数は同じモジュール内からならアクセスできる

外側からがダメなら、内側から攻めればよいのですよ…!

で、そのPersonモジュール内に置くプロシージャですが、これを「パブリック」にしてあげれば、他のモジュールから呼び出し可能で、かつ引数を受け取れます。

Propertyプロシージャを迂回してプライベート変数にアクセスする

つまり、直接プライベート変数にアクセスするのではなく、何らかのプロシージャに値を渡して、そのプロシージャ内でプライベート変数を書き換えるんですね。

このように、プライベート変数の橋渡し役のプロシージャとして、Propertyプロシージャを使うことができるというわけです。

プライベート変数から値を取得するには、以前の記事で紹介したProperty Getプロシージャを使います。

そして、プライベート変数に値を設定するには、今回紹介するProperty Letプロシージャを使うのです。

このように、Propertyプロシージャによる迂回作戦でプロパティにアクセスするんですね。よく考えたものですね。

Property Letプロシージャとは

では、Property Letプロシージャとは何か、またその使い方について見ていきましょう。

Property Letプロシージャとは、プロパティを設定するときの手続きです。

つまり、プロパティを設定しようとしたときに、手続きを呼び出すことができます。

書き方はこうです。

Property Let プロシージャ名(仮引数 As 型)
 ’処理
End Property

Property Letプロシージャを定義すると、そのプロシージャ名がプロパティ名になります。

そして、例えば「Personオブジェクト.プロパティ = 値」というように、インスタンスに何らかの値を設定しようとしたときに、その値を引数としてProperty Letプロシージャが呼び出されることになります。

ちなみに、設定するものがオブジェクト参照の場合は、Property Setプロシージャを使います。

Property Letプロシージャでプロパティを設定する

実際に、Personクラスでの例を使ってProperty Letプロシージャを作ってみましょう。

以下のProperty LetプロシージャIdを、クラスモジュールPersonに追加します。

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

プロパティIdが設定される際に、Property LetプロシージャIdが呼び出され、かつプロパティの設定値をnewIdとして受け取ります。

If文がありますが、既にプライベート変数id_に何らかの空文字以外の文字列が格納されていれば、イメディエイトウィンドウにその旨通知するだけで、何もしません。

さもなくば、プライベート変数id_は初期状態ということになりますので、受け取った引数id_を格納します。

こうすることで、初回のIdの設定はできるが、それ以降の上書きはされないプロパティを作ることができるということになります。

Property Letプロシージャによるプロパティを確認する

F2 キーを押して、オブジェクトブラウザで様子を見てみましょう。

オブジェクトブラウザでProperty Letプロシージャによるプロパティを確認

Personクラスには、プライベート変数で宣言したプロパティ「id_」と、Property Letプロシージャで定義したプロパティ「Id」の2つが存在していますね。

前回、プライベート変数名を小文字+アンダースコアの形式にしたのは、これが理由です。

  • Personクラスモジュール内で実際にデータを持つのは変数id_
  • 他のモジュールからアクセスをするのはProperty LetプロシージャId

と使い分けをする必要があるからですね。

他のモジュールからアクセスさせないように、プライベート変数として宣言する場合は、小文字+アンダースコアという名前することで、上記の役割を明確化する慣習があるということです。

標準モジュールから呼び出して確認をする

では、実行をして確認してみましょう。

標準モジュールModule1のSubプロシージャを以下のように変更して実行してみます。

Sub MySub()

Dim p As Person: Set p = New Person

Dim i As Long: i = 2
With Sheet1
    p.Id = .Cells(i, 1).Value
    p.FirstName = .Cells(i, 2).Value
    p.Gender = .Cells(i, 3).Value
    p.Birthday = .Cells(i, 4).Value
End With

p.Id = "Hoge"
Stop
'p.Greet

End Sub

Stopステートメントで中断しているときの様子を確認すると、以下のようになります。

Property Letプロシージャを用いたプロパティの設定

ローカルウィンドウでは、プライベート変数id_が「a01」つまりエクセル表から最初に取得した値のままになっていることが確認できます。

つまり、初回の代入は成功していますね。

そして、イミディエイトウィンドウには「Idは上書きすることはできません」とあります。

これは、上書きしようとしたときに、再代入をせずに出力されたものです。

まとめ

以上、エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法をお伝えしました。

プロパティにアクセス制限をかけたい場合は、今回紹介したようにProperty Letプロシージャを使用します。

手続きを加えることができますので、多様な設定の仕方が実現できるというわけです。

次回もクラスモジュールの使い方をお伝えしていきます。

どうぞお楽しみに!

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

名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!
  1. 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
  2. エクセルVBAでクラスに最も簡単なプロパティを追加する方法
  3. エクセルVBAで自作クラスをインスタンス化する方法
  4. エクセルVBAでクラスに最も簡単なメソッドを追加する方法
  5. エクセルVBAで表の1行分のデータを表すクラスを作成する方法
  6. エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
  7. エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
  8. エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法

2018年の今年の漢字と振り返り、とにかく話しまくった一年でした

$
0
0
mouth

photo credit: kixmi71 Oihu! via photopin (license)

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

もう大晦日ですか…早いですね。

さて、2018年の漢字は「災」でしたね。

2018年「今年の漢字」 | 公益財団法人 日本漢字能力検定

ここ何年か、私も個人的に「今年の漢字」を決めていまして、これまでは以下の通りです。

はい、では2018年の今年の漢字について、また一年の振り返りをしていきたいと思います。

行ってみましょう!

2018年の今年の漢字

2018年、今年の漢字は「話」にしたいと思います。

コミュニティ「ノンプログラマーのためのスキルアップ研究会」(略称: ノンプロ研)の定例会などでのプレゼン、お仕事でいただいているプログラミング研修、LinkedInラーニングやYouTube動画、その他イベントでの登壇…とにかく、しゃべりまくりました。

それで、今年でどれだけプレゼン資料を作ったか、そのスライド枚数を勘定してみました。

何枚あったと思います?

なんと5806枚もありました…汗

ちなみに、LinkedInラーニングのスライドは除くなので、それも加えるともっとです。

まさか、こんなに人前で話すことになろうとは…

2018年の振り返り

では、それも踏まえたり踏まえなかったりで、今年2018の一年を振り返ってみたいと思います。

動画へのチャレンジ開始

なんと正月も明けてうちに、YouTube配信とBASEでの販売を開始しました。

動画のYouTube配信とBASE販売を開始!その制作方法とマネタイズについて
YouTubeでの動画配信とBASEでの動画販売をはじめました!それに際して、コンテンツ準備、マネタイズの考え方、といった課題はあったのですが、それらをどう解決したかについて書き留めておければと思います。
YouTubeチャンネル「いつも隣にITのお仕事」でVBAの解説動画を配信開始しました
エクセルVBAプログラミングの解説動画の配信を開始しました!ようやくです…。今回はYouTubeでの解説動画配信のお知らせとともに、なぜ解説動画を配信するしようと思ったのかについてお伝えします。

YouTubeのほうは、やり始めてからすぐにYouTubeパートナープログラムの参加条件が厳しくなっちゃいましたね。

YouTubeで稼ぐには「過去12か月の総再生時間が4000時間以上」「チャンネル登録者数が1000人以上」を満たす必要あり、とパートナープログラム変更
YouTube上で動画を投稿するクリエイターが、動画を収益化することで表示されるようになる広告や、YouTube Redの利用者による視聴から収益を受け取ることができるようになるプログラムが「YouTubeパートナープログラム」です。YouTuberなどはこのYouTubeパートナープログラムを使ってお金を稼いでいるわ...

2018年後半はあまり更新ができていないのですが、ありがたいことにチャンネル登録数は堅調に増えて800を超えました。来年は展開ありますかね。

ちなみに、チャンネルこちらです。

YouTube

BASEのほうは正直あまり売れなかったので、ストップしています。

ブログは96万PVを達成!

ブログは引き続き順調に推移していてまして、10月には月間96万PVを達成しました。

みなさん、ご覧頂きましてありがとうございます。

また、パートナーのみなさん、いつも厳しいツッコミをかいくぐってご執筆ありがとうございます!

前からお伝えしている通り、ブログはPVが伸びたからって急激に儲かるとかそういうものでもなく…

【祝!ブログ3周年】これまでの実績を晒しつつ今後について語ります
当ブログ「いつも隣にITのお仕事」は3周年を迎えました!恒例のPV・広告収益・問い合わせ件数など実績の結果報告をしております。 また、今後のブログの運営方針についても少しだけ触れております。

マーケティング、信用、アウトプットによるスキル、ライティング、チャンス、その他超複合的かつ長期的な効果があるので、引き続き主軸です。

VBA本5刷・GAS本4刷…!

書籍については新しい書籍の出版はありませんでしたが、2017年に出版した2冊が、ありがたいことに好調に推移したようで、5刷&4刷を達成しました。

皆さま、ありがとうございます!

今現在は来年の春くらいを目指して、VBA本の執筆を進めています。

なぜ、Excel VBAの本格解説本を書く必要があるのか
3冊目となる書籍の企画が通過しました。Excel VBAの本格解説本です。なぜあえて今からVBAの本格解説本を書く必要があるのかについて、出版社さんに企画の際に送った文面をだいたいそのまま記事として公開します。

あと、うまくいけばもう一冊くらい出せるかな…

正直、書き上げるにはかなりしんどいのですが書きたい書籍がある限り、頑張ります。

新しくチャレンジしたスキルは報われなかった?

スキル習得に関しては、みなさんはうまくいっているようにご覧いただいているかも知れませんが、全然そんなことはなく…

今年はいろいろと手をつけたのが、なかなか報われなかったという部分もありますね。

App Makerは「Google Drive Tables」の終了にくじけ…

【保存版】初心者向け実務で使うためのApp Maker完全マニュアル
Googleが提供をするWebアプリケーションを開発することができるプラットフォームApp Maker。このページは初心者がApp Makerを使ってアプリケーションを作れるようになるためのまとめ記事です。

Monacaはハードルが高かった…

Monacaを使えばHTML5とJavaScriptでだけでスマホアプリを作れるぞ
HTML5とJavaScriptでiOSとAndroidの両方に対応できるハイブリッドアプリを開発できるMonacaというサービスがあります。今回の記事では、その概要についてお伝えしたいと思います。

UiPathはスタンス的にいろいろとありまして…

イベント「RPA勉強&LT会!RPALT vol3」に参加してRPAとコミュニティについて学んで来たぞ
「RPA勉強&LT会!RPALT vol3@ウイングアーク1st」というイベントに参加してきました!「IT×働き方」をテーマにしつつ2つのコミュニティの運営に携わる身として、参加レポートを書いております。

Vue.jsはまだ道半ばですが、がんばりますよ!

GASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩
Google Apps ScriptでWebアプリを作成するシリーズ。今回はGASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩を進めて行きます。

あれこれつばを付けてみて、うまくいきそうだったら攻めるし、そうでなけば寝かせる…そんな感じで良いかと。

コミュニティ「ノンプロ研」はメンバー40名を突破!

2018年、最も大きなチャレンジで変化だったのは、コミュニティ「ノンプロ研」です。

ノンプロ研のおかげでプレゼンの機会が一気に増えましたね…正直もうネタしんどいです。

立ち上げ自体は2017年12月で、初月の参加数は12名。あれやこれややっているうちに、現時点では43名もの人数になりました。

祝!コミュニティ「ノンプロ研」一周年記念!これまでの足跡と成し得たこと
コミュニティ「ノンプログラマーのためのスキルアップ研究会」がはじまってからちょうど1年!めでたい!!ということで今回は、ノンプロ研スタートから1年間の足跡とその成果についての振り返りをさせていただきます。

大阪にも行きましたね!ドキドキでしたが…いい思い出です。

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

先日行った大BT大会兼忘年会も大いに盛り上がりましたね…!

ノンプロ研の忘年会「1年の振り返り大BT大会」でちょっと感動しちゃった2つのこと
ノンプロ研Advent Calendar 2018の最終日として先日開催イベント、ノンプロ研忘年会兼定例会Vol.13「1年の振り返り大BT大会」のレポートとともに、ちょっと感動しちゃった2つのことについてです。

1年やってみて思ったのは、コミュニティの可能性…やばいっす。

今後の展開がすごい楽しみですが、それについてはまた新年のブログで。

お金を稼ぐって難しい

会社経営的には、なんとか継続できていますが、まあ難しいですね。数カ月先はわかりませんが…w

研修や開発の仕事の依頼は、とても波があり、正直読めません。

ものすごい依頼が来すぎても受け切れないし、依頼がないときは全くなかったりしますし。

書籍の印税とコミュニティの売上がすごくありがたくなってきていますので、リスクを減らすなら受託の比率は下げてかないとな~という感じです。

ちなみに、企業研修の数はGASが4件でトップでした。VBAがそれに続いて、いよいよPythonも実績が生まれました。今後が楽しみです。

あと、Chatworkアシスタントを使いはじめました。

ひとり社長が1ヶ月間でChatWork アシスタントにお願いしたお仕事一覧とポイント
オンラインアシスタントサービス「ChatWork アシスタント」を利用してみています。今回、最初の一ヶ月でChatWork アシスタントに依頼した仕事一覧とやってみてわかった依頼のポイントについてお伝えします。
  • プログラム化できるものはプログラムに
  • プログラム化できないルーチンはChatworkアシスタントに

すると、集中力を要する仕事しか残らないんですよ。これは…辛い!…けど、いい!

LinkedInラーニングのお仕事でグラーツに行きました

年間のほとんどは、東京の板橋区でこもって仕事をしています。

ただ今年、オーストリアのグラーツで2週間ほどお仕事をさせていただくという機会がありました。

起業してから3年、気づいたら異国の地グラーツで仕事をしてきました
LinkedInラーニングのお仕事でオーストリアのグラーツというところに2週間行ってきました。しかも家族で。今回は、お仕事の経緯について、またグラーツという都市についての概要についてお伝えします。

しかも家族で。

これはけっこう衝撃的な体験でしたね…!

仕事の内容も価値があるのですが、家族で移動しながら仕事というスタイルが「あり」なんだという驚きの気づきをいただきました。

まとめ

以上、2018年の振り返りをお送りしました。

コミュニティ、動画とチャレンジしてきた結果、話す機会がめちゃめちゃ増えました。

「書く」に加えて「話す」のスキルを磨けたのは、ほんとありがたい…!

また、その裏でチャレンジしたり、いったん寝かしたりもいっぱいありますよね。まあ、これでいいかなと。

来年、またいろいろとチャレンジしていきますので、どうぞよろしくお願いいたします。

何をチャレンジするか…、それはまた新年一発目にお送りします。

ということで、みなさん良いお年を!

ペンの力とコミュニティ~「働く」の価値を上げるために2019年にやりたいこと

$
0
0
resource

photo credit: Bold Frontiers Colorful Stones Texture – HDR via photopin (license)

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

明けまして、おめでとうございます!

「今年のやりたいこと」というテーマで毎年記事を書いておりまして、昨年のがこちら。

2018年のやりたいことを「価値提供チャネル軸×コンテンツ軸」で整理する
新年、明けましておめでとうございます!私のテーマは変わらず「日本の『働く』の価値を上げる」です。今回は2018年やりたいことを「価値提供チャネル軸×コンテンツ軸」で整理していきたいと思います。

さて、今年も引き続き「日本の『働く』の価値を上げる」をテーマにやっていきます。

その延長線上で、2019年やりたいことを書いていきたいと思います。

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

2018年のやりたいことの復習

たいがい1月1日に「やりたいこと」って、1年も経ったら忘れているものですが、昨年やりたいと言っていたこと…どんなことを挙げていましたっけ?

確認してみましょう。

  • ブログは1000記事、85万PVくらいいくかな?
  • 書籍はVBAでトライしたいネタがある
  • ブログ、書籍に続く三本目の柱を作る(コミュニティまたは動画)

なんでしょうか…昨年の私、預言者でしょうかw

ブログのページビューは10月に96万PVを達成、昨日までの記事で1183記事となりました。

書籍は「パーフェクトVBA(仮)」を鋭意執筆中、春の出版をターゲットに進めております。

動画はYouTubeは若干停滞していますが、LinkedInラーニングでの収録も体験させていただきました。

そして、何よりコミュニティ!

「ノンプログラマーのためのスキルアップ研究会」は開始1年で参加者数40名を超え、十分に三本目の柱といっていいかなと思います。

2019年のやりたいことを考える前提条件

さて、2019年。

引き続き、「日本の『働く』の価値を上げる」をテーマに活動をしていきます。

そして、そのためのリソースですが、お金はあんまりありませんので、ひとり社長である私の活動時間365日×16時間=5840時間のみ。

その数少ないリソースを、そのテーマに対して投資効果が高い順に割り当てていくという方針も引き続きですね。

もちろん、その活動を維持するために、生活費はきちんとキープしないといけません。

ペンの力は偉大

ひとり社長にとってペンの力は偉大です。

GoogleやSNS、Amazon、書店さんたちのおかげで、私が書いたことがそれを必要とされる方に届くようになっています。

ブログは月間40万人近くの人々に、書籍はのべ20000人以上の人々にリーチをすることができました。

情報の鮮度はありますので永久に役立つわけではありませんが、廃れるより先に新しい情報を投下していけば、全体的には少しずつ蓄積されていきます。

もっとリソースを割いても良いように見えますが、現在、午前中3時間は書籍の執筆、夜9時から2時間はブログの執筆に充てていますので、これ以上は難しいですかね…

ということで、この二つの活動はキープしていきます。

ブログ

ブログは引き続き、私自身は毎日1日ペースで頑張ります。

1000記事以上配信していますが、まだまだ、皆さんの役に立つであろう情報はありますので、どこよりも丁寧に易しく提供をしていきます。

数字には何か意味があるわけではありませんが…実際に、100万PVはどこかで達成したいですね。

また、昨年からパートナーさんにも週1でお願いしていますので、大変だと思うのですが、そのおかげで皆さんのカラーが出てきていいな~と思っています、

【副業&在宅OKパートナー募集!】お仕事をしながらITと記事執筆のスキルアップも
プランノーツでは一緒にお仕事をして下さるパートナー様を募集しています。 Excel・VBA、Google AppsなどのITと記事執筆スキルを磨きながら、空いた時間を使って収入を得ることができます。

書籍

書籍は、今執筆中の「パーフェクトVBA(仮)」を書き上げて世に出すことです。

数ある書籍が既に出版されているVBAの書籍ではありますが、プログラミング言語VBAを学ぶのに有益な一冊になると思います。

なぜ、Excel VBAの本格解説本を書く必要があるのか
3冊目となる書籍の企画が通過しました。Excel VBAの本格解説本です。なぜあえて今からVBAの本格解説本を書く必要があるのかについて、出版社さんに企画の際に送った文面をだいたいそのまま記事として公開します。

今回、初の試みとしてコミュニティで原稿先出しをしていますので、皆さんの反応を見ながら執筆を進めることができています。

あと、現在編集さんと進めている別の書籍の企画もありますので、それも年内に出せれば最高です。

コミュニティの可能性は無限大

1年活動してみて、コミュニティの可能性の大きさを感じました。

コミュニティ「ノンプログラマーのためのスキルアップ研究会」についてのお知らせ #ノンプロ研
ノンプログラマーがVBA・GAS・Pythonなどのプログラミングを学ぶコミュニティ「ノンプログラマーのためのスキルアップ研究会」が絶賛活動中です!本ページはコミュニティの情報発信をしていく特集ページです。

年末年始でメンバーの皆さんの振り返りや、目標について目にする機会が多くあります。

  • 実務に使えるプログラムを作れた
  • 社内でプログラミングの勉強会やコミュニティを開催しはじめた
  • ブログやSNSでの発信をはじめた

皆さん、それぞれの環境やスタイルでプログラミングを活用するのはもちろん、それをアウトプットして広める活動もされているんですね。

ひとり社長のリソースは限られていますが、コミュニティにそのリソースを投下すれば、たくさんの人がそれを活用してくださいます。

しかも、そのメンバーならではのスキルや持ち味がプラスαされます。

そして、その成果がアウトプットされ広がっていきます。

コミュニティ…すごくないですか!?

イベントやプレゼンを皆さんにしてもらう

コミュニティではオフラインの活動が重要です。

そこで、イベントの企画をしたり、プレゼンを準備して話をしたりが必要になってくるのですが、今年は積極的にメンバーの皆さんに頼っていこうと思います。

なにせ、私のリソースはもちろんですが、私から出せるアイデアとか話せることも限度がありますからね…

ヘンリー・フォードさんがおっしゃっている通り

自分で薪を割れ、二重に温まる

です。ここ1年の私自身がそうでしたが、より一層学びが得られますからね。

大阪、続いて東北へ

東京を中心に活動していましたが、昨年の9月には大阪に出向いて、大阪支部(チーム大阪と呼んでます)を立ち上げました。

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

現在、6名のメンバーがいらっしゃるようになって、自主的にイベントが開催できるようになりました。

続いて、東北には3/9に仙台に出向いて、初回のイベントを実施する予定です。

今年は、このように全国に出向いて、チームの種とその流れを作るような活動ができればと思っています。

やりたい!という方がいらっしゃいましたら、まずはノンプロ研入会いただきまして、その旨お声がけ下さいませ。

コミュニティ内の初心者向け研修

弊社では、毎週開催で8回から12回くらいで、VBA・GAS・Pythonの初心者向け研修を行っています。

この初心者向け研修をコミュニティに絡めてできないかと考えています。

プログラミング学習は最初の1ヶ月が本当に重要かつ大変、そしてコストがかかる部分で、それを超えると徐々に楽になっていくという性質があります。

企業研修では、その負担を企業がサポートしてくれるのですが、個人だと辛い。

一方で、コミュニティの課題として「初心者がコミュニティに入りづらい問題」というのがあります。

入ってみるとそんなこと気にしなくていいと気づくのですが、入る前は「できる人ばかりだったらどうしよう」ということで足踏みしてしまうようです。

仕組みや価格について考える必要がありますが、コミュニティという特性を組み合わせて、負担が少なく価値が高い内容にできるのではないかと期待しています。

まとめ

以上、2019年やりたいことについてお伝えしました。

「書く」のは継続で、それ以外はコミュニティにぐっとパワーシフトをしていくことになりそうです。

あ、まとめを書いていて気づきましたが、技術的なことを全然書いてなかったので、それはまた別の記事でお伝えします。

どうぞお楽しみに!

2019年プログラミング言語別に考えていること、やりたいこと

$
0
0
code-week

photo credit: Code Week Award TINCON 2016 via photopin (license)

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

昨日、1月1日ですが、2019年のやりたいことについて書きました。

ただ、あまり技術的なことに触れていなかったので、本日1月2日の記事として別途書いておこうと思います。

2019年プログラミング言語別に考えていること、やりたいことについてお伝えします。

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

VBA

ExcelにPythonが搭載されるか問題

VBAについては、Microsoftさんが今後「ExcelにPythonを載せるかどうか問題」が、どう帰結するのかにとても関心があります。

以下の記事で少し追加情報がありました。

ExcelにPythonが搭載?その後 - xlwings を使おう - Qiita
マイクロソフトが Excel に Python を搭載することを検討しているというニュースが流れたのは1年前のことで、結構話題になりました。昨年の Python Advent Calendar 2017 では、ExcelにPython...

今のところ、公式な回答はなく、非公式にはたくさんの反響があったことを受け止めている点、それまでの間はPyXLLかxlwingsを使おうというものです。

PyXLLかxlwingsは、どちらかというとPython側のパッケージで、Alt + F11 でエディターを開こう!で始められるVBAに比べちゃうとどうしても開始するための手順が必要。ノンプログラマーで経験の浅い人がトライするにはハードルが高い印象です。

なので、しばらく様子見ですね。

個人的なスキルアップとアクション

現在、「パーフェクトVBA(仮)」を執筆中で、色々と調べながら進めていますが、まあまだ知らないこと、うまく説明できていなかったことがたくさんあります。

ただ、言語としてのVBAの体系的な理解と脳内への落とし込みは、一定の完成は見る(見なくてはいけない)と思っています。

なぜ、Excel VBAの本格解説本を書く必要があるのか
3冊目となる書籍の企画が通過しました。Excel VBAの本格解説本です。なぜあえて今からVBAの本格解説本を書く必要があるのかについて、出版社さんに企画の際に送った文面をだいたいそのまま記事として公開します。

あとは性質上、他言語に比べてライブラリの活用などが薄い(実際私もそうですが…)印象がありますので、以下Ariawaseなどを研究しつつ、ライブラリの活用については考えて、発信や貢献ができればと考えます。

vbaidiot/ariawase
Ariawase is free library for VBA cowboys. Contribute to vbaidiot/ariawase development by creating an account on GitHub.

VBAに対するミッション

VBAは言語的にはクセはありますが、やはりそのシェアやすぐに使える感、情報の多さなどでいうと、ノンプログラマーの主力言語としては、間違いなくしばらくお付き合いすることになります。

私のミッションとしては、できる人を増やすこととともに、VBAを学ぶことの価値を高めていきたいわけです。

これは二つの視点があります。

  • 現場視点:価値の高いVBAプログラムができる人・組織を増やす
  • 経営者視点:VBAのスキルを正しく評価する

現場的には、「動けばいい」のマクロ作りから、長期的・継続的な運用に耐えうる作り方、リーダブルコード、チームでの運用といった視点でプログラミングができる方を増やすということで、学習に対する実質的な価値を高める必要があります。

VBAユーザーは孤独ですからね…どうしても視点が短期になりがちで、結果的に長期的にかなり効率を損しやすいです。

対企業では研修、対個人に対してはコミュニティと、書籍でなんとかフォローをしていきたいです。

あと経営者目線ですが、「VBAができる人を正しく評価できない問題」があります。

本当は、そのようなスキルがある人は、生産性を高められるので評価されるべきで、そのような人材を確保できれば、会社としても有利なはずなので、市場価値は上がるべきなんです。

ですが、まあ色々な理由があって、多くの場合正しく評価されていません。むしろ、冷遇されていることも。

それをなんとかするための仕掛けは、もうしばらく時間がかかりそうなので、じっくり取り組んでいきます。

Google Apps Script

ECMAScriptへの対応

昨年のGoogle Cloud Next ’18での発表で以下のような発表がなされました。

Modern Javascript – A common request is updating the JavaScript syntax to be able to use more modern features and libraries. At Next ‘18 it was announced that this would be supported by moving to ECMAScript 2017 scripting-language specification.

Notes on the future of Google Apps Script from Google Cloud Next ‘18 #GoogleNext18
At Google Cloud Next ‘18 it was great to see and hear about a number of G Suite and Google Apps Script updates. This post highlights a number of launched and fu...

現在のGoogle Apps Scriptで使用しているJavaScriptは1.6~1.8とだいぶ前の世代のものなのですが、それをモダンなJavaScript、具体的にはECMAScript2017へと移行するということが発表されました。

これで、いわゆるフロントエンドで使われているJavaScriptとの差分がかなり埋まり、便利な構文も追加で使えるようになりますので、ノンプログラマーにもメリットが大きい話だと思います。

2019年中のどこかでは対応をするのではないかな~と勝手に期待していますが、どうでしょうか。

個人的なスキルアップとアクション&ミッション

GASを使うことを考えた場合、データベース問題がどうしても上がります。

小さいシステムであればスプレッドシートで良いのですが、200万セルの壁はすぐにやってきます。

Fusion Tableが廃止予定となったことで、より明確にGCPへの道へ誘導しようという意図を感じます。

Fusion Tables Service  |  Apps Script  |  Google Developers

App MakerもデータベースはCloud SQLを使うことになりました。

そろそろGCPへの門戸を開いて、道筋を模索しなければいけませんね…

また、もうひとつの課題はUI面。これは現在Vue.js+HTML活用で突破できないかトライをしています。

GASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩
Google Apps ScriptでWebアプリを作成するシリーズ。今回はGASとJavaScriptフレームワークVue.jsを使ってWebアプリを作成するための最初の一歩を進めて行きます。

いずれにしても、GASに触れているノンプログラマーはシームレスに高度な技術へのステップアップを図れそうです。

なので、その当たりをぬかりなく見極めていきたいです。

Python

非エンジニア現場への土壌が整ってきた

少し前までは、Macが中心で、機械学習とか、Web開発とか、IoTとか、本職プログラマー向けの情報が多かった印象でしたが、以下の書籍がメガヒットしたことが表すように、状況が少しずつ変わってきているようです。

おそらく、この書籍の多くは本職の方が買っているのだと思うのですが、事例としてはノンプログラマーでもよだれが出るような内容ばかり…

このあたりの事例をハードルを下げながら紹介していけば、ノンプログラマーが実務で活用するための土壌は育っていく感じはします。

実際、昨年末から初となるPythonの企業研修がスタートしました。

企業の理解は少ないですが、一方で初心者プログラマーもターゲットとして見ることができますしね。

個人的なスキルアップとアクション&ミッション

他の言語に比べると経験とスキルが少ないので学習ですね。

事例を考え、やってみて、ブログにアウトプットし…をひたすら繰り返していく必要があります。

Pythonの場合、「VBAでいいじゃん」という結論になることが多そう+会社での理解を得るのが大変そう、という印象があるので、なるべく明確にメリットがあり、簡単に説明できるような事例を提供していきたいです。

まとめ

以上、2019年にプログラミング言語別に考えていること、やりたいことについてお伝えしました。

まだ、3つの言語しか追いかけていませんが、まだまだ知らないこと、やりたいことはいっぱいありますね…

教えることは二度学ぶこと。

ブログや書籍または研修やコミュニティを通して、皆さんに活用いただけるように日々準備をしていければと思います。

今年もどうぞよろしくお願いいたします!

2019年のワークスタイルを良くするために家庭に投資をしよう

$
0
0
dishwasher

photo credit: Apionid Dishwasher via photopin (license)

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

さて、1月1日&2日に今年やりたいこと、ブログとコミュニテイ編、プログラミング編とお伝えしてきました。

ペンの力とコミュニティ~「働く」の価値を上げるために2019年にやりたいこと
明けまして、おめでとうございます!2019年も引き続き「日本の『働く』の価値を上げる」をテーマに活動をしていきます。その延長線上で、ブログ、書籍、コミュニティという軸で2019年やりたいことを書いております。
2019年プログラミング言語別に考えていること、やりたいこと
明けましておめでとうございます。ノンプログラマー向けのプログラミングという視点で、2019年にプログラミング言語VBA、GAS、Pythonについて考えていること、やりたいことをお伝えします。

今年やりたいこととしては、もう一つ別の切り口がありまして、本日1月3日はそれについて書こうと思っています。

それは、ワークスタイルについてです。

それで、そのワークスタイルを良くするために、家庭に投資をしようという結論にいたりました。

今回は、2019年やりたいことワークスタイル編ということでお送りします。

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

ひとり社長の働き方の限界

仕事効率化も含めて「働き方」について皆さんをサポートする事業をしていますので、自社の働き方にも色々とこだわっています。

ただ、もう色々とやってきて、打ち手がなかなかないぞ…という悩みがありました。

設備面での限界

例えば、毎年PCは最新かつランクの高いマシンに買い換えています。

スタンディングデスク&モニター3枚環境を作ってみたそのセッティングと感想
スタンディングデスク…買いました!あわせてモニターアーム、モニターもトリプルにしてみたり、かなり環境がバージョンアップしました。それぞれどのようなセッティングをしているのか、またそれによりどのような効果があったのかレポートをします。

昨年で言えば念願のスタンディングデスクも購入しました。

なぜ毎年のようにPCを買い替えるべきなのか
毎年PCを買い替え…コスト高めに見えますが、そうでもないと思っています。常に最新のPCを使うことができというのは大きな意義があります。今回は、なぜ毎年のようにPCを買い替えるべきなのかについてお伝えします。

あと、Macbook、iPhoneX、Apple Watch、Pixel3なども購入しましたね。なるべく自分が触れるものは、新しくて良いものを使うように心がけています。

iPhoneXとApple Watchを買って、未来のワンクリックを減らすための投資を怠らないようにしようと反省した件
iPhoneXとApple Watchを買いました!買ってほんと良かったです。私の「人生のワンクリック」があれよあれよと減っております。この感動は忘れてしまわないうちに、書き留めておきたいと思います。

ただ、自分ひとりの会社でITが仕事だと、設備への投資という意味では、これくらいで十分なのかなと…。

マンパワー面での限界

では、どこに投資をしていくかと考えた場合、マンパワーになります。

私の稼働時間を増やすのは睡眠時間を削らない限りは難しいです。なにせ、9時から24時近くまで働いてますから。

また、ルーチンの多くはプログラミング化していたり、プログラミング化が難しいものはChatworkアシスタントを活用しています。

ひとり社長が1ヶ月間でChatWork アシスタントにお願いしたお仕事一覧とポイント
オンラインアシスタントサービス「ChatWork アシスタント」を利用してみています。今回、最初の一ヶ月でChatWork アシスタントに依頼した仕事一覧とやってみてわかった依頼のポイントについてお伝えします。

もちろん、人を雇うというアイデアは当然のようにありますが金銭的な余裕はないですし、採用や教育に自分のリソースがかなり食われそうな気がしていて、どうも難しい…のです。

仕事のパフォーマンスを上げたいなら家庭へ投資しよう

ですから、これ以上のパフォーマンスを出そうと思ったときに、どういう打ち手があるのか…という悩みがけっこうありました。

設備は十分だし、人も増やせない。

あとは、どこに大きな改善の余地がある?

グラーツ遠征で得たヒント

と、悩んでいる最中、そのヒントになる「オーストリアのグラーツ遠征」がありました。

起業してから3年、気づいたら異国の地グラーツで仕事をしてきました
LinkedInラーニングのお仕事でオーストリアのグラーツというところに2週間行ってきました。しかも家族で。今回は、お仕事の経緯について、またグラーツという都市についての概要についてお伝えします。

妻と2歳の息子も連れて海外で2週間と少しの期間、仕事をするという貴重な体験でした。

私はやるべき仕事がたくさんありましたので、何日間だけ休日をとったという感じですが、妻と息子は基本的には毎日がフリータイム(家族分の洗濯はありましたが)。

そんな日々を終えた後の、妻の感想にヒントがありました。

妻曰く「炊事と掃除をしなくていいのが助かる」とのこと。

なるほど。

家庭の事情も仕事の制約条件になる

家事は365日、24時間あります。

毎日3食分の買い物と調理、そして食器洗い。掃除は、2歳の息子がまとわりつくので、なかなか進まない。子供はこっちの都合なんか知ったこっちゃないわけで…

明らかに家事と育児をメインで担当をしている妻のほうが、割り込みタスクをさばく機会が多く、コントロールが効きづらく、体力的にも精神的にも疲弊しやすいのです。

例えば、そんな状態のときに

  • 土日のどちらかの午前中は書籍の執筆に時間を使わせてほしいな…
  • 毎月土日祝のうち2回、コミュニティの勉強会があるんだけど…
  • 今度、仙台でイベントやりたいんだけど…なぁ…

とか言いづらいじゃないですか。

家事や子育てを主にしていなかったとしても、家庭の事情の制約は受けているんですね。

家族で出張に行くスタイル

と、そんな悩みがあったわけですが、グラーツの経験から「連れて行ってしまえばいいんだ」というアイデアが生まれたわけです。

グラーツから帰国後に、運良く「もくもく合宿 in 三浦海岸」もあったのですが、それも運良く家族OKのイベントだったのです。やってみて「いける!」という感触は持ちました。

ノンプロ研スタート以来初めて開催された「もくもく合宿 in 三浦海岸」
なんと行って来てしまいました、ノンプロ研「もくもく合宿 in 三浦海岸」!コミュニティをスタートしてから1年。まさか、メンバーと合宿に行くことになろうとは…嬉しいですね。ということで今回は、もくもく合宿のレポートをします。

私の仕事面の活動範囲も拡がるし、家族も色々な土地の体験や学びを得られて、かつ家事が減らせるなら、全体として価値が高いぞ…と思った次第です。

ちょうどコミュニティの地方展開を狙う時期だったので、積極的に全国に種まきにいきたいです。

仕事のために家事を減らそう

あとは、直接的に家事を減らすアクションも積極的に進めていくべきと思いました。

実際に、前述のAppleWatch(妻にも買いました)や、Qrio Lock、Google Home、Amazon Echoは生活の質を上げてくれています。

ただ、ちょっとガジェット系に寄り過ぎていたので、もっと家事の削減に直撃するもの。

まずは、以下のアイテム・サービスですね。

  1. 食洗機
  2. ロボット掃除機
  3. 家事代行サービス

なかなかの出費なのですが…大黒柱がんばります。

他にもオススメあれば教えてください。

まとめ

以上、2019年ワークスタイルをよくするために、家庭に投資をしようということについてお伝えしました。

具体的には

  • 家族同行で出張に行く
  • 家事を減らすための投資をする

この2点です。

いずれもお金がかかりますが…大黒柱がんばります。

何らかお伝えすべき成果があればお伝えしますね。

どうぞお楽しみに!

Windowsのポチポチ業務を爆速化するPowerShell、正規表現で複雑なファイル名変更をする方法

$
0
0

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

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

前回はコマンドレット:Rename-Itemでファイル名を変更する方法をお伝えしました。

Windowsのポチポチ業務を爆速化するPowerShell、ファイル名を変更する方法
Windowsのマウスを使った業務(ポチポチ業務)を爆速化するCUI=PowerShell。今回はRename-Itemというコマンドレットを使ってファイル名を変更する方法をお伝えします!

今回はPowerShellで正規表現を使って複雑なファイル名変更をする方法をお伝えします。

正規表現…なんだか難しい言葉ですが、実はとっつきにくいのは名前だけです。この記事を読み終わるころには「なんだ正規表現ってそんなものか」と感じるはずですよ!

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

なぜ正規表現を使うのか

正規表現とは「文字列のパターンを記号で表現する時のルール」のことです。ではパターンを記号で表現すると、どんないいことがあるのか?そこが肝心ですよね。

正規表現は「検索・置換処理」をするときに大きな力を発揮します。

以下のような数値のグループがあったとしましょう。

「163-8001」
「999-9999-9999」
「99-9999-9999」
「163-8002」

正規表現で「数字3桁-数字4桁」というパターンを作ります。(具体的なパターンの作り方はあとでご説明いたします。)日本人ならおなじみの「郵便番号」のパターンですね。

このパターンで検索すると

「163-8001」
「163-8002」

と郵便番号のパターンに合致する文字列を抽出できます。

このように正規表現を使えば特定のパターンを見つけだすことが可能です。

Rename-Itemで正規表現を使う

前回紹介したファイル名を変更できるコマンドレット:Rename-Itemでは正規表現を使用することが可能です。

構文は以下の通りです。

Rename-Item -NewName{元のファイル名 -Replace正規表現で示すパターン‘,’置換後の文字列’}

Replace演算子で指定する置換前の文字列で正規表現が使用できます

ファイル名の中から特定のパターンを見つけ出し置換することで、複雑なファイル名変更が実現できます。

「mm月dd日」形式のファイル名を「mmdd」に変更するスクリプト

では実際にスクリプトで正規表現を使ってみましょう。

オフィスの現場では日付のついたファイル名よく見ますよね。日付の形式を「mm月yy日」から「mmyy」に置換するスクリプトを作ってみたいと思います。

デスクトップのinputディレクトリにファイル名が「mm月dd日」のテキストファイルが入っています。

月、日ともに数字が1桁・2桁の場合が混ざっています。

ファイル名から月と日を除いて「mmyy」形式に変更します。「9月」や「1日」のように数字が1桁の場合は0を付与して2桁に揃えます。

一気に変更することも可能ですが、正規表現が複雑になるため

  • 「m月」を「0m月」に置換
  • 「d日」を「0d日」に置換
  • 「mm月dd日」を「mmdd」に置換

と3段階で名称を変更していきます。

「m月」を「0m月」に置換する

1桁の「m月」を「0m月」に置換します。

スクリプトはこのようになります。

Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '^([0-9])月','0$1月'}

置換前の文字列に「^」や「[0-9]」といった記号が並んでいますね。これらをメタ文字といいます。メタ文字とは特別な意味を持たせたという記号のことです。

このスクリプトで使用しているメタ文字は文字の種類をグルーピングする「文字クラス」文字の位置を指定する「アンカー」です。

文字クラス

文字クラスとは一致させたい文字の集まりを表すメタ文字の総称です。

文字クラスの1つである[0-9]を以下の太字の部分で使用しています。

-replace ‘^([0-9])月’,’0$1月’

[]内に記載した複数文字のいずれかに含まれる文字であればマッチさせることができます。

文字コード(ASCIIコード)が連続していれば[X-Y]のように「-(ハイフン)」で開始終了の文字だけ指定することができます。

文字コードの説明は割愛しますが、よく使うもので

  • [A-Z]:AからZまでのアルファベット
  • [0-9]:0から9までの数字

があります。

このスクリプトでは[0-9]を使用して数字であることを示しています。

[]内には複数文字を記載しますが、1文字を表現しているので注意してください。

アンカー

アンカーとは文字列が一致する位置を示すメタ文字の総称です。

アンカーの1つである「^」を文字クラス[0-9]の直前で使用しています。

-replace ‘^([0-9])月’,’0$1月’

「^」は文字列の先頭であることを示すメタ文字です。

「^([0-9])月」は先頭にある「m月」を指定しています。

このようにアンカーを使って月が1桁の場合のみ置換対象とします。

さて、文字クラスとアンカーを使って1桁の「m月」をマッチングすることができそうです。次に置換後の文字列を作っていきましょう。

ブロック化()

マッチングした先頭の「m月」に「0」を付与します。

置換前の月の数字(m)は、置換後の文字列でも使いたいですよね。

置換前の文字列を()でブロック化すると、置換後の文字列で参照することができます

参照の方法は以下の通りです。

「$」+ 「左から数えた()の位置」

左のブロックから順番に「$1」、「$2」、「$3」…と指定することができます。

-replace ‘^([0-9])月’,’0$1月’

スクリプトでは月の左側にブロック()がありますね。月の数字[0-9]を囲っています。

置換後の文字列で$1と書くことで、()で囲った月の数字を参照することができます。$1の前に「0」を付けた文字列で置換します。

これで「m月」を「0m月」に置換することができます。

「d日」を「0d日」に置換する

次は「d日」に0を付与して「0d日」に置換します。

Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '月([0-9])日','月0$1日'}

さきほどの月を2桁に変換するスクリプトのアンカー「^」が「月」という文字に置き換わっているだけです。「月」に続いて「d日」である場合に置換対象としています。

「mm月dd日」形式を「mmdd」に置換する

ここまでで、1桁の月日には0が付与され、ファイル名はすべて「mm月dd日」形式になっているはずなので、これを一気に「mmdd」に置換します。

Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '([0-9][0-9])月([0-9][0-9])日','$1$2'}

ブロック化で月と日の2桁の数字([0-9][0-9])を置換後で参照し、「$1$2」とそのまま並べたものと置換します。

スクリプトを実行する

今まで作ったスクリプトをまとめて実行してみます。

意図しないディレクトリ内のファイル名が変更されないようにSet-Locationでカレントディレクトリを変更するのを忘れないようにしましょう。

 Set-Location C:\Users\terad\Desktop\input
 Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '^([0-9])月','0$1月'} 
 Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '月([0-9])日','月0$1日'}
 Get-ChildItem *.txt| Rename-Item -NewName {$_.Name -replace '([0-9][0-9])月([0-9][0-9])日','$1$2'}

inputディレクトリには月日が1桁と2桁の名称が混在していますね。

ISEで実行すると…

このようにmmddに変更されました!

(参考)代表的なメタ文字

PowerShellで使用できる代表的なメタ文字は以下の通りです。

メタ文字 説明
. 改行(\n、\r)を除くすべての文字
[X] カッコ内の文字いずれか一文字
[X-Y] 文字の範囲を指定
^ 文字列の先頭を示す
$ 文字列の末尾を示す
() 置換前の文字列をグループ化し置換後の文字列で参照ができる
* 直前のパターンの0回以上繰り返す
+ 直前のパターンの1回以上繰り返す
{min,max} 直前のパターンをmin回からmax回繰り返す

上記以外のメタ文字も含めクイックリファレンスにまとまっていますので詳細は下記のサイトをご参照ください。

正規表現言語 - クイック リファレンス

まとめ

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

今回はPowerShellのRename-Itemで正規表現を使うことで複雑な名称変更をする方法をお伝えしました!

正規表現とはメタ文字という記号を使って文字列のパターンを表現したもので、置換したい文字列をパターンで指定すること複雑なファイル名変更が実現できます。

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

エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法

$
0
0

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

「初心者でもわかるエクセルVBAのクラスモジュール」についてシリーズでお伝えしています。

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

エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
「初心者でもわかるエクセルVBAのクラスモジュール」について連載でお送りしております。今回はエクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法をお伝えします。

Property Letプロシージャの使い方をお伝えしました。

これで、クラスの作り方とPropertyプロシージャの使い方の超基本部分は抑えられたかなと思います。

が、作ってきたのはエクセル表の1行分を表すクラスです。

複数行をクラスを活かして扱うにはどうしたらよいでしょうか。

ということで、今回からコレクションの特性を持つクラスの作り方を目指していきますので、もうしばらくお付き合いください。

まず今回ですが、その前準備として、エクセル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 Property Get IsMale() As Boolean
    IsMale = (Me.Gender = "male")
End Property

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

上記コードにより、クラスに以下のメンバーを追加しています。

  • FirstNameプロパティ、Genderプロパティ、Birthdayプロパティはパブリック変数によるプロパティ
  • IdプロパティはProperty Letプロシージャにより、一度だけその値をプライベート変数id_にセットができます
  • IsMaleプロパティはProperty Getプロシージャによる読み取り専用のプロパティです
  • メソッドはGreetという挨拶代わりのメソッドですね

それを検証するための、Subプロシージャは以下の標準モジュールModule1に記載されています。

Sub MySub()

Dim p As Person: Set p = New Person

Dim i As Long: i = 2
With Sheet1
    p.Id = .Cells(i, 1).Value
    p.FirstName = .Cells(i, 2).Value
    p.Gender = .Cells(i, 3).Value
    p.Birthday = .Cells(i, 4).Value
End With

p.Id = "Hoge"
Stop
'p.Greet

End Sub

これからやりたいこと:複数行のデータをクラスで扱いたい

さて、これで1行分のデータに関してはクラスで扱えるようになりました。

ですが、エクセル表には、Bob以外のPersonもいらっしゃるわけで、それらをクラスとして扱おうと思ったら、以下のように人数分のインスタンスを用意しなければいけない…となると、ちょっとだるいです。

  • エクセル表のデータ行の分だけ以下繰り返す
    1. Personクラスのインスタンスを生成する
    2. インスタンスにエクセル表からデータを取り込む

標準モジュールに、ループ処理を作ってもいいのですが、これ…どうせ必要ならクラスの機能として持っておいたほうがスッキリしますよね。

それで、今回は2の「インスタンスにエクセル表からデータを取り込む」という処理をクラスモジュールPersonの処理として寄せてしまいたいと思います。

インスタンスの初期データをセットするメソッド

VBAにはコンストラクタがない

実は、他の言語でいうと、インスタンスの生成とデータの初期化がいっぺんに行える言語が多くあります。

一般的にコンストラクタと呼ばれる関数です。

コンストラクタを作成しておくと、インスタンスを生成したときに自動的に呼び出されて、必要なデータをセットできるのです。

残念ながらVBAにはコンストラクタのような機能は存在していません…。

ただ、どうせインスタンスを生成してから初期データをセットするのであれば、それを楽に行えるメソッドは作っておいて損はないですよね。

インスタンスの初期化をするメソッド

今回、データはエクセル表に展開されています。

ですから、その1行分のデータ範囲つまりRangeオブジェクトを渡したら、それをプロパティにセットしてくれるようにしてくれればシンプルに作れそうです。

クラスモジュールPersonに、以下のようなSubプロシージャInitializeを追加して、Initializeメソッドを作ります。

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

1行分のセル範囲をRangeオブジェクトで受け取って、左上のセルの値から順に、id_、FirstName、Gender、Birthdayにセットをします。

エクセル表の列順さえ入れ替わることがなければ、これでいけそうです。

Initializeメソッドの動作確認

では、標準モジュールModule1を以下のように変更して、その動作を確認してみましょう。

Sub MySub()

Dim i As Long: i = 2
Dim p As Person: Set p = New Person
With Sheet1
    p.Initialize .Range(.Cells(i, 1), .Cells(i, 4))
End With

Stop
'p.Greet

End Sub

Stopステートメントで中断しているときに、ローカルウィンドウを確認してみると、以下のようにすべてのプロパティが正しくセットされていることが確認できます。

エクセルVBAのインスタンスの初期データを確認する

まとめ

以上、エクセルVBAでクラスのインスタンス生成時にデータを簡単に格納するメソッドを作る方法をお伝えしました。

VBAにはインスタンス生成時にデータを初期化するコンストラクタがないので、その代わりになるメソッドを独自で作成する必要があります。

さて、次回はエクセル表の他のデータも取り扱えるようにコレクションを活用していきます。

どうぞお楽しみに!

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

名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!
  1. 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
  2. エクセルVBAでクラスに最も簡単なプロパティを追加する方法
  3. エクセルVBAで自作クラスをインスタンス化する方法
  4. エクセルVBAでクラスに最も簡単なメソッドを追加する方法
  5. エクセルVBAで表の1行分のデータを表すクラスを作成する方法
  6. エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
  7. エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
  8. エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法

エクセルVBAでProperty Getプロシージャを使ってプライベート変数にアクセスする方法

$
0
0
private

photo credit: Aircaft @ Gloucestershire Airport By James N566SR Cirrus SR22 (Private) via photopin (license)

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

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

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

エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
「初心者でもわかるエクセルVBAのクラスモジュール」について連載でお送りしております。今回はエクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法をお伝えします。

Property Letプロシージャの使い方をお伝えしました。

なのですが、Property Letプロシージャで作ったプロパティは書き込み専用になっちゃうのですね。

読み取りができないっす…

読み取りをできるようにするにはどうしたらよいでしょうか?

ということで、今回はPropety Getプロシージャを使ってプライベート変数にアクセスする方法です。

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

前回までのおさらい

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

以下のようなエクセル表の1行分のデータを表すクラスを作成しております

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

作成途中のクラスモジュール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 Property Get IsMale() As Boolean
    IsMale = (Me.Gender = "male")
End Property

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

エクセル表の列に対応するFirstName、Gender、Birthdayというプロパティを、パブリック変数で、Idというプロパティをプライベート変数とProperty Letプロシージャの組み合わせで作成しています。

それで、検証のための、Subプロシージャは以下の通りで、標準モジュールModule1に記載されています。

Sub MySub()

Dim p As Person: Set p = New Person

Dim i As Long: i = 2
With Sheet1
    p.Id = .Cells(i, 1).Value
    p.FirstName = .Cells(i, 2).Value
    p.Gender = .Cells(i, 3).Value
    p.Birthday = .Cells(i, 4).Value
End With

p.Id = "Hoge"
Stop
'p.Greet

End Sub

やりたいこと:プライベート変数によるプロパティを読み取れるようにする

それで、Idプロパティが初回にデータが書き込まれたのはいいのですが…このままだと読み取れません。

例えば、以下のようなコードを13行目の代わりにしてみましょう。

Debug.Print p.Id

実行してみると…

エクセルVBAでプライベート変数のプロパティにアクセスしたときのコンパイルエラー

ダメっすね。

コンパイルエラー: プロパティの使い方が不正です。

となってしまいます。

今回はこれを読み取れるようにしていきたいと思います。

Property Getプロシージャでプライベート変数を読み取る

これの解決法は簡単で、既にシリーズで紹介したProperty Getプロシージャを使います。

プライベート変数id_は、プライベートなので他のモジュールからはアクセスできないのですが、同じモジュールつまりクラスモジュールPerson内のプロシージャからなら読み取ることができます。

そして、プロパティを取得するためのプロシージャはProperty Getプロシージャでしたね。

そのProperty Getプロシージャをパブリックで作成してあげれば、他のモジュールから呼び出せます。

前回お伝えした、Property Letプロシージャと同じように、迂回してアクセスする作戦です。

Property Getプロシージャの構文のおさらい

Property Getプロシージャについては、以下の記事で紹介していますね。

エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ進めております。今回はエクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法をお伝えします。

おさらいで、その構文を紹介しておきます。

Property Get プロシージャ名() As
 ’処理
 プロシージャ名 = 戻り値
End Property

プライベート変数からデータを取得するプロパティ

今回の場合は、プロシージャ名はプロパティ名「Id」とします。

データ型はStringですね。

そして、戻り値は、プライベート変数id_をそのまま返せばOK。

ということで、以下のようなProperty Getプロシージャを作成して、クラスPersonに追加すればよいわけですね。

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

では、Module1のSubプロシージャを以下のように変更して確認してみましょう。

Sub MySub()

Dim p As Person: Set p = New Person

Dim i As Long: i = 2
With Sheet1
    p.Id = .Cells(i, 1).Value
    p.FirstName = .Cells(i, 2).Value
    p.Gender = .Cells(i, 3).Value
    p.Birthday = .Cells(i, 4).Value
End With

Debug.Print p.Id
'p.Greet

End Sub

以下の通り、PersonクラスのインスタンスのIdプロパティを出力することができました。

エクセルVBAでProperty Getプロシージャでプロパティの値を出力

まとめ

以上、エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法についてお伝えしました。

クラスのデータをプライベート変数にするのであれば、多くの場合でProperty LetプロシージャとProperty Getプロシージャの両方をセットで作成して、そのデータの設定と取得をできるようにします

ぜひ、覚えておいてくださいね。

次回は、インスタンスの生成時に初期データをセットするメソッドを作ります。

エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
「初心者でもわかるエクセル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でクラスのインスタンス生成時に初期データを格納するメソッドを作る方法

【エクセル区切り位置】「列のデータ形式」で数字データを文字列・日付形式に変換する

$
0
0

区切り位置3アイキャッチ

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

エクセルの隠れ優等生「区切り位置」の魅力をシリーズを通して紹介しています!

前回の記事では、「各フィールドの値がダブルクォートで囲まれているカンマ区切りのデータ」を整形する方法を紹介しました。

  • ダブルクォートを削除する
  • 各フィールドをカンマで区切る
【エクセル区切り位置】ダブルクォートで囲まれたカンマ区切りのデータを一瞬で分割する
エクセルの「区切り位置」を紹介するシリーズ。第二回目は「各フィールドの値がダブルクォートで囲まれているカンマ区切りのデータ」のダブルクォートを削除し、カンマで分割する方法を紹介しています。

今回の記事では、区切り文字で区切ったあとの「列のデータ形式」を設定する方法を紹介します。

  • 先頭がゼロではじまる数字(電話番号など)
  • 日付を表す8ケタの数字

これらの値が含まれるデータをそのまま区切ると見た目がよくないので、今回のテーマは「書式を設定して見た目をキレイに整えよう」です!

区切った後に「列のデータ形式」の設定が必要なケース

なんちゃって個人情報というサイトから取得したダミーデータを使って紹介していきます。

※今回の記事から「区切り位置」の基本操作は省略していますので、操作手順はシリーズ前回までの記事をご覧ください。

名前・ふりがな・性別・年齢・誕生日・携帯の6フィールドを持つ、カンマ区切りのテキストファイルです。

区切り位置3-1

 

このデータをカンマで区切るため、まずはデータをエクセルシートに貼り付けます。

6列目「携帯」のフィールドに注目してください。勘の良い方、イヤな予感がしていませんか・・・?

区切り位置3-2

 

「携帯」のデータはハイフンなしの数字のみなので、これまでどおりの手順で操作すると、先頭のゼロが消えてしまいます。

区切り位置3-3

 

このような場合に「列のデータ形式」で書式を設定すると、見た目を整えることができます。

 

なぜ先頭のゼロが消えてしまうの?

0120-00-0000という電話番号をハイフンなしにすると「0120000000」となります。

数字のみで構成される「0120000000」は、数値の「120,000,000(一億二千万)」であると、エクセルが判断するからです。

先頭がゼロの数字データを文字列に変換する

先頭のゼロを表示させるために、携帯の数字データを「文字列」と認識させます。

テキストファイルのデータをエクセルシートに貼り付けたところからの解説です。

「カンマやタブなどの区切り文字によってフィールドごとに区切られたデータ」を選択して「次へ」

区切り位置3-4-1

 

区切り文字「カンマ」を選択して次へ進みます。

区切り位置3-4-2

 

「列のデータ形式」の初期値は「G/標準」

「区切り位置」では、区切ったあとの各フィールドのデータ形式が、初期値で「G/標準」となっています。

「G/標準」では、このように自動で書式が設定されます。

  1. 数字 → 数値
  2. 日付 → 日付形式
  3. その他 → 文字列

「ハイフン無しの電話番号」は数字と判断され、数値形式に変換されるのです。

区切り位置3-4-3

 

列のデータ形式を「文字列」に変更する

列のデータ形式「G/標準」を「文字列」に変更しましょう。

ここで変更したいのは「携帯」の列ですね。データのプレビュー欄で列をクリックすると、白黒が反転します。

区切り位置3-5

 

次に、列のデータ形式選択欄で「文字列」を選択します。データのプレビュー欄の「携帯」のヘッダーが「文字列」に変わったことを確認したら完了をクリック。

区切り位置3-6

 

「携帯」の列が文字列として認識され、先頭のゼロが消えずに残りました。

区切り位置3-7

 

このように、商品コード・部署コードなど、先頭がゼロで始まるフィールドが存在する場合は、「列のデータ形式」で文字列に変換して、見た目を整えることができます。

8ケタの数字データを日付形式に変換する

続いてのサンプルデータがこちらです。「誕生日」の日付データにスラッシュが無く、8ケタの数字になっている場合です。

区切り位置3-8

 

列のデータ形式を「G/標準」のままで区切ると、そのまま取り込まれますね…

区切り位置3-9

 

元データに日付を表すスラッシュが無いけれど、区切った後のデータは日付形式にしたい!
そんな時に便利な設定を紹介します!

列のデータ形式を「日付」に変更する

5列目の「誕生日」のフィールドを日付形式に変更します。

列のデータ形式を設定する画面で、「誕生日」の列を選択してから、「日付(YMD)」を選択して完了をクリック。

区切り位置3-10

 

これで、区切ったあとの「誕生日」がスラッシュ付きの日付形式になりました。

区切り位置3-11

「区切り位置」の応用的な使い方

「区切り位置」は、カンマ・スペースなどで区切られているデータを分割するための機能ですが、「列のデータ形式」を設定する機能を利用して、こんなこともできます。

シートのA列に日付を表す8桁の数字があります。1列だけなので区切る要素ないですよね…?

これを、「区切り位置」を使用してスラッシュ付きの日付形式にできるのです!

区切り位置3-12

 

データを区切る作業ではないので、区切り文字のチェックはすべて外します。

区切り位置3-13

 

列のデータ形式を「日付(YMD)」に変更しましょう。

区切り位置3-14

 

A列の8桁の数字が日付形式に変換されました!

区切り位置3-15

 

本来、「区切り位置」はデータを区切るために使う機能ですが、工夫次第でこのような使い方もできます。

日付の扱いに困っている方はぜひ使ってみてくださいね!

まとめ

今回の記事では、「区切り位置」でデータを区切ったあとの「列のデータ形式」を設定する方法を紹介しました。

  • 先頭がゼロで始まる数字データを文字列にして、ゼロを表示させる
  • 8ケタの数字をスラッシュ付きの日付形式にする

「区切り位置」のシリーズはこれにて終了です。

ダブルクォートやシングルクォートで囲まれているデータ、スペース・カンマ・タブ区切りなどのデータは、「区切り位置」の機能を使用して一瞬で分割・整形しましょう!

連載目次:エクセル「区切り位置」を使い倒す

スペースが含まれるデータをスペース区切りで分割する。システムからダウンロードしたカンマ区切りのデータファイルを整形してエクセルに取り込む。

そんな作業が、プログラミング不要・エクセル関数不要で解決できる「区切り位置」の魅力を存分に紹介しています!

  1. 【エクセル区切り位置】スペースが含まれるデータを一瞬で分割する
  2. 【エクセル区切り位置】ダブルクォートで囲まれたカンマ区切りのデータを一瞬で分割する

エクセルVBAでインスタンスの集合をコレクション化する方法

$
0
0
collection

photo credit: Skolnik Collection Euphorbia via photopin (license)

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

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

前回の記事はこちら。

エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
「初心者でもわかるエクセルVBAのクラスモジュール」についてシリーズでお伝えしています。今回は、エクセルVBAでクラスのインスタンス生成時にデータを簡単に格納する、つまりコンストラクタ的なメソッドを作る方法です。

クラスのインスタンスを生成時に初期データをセットするメソッドを作成しました。

さて、これまではエクセル表の1行分のデータをクラスとして表す方法をお伝えしてきたのですが、エクセル表には複数行があるのです。

では、この複数行をまとめて取り扱う方法はないものか…

ということで、コレクションです。

今回は、エクセル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 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には色々なメンバーを追加してきましたね。

そして、その動作を検証するためのSubプロシージャを以下のModule1に記述しています。

Sub MySub()

Dim i As Long: i = 2
Dim p As Person: Set p = New Person
With Sheet1
    p.Initialize .Range(.Cells(i, 1), .Cells(i, 4))
End With

Stop
'p.Greet

End Sub

エクセル表の1行分についてインスタンスの生成をして、クラスPersonのInitializeメソッドを使って初期データをセットしています。

やりたいこと:生成したインスタンスを「集合」として取り扱いたい

さて、エクセル表には複数のデータがあります。

ですから、これを表のすべてのデータについてループを回して、インスタンスの生成を初期データのセットを行えばよいわけですね。

それで、その生成したインスタンスの集合…どんなふうに取り扱えばよかったでしたっけ?

エクセルVBAでデータの集合を扱う仕組み

エクセルVBAでは、データの集合を扱う方法として

  • 配列
  • コレクション
  • 辞書

などといった方法があります。

配列は他言語ではメジャーなのですが、VBAでは扱う要素の数を増減させたい場合には、ちょっと融通が効きづらいところがあって、正直使いづらいです(個人の感想含む)。

辞書は、Dictionaryオブジェクトを使いますが、使用するためにはライブラリの参照が必要ですね。以下の記事から始まるシリーズで紹介しています。

【エクセルVBA】リスト処理に便利!Dictionaryオブジェクトをコードで使うための準備
VBAでリストの重複を排除するのって、ループ文が複数出てきたり、処理速度が落ちたりして、ちょっと躊躇してしまいませんか?Dictionaryオブジェクトを使えば、重複排除もスマートにできるかもしれませんよ。エクセルVBAのDictionaryオブジェクトを、コードで使用するための前準備を紹介しています。

一方で、要素の数の増減に柔軟さを持っているコレクションという仕組みが非常に扱いやすいのです(個人の感想含む)。

ということで、このシリーズでは、コレクションを使ってインスタンスの集合を取り扱う方針で進めていきます。

コレクションとそのメンバー

コレクションは、既存のCollectionオブジェクトとして提供されているので、Newしてインスタンスを生成すれば、すぐに使用をすることができます。

Collectionオブジェクトには、以下のようなメンバーが既に用意されていて、それらを活用することでデータの集合を扱います。

  • Addメソッド: 要素を追加する
  • Countメソッド: 要素の数を取得する
  • Itemメソッド: コレクション内の要素を取得する
  • Removeメソッド: 要素を削除する

Collectionオブジェクトを使用する

まず、Collectionオブジェクトを使用するには、以下のDimステートメントとSetステートメントが必要です。

Dim 変数 As Collection
Set 変数 = New Collection

Collectionオブジェクトを格納するオブジェクト変数を宣言し、それにインスタンスを生成します。

例えば、以下のようなコードを作成して、複数のPersonオブジェクトを扱う、CollectionオブジェクトmyPersonsを用意します。

Dim myPersons As Collection
Set myPersons = New Collection

Addメソッドで要素を追加する

インスタンスを生成した時点では、Collectionオブジェクトは何の要素もない空っぽの状態なので、要素を追加していく必要があります。

Collectionオブジェクトに要素を追加するには、Addメソッドを使います。

Collectionオブジェクト.Add 要素, キー

追加する要素は、今回はPersonオブジェクトです。

キーは、その要素を呼び出すときに使えるキーワードのようなものです。

今回の場合は、一意に定められているIdプロパティの値などを使うと呼び出すときに便利そうです。

ですから、インスタンス生成から、初期データのセット、そしてコレクションへの追加の一連の流れは以下のように作ればよさそうです。

Dim p As Person: Set p = New Person
p.Initialize .Range(.Cells(i, 1), .Cells(i, 4))
myPersons.Add p, p.Id

インスタンスの集合のコレクション化

では、確認用のSubプロシージャの全体を作って、動作確認をしてみましょう。

こちらです。

Sub MySub()

Dim myPersons As Collection: Set myPersons = 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))
        myPersons.Add p, p.Id
        i = i + 1
    Loop
End With

Stop

End Sub

Stopステートメントで中断しているときに、ローカルウィンドウで確認をすると、コレクションmyPersonsの内容を確認することができます。

インスタンスのコレクションについてローカルウィンドウで内容を確認

まとめ

以上、エクセルVBAでインスタンスの集合をコレクション化する方法をお伝えしました。

  • Collectionオブジェクトとは
  • Addメソッドでコレクションに要素を追加する方法

インスタンスの集合に限らず、いろいろなところで活躍しますので、ぜひ覚えておいてくださいね。

次回は、インスタンスのコレクションについて参照したり、操作をしたりしてみたいと思います。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセル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でクラスのインスタンス生成時に初期データを格納するメソッドを作る方法

エクセルVBAでコレクション化したインスタンスを取り出す方法

$
0
0

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

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

前回の記事はこちら。

クラスから生成したインスタンスをコレクション化する方法についてお伝えしました。

エクセルVBAでインスタンスの集合をコレクション化する方法
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ連載をしております。今回は、エクセルVBAでCollectionオブジェクトを使ってインスタンスの集合をコレクション化する方法をお伝えします。

それで、コレクションにしたはいいのですが、そこから要素を取り出してクラスのメンバーを活用できるのかを説明していませんでしたね…

ということで、今回はエクセル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 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

プロパティ、メソッドと色々なメンバーが追加されていますね。

そして、エクセル表のデータからインスタンスを生成してコレクション化するという処理を作成しましたが、それが以下のModule1です。

Sub MySub()

Dim myPersons As Collection: Set myPersons = 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))
        myPersons.Add p, p.Id
        i = i + 1
    Loop
End With

Stop

End Sub

myPersonというオブジェクト変数をコレクションとして、そこに生成したインスタンスに初期データを投入したものを、要素として追加していっています。

では、このコレクションmyPersonからインスタンスをどのように参照して、操作できるのか…これについて見ていきましょう。

Collectionオブジェクトから要素を取り出す

まず、Collectionオブジェクトから要素を取り出す方法を見ていきましょう。

インデックスを使う方法と、キーを使う方法の2種類を使用することができます。

インデックスを使う

Collectionオブジェクトの要素を取り出すには、Itemメソッドを使います。

書式はこちらのように、引数としてインデックスを指定します。

Collectionオブジェクト.Item(インデックス)

Itemメソッドは既定のメンバーなので、以下のように省略した記述をしてもOKです。

Collectionオブジェクト(インデックス)

例えば、以下のようにすれば、インデックスが2の要素を取り出して、そのFirstNameプロパティを出力できます。

Debug.Print myPersons(2).FirstName

ただ…どのインスタンスが、どのインデックスに対応しているか…別途記録しておかないとイマイチ分かりづらいですよね。

キーを使う

そこで、Collectionオブジェクトからキーを使って要素を取り出すという手があります。

ほら、myPersonsに要素を追加するときに、以下のようにインスタンス自身のIdプロパティをキーに設定していたのでした。

myPersons.Add p, p.Id

それで、CollectionオブジェクトのItemメソッドは引数として、キーを指定することもできます。

Collectionオブジェクト.Item(キー)

同様に、以下のように省略できます。

Collectionオブジェクト(キー)

誰がどのIdであるかは事前にわかっていますもんね。

以下のようにすれば、Idプロパティが「a03」のPersonオブジェクトのBirthdayプロパティを取得できます。

Debug.Print myPersons("a03").Birthday

なお、Personクラスの仕様では、FirstNameプロパティとGenderプロパティ、Birthdayプロパティは変更が可能です。

キーを使って取り出して、プロパティを変更するということもできるわけですね。

ループを回して各インスタンスを操作する

コレクション化のもう一つのメリットとしては、反復を行うステートメントを使えるようになるということですね。

例えば、For Each~Next文を使えば、以下の構文で各要素についてループさせることができますね。

For Each 変数 In Collectionオブジェクト
 ’処理
Next 変数

今回の場合は、以下のようにすれば、各インスタンスのプロパティをデバッグ出力することができます。

For Each p In myPersons
    Debug.Print p.Id, p.FirstName, p.Gender, p.Birthday
Next p

コレクション化したインスタンスを取得する

では、以上を踏まえてマクロを実行して確認してみましょう。

まとめて、Module1を以下のように書き換えてみました。

Sub MySub()

Dim myPersons As Collection: Set myPersons = 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))
        myPersons.Add p, p.Id
        i = i + 1
    Loop
End With

Debug.Print myPersons(2).FirstName 'インデックスでの参照を確認
Debug.Print myPersons("a03").Birthday 'キーでの参照を確認

'コレクションの要素についてループ
For Each p In myPersons
    Debug.Print p.Id, p.FirstName, p.Gender, p.Birthday
Next p

End Sub

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

010 コレクション化したインスタンスの情報をデバッグ出力

まとめ

以上、エクセル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でインスタンスの集合をコレクション化する方法

エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法

$
0
0
collection

photo credit: www.ilkkajukarainen.fi IMG_0059 via photopin (license)

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

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

さて、前回の記事はこちら。

エクセルVBAでコレクション化したインスタンスを取り出す方法
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズでお送りしております。今回は、Itemメソッドを使ってエクセルVBAでコレクション化したインスタンスを取り出す方法についてお伝えします。

インスタンスのコレクションからその要素を取り出す方法をお伝えしました。

これで、だいぶ形になってきた感じはあるのですが、もうちょっと欲を出しちゃいましょうか。

それは、独自のコレクションを作るです。

これまでは、既存のCollectionオブジェクトを使ってきたのですが、独自のコレクションを作れたら、集合に対して便利なメソッドやプロパティを追加できますもんね。

ということで、エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法です。

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

前回のおさらい

では、前回のおさらいから…!

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

これをクラスでいい感じに取り扱えるようにしていきたいというのがシリーズの目標です。

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

それで、これまで作成してきたクラス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

エクセル表のフィールドをプロパティとして持つだけでなく、いくつかの便利なメンバーも独自で追加しています。

上記、クラスはエクセル表の1行分のデータを表すものなので、それをコレクションに格納して取り扱おうと、そしてその参照方法についていくつかテストしているのが、以下のModule1になります。

Sub MySub()

Dim myPersons As Collection: Set myPersons = 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))
        myPersons.Add p, p.Id
        i = i + 1
    Loop
End With

Debug.Print myPersons(2).FirstName 'インデックスでの参照を確認
Debug.Print myPersons("a03").Birthday 'キーでの参照を確認

'コレクションの要素についてループ
For Each p In myPersons
    Debug.Print p.Id, p.FirstName, p.Gender, p.Birthday
Next p

End Sub

今回やりたいこと:独自のコレクションを作る

標準モジュールModule1の処理を見ると、3~13行目はそもそもコレクションの準備として、

  • 新規コレクションを生成
  • データ行の分だけ繰り返し
    1. インスタンスを生成
    2. インスタンスのプロパティに初期データをセット

というような処理をしています。

ていうか、この部分って、どうせいつも必要な処理ですよね?

そしたら、これもクラスに寄せることはできまいか…!?

そう考えると、ふと思い浮かびます。

  • WorksheetオブジェクトにはWorksheetsコレクション
  • WorkbookオブジェクトにはWorkbooksコレクション
  • WindowオブジェクトにはWindowsコレクション

あらかじめ用意されているオブジェクトのいくつかには、その集合を扱うための専用のコレクションが用意されています。

てことは、PersonオブジェクトにはPersonsコレクションがあったらほうが便利じゃね?

それで、Personのコレクションにいつもやるようさ操作は、そっちに機能をもたせたほうがいいんじゃね?

ということになりそうです。トライしてみましょう。

独自のコレクションを作成する

さて、では手探りをしながら、独自コレクションPersonsを作成していきましょう。

新規クラスモジュールを挿入する

独自コレクションとはいいつつも、コレクションはオブジェクトなので、クラスモジュールの挿入からスタートです。

VBEメニューの「挿入」から「クラスモジュール」を選択して、新たなクラスモジュールを挿入します。

新規クラスモジュールを挿入する

そして、プロパティウィンドウの「(オブジェクト名)」を編集して、挿入したクラスモジュールの名前を「Persons」に変更します。

プロパティウィンドウでクラス名をPersonsに

クラスモジュールにCollection型のプロパティを追加する

それで、その新たに作ったまっさらのクラスモジュールPersonsに何を書いていくか…ということなのです。

まず、コレクションを持たせたいので、「データ」としてコレクションを定義しちゃいましょうか。

プロパティとして、Collection型のオブジェクト変数を定義するのです。

クラスモジュールPersonsの宣言セクションに…えい!

Public Items As Collection

これで、PersonsクラスにCollection型のオブジェクトを参照するItemsというプロパティを定義することになります。

Itemsプロパティは以下のようにすることで、Personsクラスのインスタンスが持つCollectionオブジェクトを返します。

Persons.Items

ですから、それに対してAddメソッドやItemメソッドなどが使えるという寸法です。

これで、クラスPersonsにはコレクションを持たせることができるはず…!

独自コレクションの確認するマクロ

いったんこの時点で確認してみましょう。

標準モジュールModule1を以下のように変更しました。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons
Set myPersons.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))
        myPersons.Items.Add p, p.Id
        i = i + 1
    Loop
End With

Stop

End Sub

1つ目のポイントは4行目ですが、ほらItemsプロパティはCollection型、つまりオブジェクトなので、宣言するだけでは実体化されていません。

なので、Setステートメントで、Newで生成したインスタンスを参照設定してあげる必要があります。

それで、11行目は各インスタンスについて、インスタンス内のCollectionオブジェクトにAddメソッドで追加しているというわけですね。

実行して、Stopの際のローカルウィンドウを確認します。

ローカルウィンドウでItemsプロパティの内容を確認

無事に、データが投入されているのが確認できますね。

まとめ

以上、エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法をお伝えしました。

プロパティとしてCollection型のオブジェクト変数を持たせることで、ひとまず独自コレクションとしての機能は実現できます。

ただ、「myPersons.Items.~」っていちいち書かないといけないので、ちょっとかっこ悪いですね。独自のAddメソッドとか、Itemメソッドがあったら「myPersons.Add」「myPersons.Item」とできますね。

なんとなく、Itemsプロパティはプライベートにしたいですし…

ということで、次回以降で独自コレクションPersonsをパワーアップしていきますよ。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセル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でコレクション化したインスタンスを取り出す方法

エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize

$
0
0
initial

photo credit: weesen S via photopin (license)

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

「初心者でもわかるエクセルVBAのクラスモジュール」についてシリーズでお伝えしております。

前回の記事はこちら。

エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
「初心者でもわかるエクセルVBAのクラスモジュール」ということでシリーズでお伝えしております。今回は、エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法をお伝えします。

エクセルVBAで独自のコレクションを作る方法をお伝えしました。

とは言っても、ただクラスモジュールにパブリック変数でCollectionオブジェクトのオブジェクト変数を宣言しただけでしたね…。

ということで、この独自のコレクションをパワーアップしていきますよ。

Collectionオブジェクトは生成が必要なので、独自コレクションのインスタンスを生成したときに、それも自動でやっちゃいたいですね…

ということで、今回はエクセルVBAでインスタンスを生成したときに自動で処理を実行するイベントプロシージャClass_Initializeの使い方です。

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

前回までのおさらい

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

まず、エクセルシート上には以下のような表があります。

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

このデータをクラス化して取り扱いたいのですが、その一行分を取り扱うのが、以下のクラス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

色々とメンバーを追加してきまして、一通りの実装は完了しています。

そして、その一行分のデータを表すオブジェクトを集合として便利に取り扱えればな~ということで、手をつけはじめたのが、以下の独自コレクションPersonsです。

Public Items As Collection

まだ、Collectionオブジェクト型のパブリック変数Itemsの宣言が一つあるだけですね…。

でも、これでPersonオブジェクトをコレクションとして扱うことができると言えばできます。

それを検証しているのが、以下の標準モジュールModule1ですね。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons
Set myPersons.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))
        myPersons.Items.Add p, p.Id
        i = i + 1
    Loop
End With

Stop

End Sub

それで、標準モジュールModule1で、クラスPersonsのインスタンス生成は仕方ないんですが、Itemsプロパティとして持っているCollectionオブジェクトの生成までやっちゃっているんですね。

これは、どうせいつも必要な処理なので、標準モジュールではなくて、クラスモジュールPersonsに寄せていきたいというのが今回のお題です。

イベントプロシージャClass_Initializeとは

そんなときに便利なのが、イベントプロシージャClass_Initializeです。

このプロシージャ名でクラスモジュールにプロシージャを作成すると、インスタンス生成時に自動で走ってくれます。

つまり、イベントプロシージャClass_Initializeはインスタンスの生成時に呼び出されるので、コンストラクタ的な役割になります。

インスタンス生成時にデータを渡せないのが大変残念なのですが…というのを以下の記事でもお伝えしております。

エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
「初心者でもわかるエクセルVBAのクラスモジュール」についてシリーズでお伝えしています。今回は、エクセルVBAでクラスのインスタンス生成時にデータを簡単に格納する、つまりコンストラクタ的なメソッドを作る方法です。

イベントプロシージャClass_Initializeを挿入する

では、イベントプロシージャClass_Initializeを作成していきましょう。

まず、クラスモジュールPersonsを開いてください。

そこでプロシージャ名を指定すればよいのですが、イベントプロシージャはオブジェクトボックスとプロシージャボックスからでも作れます。

まず、コードペインの左上がオブジェクトボックスですが、そこで「Class」を選択します。

オブジェクトボックスでClassを選択する

すると、右側の「プロシージャボックス」の選択が自動で「Initialize」になり、クラスモジュールにイベントプロシージャ「Class_Initialize」が挿入されます。

クラスモジュールにClass_Initializeが挿入される

このようにすれば、イベントプロシージャ名を覚えていなくても正確に挿入できます。

イベントプロシージャClass_Initializeを作成する

あとはClass_Initializeプロシージャの中身を書いていけばOKです。

Personsのインスタンス生成時に、Itemsプロパティが表すCollectionオブジェクトを生成したいので、以下のようにします。

Private Sub Class_Initialize()
    Set Items = New Collection
End Sub

インスタンスが生成されたら、パブリック変数Items(つまりItemsプロパティ)に、Collectionオブジェクトのインスタンスを生成してセットするわけですね。

イベントプロシージャClass_Initializeの動作を確認する

では、イベントプロシージャClass_Initializeの動作を確認してみましょうか。

標準モジュールModule1を以下のようにします。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons
'Set myPersons.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))
        myPersons.Items.Add p, p.Id
        i = i + 1
    Loop
End With

Stop

End Sub

myPersonsのItemsプロパティへのSetステートメントをコメントアウトしただけですね。この部分は、イベントプロシージャがやってくれるはず…!

実行をして、Stop時のローカルウィンドウを確認すると…

ローカルウィンドウで独自コレクション内を確認

無事に動いています。つまり、Class_Initializeプロシージャも動いているということです。

まとめ

以上、エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initializeについてお伝えしました。

おそらく、このイベントプロシージャはクラスモジュールを使うならかなりお世話になるはず…!

さて、次回は標準モジュールの処理をもっともっとクラスモジュールPersonsに寄せていきますよ。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセル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

エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法

$
0
0

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

「初心者でもわかるエクセルVBAのクラスモジュール」についてシリーズでお伝えしています。

前回の記事はこちら。

エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
「初心者でもわかるエクセルVBAのクラスモジュール」のシリーズです。今回はエクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initializeの使い方です。

インスタンスの生成時に自動で呼び出されるイベントプロシージャClass_Initializeについて紹介しました。

さて、そのClass_Initializeは自作のコレクションに追加したのですが、実はこのコレクションに初期データを投入する処理を追加もできちゃうんです。

ということで、今回はエクセル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 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クラスから生成されたインスタンスを集合としてコレクション的に扱うのがこのクラスPersonsです。

Public Items As Collection

Private Sub Class_Initialize()
    Set Items = New Collection
End Sub

これで複数のデータ行、すなわちエクセル表全体を扱うことができるわけです。

前回は、イベントプロシージャClass_Initializeを作成して、Itemsプロパティ用Collectionオブジェクトの生成とセットをするようにしました。

そして、その動作を確認するために作ったのが、以下の標準モジュールModule1のコードです。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons
'Set myPersons.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))
        myPersons.Items.Add p, p.Id
        i = i + 1
    Loop
End With

Stop

End Sub

今回の目標:自作コレクションの初期データを投入したい

さて、以前クラスPersonのインスタンスについて初期データを投入する処理を作るという記事を書きました。

エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
「初心者でもわかるエクセルVBAのクラスモジュール」についてシリーズでお伝えしています。今回は、エクセルVBAでクラスのインスタンス生成時にデータを簡単に格納する、つまりコンストラクタ的なメソッドを作る方法です。

その際は、Class_Initializeではなくて、独自のInitializeメソッドというのを作って、初期データの投入をするようにしていました。

上記のModule1のコードでいうと、10行目のところです。

これは、イベントプロシージャClass_Initializeには引数を渡すことができないという仕様から、仕方なく別メソッドにしていたんですね。

では、クラスPersonsはどうです?

クラスPersonは何行目のデータをインスタンス化していいかわからないので引数を渡す必要がありましたが、クラスPersonsは表全体をインスタンス化しちゃっていいですもんね。

引数、いらないんじゃないですかね…?

てことは、イベントプロシージャClass_Initializeにすべて吸収できるのでは…?

検証してみましょう!

イベントプロシージャClass_Initializeで初期データを投入する

標準モジュールModule1の4~14行目の処理をご覧ください。

4行目のCollectionオブジェクト生成とセットは、既にPersonsクラスのClass_Initializeに移設済みなので、コメントアウトしています。

残りの処理はどうでしょう。

  • 2行目からすべてのデータ行について
    • Personクラスのインスタンスを生成し変数pにセット
    • pについてセル範囲を渡してInitializeメソッドを実行、pに初期データをセット
    • myPersonsのItemsプロパティ(コレクション)にpを追加

引数なくても、いけそうです。

自作コレクションのクラスモジュール

では、初期データ投入の処理をクラスPersonsに作成していきます。

Personsクラスのコードを以下のように追加しました。

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

といっても、上記のModule1の処理のほぼカット&ペーストです。

変更したところと言えば、2行目と9行目。myPersons.Itemとなっていたところを、単にItemsとしただけですね。

自作コレクションへの初期データ投入を確認する

では、Personsクラスの初期データ投入について動作を確認してみましょう。

Module1のコードは以下のように変更しました。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons

Stop

End Sub

…って、ものすごいシンプルになりましたね。

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

イベントプロシージャClass_Initializeで初期データを投入

まとめ

以上、エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法についてお伝えしました。

標準モジュール…だいぶスッキリしましたよね!

初期データ投入などといういつも発生する処理は、なるべくクラスモジュールのほうで持っていたいですもんね。

さて、では次回はPersonsクラスを操作するメンバーを追加していきますよ。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセル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

エクセルVBAで自作コレクションの要素を取得するプロパティの作り方

$
0
0
collection

photo credit: Hugo-90 Harold’s toy collection via photopin (license)

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

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

前回の記事はこちら。

エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法
「初心者でもわかるエクセルVBAのクラスモジュール」についてのシリーズです。今回は、エクセルVBAで自作コレクションのインスタンス生成時のイベントClass_Initializeで初期データも投入する方法です。

自作コレクションのクラスPersonsをイベントプロシージャClass_Initializeで初期化する方法をお伝えしました。

さて、この自作コレクションですが、現状だと要素の取得がちょっと回りくどいんです。

ということで、今回はエクセルVBAで自作コレクションの要素を取得するプロパティの作り方です。

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

前回のおさらい

では、前回のおさらいから…!

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

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

こちらのエクセル表をクラスで取り扱いをしていくというのが目標です。

まず、一行分のデータを扱うために、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クラスから生成したインスタンスを複数取り扱うコレクションのクラスPersonsがこちら。

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

これで、エクセル表のデータ全体を扱うことができるわけです。

前回、上記のコードのよいうに、クラスPersonsのインスタンス生成時にエクセル表のデータを自動で取り込むように作ったんです。

その確認用の標準モジュールがこちら。

Sub MySub()

Dim myPersons As Persons: Set myPersons = New Persons

Stop

End Sub

…超シンプルになりましたね。

独自コレクションにメンバーItemを追加する

さて、実際のPersonオブジェクトたちは、PersonsクラスのCollection型のパブリック変数Itemsに格納されています。

ですから、特定のPersonsオブジェクトを参照しようと思ったら

myPersons.Items.Item(1)
myPersons.Items.Item('a01')

などとする必要があります。

ちょっと回りくどいですし、普段使っているコレクションっぽくないですよね…

例えば、Personsクラス自体に、独自のメンバーとして「Item」を追加したらどうでしょう?

myPersons.Item(1)
myPersons.Item('a01')

と、こんな感じで参照ができて、普段使っているコレクションっぽいですよね。

コレクションの要素を取得するItemプロパティ

では、実際に実装していきましょう。

クラスPersonsにItemプロパティを追加します。

値を返すプロパティでいいので、Property Getプロシージャですね。

そして、引数として整数のインデックスまたは、文字列型のキーかどちらかを受け取る必要があるので、Variant型で引数を受けるようにしましょう。

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

それで、その引数を使って、パブリック変数Itemsが参照するコレクションからItemメソッドを使って要素を取り出して挙げるということです。

自作のItemプロパティで要素を取得する

では、作成した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

インデックス1の要素のFirstNameを表示、キー「a02」の要素のGreetメソッドを実施ですね。

実行すると以下のように正しく参照できていることを確認できます。

自作コレクションのItemプロパティのテスト

Itemsプロパティを隠蔽する

さて、PersonsコレクションにItemプロパティを追加しました。

そうなると、ここでふとした疑問が…

パブリック変数Itemsですが、これ他のモジュールからアクセスできる必要…あります?

今回追加したItemプロパティや、要素の追加をするAddメソッドなどを用意すれば、Itemsがパブリックである必要はなさそうです。

Itemsプロパティを隠蔽しちゃいましょうか。

パブリック変数をプライベート変数に変更する

まず、Personsクラスのパブリック変数Itemsをプライベート変数に変更します。

プライベート変数なので、頭文字も小文字にしてアンダースコアを付与しました。

Private items_ As Collection

それに合わせて、Personsクラスのコードを置換しましょう。

Ctrl + F で以下の置換ダイアログが表示しますので、検索文字列を「Items」、置換後文字列を「items_」にします。

あと、「大文字と小文字を区別する」にもチェック入れておきましょう。

変数名を置換する

結果的に、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

これで、他のモジュールからアクセスができなくなります。

ただ、Class_Initializeでの初期データ投入と、Itemプロパティによる参照はできるはずです。

前述の標準モジュールのコードを実行して確認しておきましょうね。

まとめ

以上、エクセルVBAで自作コレクションの要素を取得するプロパティの作り方をお伝えしました。

これで、コレクションっぽく要素を参照できるようになりましたね。

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

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセル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で自作コレクションのインスタンス生成時に初期データも投入する方法

Windowsのポチポチ業務を爆速化するPowerShell、タスクスケジューラでスクリプトを決まった日時に起動する方法

$
0
0

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

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

前回はコマンドレット:Rename-Itemで正規表現を使って複雑なファイル名変更をする方法をお伝えしました。

Windowsのポチポチ業務を爆速化するPowerShell、正規表現で複雑なファイル名変更をする方法
Windowsのポチポチ業務(マウスを使った業務)を爆速化するCUI=PowerShell。今回は正規表現を使って複雑なファイル名変更をする方法をお伝えします!

今回はタスクスケジューラというWindowsの標準機能を使ってPowerShellのスクリプトを決まった日時に起動する方法をお伝えします。

タスクスケジューラとPowerShellのスクリプトで定例的な業務を自動化して、コアな業務に集中して取り組める環境を作りましょう!

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

タスクスケジューラを起動する

Windowsには決まった日時にアプリケーションを実行するタスクスケジューラという機能が標準搭載されています。

タスクスケジューラを使うことでファイルのバックアップなど定期的に実施したい作業を忘れずに実行することができます。またPCをシャットダウンした状態でも処理は実行されます。

早速ですが、タスクスケジューラを起動しましょう!

Windowsを押してスタートメニューを開き、そのままの状態で「タスク」と入力すると検索結果にタスクスケジューラが表示されます。表示されたタスクスケジューラをクリックすると…

タスクスケジューラが起動しました!

検索することで素早く起動できますが、タスクスケジューラは「コントロールパネル」から起動できる機能の一つです。コントロールパネルはWindowsの設定変更の際などによく登場しますのでこちらもご紹介しておきます。

スタートボタンをクリックするか、Windowsを押してスタートメニューを開き、Windowsシステムツール内のコントロールパネルをクリックします。

コントロールパネルが開いたら「システムとセキュリティ」をクリックします。

下のほうにある「管理ツール」をクリックします。

管理ツールの中に「タスクスケジューラ」がありました。こちらをダブルクリックすると…

タスクスケジューラが起動しました!

タスクスケジューラでタスクを作成する

タスクスケジューラはアプリケーションと、時刻や周期など起動する際の条件をまとめてタスクという単位で管理しています。

さっそくタスクを作成していきましょう!

基本的な条件を設定する

左上の「タスクスケジューラライブラリ」をクリックした後に、右側の操作エリアで「基本タスクの作成」をクリックします。

基本タスクの作成ウィザードが表示されます。タスクの名前と説明を入力して「次へ」をクリックします。

タスクのトリガーを設定します。今回は毎週にして「次へ」をクリックします。

①タスクの起動時刻、②週の間隔、③曜日を設定します。今回は毎週火曜日の22:10に起動させます。

次に操作を選びます。PowerShellのスクリプトを起動する場合は「プログラムの開始」を選びます。

PowerShellのスクリプトを指定する

「プログラムの開始」というダイアログが表示されました。タスクで起動するPowerShellのスクリプトを指定していきます。

下図のように「プログラム/スクリプト」と「引数の追加」を設定し「次へ」をクリックします。

「プログラム/スクリプト」にはPowerShellの実行ファイル「powershell.exe」のフルパスを指定します。実行ファイルが入っているディレクトリはPowerShellで確認できます。「$PSHOME」と入力しエンターを押すと…

PS C:\Users\terad> $PSHOME
C:\Windows\System32\WindowsPowerShell\v1.0

このように「powershell.exe」が格納されているディレクトリが表示されますのでこちらと「powershell.exe」を「\」でつないで「プログラム/スクリプト」に設定しましょう。

$PSHOMEは自動変数の1つで、PowerShellが自動で実行ファイルのディレクトリを設定してくれます。本連載ではパイプラインで引き渡したオブジェクトが自動的に設定される「$_」を紹介してきましたが、PowerShell自体が自動的に値を生成してれる変数を総称して自動変数といいます。

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

「引数の追加」にはスクリプトのフルパスを指定します。

今回はデスクトップにあるsample.ps1というスクリプトファイルを実行します。「引数の追加」に「C:\Users\terad\Desktop\sample.ps1」とフルパスを設定します。

最後にこれまで設定した内容が表示されますので、誤りがなければ「完了」をクリックします。

これでタスクが設定できました!

スクリプト実行時に追加で設定しておくべき条件

タスクスケジューラに新たに「ファイルバックアップ」という名前のタスクが追加されていますね。

あと2つだけ追加でスクリプトを実行する際に設定しておくべき条件があります。

ログオン/ログオフの条件を設定する

バックアップのタスクはログオフ中、シャットダウン時にも実行しておいてほしいですよね?

新たに追加されたタスクをダブルクリックすると以下のようなダイアログが表示されます。

「全般」タブで「ユーザーがログインしているかどうかにかかわらず実行する」を選択するとログオフ中にもタスクが実行されるようになります。

「パスワードを保存しない」を設定するとスクリプトでユーザー情報などを渡していた場合もタスク終了後に破棄されます。今回ユーザー情報を設定することはありませんが、チェックを入れていても弊害はありませんのでそのまま設定しておきます。

電源の条件を設定する

次に「条件」タブを選択し、電源の状態に関する設定を確認します。

  • 「コンピュータをAC電源で使用している場合のみタスクを開始する」
  • 「コンピュータの電源をバッテリに切り替える場合は停止する」

の2つにチェックを入れておくとACアダプターにつないでいるときだけタスクが実行されます。

ノートPCの場合、バッテリー電源の時はスクリプトが動作途中に電源が落ちて処理が途中で終了してしまう可能性がありますのでチェックを入れておくと安心です。

これでタスクスケジューラの追加設定は完了です!

まとめ

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

今回はタスクスケジューラというWindowsの標準機能を使ってPowerShellのスクリプトを決まった日時に起動する設定方法をご紹介しました。

毎日、毎週、毎月など自分の好きな間隔で定期的にタスクを実行することができます。ログオフ時に実行可能になる、ノートPCの方はバッテリー電源の時にだけ実行される2つの追加条件も忘れずに設定してくださいね。

次回は実際にファイルバックアップをする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、正規表現で複雑なファイル名変更をする方法

Webサイトの新着記事をいち早く取得!RSSフィードのURLを確認する方法

$
0
0

importfeedサムネイル1

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

みなさん、お気に入りのWebサイトはありますか?

仕事で情報収集が必要なサイト・人気ブロガーのブログなどを「このWebサイト、今日は更新されてるかな~?」と、自分から毎日アクセスして確認するのはめんどうくさいですよね。

一部のWebサイトには、「フィード」という、新規記事が公開されたときに情報を自動で配信する機能があります。

この記事では、GoogleスプレッドシートのIMPORTFEED関数を紹介するシリーズの第一歩として、

  • Webサイトの「フィード」とは何か?
  • フィードのURLを取得・確認する方法

を紹介していきます。

IMPORTFEEDは、Webサイトの情報をGoogleスプレッドシートにインポートできる関数です。スプレッドシートをまだ使ったことがない方も、このシリーズでいっしょに学習していきましょう!

フィードとは

まず、英単語の「feed」の意味がこちらです。

  • ~を与える
  • ~を送り込む

データを与える・提供するというイメージですね。

つぎに、IT用語辞典の説明がこちらです。

フィードとは、主に、Webサイトの内容の要約や更新情報を配信すること、またはその配信のためにこれらの情報をまとめたデータのことである。

フィードに使用されるデータ形式として代表的なものにはRSSとAtomがあり、これらのデータには、Webサイトの更新情報、内容の概略などの情報が含まれる。

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

フィードのデータ形式には2種類あると書いてあります。

  • RSS
  • Atom

RSS?Atom?とむずかしく感じますが、IMPORTFEED関数を使う上で、この2つの違いを意識する必要はありません。2種類のデータ形式が存在するのね、とだけ理解しておきましょう。

フィードのURLを確認する方法

IMPORTFEED関数では、引数に「フィードURL」を指定します。

そのため、データを取得したいWebサイトの「フィードURL」を知る必要があります。

WordPressで作成されている当ブログ「いつも隣にITのお仕事」のフィードURLを確認してみます。

サイトのトップ画面でソースを表示しましょう。

importfeed1-1-2

 

このソースの中に、「フィードURL」が書かれています。すべてのソースをみるのは大変なので、検索機能を使いましょう。

Ctrl + Fで検索ボックスが出現します。feedまたはrssで単語検索するとすぐに見つかります。

importfeed1-2

当ブログは56行目にフィードURLが記載されています。

<link rel="alternate" type="application/rss+xml" title="いつも隣にITのお仕事 &raquo; フィード" href="https://tonari-it.com/feed/" />

href属性のダブルクォーテーションで囲まれているhttps://tonari-it.com/feed/が、当ブログの「フィードURL」です。

同じWordPressでも、フィードURLの形式が異なる場合がありますので、サイト毎に確認するとよいでしょう。

WordPressでは、/?feed=rss2/という形式のフィードURLも存在します。

特定の著者のフィードURLを確認する方法

WordPressでは、著者ごとのフィードURLが存在します。複数名で執筆している当ブログが、まさにそうです。

お気に入りのライターさんの記事だけをウォッチしたい!という場合に使えます。

執筆メンバー・寺戸さんのフィードURLをチェックしてみます。

寺戸さんが書いた記事をどれか開き、記事下「投稿者プロフィール」の「この著者の記事一覧」をクリックします。

importfeed1-9

 

https://ドメイン/author/著者名 というURLに遷移して、その著者が書いた記事の一覧画面が表示されます。

この画面で、ソースコードを表示しましょう。

importfeed1-10

 

コードを表示したら、検索機能を使用してフィードURLを特定します。

importfeed1-11

href属性の値が、その著者の「フィードURL」です。つまり、寺戸さんが書いた記事の「フィードURL」はhttps://tonari-it.com/author/teradosh/feed/です。

フィードはXMLファイルである

それでは「フィード」には、具体的に何が書かれているか見てみましょう。

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

ソース内のフィードへのリンクからも遷移できます。

importfeed1-3

 

フィードを購読するか聞かれます。ここでは、フィード確認で開くだけなので画面を閉じます。

importfeed1-4

 

これが「フィード」の正体です。

ファイルの先頭が<?xmlではじまってますね。フィードの正体はXML形式のファイルです。importfeed1-5

 

こんな複雑に記述されていたら、人間が読むにはとても難しすぎますよね。

この複雑なXMLファイルをスプレッドシートにインポートして、見た目をきれいに整形してくれるのが、IMPORTFEED関数なのです。

Webサイト・フィード・スプレッドシートの関連図

ここまでで、3つのキーワードが出てきました。

  1. Webサイト
  2. フィード
  3. GoogleスプレッドシートのIMPORTFEED関数

それぞれの関連図はこちらです。関係を理解しておきましょう!

importfeed1-8

まとめ

今回の記事では、GoogleスプレッドシートでIMPORTFEED関数を使うための「最初の一歩」として、これらをお伝えしました。

  • Webサイトの「フィード」とは何か
  • 「フィードのURL」を確認する方法

事前知識の解説のみとなりましたが、実務で関数を正しく使いこなすには、これらの基本をきちんと理解しておくことが大切ですよ!

次回から、IMPORTFEED関数を使用して、スプレッドシート上にWebサイトの情報をインポートする方法を紹介していきます。

どうぞお楽しみに!

Windowsのポチポチ業務を爆速化するPowerShell、ファイルをバックアップするスクリプトの作り方

$
0
0

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

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

前回はタスクスケジューラというWindowsの標準機能を使ってPowerShellのスクリプトを決まった日時に起動する設定方法をお伝えしました。

Windowsのポチポチ業務を爆速化するPowerShell、タスクスケジューラでスクリプトを決まった日時に起動する方法
Windowsのポチポチ業務(=マウスを使った業務)を爆速化するPowerShell。今回はタスクスケジューラというWindowsの標準機能を使って定期的にスクリプトを起動する方法をお伝えします!

今回はタスクスケジューラとの組み合わせ抜群なファイルをバックアップするスクリプトの作り方をお伝えします。

大事なファイルは定期的にバックアップしておきたい…それが自動で実行されると作業漏れがなくなり、時間も節約できて一石二鳥ですよ!

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

前回のおさらい

Windowsには決まった日時にアプリケーションを実行するタスクスケジューラという機能が標準搭載されています。

前回はタスクスケジューラにて、毎週火曜日の22:10にPowerShellのスクリプトを起動する「ファイルバックアップ」という名前のタスクを作成しました。

PowerShellのスクリプトを起動したいときは、以下のようにPowerShellの実行ファイルとスクリプトのフルパスを指定するんでしたね。

記事中では話の流れ上タスクを作成してからスクリプトを作成します。

しかし、パスが誤っているとスクリプトが起動できませんので注意が必要です。

①スクリプト、②タスクの順番で作成し、コピー&ペーストでパスを誤りなく設定するようにしてください。

ファイルバックアップのためのスクリプト

では、ファイルバックアップをするスクリプトを作っていきましょう。

スクリプトの全体像

別ディレクトリにファイルをコピーし、いつバックアップされたファイルかわかるようにファイル名にスクリプト起動時の日付を付与するスクリプトを作成します。

タスクスケジューラで指定したとおり、デスクトップに「sample.ps1」という名称で保存します。

スクリプトは以下の通りです。

$indir = "C:\Users\terad\Desktop\input"
$outdir = "C:\Users\terad\Desktop\output"
$date = Get-Date -UFormat "%Y%m%d"

Get-ChildItem $indir | Foreach-Object {

    $infile = $indir + "\" + $_.name
    $outfile = $outdir + "\" + $date + "_" + $_.name
    Copy-Item $infile -Destination $outfile

}

詳細を説明してきますね。

ディレクトリのパスと起動日付を変数に格納する

まずバックアップ元、バックアップ先のディレクトリをそれぞれ変数$indir、$outdirに代入します。

次に現在の日付と時刻を取得できるコマンドレット:Get-Dateを使って起動時の日付を取得し変数$dateに代入します。

$indir = "C:\Users\terad\Desktop\input"
$outdir = "C:\Users\terad\Desktop\output"
$date = Get-Date -UFormat "%Y%m%d"

Get-Dateの構文は以下の通りです。

Get-Date -Uformat “日付の書式”

取得する日付の書式をUformatパラメータで指定できます。今回は「西暦4桁+月+日」とするので「%Y%m%d」とします。

Uformatの日付の形式は以下のように指定できます。

書式 取得する情報
%Y 年(西暦4桁)
%y 年(西暦下2桁)
%m 月(01~12)
%B 月(January~December)
%d 日(01~31)
%H 時(00~23)
%h 時(01~12)
%M 分(00~59)
%S 秒(00~59)
%p 午前/午後

ファイルをコピーし名称を変更する

Get-ChildItemで取得した複数ファイルをForEach-ObjectとCopy-Itemで全てコピーします。

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

Windowsのポチポチ業務を爆速化するPowerShell、ファイルを別フォルダにコピーし名称を変更する方法
複数ファイルを一気にリネームする方法をご紹介!今回は複数のファイルをCopy-Itemというコマンドレットを使い、ファイル名を変更し別フォルダにコピーする方法をお伝えします!

Get-ChildItem $indir | Foreach-Object {
    $infile = $indir + "\" + $_.name
    $outfile = $outdir + "\" + $date + "_" + $_.name
    Copy-Item $infile -Destination $outfile
}

Copy-Itemの構文は以下の通りです。

Copy-Item コピー元ファイルのフルパス -Destination コピー先ファイルのフルパス

新しいファイル名は「$outdir + “\” + $date + “” + $.name」と元のファイル名($_.name)の前に日付($date)を付与しています。

実行結果

スクリプトを保存したら、PCをシャットダウンします。ノートPCの方は前回設定した条件のとおりAC電源につないだ状態で指定した時刻を待ってください。

指定した時刻が過ぎてから再度PCを起動、結果を確認してみます。

inputディレクトリには以下のようなファイルが入っています。

outputディレクトリを確認してみると…

無事、コピーされた上でファイル名が変更されていました!

まとめ

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

今回は定例作業としてよく使うファイルバックアップのためのスクリプトをご紹介しました。

毎日、毎週、毎月など自分の好きな間隔で定期的にタスクを実行することができますので、ファイルバックアップ以外にもいろいろなスクリプトを設定して普段の業務にお役立てください!

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

コミュニティ連携型!初心者向けプログラミング講座開講のお知らせ

$
0
0

ノンプロ研初心者向け講座

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

コミュニティ「ノンプログラマーのためのスキルアップ研究会」と連携した新しいタイプのVBAおよびGoogle Apps Script初心者講座(全6回)を開催させていただくことになりましたのでお知らせします。

ノンプロ研初心者向けプログラミング講習【VBAコース】 - paymo (ペイモ)
コミュニティ「ノンプログラマーのためのスキルアップ研究会」(ノンプロ研)のメンバー限定のVBA初心者講座(全6回)です。 VBAによる簡単な実務向けのツールを作れるレベルまでのスキル習得を目指します。コミュニティにもご参加いただくことで、継続して学ぶ環境と仲間を得られるというのが最大の特長です。 受講にはノ...
ノンプロ研初心者向けプログラミング講習【GASコース】 - paymo (ペイモ)
コミュニティ「ノンプログラマーのためのスキルアップ研究会」(ノンプロ研)のメンバー限定のGAS初心者講座(全6回)です。 GASによる簡単な実務向けのツールを作れるレベルまでのスキル習得を目指します。コミュニティにもご参加いただくことで、継続して学ぶ環境と仲間を得られるというのが最大の特長です。 受講にはノ...

こちらの講座は、コミュニティへのご参加もいただくことで、個人でのプログラミング学習ではあるあるの課題となりがちの以下をスッキリ解決するというものです。

  • 受講料が高い
  • 受講後の学習の継続ができない
  • 行き詰まったときに一人で解決できない

このページでは「ノンプロ研初心者向けプログラミング講座」の内容がどういったものか、またどのように個人の初心者向けプログラミング学習の課題を解決しているのかについてお伝えてしていきます。

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

「ノンプロ研初心者向けプログラミング講座」の開催概要

「ノンプロ研初心者向けプログラミング講座」は、VBAコースとGAS(Google Apps Script)コースの2つを用意しています。

以下開催概要です。

  • ターゲット:プログラミング初心者
  • ゴール:VBAまたはGASで実務で使える簡単なツールを作るまで
  • スケジュール:毎週2時間×計6回 ※暫定スケジュールは後述
    • 期間中、オンライン(Slack)で演習のフォローと質疑応答を行います
  • 開催場所:みんなの会議室 代々木第1(予定)
    • 東京都渋谷区千駄ヶ谷5丁目14番地10号 新宿明治通りビル6階
    • 現地での受講を推奨しますが、リモート環境と収録動画も提供します
  • 定員:10名
  • 最小催行人数:6名
  • 受講料(税抜):受講料15000円+ノンプロ研月額会員費4500×2ヶ月=総額24000円
  • 受講条件:ノンプロ研に参加していること
  • 持ち物:VBAを実行可能なノートPCをお持ち下さい※Windowsを対象としています

コミュニティ「ノンプログラマーのためのスキルアップ研究会」(通称ノンプロ研)と連携しているという点が大きな特長となっています。

コミュニティはノンプログラマーがプログラミングスキルを学び、教え合うためのコミュニティで、定例会や勉強などのオフライン活動、Slackを用いたオンライン活動を行う集まりです。詳しくは以下詳細ページもご覧ください。

コミュニティ「ノンプログラマーのためのスキルアップ研究会」についてのお知らせ #ノンプロ研
ノンプログラマーがVBA・GAS・Pythonなどのプログラミングを学ぶコミュニティ「ノンプログラマーのためのスキルアップ研究会」が絶賛活動中です!本ページはコミュニティの情報発信をしていく特集ページです。

以下、本講座の詳細や特長についてお伝えしていきます。

カリキュラムと暫定スケジュール

VBAコースのカリキュラムと暫定スケジュールです。

日程 内容
1 2/19(火) 19:30~ はじめてのプログラム、変数、演算、データ型
2 2/26(火) 19:30~ 制御構文
3 3/6(水) 19:30~ プロシージャ、関数
4 3/15(金) 19:30~ オブジェクト、コレクション
5 3/20(水) 19:30~ セル、シート、ブックの操作
6 3/27(水) 19:30~ ワークシートの操作実務編

※日程は暫定です。催行決定から会議室を確保しますので、状況により変更の可能性がありますのでご注意ください。

こちらが、GASコースのカリキュラムと暫定スケジュールです。

日程 内容
1 2/20(水) 19:30~ はじめてのプログラム、変数、演算、データ型
2 2/27(水) 19:30~ 制御構文
3 3/5(火) 19:30~ 関数、配列
4 3/13(水) 19:30~ オブジェクト
5 3/22(金) 19:30~ セル、シート、ブックの操作
6 3/29(金) 19:30~ スプレッドシートの操作実務編

※日程は暫定です。催行決定から会議室を確保しますので、状況により変更の可能性がありますのでご注意ください。

カリキュラムの内容については、いずれのコースも受講者の学習状況などにより調整しながら進めますので、必ずしも上記の通りというわけではありません。

1ヶ月半で使えるようになるまで

いずれも、全くの初心者を対象としていて、プログラミングに初めて触るところから、算術演算や条件分岐や繰り返しといったプログラミングの基礎、そして簡単なシートのデータの操作までができるようになることを目標にしています。

企業向けの研修では、それをクリアするのはだいたい8週で組むことが多いのですが、それを本講座では、2回少ない6回でクリアしようとしています。

正直、講座としてはスパルタなのですが、その理由は2つあります。

受講料を安くしたい

1つ目はコストです。

回数が増えると、会場費や講師の稼働日数が増えるため、その分を受講料に転嫁する必要が出てきます。

回数を減らせば、その分、安く受講いただくことが可能になります。

早く実務に使えるようになる

2つ目は習得までの期間です。

プログラミングの学習は最初のうちは、変数とは?関数とは?条件分岐は?繰り返しは?といった、基礎の部分の学習が中心になります。

それらの学習もなかなか大変なのですが、一方でその基礎の部分をすべて通過しないと、実務に使える状況にならないということです。

つまり、その学習に2ヶ月かけるとしたら、そのリターンは3ヶ月目以降にしか得られないということです。

これは、プログラミング学習を困難にしている一つの理由です。

ですから、それを2週間でも早めることには意義があります。

コミュニティと動画の活用で密度を上げる

しかし、回数を減らした分、内容も少なくなるのでは意味がありません。

その点をフォローするのが、コミュニティと動画の活用です。

まず、本講座では演習(つまり宿題)を大量に出します。そして、それをすべてクリアする前提でカリキュラムを組みます。

このようにスパルタですが、安心です。

なぜなら、コミュニティに参加いただいているからです。

一人ではどうしてもクリアできない課題が出てくることもありますが、その点はコミュニティで使用しているSlackを使ってフォローを求めることができ、私やコミュニティのメンバーがフォローをします。

また、企業研修では、VBAとは?GASとは?学習を効果的に進めるためには?といった、基礎知識やメタ学習もカリキュラムの冒頭に入れているのですが、本講座では、その部分を事前学習用の動画としてお渡しします。

過去のノンプロ研の定例会や分科会で行ったプレゼンのアーカイブ動画がたくさんあるので、それを活用していただけます。

ノンプロ研の参加を条件にしている理由

ノンプロ研の参加を条件にしている理由は、いくつかあります。

この部分が、本講座が一般的なセミナーとは異なる、特長やメリットを生み出していると考えています。

コストパフォーマンス

ひとつはコストパフォーマンスです。

一般的に、このような講習というのは会議室の使用料や、講師の稼働、最低催行人数などから赤字にならないように逆算して、受講料を決めているはずで、本講座もベースは同じ考え方です。

ただ、純粋な受講料だけで回収しようとすると、けっこう高くなりがちです。

さて、本講座については、最低2ヶ月はノンプロ研に所属いただく必要があるということになります。受講料15000円+9000円で合計24000円になります。

新たにプログラミング学習をする講座、6回で24000円。

これは、他の講座と比べてみていただくと、決して高い金額ではないと思います。

そうできている理由は、継続してノンプロ研にご参加いただけるであろうという期待値があるからです。

また、コミュニティに所属いただいてれば、講座以外にも定例会や勉強会、Slackの利用、アーカイブの閲覧など、他のコンテンツも利用できますので、そこまで使い倒せば、かなりお得感は出てくると思います。

仲間とともに継続できる環境

もうひとつは、継続性と仲間です。

ノンプログラマーの個人での学習は一般的に孤独です。

せっかくお金をかけて学んである程度身につけても、講習期間が終わり、会社へ戻ると仲間もいない…独学の世界へ逆戻りしてしまいます。

それで、うっかり本業などが忙しかったりすると、すっかりプログラミングに触れる機会もなく、忘れてしまう…

残念なことにそんなことが、しばしば起きてしまいます。

本講座でいえば、終了後にそのままコミュニティに継続いただければ、引き続きプログラミングを学び続けるための場と仲間を確保することができます。

1ヶ月半の学習でできることは微々たるものなので、その後もストレスなく学び続けて、できることをじゃんじゃん増やし続けていただきたいです。

リモート参加と動画の提供

実際に受講されている皆さんの作業状況を見られる、確実に講座を提供するという点から、現地での受講をおすすめしています。

ただ、どうしても都合が悪い場合や遠方でも参加したい場合のために、リモート参加の環境と収録動画の提供をします。

※リモート環境は、設備の状況で提供ができない、または質が低下する場合がありますのでご了承ください。
※動画の提供は、収録からしばらく時間をいただく可能性があるので、ご了承ください。

まとめ

以上、コミュニティ「ノンプログラマーのためのスキルアップ研究会」(通称ノンプロ研)のメンバー限定で、VBAおよびGoogle Apps Script初心者講座(全6回)のお知らせでした。

最低催行人数がありますので、皆さんのシェアによる拡散のご協力、よろしくお願いいたします。

皆さんのお申し込みをお待ちしています!

ノンプロ研初心者向けプログラミング講習【VBAコース】 - paymo (ペイモ)
コミュニティ「ノンプログラマーのためのスキルアップ研究会」(ノンプロ研)のメンバー限定のVBA初心者講座(全6回)です。 VBAによる簡単な実務向けのツールを作れるレベルまでのスキル習得を目指します。コミュニティにもご参加いただくことで、継続して学ぶ環境と仲間を得られるというのが最大の特長です。 受講にはノ...
ノンプロ研初心者向けプログラミング講習【GASコース】 - paymo (ペイモ)
コミュニティ「ノンプログラマーのためのスキルアップ研究会」(ノンプロ研)のメンバー限定のGAS初心者講座(全6回)です。 GASによる簡単な実務向けのツールを作れるレベルまでのスキル習得を目指します。コミュニティにもご参加いただくことで、継続して学ぶ環境と仲間を得られるというのが最大の特長です。 受講にはノ...

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

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


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>