VB.NETでExcel編集を行った後でExcelプロセスが消えないトラブル

先日VB.NETでExcelブックにデータを読み書きするプログラムを作っていたのですが、
その際にタスクマネージャにExcelのプロセスが残ったままになる現象が起きてはまって
しまったので備忘録を書いておこうと思います。

【環境】
・Windows 10
・Visual Studio 2013
・Microsoft Office 2013

結論から言うとExcelのオブジェクトを解放してあげればいいのですが、それにはコツがあるのです。

NG例

xlApplication.Workbooks.Item("Sheet1")

'■COMオブジェクトの解放
Call ReleaseCOMObject(xlsApp)

何がいけないかというと「xlsApp.Workbooks.Item(“Sheet1”)」の部分です。
ドット(.)が二つ以上続く操作を行う場合は、COMオブジェクトを解放してもExcelのプロセスが残ってしまいます。
この場合は一つずつ分解して変数に保持しなければいけません。

OK例(サンプルソース)

Imports Microsoft.Office.Interop

Public Shared Sub P_Sample()

'■Excel用
Dim xlApplication As Excel.Application = Nothing
Dim xlWkBooks As Excel.Workbooks = Nothing
Dim xlBook As Excel.Workbook = Nothing
Dim xlSheets As Excel.Sheets = Nothing
Dim xlWkSheet As Excel.Worksheet = Nothing
Dim xlActvSheet As Excel.Worksheet = Nothing
Dim xlRange As Excel.Range = Nothing

Try

'■Excel.Application の新しいインスタンスを生成する
xlApplication = New Excel.Application()

'■アプリケーションの非表示
xlApplication.Visible = False

'■test.xlsmを開く
xlWkBooks = xlApplication.Workbooks
xlBook = xlWkBooks.Open(“D:\test.xlsm”)

'■シートの指定
xlSheets = xlBook.Worksheets

'***********************
' [Sheet1]シート
'***********************
xlWkSheet = xlSheets.Item("Sheet1")
xlWkSheet.Activate()

'■指定エリアの値をクリア
xlRange = xlWkSheet.Range("B7:C59")
xlRange.Value = ""
'■COMオブジェクトの解放
Call ReleaseCOMObject(xlRange)

'■COMオブジェクトの解放
Call ReleaseCOMObject(xlWkSheet)

'***********************
' [Sheet2]シート
'***********************
xlWkSheet = xlSheets.Item("Sheet2")
xlWkSheet.Activate()

'■指定エリアの値をクリア
xlRange = xlWkSheet.Range("B7:C59")
xlRange.Value = ""
'■COMオブジェクトの解放
Call ReleaseCOMObject(xlRange)

'■COMオブジェクトの解放
Call ReleaseCOMObject(xlWkSheet)

'----------------------------------------
' Sheet1シートに社員番号、氏名をセット
'----------------------------------------

xlWkSheet = xlSheets.Item("Sheet1")
xlWkSheet.Activate()

xlRange = xlWkSheet.Range("C1”)
xlRange.Value = “001” ‘社員番号
'■COMオブジェクトの解放
Call ReleaseCOMObject(xlRange)

xlRange = xlWkSheet.Range("D1”)
xlRange.Value = “佐藤” ‘氏名
'■COMオブジェクトの解放
Call ReleaseCOMObject(xlRange)

'■COMオブジェクトの解放
Call ReleaseCOMObject(xlWkSheet)

'■Excelを上書保存して閉じる
xlBook.Close(True)

'■COM オブジェクトの参照カウントを解放する
Call ReleaseCOMObject(xlSheets)
Call ReleaseCOMObject(xlWkBooks)
Call ReleaseCOMObject(xlBook)

xlApplication.Quit()
Call ReleaseCOMObject(xlApplication)

Exit Sub
'**エラー処理 ******************************************
Catch ex As Exception

'■エラーメッセージとログ出力、強制終了
Messagebox.Show “処理に失敗しました。”

Finally

'■Excelを保存
If Not xlBook Is Nothing Then
xlBook.Close(True)
End If

'■COM オブジェクトの参照カウントを解放する
Call ReleaseCOMObject(xlRange)
Call ReleaseCOMObject(xlWkSheet)
Call ReleaseCOMObject(xlSheets)
Call ReleaseCOMObject(xlWkBooks)
Call ReleaseCOMObject(xlBook)

If Not xlApplication Is Nothing Then
xlApplication.Quit()
End If

Call ReleaseCOMObject(xlApplication)
End Try
End Sub

'■====================================================■
'■ COMオブジェクトの解放
'■====================================================■
Public Shared Sub ReleaseCOMObject(Of T As Class)(ByRef objCom As T)

'オブジェクトが空の場合処理を抜ける
If objCom Is Nothing Then
Return
End If

Try
'パラメタがCOMオブジェクトかチェック
If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then

'Runtime Callable Wrapperの解放を行う
Dim cntRCW As Integer = System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)

If cntRCW <> 0 Then
'解放しきれていない場合、メッセージを出力
MessageBox.Show("解放エラー")
End If

End If

Finally
objCom = Nothing
End Try

End Sub

一つの操作ごとにCOMオブジェクトを解放しています。
また、最後にCOMオブジェクトを解放だけではなく、「Excel.Application」の「Quit」と
Excel.Workbook」の「Close」を必ず行って下さい。

COMオブジェクトの解放が煩わしという人には「ClosedXML」や「EPPlus」といったライブラリを
使ったExcelファイルの読み書きを行う方法もありますよ。

「重複」という漢字・・・何て読む?

今年の6月からの話になります。

画面から入力される、多数のデータ項目を複雑に管理し、それらを基に基幹業務システムで使用するスクリプトファイルを生成するツールプログラムの開発プロジェクトに着手しております。

このツールプログラムですが、細かなユーザー入力機能が多数あり、その入力機能数に相応して、「重複チェック」処理が多数発生しておりました。

当然、我スタッフ達と「重複機能はどうする?」「この重複機能の仕様はこうする」という仕様確認の会話が多発していた次第でした。

その際、この“重複”をあるスタッフは「ちょうふく」と言い、あるスタッフは「じゅうふく」と言い、会話にギクシャク感が生じる場面がありました。

そこで、少し気になってWebで参考情報を検索してみたところ、以下のような私的結論に達しました。
(1)”重複”の読み方として「ちょうふく」「じゅうふく」はどちらも正解のようです。
(2)試験で解答する場合は「じゅうふく」と書くと誤答となるケースがある。

とりあえず、私は話す相手に合わせて「ちょうふく」「じゅうふく」を使い分けていきたいと思います。

ちなみに、私に「ちょうふく」と教えてくれたのは、高校時代の「情報処理」教科の先生でした。重複チェック処理プログラムの作成課題を与えられた際に「”ちょうふく”するデータを見つけ出し先生に報告すること!」という感じで言われたな・・・と思い出してしまいました。もう20年も前の話ですが・・・

さて、皆様は「ちょうふく」「じゅうふく」のどちらを選択して言葉にされていますか?

 

 

ちなみに、こんな重複なら嬉しいかぎりですね。 (^^♪

重複前:  ここで、手を叩いた瞬間に魔法が発生し・・・(/ω\)

duplicatebefore

 

重複後: なんと、6台に増えました(重複しました)  !(^^)!

duplicateafter

↑ 一応、補足しますが6台も購入してませんので(笑)

 

 

「2048」というゲーム

「2048」

これは、最近Web上で騒がれているゲームアプリになります。

game2048

このゲームの特徴ですが・・・

(1)操作がスワイプのみで簡単

(2)同じ数字のマス目が隣接した際に、その合計値のマス目に計算統合される。

(3)最終的に「2048」の数字を持つマス目を作成できればクリア

という、極めて「簡単」かつ「明快」、それでいて「面白くてハマってしまう」というゲームアプリになります。(私の私見かもしれませんが・・)

 

しかし、このゲームには物言いが生じています。

 

ことの経緯は、このようになっているようです。

(経緯1)
作者Aにより「Threes!」というパズルゲームが開発され、有料アプリ(販売価格¥200)として公式公開される。

(経緯2)
しかし、作者Bがこの「Threes!」を真似て(もしくは近似した内容で)「2048」を開発し、これまた公式公開する。しかも、広告付きではあるが、無料で公開している。 ※補足すると、「2048」は「Threes!」のゲームエキス的部分を、作者Bがアレンジした開発した内容になっているようです。

(経緯3)
さらに、作者BがGitHubに「2048」のソースコードを公開したため、アプリ市場に「2048」の模倣アプリが蔓延し、経緯1で記載の「Threes!」がその模倣アプリの中に埋もれる事態になっている。

(経緯4)
そして、最もWeb上で騒がれているのが、この「2048」が、あの任天堂が携帯ゲーム機「3DS」用ソフトとして商品化し今月より販売を開始したことである。(ちなみに、販売価格は¥300)

 

私は、このニュースを、初めて知った時、「ソフトウェア業界、何だかおかしくなってるな・・」と思わずにはいられませんでした。

(1)
作者Aのソフトウェア著作権はどこに消えたのか?

(2)
任天堂は、作者Bからアイデアを買い取ることになるのか? (作者Aの立場は?)

(3)
そもそも、ことの経緯を知りながら、任天堂がこのような販売を行うとは・・・どうなんだろうか? 
なお、任天堂社から「法律的に問題ないことを確認した上で販売決定した」というコメントが出ているようです。

(4)
今後、世の中に発表されるアプリに関しても、このような模倣(パクリ)が合法として市場に認めらてしまうのか?

 

さて、皆様はどう思われますか?

 

 

【HTML】CSSの変更内容を確実に反映させる!

 以前弊社ホームページの更新作業を行った際に、cssのキャッシュについて少々ハマったところがあったので、備忘録として残しておきます。
 問題となったケースは、以下のようなものでした。

○弊社ホームページで使用しているcssを変更し、レイアウトの修正を行ったが、その変更内容がホームページ側に反映されない(レイアウトが変わらない)。

 cssは確かに変更されているのに、なぜホームページに反映されないのか……調査の結果、原因はcssのキャッシュが残っていたためだとわかりました。なので以下のように修正して対応しました。
 修正を行うのは、各htmlファイルのcssを読み込む部分になります。

<link rel=”stylesheet” href=”css/hogehoge.css” type=”text/css” id=”hoge”>

 ここを、以下のように修正しました。

<link rel=”stylesheet” href=”css/hogehoge.css?20140527” type=”text/css” id=”hoge”>

 太字部分の内容を追加した形になります。”?”以降になんらかの文字列(クエリー文)を付与することで、同じcssファイルであっても別物として認識されるようになります。
 具体的には、『css/hogehoge.css』『css/hogehoge.css?20140527は、例え中身(hogehoge.css)が同一ファイルでも別物のcssと判定されるので、

(1)css変更後にクエリー文を追加しない場合:
 :ホームページを見に行く → ブラウザ:「『css/hogehoge.css』のキャッシュを保存するよ」
 :cssを変更する(クエリー文は追加しない)
 :もう一度ホームページを見に行っても、既に『css/hogehoge.css』のキャッシュが残っているので、変更前の内容が表示されてしまう(cssの変更が反映されない)

(2)css変更後にクエリー文を追加する場合:
 :ホームページを見に行く → ブラウザ:「『css/hogehoge.css』のキャッシュを保存するよ」
 :cssを変更し、クエリー文を追加して『css/hogehoge.css?20140527』に!
 :もう一度ホームページを見に行く → ブラウザ:「『css/hogehoge.css』というキャッシュは保存してるけど、『css/hogehoge.css?20140527』というキャッシュは保存してないから、サーバーに取りに行くよ」
 :変更したcssの情報が読み込まれ、ホームページに反映される!

 といった具合で、ページ読み込みと併せてcssが再取得されます。つまり今回のクエリー文は、「ここの文字列が変わってたらcssも変わってるってことにして、とりあえず新しく取りに行ってね」とブラウザに命令するもの、と言えるでしょうか。今回は、cssの最終更新日付を付与しました。
 いずれまたcssを更新することになった場合は、クエリー文を『css/hogehoge.css?20140701』などのように、再度別の文字列に変更するようにすれば、

ブラウザ:「『css/hogehoge.css』と『css/hogehoge.css?20140527』というキャッシュは保存してるけど、『css/hogehoge.css?20140701』というキャッシュは保存してないから、サーバーに取りに行くよ」

 となって、また変更を反映させることができます。
 問題は、上のクエリー文はcssではなくhtml側で行うものなので、cssの内容を変更した際には、必ずhtml側も修正する必要がある点でしょうか。修正を忘れると、キャッシュが残っているので(1)と同様の流れになってしまい、変更が反映されないということに……。
 いかにも修正忘れや修正漏れの凡ミスが起こりそうなので、念入りに注意する必要がありますね(-_-;)

我ら日本語システムエンジニア(笑)

先日の話です。

私より英語力のある部下と、話しをしていたときのこと。

(私)
「この不具合は問題だな。何が原因なんだろうか?」

(部下)
「それは、変数をステティックに確保しているため、初期化されていないことが原因と考えます。」

(私)
第1思考段階: ステティック・・・んっ・・・もしかしてスタティック変数(静的変数)のことか?
第2思考段階: 英語発音ではステティックが正解なのか?
第3思考段階: では、部下の意向を尊重し、自分もステティック“として会話を続けるべきか?
第4思考段階: いや!ここはまず中立的に日本語で話そう。 で、

「その静的変数の不具合は解消できるのか?」
・・・おいおい、それでいいのか? (゜_゜>)

なんて、やりとりがありました。

そして、この話の顛末は、我ら日本語システムエンジニアとして「ステティック」という発音(会話)が妥当でないことを部下に諭し、今後スタティック」として発音するよう指導した次第です。

 

実は、これと似た話を、遡ること20年前にも経験していることを思い出してしまいました。

当時、私は某I社という世界的に有名なIT会社と連携協力するプロジェクトに参画しておりました。その当時、我ら技術者が使用していた主な記憶媒体は「3.5インチのフロッピーディスク」というものでした。

ある日、私は作成した文書を保存するために、この記憶媒体を入手する必要があり「文書保存のために、フロッピーを1枚いただけませんか?」とお願いしたところ、同僚に「バカ!、フロッピーなんてI社社員の前で言うなよ。いいか、フロッピーディスケットと言うんだぞ。怒られるからな。」と言われてしまいました。

当時の私は、「フロッピーでも、フロッピーディスケットでも、どっちでもいいから、とにかく記憶媒体を下さいよ」というのが本音でした。しかし、I社社員を交えた打ち合わせ、会話をする上で「フロッピーディスケット」という共通の単語を使用しないと、円滑な会話ができないこともあり、そのプロジェクトの間は、慣れない「フロッピーディスケット」という単語を発音していました。

また別の話になりますが、私のツイッターのフォロワーさんからのネタになりますが、自分の上司がキーボードの「BS(バックスペース)」を「バック・スキップ」と言うもんだから、仕方なく自分も「バック・スキップ」と言っていたという話を聞きました。

上述のこと全てに共通するのですが、プロジェクトの会話を円滑にするためには「正しい用語」を「正しい発音」で使用することが、非常に大切なことと考えます。

さて、相応の役職の方々!
間違った単語の発音などされていませんでしょうか?


ちょっとしたパワハラに
なっているかもしれませんよ。(苦笑)

とある「ゲームソフト」にみるバグ事情(その後の話…のまた続き)

※本投稿は以下の投稿からの続きです。気になる方は、こちらもお読みください。
1) とある「ゲームソフト」にみるバグ事情
2) とある「ゲームソフト」にみるバグ事情(その後の話)

先日の夜の話です。

自宅に、遅い帰宅をし、そのまま自室へ引きこもり某社様向けの提案書に目を通していたところ...(こう見えて、私も忙しいみたいなんですよ)

深夜だというのに、息子(次男)が自室に入ってきました。で、

「お願いがあるんだけどさ~。 僕の”とび森※1”をさ~、Version1.1の前の状態に戻してくれないかな~。前のバージョンだと、裏ワザ※2で多額のお金※3や、レアなアイテムをゲットできるみたいなんだよ。できる~?

とのこと。 はぁ......(゜_゜>)...なんじゃいそれ。

それで、私の返答は「無理です」の一言でした。

なんせ、普通の使い方であればニンテンドー3DSの「ゲームカセット」は読み取り専用です。
中身を書き換えるなんて、普通の人にはできません

しかも、次男の手元にある「ゲームカセット」は工場出荷時から「Version1.1」なのです。

ダウングレードなんて、出来るわけない。

アップグレードのお願いの次は、
ダウングレード
かよ~~。勘弁してくれ~(苦笑)

 

※1
とび森=とびだせ どうぶつの森

※2
子供たちは「裏ワザ」なんて言ってますが、我々業界の者から言わせてもらうと「バグ」のはずです。このソフトのバグには「プレイデータを勝手に削除する」という最悪の問題が潜んでいる反面、お金を増やしたり、レアアイテムを取得できたりする嬉しい不具合も潜んでいるようです。

※3
もちろん、ゲーム中でしか通用しない「お金」です。

Androidアプリを公開したら・・来ました。広告勧誘メール(苦笑)

先日、AndroidアプリをGooglePlayより公開したところ、すぐに以下のような広告勧誘メールが送付されてきました。

当社アプリ「連勝じゃんけん」に関しては、開発当初から「広告機能は組み込まない」という思いがありましたので、このメールは無視することにしました。
(あくまでも私個人の判断ですが)

 

その前に、本気で広告勧誘したいなら以下の2点は考慮して欲しいものです。

(1)
開発者の母国語
によるメール文章の記載
(今回は日本語で送付すべきです)

(2)
どうみても、「会社名」「アプリ名」をパラメータとして機械処理したとしか思えない無機質なメール文章
(連勝じゃんけんを気にかけた事由を記載すべきです)

 

<これが、その広告勧誘メール> ※多分、青字がパラメータと思われます。
————————————————————————————-
Dear Transsoft team,

My name is xxxxx and I am specialized in helping android developers to
better monetize their apps on Google Play. Our premium advertisers are
currently looking to buy android traffic at a very high price in apps
like 連勝じゃんけん.

We think you can generate up to $10 CPM with their full screen ads,
which are very clean. Indeed, most of our advertisers are willing to pay
over $1 per installation. You’re free to display these ads whenever you
want in your app so that it’s not intrusive.

If you’d like to learn more, don’t hesitate to ask me. You can also
visit our website: the link is in my signature

What do you think? Do you want to give it a try?

Cheers,
————————————————————————————-

スマホアプリの開発は、思い立ったらスピードが命です!

先日、Androidアプリ「連勝じゃんけん」をGooglePlayより公開させていただきました。

無事に公開できてなによりだったのですが・・・・

私、個人としては残念でならないことがありました。

それは、この「連勝じゃんけん」が公開される約1カ月前に同名(しかも、ほぼ同機能)のアプリが公開されていたのです。

内容的には、当社のアプリの方が出来が良いと思っております。
自画自賛と言われるかもしれませんが・・)

実は、このようなことを経験するのは、これで2回目になります。

前回は、転職前の会社で開発したiPhoneアプリでして、AppStore公開前に東京のITフェアで事前プレゼンをしたところ、そのiPhoneアプリの仕様をそっくりコピーされたようなアプリが他の方からAppStoreに公開されてしまいました。しかも、そのITフェアで紹介したアプリ名もそのまま使われて・・・(まず、間違いなくアイデアを盗用されたものと考えます)

その数か月後、転職前の会社よりそのアプリをAppStoreに正式公開することになったのですが、くやしいかな後発となったため、アプリ名を再検討して若干不本意な名前で公開することになったのです。

スマホアプリ開発は、
アイデアが生まれたら、
すぐに開発して、
すぐに公開する。
しかも、公開するまでアイデア(アプリ仕様)は他言無用を厳守する。

今度は、これを徹底するぞ!

とある「ゲームソフト」にみるバグ事情(その後の話)

先日、投稿した「ゲームソフト(どうぶつの森)」に関する続き話をさせていただきます。

まず、私の自宅に2名の「息子の友達」がやってきまして、私が「Ver1.1対応」のお手伝いをすることになりました。また、他の「息子の友達」数名も、私が先日配布した文書をもとに親から更新作業を行ってもらったようです。※少なくとも、私の自宅の界隈では、密かに「Ver1.1対応」がはやり始めた模様です。引き金をひいたのは私でしょうけど・・・(笑)

ということで、息子(二男)も無事に、通信仲間を得て「どうぶつの森」を楽しんでいるようで安心しております。

が、うちの長男がボソッともらした一言が、一応の同業者としてグサッと刺さるものがありました。

「この、どうぶつの森を作った会社って、何なのかな? 本当に試して売っているかな?」

それを受け、「そりゃ、いろいろな試験をして販売しているはずだよ。だけど試験する箇所が沢山ありすぎて、それが漏れちゃったんだろうね。ゲーム内容も複雑だしさ。」と自然に言ってしまった私がいて、

あれっ、「もしかして、私自身に言い訳してるのか?」ととっさに省みてしまいました。

試験項目数が多くなれば、試験工数も増えるし、増えた試験項目から更なる相関試験項目も増えるし、試験作業が複雑になるのは仕方がないこと。しかし、それを理由に「少しくらい、試験ケースが漏れてもいいかな」と心中で妥協してしまっている自分がいるような気持ちになってしまいました。

いかんですね。息子の一言を、自分にも向けられた一言として考えてゆかねばと思った今日でした。

 

 

とある「ゲームソフト」にみるバグ事情

先日の「子どもの日」になります。

息子から、任天堂の「とびだせ どうぶつの森(以降、ソフト)」というゲームが欲しいとせがまれ、たまのプレゼントだしいいかと思い買ってあげました。

すると、次の日に息子に泣きつかれ「友だちの持ってるソフトと通信できなかったか(涙) なんか、僕のソフトのバージョンが違うんだって。友だちはかなり先に始めていたから、僕も頑張って進めないと、そのバージョンが通信できるようにならないんだってさ」とのこと。

んっ、何か怪しいと思い息子に詳細を聞くと「うちの息子のソフトのバージョン:1.1」、「他の子のソフトのバージョン:無表示」とのこと。もしかして、後発で買って息子のソフトがバグ修正版の可能性があるとみてググってみたところ・・・・

案の定、このソフトはバグの宝庫状態となっており、ユーザからのクレーム書き込みも多数ありました。

そして、当の任天堂では平成25年3月18日から「更新プログラム」を提供していたようです。

しかも、更新プログラムはゲーム機内のSDカードに保存し、ゲームを起動するたびにその更新プログラムを読み込むそうな。

そのため、任天堂でWeb公開している「更新プログラム適用のすすめ」を、息子の友達分の部数で印刷し、それの必要箇所にマーカを引き、息子に渡してきました。

さて、息子の友達たちは「更新プログラム」を適用してくれるだろうか?

近日、息子が通信成功を喜ぶ姿を見たいものです。