パソコン仕事5倍塾
35,000人を指導した東大卒・元日本IBM社内講師が直伝
MENU
田中 宏明さんの投稿
(投稿ID: 4234)
'************************************************************* 'クラスモジュール 'logフォルダを作成してテキストファイルにログ出力 '************************************************************* Option Explicit '------------------------------------------------------------- 'モジュールレベル変数定義 '------------------------------------------------------------- Private txt As TextStream '------------------------------------------------------------- ' 名 称 : Class_Initialize ' 機 能 : コンストラクタ ' 引 数 : なし ' 戻 値 : なし '------------------------------------------------------------- Private Sub Class_Initialize() 'インスタンス生成時に追記モードでログファイルオープン Dim logPath As String logPath = ThisWorkbook.path & "\log" 'ログフォルダが無ければ作成 Dim objFSO As FileSystemObject Set objFSO = New FileSystemObject If objFSO.folderexists(folderspec:=logPath) = False Then objFSO.createfolder logPath End If Dim filePath As String filePath = logPath & "\" & "VBA_" & Format(Date, "yyyymmdd") & ".log" 'TextStreamの追記モードでオープン Set txt = objFSO.OpenTextFile(Filename:=filePath, IOMode:=ForAppending, Create:=True, _ Format:=TristateUseDefault) Set objFSO = Nothing End Sub '------------------------------------------------------------- ' 名 称 : Class_Terminate ' 機 能 : デストラクタ ' 引 数 : なし ' 戻 値 : なし '------------------------------------------------------------- Private Sub Class_Terminate() 'インスタンス解放時ログファイルクローズ txt.Close Set txt = Nothing End Sub '------------------------------------------------------------- ' 名 称 : writeLog ' 機 能 : ログ出力 ' 引 数 : level :ログレベル("INFO " or "ERROR") ' message :メッセージ ' 戻 値 : なし '------------------------------------------------------------- Public Sub writeLog(ByVal level As String, _ ByVal message As String) 'ログ作成 Dim buf As String buf = Format(Now, "yyyy/mm/dd hh:nn:ss") '時間 buf = buf & ", [" & level & "] " 'ログレベル buf = buf & ", " & message 'メッセージ '出力 txt.WriteLine buf End Sub
小川慶一さんのコメント
(コメントID: 5802)
田中 宏明さんのコメント
(コメントID: 5803)
(コメントID: 5804)
(コメントID: 5805)
(コメントID: 5806)
(コメントID: 5807)
(コメントID: 5808)
(コメントID: 5839)
(コメントID: 5840)
外部アカウントで登録
たった1ヶ月で人生が劇的に変わりました
佐藤信さん
役員クラスの方から高い評価を受けるようになりました。
佐賀県 - 岩本徹さん
今までまったく知らなかったショートカットキーを使いまくっています。
東京都 - 鷹觜慶さん
年齢60才間近、営業で外回りの時間が多い私でも退社時間が1-2時間程度早くなりました。
東京都 - 宗内隆明さん
受講前もすでにパソコン得意でしたが、そんな私でも受講して本当に良かったと思えた講座です。
東京都 - 佐伯とも子さん
ここまで包括的に仕事に役立つ深い学びを受けれた講座は初めてでした
東京都 - 飯田倫子さん
2024年04月27日 15:36
2024年04月25日 07:00
2024年04月23日 21:36
2024年04月23日 10:01
2024年04月22日 03:23
2024年04月28日 20:53
2024年04月28日 19:20
2024年04月28日 15:34
2024年04月28日 12:07
2024年04月28日 11:43
2022年02月24日 10:59
2019年12月23日 05:57
2019年09月20日 12:29
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
2022年02月02日 00:00
2022年02月02日 03:00
2022年02月02日 06:00
2022年02月02日 09:00
2022年02月02日 12:00
2024年02月15日 18:30
2024年02月09日 17:05
2024年01月19日 13:00
2023年12月31日 17:00
2023年12月21日 14:00
2024年04月27日 23:02
2024年02月28日 14:53
2024年02月27日 14:27
2024年02月27日 14:21
2024年02月27日 14:15
田中 宏明さんの投稿
(投稿ID: 4234)
出力結果とコードの一部です。素晴らしいです。
2018/12/01 13:37:09, [INFO] , --------------- ログファイルオープン ---------------
2018/12/01 13:38:04, [ERROR] , エラー番号:-2147023783/種類:Unicode 文字のマッピングがターゲットのマルチバイト コード ページにありません。
2018/12/01 13:41:19, [INFO ] , ---------------正常終了 ---------------
小川慶一さんのコメント
(コメントID: 5802)
ところで、クラスモジュールにすることのメリットは何でしょう?
田中 宏明さんのコメント
(コメントID: 5803)
クラスモジュールを使うメリットは、まだ実感できないです。
オブジェクトを深く理解するための手段として使う意味があると考えます。
> どんどん上達されていてなによりです。
> ところで、クラスモジュールにすることのメリットは何でしょう?
小川慶一さんのコメント
(コメントID: 5804)
> クラスモジュールを使うメリットは、まだ実感できないです。
正直、このくらい単純なプログラムだと、無いように思います。
利用者を選びますし。
とはいえ、いろいろな書き方を試されるのはとても良いことだと思います。
ログ出力用クラスを作って複数マクロで使い回すということでしたら、以下は、 Initialize ではなく、クラス生成後のプロパティの設定で行いたいところですね。
「呼び出し元モジュールからログ生成先パスの設定を行う。この過程で、作成先フォルダなり記入先ファイルなりが見つからないときには自動生成する」
クラスモジュールを使った僕の自作ライブラリがあります。
近日、公開したいと思っています。
> 小川慶一先生:
>
> クラスモジュールを使うメリットは、まだ実感できないです。
> オブジェクトを深く理解するための手段として使う意味があると考えます。
>
> > どんどん上達されていてなによりです。
> > ところで、クラスモジュールにすることのメリットは何でしょう?
田中 宏明さんのコメント
(コメントID: 5805)
ありがとうございます。
実現したいことは「ログ出力用クラスを作って複数マクロ(個人あるいは担当内)で使い回す」です。最初の投稿で気づいておられたのですね。
最初に作ったものがベースなるので、ご意見をいただけてよかったです。下記実装に向けて設計からやり直してみます。
> ログ出力用クラスを作って複数マクロで使い回すということでしたら、以下は、 Initialize ではなく、クラス生成後のプロパティの設定で行いたいところですね。
> 「呼び出し元モジュールからログ生成先パスの設定を行う。この過程で、作成先フォルダなり記入先ファイルなりが見つからないときには自動生成する」
>
> クラスモジュールを使った僕の自作ライブラリがあります。
> 近日、公開したいと思っています。
小川慶一さんのコメント
(コメントID: 5806)
「ログ出力機能は標準モジュールに実装し、使い回す際には、それをコピペする」でも効果は同じですからね...。
どちらの場合も、 Scripting.Dictionary を使うなら、それぞれのエクセルファイルで参照設定が必要ですし。
・初期化段階で連動して自動的に○○がなされる
・プロパティ設定段階で連動して自動的に○○がなされる
・プロパティ取得段階で連動して自動的に○○がなされる
・メソッド実行段階で連動して自動的に○○がなされる
といった、「ついでに○○がなされる」ということがクラス内で生じるのでなければ、わざわざクラスモジュールにする意味がないです。
というか、可読性という点を考えると、標準モジュールに実装するほうが、利用者に求める知識がいたずらに高度にならない分だけ有利と感じます。
> 小川慶一先生:
>
> ありがとうございます。
> 実現したいことは「ログ出力用クラスを作って複数マクロ(個人あるいは担当内)で使い回す」です。最初の投稿で気づいておられたのですね。
> 最初に作ったものがベースなるので、ご意見をいただけてよかったです。下記実装に向けて設計からやり直してみます。
>
> > ログ出力用クラスを作って複数マクロで使い回すということでしたら、以下は、 Initialize ではなく、クラス生成後のプロパティの設定で行いたいところですね。
> > 「呼び出し元モジュールからログ生成先パスの設定を行う。この過程で、作成先フォルダなり記入先ファイルなりが見つからないときには自動生成する」
> >
> > クラスモジュールを使った僕の自作ライブラリがあります。
> > 近日、公開したいと思っています。
田中 宏明さんのコメント
(コメントID: 5807)
ログ出力機能ですが、標準モジュールに実装することに決めました!
思考と行動が逆になっており、プロセスと結果が良くなかったことに気づきました。
<相談後>
ログ出力したい⇒実現したいことを具体化⇒標準モジュールに実装可⇒速攻で完成
<相談前>
クラスを勉強 ⇒ログ出力で活用を考えた⇒クラスモジュールに実装⇒素晴らしい
> 田中 宏明さん:
>
> 「ログ出力機能は標準モジュールに実装し、使い回す際には、それをコピペする」でも効果は同じですからね...。
> どちらの場合も、 Scripting.Dictionary を使うなら、それぞれのエクセルファイルで参照設定が必要ですし。
>
> ・初期化段階で連動して自動的に○○がなされる
> ・プロパティ設定段階で連動して自動的に○○がなされる
> ・プロパティ取得段階で連動して自動的に○○がなされる
> ・メソッド実行段階で連動して自動的に○○がなされる
>
> といった、「ついでに○○がなされる」ということがクラス内で生じるのでなければ、わざわざクラスモジュールにする意味がないです。
> というか、可読性という点を考えると、標準モジュールに実装するほうが、利用者に求める知識がいたずらに高度にならない分だけ有利と感じます。
小川慶一さんのコメント
(コメントID: 5808)
> ログ出力機能ですが、標準モジュールに実装することに決めました!
それが良いと思います。
クラスが意味を持つのは、前回指摘したことに加えて、複数インスタンスを生成する必要があるときです。
> 小川慶一先生:
>
> ログ出力機能ですが、標準モジュールに実装することに決めました!
> 思考と行動が逆になっており、プロセスと結果が良くなかったことに気づきました。
>
> <相談後>
> ログ出力したい⇒実現したいことを具体化⇒標準モジュールに実装可⇒速攻で完成
>
> <相談前>
> クラスを勉強 ⇒ログ出力で活用を考えた⇒クラスモジュールに実装⇒素晴らしい
>
> > 田中 宏明さん:
> >
> > 「ログ出力機能は標準モジュールに実装し、使い回す際には、それをコピペする」でも効果は同じですからね...。
> > どちらの場合も、 Scripting.Dictionary を使うなら、それぞれのエクセルファイルで参照設定が必要ですし。
> >
> > ・初期化段階で連動して自動的に○○がなされる
> > ・プロパティ設定段階で連動して自動的に○○がなされる
> > ・プロパティ取得段階で連動して自動的に○○がなされる
> > ・メソッド実行段階で連動して自動的に○○がなされる
> >
> > といった、「ついでに○○がなされる」ということがクラス内で生じるのでなければ、わざわざクラスモジュールにする意味がないです。
> > というか、可読性という点を考えると、標準モジュールに実装するほうが、利用者に求める知識がいたずらに高度にならない分だけ有利と感じます。
田中 宏明さんのコメント
(コメントID: 5839)
ログ出力機能について経過報告です。
Subプロシージャ単位で正常動作したプログラム(他人が作成したプログラムを含む)をコピペし、別のプログラムに流用しています。
過去に正常動作を確認済みのSubプロシージャは、再度テストすることなく使っていますが、実際にログ出力させてみると、自分が想定している動きをしていない場合があることがわかりました。
ステップ実行すれば、発見できることですが、時間がかかってしまうので省略していたことを反省しつつ、ログ出力の成果が体感できました。
本当にこの講座のおかげです。ありがとうございます。
> 田中 宏明さん:
>
> > ログ出力機能ですが、標準モジュールに実装することに決めました!
>
> それが良いと思います。
> クラスが意味を持つのは、前回指摘したことに加えて、複数インスタンスを生成する必要があるときです。
小川慶一さんのコメント
(コメントID: 5840)
おはようございます。
ログの件、いろいろ学べてよかったですね。
手元でのテストだけなら debug.print でも十分です。
が、ログ出力機能は、遠隔地で起きていることの把握等では特に力を発揮します。
ひきつづき、よい学びを☆
> 小川慶一先生:
>
> ログ出力機能について経過報告です。
>
> Subプロシージャ単位で正常動作したプログラム(他人が作成したプログラムを含む)をコピペし、別のプログラムに流用しています。
>
> 過去に正常動作を確認済みのSubプロシージャは、再度テストすることなく使っていますが、実際にログ出力させてみると、自分が想定している動きをしていない場合があることがわかりました。
>
> ステップ実行すれば、発見できることですが、時間がかかってしまうので省略していたことを反省しつつ、ログ出力の成果が体感できました。
>
> 本当にこの講座のおかげです。ありがとうございます。
>
> > 田中 宏明さん:
> >
> > > ログ出力機能ですが、標準モジュールに実装することに決めました!
> >
> > それが良いと思います。
> > クラスが意味を持つのは、前回指摘したことに加えて、複数インスタンスを生成する必要があるときです。