2016年12月8日木曜日

[Eclipse]「この選択をデフォルトとして使用し、今後この質問を表示しない」の解除

Eclipseの起動時の「ワークスペース・ランチャー」ウィンドウで
「この選択をデフォルトとして使用し、今後この質問を表示しない」
チェックをいれると、
次回起動時には「ワークスペース・ランチャー」は表示されなくなります。
 ※英語版の場合、チェックの表記は
  「Use this as the default and do not ask again」になります。

備忘録として、
間違えてチェックを入れてしまった場合に備えて、
次回起動時に「ワークスペース・ランチャー」を表示させる手順を載せておきます。

手順(日本語版Eclipseの場合)
①メニューから「ウィンドウ」「設定」を選択して、
 「一般」「開始およびシャットダウン」
 「ワークスペース」を選択する。
「始動時にワークスペースをプロンプト」にチェックして、
 「適用」ボタンをクリックすると、
 次回起動時に「ワークスペース・ランチャー」ダイアログが
 表示されるようになります。
英語版Eclipseについても載せておきます。
手順(英語版Eclipseの場合)
①メニューから「Window」
 「Preferences」を選択して、
 「General」「Start up and shutdown」
 「Workspaces」を選択する。
「Prompt for workspace on start up」をチェックして、
 「Apply」ボタンをクリックすると、
 次回起動時に「Workspace Lancher」ダイアログが
 表示されるようになります。

2016年12月3日土曜日

[Software's Review]超ホーダイ(120本使い放題)|1年版

(1)レビュー
最近、妻のPC練習のためにタブレットPC(Windows10)を購入しました。

マウスやキーボードの操作にも慣れてきたので、
そろそろ次のステップとして、
アプリケーションにも慣れてもらおうと思い、
『超ホーダイ』を購入しました。

『超ホーダイ』は5,000円の価格で、
1年間120本のソフトを利用できるというものですが、
付属の『スーパーセキュリティ』を単独購入しても
4,000円の価格なので、
コスト的にもお買い得です。

■利用できるソフト一覧
 http://www.sourcenext.com/service/houdai/titles/

とりあえず、
特打PLUS(タイピング練習ソフト)
特打式Excel編(Excel練習ソフト)
をインストールしてみました。

『特打PLUS』は、
特打シリーズで有名なタイピング練習ソフトですが、
ゲーム感覚で学べるので、飽きずに楽しめる内容です。

『特打式Excel編』は、
実際のExcelと連動して、実機演習もできるスグレモノです。
Excelのバージョンは、2016 /2013 / 2010 / 2007の各々に対応。
※他のOffice製品として、Word編PowerPoint編もあります。

(2)リンク
超ホーダイ(120本使い放題)|1年版| オンラインコード版

超ホーダイ(120本使い放題)|1年版| オンラインコード版

  • 出版社/メーカー: ソースネクスト
  • メディア: Software Download
(3)関連商品
超ホーダイ(120本使い放題)|3年版| オンラインコード版

超ホーダイ(120本使い放題)|3年版| オンラインコード版

  • 出版社/メーカー: ソースネクスト
  • メディア: Software Download
超ホーダイ 3年版(旧版)

超ホーダイ 3年版(旧版)

  • 出版社/メーカー: ソースネクスト
  • メディア: CD-ROM

2016年8月7日日曜日

[Hardware's Review]スマホのモバイルバッテリー

(1)レビュー
 最近、外出先でスマホを充電する機会が増えたので、
 モバイルバッテリーを新たに購入することにしました。

 妻と2人で外出することが多いので、
 大容量かつ2台同時給電の特長を意識して、
 以下の製品を購入しました。

 Softbank製品ですが、他の機種にも対応しているようです。
 ※詳細は以下リンク参照

 ■モバイルバッテリー
 『Softbank Selection smart energy box 10000』
 (1)対応機種2台への同時給電
    スマホが2台ある時も便利
 (2)約4.5回充電できる大容量バッテリー
    2人で外出しても、外出先で2回充電できます。
    最近はやりの『ポケモンGO』をやるにも十分ですね(笑)
(2)リンク
SoftBank SELECTION smart energy box 10000 SB-SE14-U100/WH

SoftBank SELECTION smart energy box 10000 SB-SE14-U100/WH

  • 出版社/メーカー: ソフトバンク
  • メディア: エレクトロニクス

2015年9月20日日曜日

[VBA]クラスモジュールのインスタンス生成タイミングについて

[はじめに]
VBAは、Javaや.NET系言語程ではありませんが、
オブジェクト指向をサポートしています。

Javaや.NETとの違いの1つとして、
インスタンスの生成タイミングがあります。
Javaや.NETの感覚でコーディングすると間違いに陥りやすいので、
備忘録として記載します。

[インスタンスの生成タイミング]
インスタンスの生成はJavaなどでは、
『New』を指定するとインスタンスが生成されますが、
VBAでは記載の仕方によって、
必ずしも生成されるとは限りません。

例えば、Javaの場合、
newを指定するタイミングでインスタンスが生成され、
その参照が変数に格納されます。
クラスモジュールのインスタンス生成タイミング_java.png
それに対して、VBAの場合は、
Newを指定したタイミングではインスタンスは生成されず、
その変数に初めてアクセス(メソッド呼出しなど)するタイミングで、
インスタンスが生成されます。
クラスモジュールのインスタンス生成タイミング_vba.png
インスタンス生成タイミングの検証として、
下記のコードを実行してみると以下のようになります。
もし、Javaや.NETと同じように
宣言時にインスタンス生成がされるのであれば、
出力結果は、
 (1)インスタンスをNew付で宣言します。
 (a)インスタンスが生成されました。 ★JavaやC#ならこのタイミング
 (2)これからインスタンスにアクセスします。
 (b)MethodA実行中
となるはずですが、
実際は次のようになります。
 (1)インスタンスをNew付で宣言します。
 (2)これからインスタンスにアクセスします。
 (a)インスタンスが生成されました。 ★VBAの場合、初回メソッド実行時
 (b)MethodA実行中
これは、宣言時にインスタンスは作成しておらず、
MethodAを実行する際に、インスタンスが生成していることを示します。

[VBAのコード]
Option Explicit

Private Sub TestA()
    Dim a As New Hoge
    Debug.Print "(1)インスタンスをNew付で宣言します。"
    Debug.Print "(2)これからインスタンスにアクセスします。"
    a.MethodA

    '実行結果
    '(1)インスタンスをNew付で宣言します。
    '(2)これからインスタンスにアクセスします。
    '(a)インスタンスが生成されました。
    '(b)MethodA実行中
End Sub
[VBA]インスタンスの生成タイミングの検証(Hogeクラスの呼出し側)


Option Explicit

Private Sub Class_Initialize()
    Debug.Print "(a)インスタンスが生成されました。"
End Sub

Public Sub MethodA()
    Debug.Print "(b)MethodA実行中"
End Sub
[VBA]インスタンスの生成タイミングの検証(Hogeクラス)
[その他]  VBAを例に説明していますが、  VisualBasic6(VB6)系の言語にも同様なことが言えます。

2015年8月30日日曜日

[Hardware's Review]SEIKO CLOCK (セイコークロック) デジタル ウィークリーアラーム

(1)レビュー
 目覚まし時計の調子が悪くなったので、新たに購入しました。
 指定した時刻にアラームが鳴ってくれさえすればよいので、
 特別な機能は求めていなかったのですが、
 価格の割に便利な機能が搭載されていたので、購入に至りました。

 最近は、スマホにもアラーム機能が搭載されているので、
 時計メーカーもいろんな工夫を凝らしているのかもしれませんね。

 【便利だと思った機能ベスト5】
 (1)アラームを曜日毎に設定できる。(設定も簡単)
    今までは金曜日の就寝前にアラームを無効にしたり、
    日曜日の就寝前にアラームを有効にする必要がありましたが、
    設定の変更が必要なくなりました。
 (2)午前と午後を区別できる。
    午前と午後を区別できないと、起床後にアラームを無効にしたり、
    就寝前にアラームを有効にする必要がありました。
    (1)と同じような理由ですが、
    設定の変更が必要なくなりました。
 (3)電池残量を通知してくれる。
    『気が付いたら時計が止まっていた』ってことがなくなります。
 (4)電波による自動更新。
    今となっては当たり前の機能かもしれませんが、
    時刻を修正する必要がありません。
 (5)温度と湿度を表示。(快適さも表示)
    なくても不便ではないですが、あったら便利です(笑)


(2)リンク

2015年3月1日日曜日

[Book's Review (Develop)]jQueryポケットリファレンス

(1)レビュー
 最近はGoogle等で検索すれば情報を得ることはできますが、
 まとまった本があればと思い1冊購入しました。
 リファレンスとしてももちろんですが、
 カテゴリ毎に順番に読み進めていっても面白いと思います。

 章立ては、
 第1章で、WebやjQueryの基本、
 第2章で開発環境について、
 第3章以降でリファレンス的な内容 
 の構成でまとめてています。
 
 あと、『Web制作の現場で使うjQueryデザイン入門』の書籍では、
 サンプルを紹介しながらの解説になっています。
 合わせて読むことをオススメします。

(2)リンク
jQuery ポケットリファレンス (POCKET REFERENCE)

jQuery ポケットリファレンス (POCKET REFERENCE)

  • 作者: 鶴田 展之
  • 出版社/メーカー: 技術評論社
  • 発売日: 2010/06/18
  • メディア: 単行本(ソフトカバー)

[Book's Review (Develop)]Web制作の現場で使うjQueryデザイン入門

(1)レビュー
 jQueryを扱う機会がでてきたので、購入しました。

 本書のサンプルファイルをダウンロードできるので、
 実際に動作させながらの確認ができます。

 JavaScriptやCSSの経験があり、jQueryをこれから覚えるWeb開発者にとって、
 1番最初に読む入門書だと思います。

(2)リンク
Web制作の現場で使う jQueryデザイン入門 (WEB PROFESSIONAL)

Web制作の現場で使う jQueryデザイン入門 (WEB PROFESSIONAL)

  • 作者: 西畑 一馬
  • 出版社/メーカー: アスキー・メディアワークス
  • 発売日: 2010/02/12
  • メディア: 大型本

2015年1月31日土曜日

[Tool's Review]ステンレスものほし台 ブロー台付き BD-50S 【ブロー台付きで安定性抜群・U型の竿受けで竿の取り外し楽々! 】

(1)レビュー
 最近、引越しをしました。
 ベランダの物干し竿を固定する位置が転居前よりも高く、
 身長が低い妻にとって家事がしづらいので、
 物干し台を購入しました。
 
 組み立て式の為、多少のぐらつきはありますが、
 実際使ってみても全く不便さを感じません。

 物干し台の土台の重りが、
 タンクに水や砂を入れるタイプなので、
 今後引越しすることになっても、持ち運びが楽になります。
 
 土台の重りの目安は、下記の通りです。

  ・水のみを入れた場合:16Kg×2=32Kg
  ・砂のみを入れた場合:22Kg×2=44Kg
  ・水と砂を混ぜて入れた場合:28Kg×2=56Kg

 砂を混ぜると、
 引越しの際に中身(砂&水)を抜く時が大変なので、
 用途に応じて使い分けるといいかもしれません。
 ちなみに我が家は『水のみ』ですが問題なく使えています。

 【ご参考】価格について (2015.1時点)
 渋谷の東急ハンズだと1万円近くでしたが、
 アマゾンだと5,500円でした。

(2)リンク

2015年1月15日木曜日

[Book's Review (Develop)]ASP.NET MVC 5実践プログラミング

(1)レビュー
 ASP.NETは、以下の2種類に大別されます。
 (1)ASP.NET Web Form
   .NET Framework1.0リリース時の頃から導入
 (2)ASP.NET MVC
   .NET Framework4以降に導入


 5年前まではASP.NETといえば、ASP.NET Web Formが主流でしたが、
 他のWeb系の言語(Java、PHP、Ruby等)と比べて異色な仕組みの為、
 初めてASP.NETを学ぶ人にとってはとっつきにくいものがありました。
 最近のWeb開発はMVCが主流になりつつあり、.NETもそれに合わせて
 ASP.NET MVCの仕組みが追加されました。

 本書はASP.NET MVCについて、
 基礎から応用までわかりやすく解説しています。
 
 これからASP.NET MVCを始める方にとって、貴重な1冊だと思います。

(2)リンク
ASP.NET MVC 5実践プログラミング

ASP.NET MVC 5実践プログラミング

  • 作者: 山田 祥寛
  • 出版社/メーカー: 秀和システム
  • 発売日: 2014/09
  • メディア: 単行本

2014年8月17日日曜日

[Hardware's Review]クーラーパッド(K-CLN16U2RN)

(1)レビュー
 3年前に購入したノートパソコンの
 CPUとHDDの熱が気になったので、
 クーラーパッド(パソコンのクーラー)を購入しました。

 【店頭での印象】
  店頭で、手をのせて他の製品と比較しましたが、
  本体がアルミボディなのか、
  冷却されたボディのひんやり感を一番感じました。
  あと、クーラー本体に小物の収納ボックスがついています。
  普段使わないゴム足などの付属品をいれるのに
  便利だと思いました。

 【実際に使った感想】
  フリーソフトの『Open Hardware Monitor』で
  CPUとHDDの温度を測定すると、
  下記の結果になりました。
  効果はあるようです。
  【適用前】
   ・CPU:約55度
   ・HDD:約40度
  【適用後】
   ・CPU:約45度
   ・HDD:約35度

  取扱説明書は入っていませんが、
  本製品のサイトで動画を使った説明が
  掲載されているので、
  特に困ることはないと思います。
  [参考サイト]
  http://www.sanwa.co.jp/product/syohin.asp?code=TK-CLN16U2RN

 【改善して欲しい点】
  電源ケーブルが短い(80cm)為、
  PCのUSBポートからの電源供給を余儀なくされます。
  USBポートを塞ぎたくない場合もあると思うので、
  コンセントからも供給できるように、
  電源ケーブルがより長くしてもらうと融通が利くと思います。
  AC電源とUSBの変換アダプタを別途購入すれば、
  融通は効かせられるので、
  インタフェースはUSBのままでもよいと思います。
 
 【特徴】
 ・ファン数:2つ
 ・ファンの強弱をボリュームで調節できる。
 ・ファンの位置を調節できるのでピンポイントで冷却できる。
(2)リンク
サンワサプライ ノート用クーラーパッド レッド・16型ワイド TK-CLN16U3RN

サンワサプライ ノート用クーラーパッド レッド・16型ワイド TK-CLN16U3RN

  • 出版社/メーカー: サンワサプライ
  • メディア: Personal Computers

[Hardware's Review]10ポートUSBハブ(U2H-Z10SBK )

(1)レビュー
 パソコンにクーラーパッドを取り付けた為、 
 USBポートの口が足りなくなったので、USBハブを購入しました。

 【実際使った感想】
  ・USBポートを10個搭載しているので、
   将来的に接続する機器が増えても個数を気にする必要がありません。
  ・電源供給はセルフパワーとバスパワーの両方に対応しています。
   マウスやキーボードなど大量の電力を消費しない場合は
   バスパワーで、
   外付けHDDやDVDドライブなど、
   大量の電力を消費する機器を使う場合はセルフパワーで使います。
   ただ、セルフパワーを使う場合、ACアダプタが大きい為、
   OAタップの種類によっては、
   コンセントの差込口の場所をとることになるのが難点です。
   セルフパワーとバスパワーについては、こちらをご参照。

(2)リンク

[雑記]ソフトバンクの焼きそば

ソフトバンクショップに料金プランの変更に行ったら、
インスタントの焼きそばをいただきました。
しかも、
妻(Docomoユーザですが(笑))も一緒についてきたので、
2食分もいただいちゃいました[わーい(嬉しい顔)]
ソフトバンク焼きそば.jpg

2014年2月15日土曜日

[SQLServer]sqlcmdコマンドの表示桁数の指定

(1)はじめに
 sqlcmdコマンドで、
 SELECTステートメントを実行した時、
 行の折り返しで、結果が見づらくなることがあります。

 OracleLINESIZEに相当する設定が、
 SQLServerにもないか調べてみました。

 普段は、Management Studio等のGUIツールを使いますが、
 たまにCUIを使うことがあるので、備忘録として載せておきます。

(2)コマンド
 [前提]
   SQLServer2005以降 (2000以前はosqlを使用します。)
 [コマンド]
  sqlcmdコマンドの実行時に、オプションで指定します。(-w [表示桁数])
  例
   ・接続先:(local)\SQLEXPRESS
   ・接続方法:SQLServer認証
   ・ユーザ:sa 、パスワード:pass
   ・表示桁数:1000
                   
コマンド
sqlcmd -S (local)\SQLEXPRESS -U sa- P pass -w 1000

 [補足]
   sqlcmdで表示桁数を増やしても、
   コマンドプロンプトのウィンドウ幅が狭いと、
   行を折り返してしまいます。
   事前にコマンドプロンプトのプロパティで、
   十分な幅を設定する必要があります。
   コマンドプロンプトの幅の設定手順は、以下の通りです。
   [手順]
    (1)「プログラム名を指定して実行」
    (2)「cmd」を実行
    (3)ウィンドウの「プロパティ」
    (4)「レイアウト」タブを選択
    (5)「画面バッファのサイズ」の「幅」を変更。

2014年2月11日火曜日

[雑記]冬の風物詩

雪が積もるくらいに降ると、毎年誰かが作ってくれます[雪] 見かけたので、思わず写メに収めてしまいました[わーい(嬉しい顔)] 雪だるま20140210.jpg

2014年1月19日日曜日

[Hardware's Review]デジカメ:Canon PowerShot A3500 ls

(1)レビュー  携帯のカメラの機能に乏しさを感じたので、
 デジカメを購入しました。

 デジカメの購入は10年以上ぶりなので、
 当時の製品と比べるとかなり性能はアップしていますが、
 単純に、画素数や記録枚数が増えただけではないようです。

 一番、目新しいと感じたのは、『写真の転送機能』です。

 従来のデジカメは、写真をパソコンに転送するには、
 デジカメとパソコンをケーブルで接続するか、
 メディアをデジカメから取り出してパソコンにセットする必要がありました。

 今回購入したデジカメは、Wi-Fiに対応しており、
 デジカメ側は、操作メニューで項目を選択するだけで、
 無線LAN経由でパソコンに転送することができます。

 また、Wi-Fiを利用することで、
 スマホへの転送や、2台のデジカメ間でのデータ交換も可能です。

 さらに、PictBridge(USB and Wireless LAN)に対応したプリンタであれば、
 デジカメから直接、プリンタに写真を印刷することができます。

(2)リンク
Canon デジタルカメラ PowerShot A3500 IS(パープル) 広角28mm 光学5倍ズーム PSA3500IS(PR)

Canon デジタルカメラ PowerShot A3500 IS(パープル) 広角28mm 光学5倍ズーム PSA3500IS(PR)

  • 出版社/メーカー: キヤノン
  • メディア: エレクトロニクス

2013年12月31日火曜日

[VBA]文字コードを指定してファイルにテキストを出力するクラスモジュール

[はじめに]
・最近、JSONファイルを扱うことがあり、
 UTF-8でテキストファイルを作成する機会があったので、
 作ってみました。
 備忘録としてサンプルを掲載します。
 クラスモジュールで定義することを前提としています。

[ソース]
''' <summary>
''' クラスモジュール名:TextWriterWithCharaSet
''' 文字コードを指定してファイルにテキストを出力するクラス
''' </summary>
''' <remarks></remarks>
Option Explicit

'ファイルのバッファサイズ
Private Const BUF_SIZE As Integer = 1024

'文字コード(デフォルト:UTF-8)
Public CharCode As String

'出力ディレクトリ
Public TargetDirectory As String

'出力ファイル名
Public TargetFileName As String

'FileSystemObject
Private objFs As Object

'ADODB.Stream
Private objStream As Object

'ADODB.StreamのSaveOptionsEnum
Private Enum SaveOptionsEnum
    'ファイルが存在しない場合にのみ作成します。
    '存在する場合はエラー。(既定値)
    adSaveCreateNotExist = 1
    'ファイルが存在する場合は、
    'ファイルを上書きします。
    adSaveCreateOverWrite = 2
End Enum

'出力テキストのコレクション
Private colTraget As New Collection

''' <summary>
''' Initializeイベント(コンストラクタ)
''' </summary>
''' <remarks></remarks>
Private Sub Class_Initialize()
    Set objStream = CreateObject("ADODB.Stream")
    Set objFs = CreateObject("Scripting.FileSystemObject")
    
    Me.CharCode = "UTF-8"
    
    Call ClearBuffer
End Sub

''' <summary>
''' Terminateイベント(デストラクタ)
''' </summary>
''' <remarks></remarks>
Private Sub Class_Terminate()
     
    Call Flush
    
    Set objStream = Nothing
    Set objFs = Nothing

End Sub

''' <summary>
''' テキストを出力する。
''' </summary>
''' <param name="strText">出力テキスト</param>
''' <param name="useBuffer">バッファの利用有無(※省略時はTrue)</param>
''' <remarks></remarks>
Public Sub WriteText( _
    ByVal strText As String, _
    Optional ByVal useBuffer As Boolean = True)
    
    colTraget.Add strText
    
    If useBuffer = True Then
        'バッファ有効の場合は、
        '一旦、バッファに溜めておき、
        '特定サイズを越えてからファイル出力する。
        If colTraget.Count > BUF_SIZE Then
            Me.Flush
        End If
    Else
        'バッファ無効の場合は、ファイルに出力
        Me.Flush
    End If

End Sub

''' <summary>
''' バッファーの内容をテキストに出力する。
''' </summary>
''' <remarks></remarks>
Public Sub Flush()
     
    Dim i As Long
    Dim targetFilePath As String
    
    On Error GoTo LBL_ERR:
     
    'ファイルパスを生成
    targetFilePath = objFs.BuildPath( _
        GetTargetDirectory(), TargetFileName)
    
    With objStream
        .Charset = Me.CharCode
        .Open
        
        'ファイルが既に存在する場合は、全テキストを読込む。
        '※追記書込みができないので、
        '  既存テキストをメモリ上に取込んでから上書きする。
        If objFs.FileExists(targetFilePath) Then
            .LoadFromFile targetFilePath
            .Position = .Size
        End If

        For i = 1 To colTraget.Count
            .WriteText colTraget(i)
        Next
        
        .SaveToFile targetFilePath, _
            SaveOptionsEnum.adSaveCreateOverWrite
        
        .Close
    
    End With
     
    Call ClearBuffer
    
    Exit Sub
LBL_ERR:
    
     Call ClearBuffer
     
     Err.Raise _
         Number:=Err.Number, _
         Description:="テキストの出力に失敗しました。" & _
         Err.Description

End Sub

''' <summary>
''' 出力ディレクトリを取得する。
''' </summary>
''' <returns>出力ディレクトリ(デフォルト:ThisWorkbook.path)</returns>
''' <remarks></remarks>
Private Function GetTargetDirectory() As String
     If Me.TargetDirectory = "" Then
         GetTargetDirectory = ThisWorkbook.path
         Exit Function
     End If

     GetTargetDirectory = Me.TargetDirectory

End Function

''' <summary>
''' 出力ファイルパスを設定する。
''' </summary>
''' <param name="targetFilePath">出力ファイルパス</param>
''' <remarks></remarks>
Public Sub SetFilePath(ByVal targetFilePath As String)
     
    With objFs
        Me.TargetDirectory = _
            .GetParentFolderName(targetFilePath)
        Me.TargetFileName = _
            objFs.GetFileName(targetFilePath)
    End With

End Sub

''' <summary>
''' バッファーをクリアする。
''' </summary>
''' <remarks></remarks>
Public Sub ClearBuffer()
     Dim i As Long
     
     For i = colTraget.Count To 1 Step -1
         colTraget.Remove i
     Next

End Sub

[VBA]文字コードを指定してファイルにテキストを出力するクラスモジュール

[ソース]

Private Sub CommandButton1_Click()

    Dim rw As New TextWriterWithCharaSet
    
    rw.CharCode = "UTF-8"
    rw.SetFilePath "C:\aaa\hogehoge.txt"
    rw.WriteText "ABCDE"True
    
    Set rw = Nothing
    
End Sub
[VBA]使用例

2013年11月18日月曜日

[Book's Review (Develop)]C言語入門書の次に読む本

(1)レビュー
 C言語の中級者向けに書かれた書籍です。
 他の書籍では、入門書レベルの内容が大半で、
 中級以上の人が読む専門書は少ないのが現状です。
 入門レベルを卒業する為には、
 洗練されたソースを読んだり、スキルの高い人から学ぶなど、
 実践を通して経験するしかありません。
 本書は、他言語にもある基礎的な内容(条件分岐、ループ、関数など)は省略し、
 中級以上のC言語プログラマー向けにまとめています。


主な内容
 ・分割コンパイル
 ・ヘッダ作成
 ・ライブラリの作成
 ・バグを発生させないコーディング
 ・意外に知られていないノウハウも… など

 意外に知られていないこととして、
 例えば、constキーワードがあります。
 【constキーワード】
  (1)『円周率など、不変の値を利用する時に、
     値が変化しないことを保証することができる。』
  (2)『ポインタの指す先の値が変化しないことを保証する。』

 (1)は他の言語でもよく使われるので、よく知られていますが、
 (2)は入門書レベルでは解説していないことが多いです。
 printfの第1引数『const char*』型の『const』は、(2)の意味になります。

 C言語の開発経験がなくても、
 他言語(.NET、Java、VBなど)の知識があれば、
 応用で理解できる内容だと思います。

(2)リンク
C言語 入門書の次に読む本 [改訂新版] (プログラミングの教科書)

C言語 入門書の次に読む本 [改訂新版] (プログラミングの教科書)

  • 作者: 坂井 弘亮
  • 出版社/メーカー: 技術評論社
  • 発売日: 2011/04/08
  • メディア: 単行本(ソフトカバー)

2013年9月1日日曜日

[VBA]ログを出力するクラスモジュール

[はじめに]
・最近、Excelマクロを使う機会が増えたので、
 備忘録としてサンプルを掲載します。
 クラスモジュールで定義することを前提としています。

[ソース]
''' <summary>
''' クラスモジュール名:LogForExcel
''' ログ出力を制御するクラス
''' </summary>
''' <remarks></remarks>
Option Explicit

'ログファイルのプレフィックス
Private Const LOG_FILE_PREFIX As String = "LOG_"
'ログファイルの拡張子
Private Const LOG_FILE_EXTENSION As String = ".log"
'ログファイルのバッファサイズ
Private Const LOG_BUF_SIZE As Integer = 1024

'ログ出力ディレクトリ
Public LogDirectory As String

'FileSystemObject
Private objFs As Object

'TextStreamObjectのIOモード
Private Enum IOMode
    ForReading = 0  '読み取り専用モード(既定値)
    ForWriting = 1  '上書きモード
    ForAppending = 8    '追記モード
End Enum

'ログ出力対象
Private colTraget As New Collection

''' <summary>
''' Initializeイベント(コンストラクタ)
''' </summary>
''' <remarks></remarks>
Private Sub Class_Initialize()
    Set objFs = CreateObject("Scripting.FileSystemObject")
    
    Call ClearLog
End Sub

''' <summary>
''' Terminateイベント(デストラクタ)
''' </summary>
''' <remarks></remarks>
Private Sub Class_Terminate()
    
    Call Flush
    
    Set objFs = Nothing

End Sub

''' <summary>
''' ログを出力する。[Information]
''' </summary>
''' <param name="msg">出力メッセージ</param>
''' <param name="useBuffer">バッファの利用有無</param>
''' <remarks></remarks>
Public Sub OutputInfo( _
    ByVal msg As String, _
    Optional ByVal useBuffer As Boolean = False)
    
    Call OutputLog("Informaton", msg, useBuffer)
    
End Sub

''' <summary>
''' ログを出力する。[Warning]
''' </summary>
''' <param name="msg">出力メッセージ</param>
''' <param name="useBuffer">バッファの利用有無</param>
''' <remarks></remarks>
Public Sub OutputWarn( _
    ByVal msg As String, _
    Optional ByVal useBuffer As Boolean = False)
    
    Call OutputLog("Warning", msg, useBuffer)
    
End Sub

''' <summary>
''' ログを出力する。[Error]
''' </summary>
''' <param name="msg">出力メッセージ</param>
''' <param name="objErr">エラーオブジェクト</param>
''' <param name="useBuffer">バッファの利用有無</param>
''' <remarks></remarks>
Public Sub OutputError( _
    ByVal msg As String, _
    Optional ByVal objErr As ErrObject = Nothing, _
    Optional ByVal useBuffer As Boolean = False)
    
    Dim strMsg As String
    
    strMsg = msg
    
    If Not (objErr Is NothingThen
        strMsg = strMsg & ":" & _
            "Err.Number:[" & objErr.Number & "]," & _
            "Err.Description:[" & objErr.Description & "]:"
    End If
    
    Call OutputLog("Error", strMsg, useBuffer)

End Sub

''' <summary>
''' ログを出力する。
''' </summary>
''' <param name="logType">ログ種別</param>
''' <param name="msg">出力メッセージ</param>
''' <param name="useBuffer">バッファの利用有無</param>
''' <remarks></remarks>
Private Sub OutputLog( _
    ByVal logType As String, _
    ByVal msg As String, _
    ByVal useBuffer As Boolean)

    colTraget.Add _
        Format(Now, "yyyy/mm/dd hh:mm:ss") & ":" & _
        logType & ":" & msg

    If useBuffer = True Then
        If colTraget.Count > LOG_BUF_SIZE Then
            'バッファがサイズを超えた場合は、ファイルに出力
            Me.Flush
        End If
    Else
        'バッファ無効の場合は、ファイルに出力
        Me.Flush
    End If

End Sub

''' <summary>
''' バッファーのデータをログに出力する。
''' </summary>
''' <remarks></remarks>
Public Sub Flush()
    
    Dim objTs As Object 'TextStreamObject
    Dim i As Long
    
    On Error GoTo LBL_ERR:
    
    Set objTs = objFs.OpenTextFile( _
        fileName:=objFs.BuildPath( _
            GetLogDirectory(), _
            LOG_FILE_PREFIX & _
            Format(Now, "yyyymmdd") & _
            LOG_FILE_EXTENSION), _
        IOMode:=IOMode.ForAppending, _
        Create:=True)


    For i = 1 To colTraget.Count
        objTs.WriteLine colTraget(i)
    Next
    
    objTs.Close
    Set objTs = Nothing
    Call ClearLog

   Exit Sub
LBL_ERR:
   
    If Not (objTs Is NothingThen
        objTs.Close
        Set objTs = Nothing
    End If
    
    Call ClearLog
    
    Err.Raise _
        Number:=Err.Number, _
        Description:="ログの出力に失敗しました。" & _
        Err.Description

End Sub

''' <summary>
''' ログ出力ディレクトリを取得する。
''' </summary>
''' <returns>ログ出力ディレクトリ(デフォルト:ThisWorkbook.path)</returns>
''' <remarks></remarks>
Private Function GetLogDirectory() As String
    If Me.LogDirectory = "" Then
        GetLogDirectory = ThisWorkbook.Path
        Exit Function
    End If
    
    GetLogDirectory = Me.LogDirectory

End Function

''' <summary>
''' バッファーをクリアする。
''' </summary>
''' <remarks></remarks>
Public Sub ClearLog()
    Dim i As Long
    
    For i = colTraget.Count To 1 Step -1
        colTraget.Remove i
    Next

End Sub
[VBA]ログを出力するクラスモジュール


[ソース]
Private Sub CommandButton1_Click()

    Dim logger As New LogForExcel
    
    On Error GoTo LBL_ERR
    
    'ログ出力[Info]
    Call logger.OutputInfo("出力テスト(Info)"True)
    'ログ出力[Warn]
    Call logger.OutputWarn("出力テスト(Warn)"True)
    
    'ゼロ除算で意図的に例外を発生させる。
    Debug.Print 1 / 0
    
    Set logger = Nothing
    
    Exit Sub
LBL_ERR:
    
    'ログ出力[Error]
    Call logger.OutputError("出力テスト(Error)", Err, True)
    
    Set logger = Nothing

End Sub
[VBA]使用例

2013年8月18日日曜日

[VBA]ファイル保存ダイアログの表示

[はじめに]
・最近、Excelマクロを使う機会が増えたので、
 備忘録としてサンプルを掲載します。
 VBAの関数が使いにくいので、クラスモジュールにまとめてみました。
 .NETのSaveFileDialogクラスを真似して実装しているので、
 .NET開発者にとっては、お馴染みのインタフェースで使いやすいかと思います。

[ソース]
''' <summary>
''' クラスモジュール名:SaveFileDialog
''' ファイル保存ダイアログを制御するクラス
''' </summary>
''' <remarks></remarks>
Option Explicit

'FileSystemPbject
Private objFs As Object

'タイトル
Public Title As String
'初期ディレクトリ
Public InitialDirectory As String
'初期ファイル名
Public InitialFileName As String
'[ファイルの種類]の選択肢
Public Filter As String
'[ファイルの種類]の選択値
Public FilterIndex As Integer

'選択したファイル名
Private m_FileName As String

''' <summary>
''' Initializeイベント(コンストラクタ)
''' </summary>
''' <remarks></remarks>
Private Sub Class_Initialize()
    Set objFs = CreateObject("Scripting.FileSystemObject")
    
    Call Clear
End Sub

''' <summary>
''' Terminateイベント(デストラクタ)
''' </summary>
''' <remarks></remarks>
Private Sub Class_Terminate()
    Set objFs = Nothing
End Sub


''' <summary>
''' 初期化
''' </summary>
''' <remarks></remarks>
Public Sub Clear()
    
    Me.InitialDirectory = Application.ThisWorkbook.path
    Me.InitialFileName = ""
    Me.Filter = "すべてのファイル(*.*),*.*"
    Me.FilterIndex = 1
    Me.Title = ""
    m_FileName = "ファイル名を指定してください"

End Sub

''' <summary>
''' フィルターを設定
''' </summary>
''' <param name="filterArray">フィルター文字列</param>
''' <remarks></remarks>
Public Sub SetFilterList(ParamArray filterArray() As Variant)
    Filter = Join(filterArray, ",")
End Sub

''' <summary>
''' 選択したファイル名を取得する。
''' </summary>
''' <remarks></remarks>
Public Function GetSelectedFileName() As String
    GetSelectedFileName = m_FileName
End Function

''' <summary>
''' パスとファイル名を結合する。
''' </summary>
''' <param name="path">パス</param>
''' <param name="fileName">ファイル名</param>
''' <returns>結合後のフルパス</returns>
''' <remarks></remarks>
Private Function BuildPath( _
    ByVal path As String, _
    ByVal fileName As StringAs String
    
    BuildPath = objFs.BuildPath(path, fileName)

End Function

''' <summary>
''' ファイル保存ダイアログを開く
''' </summary>
''' <returns>vbOK:ファイル選択、vbCancel:キャンセル</returns>
''' <remarks></remarks>
Public Function ShowDialog() As VbMsgBoxResult

    Dim resDlg As Variant
    Dim initDir As String
    
    '初期ディレクトリの存在チェック
    ' 存在しない場合は、Excelブックの配置ディレクトリに置き換える。
    If objFs.FolderExists(Me.InitialDirectory) = False Then
        Me.InitialDirectory = ThisWorkbook.path
    End If
    
    'ファイル選択ダイアログを開く
    resDlg = _
         Application.GetSaveAsFilename( _
              InitialFileName:= _
                BuildPath( _
                    Me.InitialDirectory, _
                    Me.InitialFileName), _
              FileFilter:=Me.Filter, _
              FilterIndex:=Me.FilterIndex, _
              Title:=Me.Title _
             )

    If resDlg = False Then
        'キャンセルした場合
        m_FileName = ""
        
        ShowDialog = vbCancel
        Exit Function
    End If
    
    'ファイル選択した場合
    m_FileName = resDlg
    
    ShowDialog = vbOK
    Exit Function
    
End Function

VBA]ファイル保存ダイアログ


[ソース]
Private Sub CommandButton1_Click()

    Dim sfd As New SaveFileDialog
    
    With sfd
        .InitialDirectory = "C:\Hoge"
        .InitialFileName = "abc.csv"
        .Title = "タイトル"
        .FilterIndex = 1
        .SetFilterList "CSV(*.csv),*.csv""すべてのファイル(*.*),*.*"
        
    End With
    
    'ファイル保存ダイアログを開く。
    If sfd.ShowDialog() = vbOK Then
        MsgBox sfd.GetSelectedFileName()
    Else
        MsgBox "キャンセルしました"
    End If
    
    '終了処理
    Set sfd = Nothing

End Sub
VBA]使用例

[VBA]ファイル選択ダイアログの表示

[はじめに]
・最近、Excelマクロを使う機会が増えたので、
 備忘録としてサンプルを掲載します。
 VBAの関数が使いにくいので、クラスモジュールにまとめてみました。
 .NETのOpenFileDialogクラスを真似して実装しているので、
 .NET開発者にとっては、お馴染みのインタフェースで使いやすいかと思います。

[ソース]
''' <summary>
''' クラスモジュール名:OpenFileDialog
''' ファイル選択ダイアログを制御するクラス
''' </summary>
''' <remarks></remarks>
Option Explicit

'FileSystemPbject
Private objFs As Object
'WScript.Shell
Private objWs As Object

'タイトル
Public Title As String
'初期ディレクトリ
Public InitialDirectory As String
'[ファイルの種類]の選択肢
Public Filter As String
'[ファイルの種類]の選択値
Public FilterIndex As Integer
'複数選択の可否
Public MultiSelect As Boolean

'選択したファイル名
Private m_FileNames() As String

''' <summary>
''' Initializeイベント(コンストラクタ)
''' </summary>
''' <remarks></remarks>
Private Sub Class_Initialize()
    Set objFs = CreateObject("Scripting.FileSystemObject")
    Set objWs = CreateObject("WScript.Shell")
    
    Call Clear
End Sub

''' <summary>
''' Terminateイベント(デストラクタ)
''' </summary>
''' <remarks></remarks>
Private Sub Class_Terminate()
    Set objFs = Nothing
    Set objWs = Nothing
End Sub

''' <summary>
''' 初期化
''' </summary>
''' <remarks></remarks>
Public Sub Clear()
    
    Me.InitialDirectory = Application.ThisWorkbook.path
    Me.Filter = "すべてのファイル(*.*),*.*"
    Me.FilterIndex = 1
    Me.Title = "ファイルを選択してください"
    Me.MultiSelect = True

    ReDim m_FileNames(0)
End Sub

''' <summary>
''' フィルターを設定
''' </summary>
''' <param name="filterArray">フィルター文字列</param>
''' <remarks></remarks>
Public Sub SetFilterList(ParamArray filterArray() As Variant)
    Filter = Join(filterArray, ",")
End Sub

''' <summary>
''' 選択したファイル名を取得する。
''' </summary>
''' <remarks></remarks>
Public Function GetSelectedFileNames() As String()
    GetSelectedFileNames = m_FileNames
End Function

''' <summary>
''' ファイル選択ダイアログを開く
''' </summary>
''' <returns>vbOK:ファイル選択、vbCancel:キャンセル</returns>
''' <remarks></remarks>
Public Function ShowDialog() As VbMsgBoxResult

    Dim resDlg As Variant

    'カレントディレクトリを設定
    objWs.CurrentDirectory = Me.InitialDirectory
     
    'ファイル選択ダイアログを開く
    resDlg = _
         Application.GetOpenFilename( _
              FileFilter:=Me.Filter, _
              FilterIndex:=Me.FilterIndex, _
              Title:=Me.Title, _
              MultiSelect:=Me.MultiSelect _
             )

    If IsArray(resDlg) = False Then
        If resDlg = False Then
            'キャンセルした場合
            ReDim m_FileNames(0)
            
            ShowDialog = vbCancel
            Exit Function
        End If
    End If
    
    ReDim m_FileNames(0)
    
    'ファイル選択した場合
    If IsArray(resDlg) = True Then
        '複数選択の場合
        Dim cnt_i As Integer
        
        For cnt_i = 1 To UBound(resDlg)
            ReDim Preserve m_FileNames(cnt_i - 1)
            m_FileNames(cnt_i - 1) = resDlg(cnt_i)
        Next
        
        ShowDialog = vbOK
        Exit Function
    Else
        '単一選択の場合
        ReDim m_FileNames(0)
        m_FileNames(0) = resDlg
    
        ShowDialog = vbOK
        Exit Function
    End If
    
End Function
[VBA]ファイル選択ダイアログ


[ソース]
Private Sub CommandButton1_Click()
    
    Dim ofd As New OpenFileDialog
    
    With ofd
        .Title = "ファイル選択ダイアログ(単一選択)"
        .FilterIndex = 1
        .MultiSelect = False
        .SetFilterList "CSV(*.csv),*.csv""すべてのファイル(*.*),*.*"
        
    End With
    
    'ファイル選択ダイアログを開く。
    If ofd.ShowDialog() = vbOK Then
        
        Dim cntI As Integer
        Dim fList() As String
        
        fList = ofd.GetSelectedFileNames()
        
        For cntI = 0 To UBound(fList)
            MsgBox fList(cntI)
        Next
    Else
        MsgBox "キャンセルしました"
    End If

    '終了処理
    Set ofd = Nothing

End Sub
[VBA]使用例

[VBA]指定したブック内のシート検索

[はじめに]
・最近、Excelマクロを使う機会が増えたので、備忘録としてサンプルを掲載します。
 指定したブック内のシートを検索する処理です。

[ソース]
Option Explicit

''' <summary>
''' 指定したブック検索する。
''' </summary>
''' <param name="bookName">ブック名</param>
''' <returns>対象のWorkBook。(存在しない場合はNothing)</returns>
''' <remarks></remarks>
Public Function FindBook( _
    ByVal bookName As StringAs Workbook

    Dim bk As Workbook
    
    For Each bk In Workbooks
        If bk.name = bookName Then
            Set FindBook = Workbooks(bk.name)
            Exit Function
        End If
    Next

End Function

''' <summary>
''' 指定したブック内のシートを検索する。
''' </summary>
''' <param name="sheetName">シート名</param>
''' <param name="bookName">ブック名(※省略時はThisWorkbook.Name)</param>
''' <returns>対象のWorkSheet。(存在しない場合はNothing)</returns>
''' <remarks></remarks>
Public Function FindSheet( _
    ByVal sheetName As String, _
    Optional ByVal bookName As String = ""As Worksheet

    Dim bk As Workbook
    Dim sht As Worksheet

    If bookName = "" Then
        'ブック名を省略した場合は、
        '自分自身のブックを対象とする。
        Set bk = ThisWorkbook
    Else
        Set bk = FindBook(bookName)
        
        If bk Is Nothing Then
            '指定したブック名が存在しない場合は、Nothingを返す。
            Set FindSheet = Nothing
            Exit Function
        End If
        
    End If
    
    For Each sht In bk.Sheets
        If sht.name = sheetName Then
            Set FindSheet = bk.Worksheets(sht.name)
            Exit Function
        End If
    Next

    'シートが存在しない場合、Nothingを返す。
    Set FindSheet = Nothing

End Function
[VBA]指定したブック内のシートを検索

[雑記]ドローン(DJI Mini 3)

(1)雑記 もともと多趣味の友人 masakazu Drone 氏が、 最近、 ドローン にハマり始めて、 更に、新たな趣味が増えたとのこと。 ドローン を始めてから、 まだ1年も経っていないとのことですが、 旅行先で山や川の景色を 空撮 して、 Youtube ...