Visual Basic.NET EPPlusの使ったExcelファイルへの画像挿入

今回、Excelファイルへの値書込みについて公開しておられる方はいらっしゃいましたが、画像挿入についてはありませんでしたので、私の方法を記述します。
画像挿入についてはC#ならいくつも説明するサイトがありますが、VBでは皆無でしたので。

//Imports System.IO
//Imports OfficeOpenXml
//Imports OfficeOpenXml.Drawing

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim stCurrentDir2 As String = System.Environment.CurrentDirectory
        Dim ExFile As String = stCurrentDir2 + "[Excelファイル名]"

        Dim fi As System.IO.FileInfo = New System.IO.FileInfo("\[Excelファイル名]")
        If fi.Exists = False Then
            File.Delete("[画像ファイル名]")
            MessageBox.Show("ファイルなし")
            Return
        End If
        Dim s As String = Now.ToString("HH:mm:ss")
        Using pkg As New ExcelPackage(fi)
            'シート追加に際してシート名をobj+時刻とする
           Dim sheet1 As ExcelWorksheet = pkg.Workbook.Worksheets.Add("obj" + s)
            '// セルを指定して代入(ExcelVBA同様1から始まる)'
           Dim img As System.Drawing.Image = System.Drawing.Image.FromFile(stCurrentDir2 + "\[画像ファイル名]")
            Dim pic As ExcelPicture = sheet1.Drawings.AddPicture("img", img)
            pic.SetPosition(1, 1)
            pic.SetSize(240, 400)
            Call pkg.Save()  '// 保存。名前を変えて保存はSaveAs()'
           sheet1.Dispose()
            img.Dispose()
            pic.Dispose()
        End Using
        File.Delete("[画像ファイル名]")
        MessageBox.Show("スナップショットを出力しました")
End Sub

 

日本語入力システムはつらいよ

なぜかはわからないのですが、Word(Windows10 32ビット/Word2013)の調子が悪くなりました。

何の変哲もない二段組みの文書の編集中に、急に固まったかと思うと次々に怪しげなメッセージが表示されてWordが再起動します。

1.「Microsoft Wordは動作を停止しました。この問題の解決策を確認しています。」

2.「標準テンプレート(Normal.dotm)への変更がバックアップされています。この変更を反映しますか?」

3.「Microsoft Wordを再起動しています。」



途中まで編集した文書は復元されるのですが、何度もこのようなことがおこるといい加減腹が立ちます。

考えてみると、この現象が起こるのは文字変換の確定でEnterキーを押した時です。

といっても毎回ではなく、気持ちよく入力していると、突然起こる現象なのでわけがわかりません。どうやら決まりはないようです。



とりあえず以下の対処をしてみました。

4.文書の再作成(編集中の文書を新しいファイルに貼り付け)

5.不要なアドインの削除とC:\Users\ユーザー名\AppData\Roaming\Microsoft\WordにあるSTARTUPフォルダ以外のファイル・フォルダをすべて削除

6.C:\Users\ユーザー名\AppData\Roaming\Microsoft\TemplatesにあるNormal.dotmの再生成



4と6をしたことでいつしか、2のメッセージは表示されなくなったものの、依然として1と3は起こります。



これ以上あれこれするのも面倒くさいので、兎にも角にもこの現象は文字変換中に起こることから、「Google日本語入力」をインストールして、日本語入力システムを変えてみることにしました。

すると、あら不思議、現象がやみました。う~ん、Office IMEが悪かったのね。



Google日本語入力の使い勝手はそう悪くなさそうなので、一応これで一件落着にします。



ちなみに、Google日本語入力に変えただけでは、Wordで文字入力をする際には、入力したひらがなが黒塗りされてみえなくなってしまいます。

これはWordを以下のように設定してください。

「ファイル」-「オプション」-「言語」から「表示言語とヘルプ言語の選択」欄

7.「表示言語」を「日本語」へ

8.「ヘルプ言語」を「日本語」へ

にすると解消されます。

ダブルクリックでExcelファイルが開かない

私のノートパソコン(Windows10 64bit・Excel2013 32bit)のExcelが急にダブルクリックしてもExcelが空白で起動するだけでファイルが開けない状況が発生しました。

回避方法としては一般的には次の二つの方法が述べられています
方法1 : Dynamic Data Exchange (DDE) を使用する他のアプリケーションを無視するのチェックを外す
※ Excel の [ファイル] タブ > [オプション] > [詳細設定] > [Dynamic Data Exchange (DDE) を使用する他のアプリケーションを無視する] にチェックが入っていたらチェックを外す手順です
方法2 : Office 修復 (クイック修復) を試す
※ コントロールパネル> プログラム > プログラムと機能 > Microsoft Office Professional 2013 ja-jp > 右クリック > 変更 > クイック修復を選択する手順です。

ただ、私のパソコンではこの不具合は解消されませんでした。そこで私は以前から気になっていたことを疑って調べたところ、ピンポンでした。それは何かというと、分析ツール・分析ツールVBAの両アドインを外すことでした。実際、難なくファイルが開きました。

なぜ、ピーンと来たかというと、実は別のノートパソコンで初めてインストールしたOfficeでExcelが起動できなくなったことがあったからでした。何が違うかというと、インストールしたOffice/Excelが64bit版だった点です。

何度再インストールしても64bit版の方は分析アドインをセットした時点で起動できなくなったのでした。32bit版、そう今回起動できなくなったノートパソコンの方ではその時は異常はなかったのです。それが今になって同じことになりました。今このアドインにチェックが入っていても問題ないのは、Windows10 32bit・Excel 32bitのコンビだけです。

なんともおそるべし、分析アドイン!

ExcelからIEの位置制御

ExcelでIEを開くとき、HTMLでid=detal1で指定した位置がウインドウの最上段になるように移動させたい。スクロールがベストだがそれ以外でもよしとする。

このHTML中ではなんでもないことが、Excelからとなるとちょっと厄介だ。要素の値の取得はそれほどでもないが、アンカーの位置を取得できない。考えあぐねた結果、下記のようなコードになりました。今回は全ソースを掲載します。

Option Explicit
#If VBA7 And Win64 Then
'  ' 64Bit 版
    Private Declare PtrSafe Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As LongPtr
    Private Declare PtrSafe Function IsIconic Lib "user32" (ByVal hWnd As Long) As LongPtr
    Private Declare PtrSafe Function ShowWindowAsync Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As LongPtr
    Private Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwindow As Long, ByVal cmdshow As Long) As LongPtr
#Else
  ' 32Bit 版
    Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As Long
    Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long
    Private Declare Function ShowWindowAsync Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hwindow As Long, ByVal cmdshow As Long) As Long
#End If

Sub 閲覧()
  Dim objIE As Object
 
  Set objIE = CreateObject("InternetExplorer.application")
  objIE.Visible = False
  objIE.Navigate "http://www.eonet.ne.jp/
 
  Do While objIE.Busy Or objIE.ReadyState <> 4
    DoEvents
  Loop
 
  Application.Wait Now() + TimeValue("00:00:01")
     
  objIE.Visible = True
   
 '最小化されている場合は元に戻す(9=RESTORE:最小化前の状態)
  If IsIconic(objIE.hWnd) Then
     ShowWindowAsync objIE.hWnd, &H9
  End If
     
  #If VBA7 And Win64 Then
     Dim Maxit As LongPtr    'APIのリターン値
  #Else
     Dim Maxit As Long    'APIのリターン値
  #End If
  Maxit = ShowWindow(objIE.hWnd, 3)   '<-- ウインドウ最大化
     
  SetForegroundWindow (objIE.hWnd) '<-- アクティブに

  Dim element As String
  element = objIE.document.getElementById("detail1").ScrollIntoView(True)

End Sub
 

ActiveX コントロールのサイズが変更される不具合は、合わせ技で解決

マイクロソフトサポートでは
「Excel ファイルを開くときに ActiveX コントロールが挿入されていないシートをアクティブにし、その後、コンテンツを有効にしてください。」
とありましたが、これでは完全には回避できませんでした。

参照元:https://support.microsoft.com/ja-jp/help/2557860


困った。フォームコントロールで代替するのはちょっと無理だし…。

試行錯誤の末、下記1+2の対処で解決しました。

【問題1】
リストボックスが、パソコン(解像度などが異なる)によっては1/2リサイズ(縮小)してしまう場合がある。

【対処1】
プロパティを再設定
Enabled を False → これは今回はできないので採用せず。
Locked を True
Integral Height を False

参照元:https://oshiete.goo.ne.jp/qa/1024437.html


【問題2】
対処1により、サイズは縮小しなくなったのですが、代わりにリスト中の文字が2倍ズーム(拡大)してしまいました。

【対処2】
下記のコードを実行して、画面更新
Sub test()
  Dim obj As Object
  
  For Each obj In ActiveSheet.OLEObjects
    obj.Width = obj.Width + 0.1
    obj.Width = obj.Width - 0.1
  Next
End Sub

参照元:http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=56953;id=excel

環境によっては対処2だけでも回避できるようです。

ソースコードハイライトの仕方を勉強します

ご無沙汰しております。

みなさんは、私のブログを見てきっと思っていらっしゃるのではないでしょうか。

「せっかくVBAのソースコードが書かれていても、読みにくいうえに利用しずらい!」

私も他のサイトを訪れてはそう思っていました。このままではいけません。

いろいろネットで調べると、代表的なものとして SyntaxHighlighter がありました。さらに調べると、1.X系・2.X系・3.X系・4.X系があるようです。
使い方などが書かれていましたが、GitHub に移ってからは、ダウンロードしただけでは利用できない物になってしまいました。素人には手が出しにくいです。
それでも何とか 1.51 と 2.1364 を素の状態で手に入れることができました。古いですが、仕上がりは 1.51 の方が私は好みです。

ただし、私はビッグローブの無料会員にすぎません。自分のスペースも自分では扱えないし、JavaScript を個人のスペースに置くことができないようです。

何か代替策がないか調べました。
hightlight.js や google-code-prettify なら、オートローダーをヘッダー等に置けば可能なようですが、無料会員は body 部分だけしか編集できないので結局は上記と同じです。

今のところ表を作り、表内を行単位の背景色をしていする古典的な方法しか思いつきません。
ちなみに、前回のソースコードはこうなります。

Const KEY_ENUMERATE_SUB_KEYS = &H8&
Const KEY_WOW64_64KEY = &H100&
RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"Software\Microsoft\Windows\CurrentVersion\UnInstall", 0&,
KEY_ENUMERATE_SUB_KEYS Or KEY_WOW64_64KEY, Hensu)


本当に申し訳ございません。もう少し勉強させてください。

追記
すみません。自分のスペースにjavascriptの保存はできるようです。画像や動画を保存するスペースを使えばよかったのですね。でも、リンク・ロードの仕方がよくわかりません。ってさわれるの?

ちなみに、CodeHighlighterを使わせていただくとこうなりました。あれこれと装飾に悩むよりもこれのほうがいいと今は感じています。

Const KEY_ENUMERATE_SUB_KEYS = &H8&
Const KEY_WOW64_64KEY = &H100&
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\UnInstall", 0&, KEY_ENUMERATE_SUB_KEYS Or KEY_WOW64_64KEY, Hensu)


参照元:http://ssroute11.at.webry.info/201007/article_1.html

RegOpenKeyExの第4引数がわかればすべてが見えてきた

皆様に謝らないといけないことがございます。

私は、1.2017/02/25のブログ「レジストリキーの最終更新日時取得はRegOpenKeyから」で、RegOpenKeyExは使えないのでRegOpenKeyを使えとぼやきました。
さらに、2.2017/03/04のブログ「なぜか、指示していないWow6432Nodeの方を列挙してしまう」で、RegOpenKeyExがWow6432Nodeにリダイレクトされてしまうとぼやきました。

しかしこれは、そもそもRegOpenKeyExの第4引数の意味が分かっていなかったことが原因でした。これが理解できた時、2つの問題は解決しました。

1.RegOpenKeyExの第4引数の値は常に1だと誤解していたため、正しくOpenしていなかった。
2.RegOpenKeyExの第4引数の値にKEY_WOW64_64KEYのフラグを渡してやればリダイレクトされない。

結論ははこうです。
Const KEY_ENUMERATE_SUB_KEYS = &H8&
Const KEY_WOW64_64KEY = &H100&
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\UnInstall", 0&, KEY_ENUMERATE_SUB_KEYS Or KEY_WOW64_64KEY, Hensu)
 

軽率な発言を反省しております。
それにしても、奥が深いなあ。

なぜか、指示していないWow6432Nodeの方を列挙してしまう

実は、実は、先日のRegOpenKeyなどにも残された課題があるのです。

それは、HKEY_LOCAL_MACHINE\Software\Microsoft\CurrentVersion\UnInstall のサブキーを列挙するよう指示持してもうまくいかないケースがありました。

1.○ Win10 64ビット・Excel2013 64ビット
2.○ Win10 32ビット・Excel2013 32ビット
3.× Win10 64ビット・Excel2013 32ビット

どうも、3・のパソコンはSoftware\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall のサブキーを列挙してしまうようなのです。
RegOpenKey・RegEnumKeyEx・RegQueryValueExのどれもがです。

いったいなぜなのでしょうか?苦悶の日々が続いています。

レジストリキーの最終更新日時取得はRegOpenKeyから

「PCのソフトウエアのインストール日を取得しようとしても、そもそもレジストリに値として登録されていない場合がある。」これが事の始まりでした。

実際、レジストリエディタで、HKEY_LOCAL_MACHINE直下
32ビットアプリの場合はSoftware\Microsoft\Windows\CurrentVersion\UnInstall
64ビットアプリの場合はSoftware\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
のサブキーの値を照会すると、確かにInstallDateの登録がないものが多数あったのです。

それではそもそも値として登録がない場合、Windowsのコントロールパネルは何をもとにインストール日を表示しているのか。

どうやら、「Windowsはレジストリキーへの書込み日時で便宜的に置き換えているらしい。」ということがわかって、どうしてもその日時(最終更新日時になります)を取得したくなったのです。

それには、Win32/64APIが必須。これをExcelVBAで実現すべく試行錯誤の結果、RegOpenKeyExでレジストリキーへの権限を取得して、RegEnumKeyExでサブキーの情報列挙の際に最終更新日時を取得するコードを書いたのですが、なぜかRegOpenKeyExでハンドルは取得できても、そのハンドルでRegEnumKeyExを実行するとエラーを吐いて先へ進みません。

ExcelVBAでのWinAPI情報が少ない中、ネットでいろいろ検索すると、ある方がレジストリサブキーを列挙するコードをアップしておられました。そのコードをみるとRegCloseKeyでレジストリキーを開いているではありませんか。RegOpenKeyは古いWindowsへの互換性のために残されているAPIで、現在はRegOpenKeyExを使うとあったのに…。

ちなみに私のコードをこのRegOpenKeyに書き換えてハンドルを取得、そのハンドルでRegEnumKeyExを実行するとなんとエラーを吐かずに最終更新日時が取得ができたではありませんか。えー。これを使えば、後はFILETIME構造体で取得されたその最終更新日時をSYSTEMTIMEに変換するだけです。

ということで、
1.RegOpenKeyで、レジストリキーへのハンドル(権限)を取得
2.RegEnumKeyExで、レジストリサブキーの最終更新日時を取得
3.FileTimeToSystemTimeで、最終更新日時をSYSTEMTIMEに変換
という手順になりました。

それにしてもなぜなのかわかりません。相性の問題でしょうか?

ワークシートへの画像の挿入はご注意を

何でもやってみないとわからないものですね。
Excelのワークシートに画像を挿入しようとした時のことです。サイズはセルの大きさにピッタリ合わせたいですよね。その際は下のコードが一般的です。

On Error Resume Next

With ActiveSheet.Pictures.Insert(FileName:="C:\test.jpg")
    .Top = TargetCell.Top
    .Left = TargetCell.Left
    .Width = TargetCell.Width
    .Height = TargetCell.Height
End With


ちなみにiPhoneで撮影した画像を貼り付けてみると、うまく挿入される画像もあるのですが、中にはTargetCellから大きく右へずれて、しかも少し大きめのサイズで貼りついてしまう画像があるじゃないですか。
これは画像の方に原因があるのではないかと思って調べてみると、右に大きくずれる画像は右方向に90度回転された画像だったのです。つまり、撮影した元画像をiPhoneが傾き補正した画像でした。

ここで問題を整理すると、次の2点になります。
1.狙ったセルから右に大きく離れた位置に貼りついてしまうこと。
2.縦・横のサイズ調整が逆になってしまうこと。

これを力技で修正したのが下のコードです。

On Error Resume Next

ActiveCell.Select

filePath = "C:\test.jpg"

ActiveSheet.Pictures.Insert(filePath).Select

If Application.WorksheetFunction.VLookup("Orientation", TargetCell, 2, False) < 5 Then
    If Selection.Width > ActiveCell.Width Or Selection.Height > ActiveCell.Height Then
        If Selection.Width / ActiveCell.Width > Selection.Height / ActiveCell.Height Then
            Selection.Height = Selection.Height * (ActiveCell.Width / Selection.Width)
            Selection.Width = ActiveCell.Width
        Else
            Selection.Width = Selection.Width * (ActiveCell.Height / Selection.Height)
            Selection.Height = ActiveCell.Height
        End If
    End If
Else
    If Selection.Width > ActiveCell.Height Or Selection.Height > ActiveCell.Width Then
        If Selection.Width / ActiveCell.Height > Selection.Height / ActiveCell.Width Then
            Selection.Height = Selection.Width * (ActiveCell.Width / Selection.Width)
            Selection.Width = ActiveCell.Height
        Else
            Selection.Width = Selection.Height * (ActiveCell.Height / Selection.Height)
            Selection.Height = ActiveCell.Widtht
        End If
    End If
End If


参照先:http://blog.livedoor.jp/hamu1962/archives/51519248.html
2017/08/17 コード再編集

Excelを閉じる際に意図せぬパスワード要求をされて困っています。Part.2

Windows10 64bit・Excel2013 64bitにて、またまた2年越しの再登場です。

今回も同様に VBA にパスワードをかけているExcelブックで、フォームを開いたときのみ現れるあの症状です。
ただし、前回と異なって表示後2秒ほどたつとダイヤログが自動的に消えるんです。

んー。今回は前回の私の解決策だった『無理やりプロジェクトのコンパイル』という方法はとれません。困った…。
まあしばらくすると自然に消えるのだからよしとするか、とも考えましたがやはり気持ちが悪い。
またもやネットをググって検索すること1時間余り。ふとこの記事が目に留まりました。

「オンラインストレージサービスの DropBox をインストールしているパソコンで、Excel 終了時に「プロジェクト パスワード」の入力ダイアログが表示されることが確認されています。」だと!
参考URL:https://freelance.kantan-aoiro.net/faq/faq14.html

そういえばこの12月から、バックアップは NAS を構築するよりオンラインストレージの方がいいような気がして、 DropBox を導入したのでした。

エーと思いながら、 DropBox を終了させてから Excel を終了したところ、キターっ!あの症状がおこらない!
オンラインストレージということで何かあるかとは思っていたのですが、まさか DropBox 外で保存しているファイルまで影響されるとは。

深いことを考えても無理そうなので考えるのをやめました。とりあえずご報告まで。

「正常に移行できます」なんてウソです

2016年11月1日11:02、突然、k-opticomより「2017年3月31日15:00をもってeoブログサービスを終了します」とメールがありました。

「経営を圧迫するほどの経費の割には利用者が少ないので」というのが理由らしいのですが、今の今まで何の情報開示もしてこなかったのですから、利用者にとってはまさに寝耳に水の出来事です。

苦情をメールにして送ったところ、丁寧語を使ってはいるものの、つまるところ『今まで無料で提供してきたのだから終了するのも経営判断のうち』との弁明。利用者はもともとコミコミでインターネット接続料を支払っているのに、まさか居直られようとは思いもしませんでした。こういう危機管理もあるのかと驚きました。

これ以上何を言っても仕方がないので移行先を探しました。k-opticomとちがって私は読者に迷惑をかけることはできません。

もともとeoblogサービス終了のメールには移行先の照会されていました。その中から比較的安価に広告表示が消せて、なおかつスマホでも読みやすいブログとしてBIGLOBEブログを試してみました。

先のメールでも、正常に移行ができる候補のとして紹介されていたことも選んだ理由の一つだったのですが…。

確かに説明文のとおりに行って、エラーを吐くことなく移行できました。PCからは一見正常に移行したように見えましたが、実はそうではありませんでした。

テキストは一応読み込んでいるようですが、中身を見ると不要なHTMLタグが入っています。1種類だけでも腹立たしいのに、7種類もの不要なタグのなんでもござれ。当ブログの性質からプログラムコードを掲載していたことが災いしたのでしょうか。まったく訳が分かりません。しかも、表題は50字までと制限があったようで編集するとおかしくなってしまいました。

k-opticomは本当にちゃんと調査して回答したのかと、怒りに震えながら、過去ログ1件1件、不要なタグを消しました。

Excel分析アドインは重いだけでなく厄介者ですね

私は3年以上前から悩んでいたことがあるのです。それは、Excelの常駐アプリ化です。具体的に言うと、Excelシートを非表示にして、タスクトレイにアイコン表示するということです。ExcelVBAで簡易グループウエアを開発する際に必要だったのです。

苦心惨憺して、Windows32APIの「Shell_NotifyIcon」を使えば可能なことが分かり、試作品を作っていたのですが、それがちょうど2年前から異常終了してしまうようになりました。エラー項目を見るとオートメーションエラーです。

それからずっと原因がわからなかったのですが、最近やっとわかりました。
どうも、「分析アドインーFUNCRES.XLAM」とそりが合わないようなのです。それが証拠にアドインを無効にしたら、Excelが異常終了しなくなりました。

根本原因がわからないため、技術的な解決とは言えず、対処療法として単なる知識に終わってしまうのですが、悩んでいらっしゃる方がいらっしゃいましたら参考まで。

参照:http://excelfactory.net/excelboard/excelvba/excel.cgi?mode=all&namber=175963&rev=0


ごみ箱へ WindowsAPIはLongLongで

ExcelVBAでファイルをKillするのではなく、ごみ箱に送りたい場合はWindowsAPIを使いますよね。

でも、今やパソコンはx64が主流です。「それならPtrSafeを記述したらよいだけ」だってと思っていませんか、
答えはNoです。

ネットで公開されているコードは古いです。PtrSafeだけでなく、変数の型にも注意しましょう。

× Private Declare Function SHFileOperation Lib "shell32.dll" _
(lpFileOp As SHFILEOPSTRUCT) As Long

〇 Private Declare PtrSafe Function SHFileOperation Lib "shell32.dll" _
(lpFileOp As SHFILEOPSTRUCT) As LongLong



新しいフォルダー (1)の怪

皆さんはご承知かもしれませんが、ちょっと前にハマってしまったことを報告。

VBAなどを用いて、引数を送るタイプの外部アプリケーションを起動する際になぜかエラーが出てしまう。

外部アプリケーションは、Microsoft OLE DB Provider for Jet and Replication Objects (JRO) をつかうものでした。

「複数ステップのOLEDBの操作でエラーが発生しました。各OLEDBの状態の値を確認してください。作業は終了しませんでした。」

はぁ?今まで問題なかったのに何でだめなの?。負の思考が頭の中をぐるぐる回りました。

プログラムのほうをいろいろ触っていて解決できず、最後の最後、過去にうまくいったケースとじっと比べてみて、あっ!
テスト環境のフォルダ名に半角スペースがあることが原因でした。引数としてファイル名を渡す際に障害になります。Windowsではフォルダの新規作成では「新しいフォルダー」と「(」カッコの間に自動的に半角スペースを作ってしまっていたのでした。

よく注意しないとダメですね。


VBAでテキストデータを読み込む

ずいぶんご無沙汰して申し訳ございません。

2,3日前から気にかかっていたことが、今日解決しましたのでご報告します。

標題の件はネットでもいろいろ情報がありますよね。私もあるソフトから出力されたテキストデータをAccessのテーブルに1件ずつ取り込むことを考えたんです。テキストデータが出力されるなら、カンマ区切りが普通だと思っていたんですが、それをExcelで開こうとすると出力されているデータの一部が表示されないことが分かったんです。

それでもって、タブ区切りのほうが精度がいいことが分かってからは、これをデフォルトと考えるようになりました。

話はここからです。ところで、ある海外製のソフト、といっても日本語対応しているものなのですが、そこから出力されたテキストデータを、いつもの通りVBAで1件ずつAccessテーブルに取り込もうとしたら、強制終了してしまうんです。ただし、インポート定義を使ってインポートすると取り込めるんです。

コードは間違っていないだろうしと不思議に思って、イミディエイトウインドウでデバッグしながら値を確認するとどうもおかしい。もしやと思って出力されたテキストデータの文字コードを見るとUnicodeでした。がーん。

気を付けないといけないですね。VBAはShift-JISがデフォルトですから。

前はこれ
Open strFilePath For Input As #FNo
Line Input #FNo, txtData


これに変更
Dim strLine As String
Dim adoSt As Object
Set adoSt = CreateObject("ADODB.Stream")

With adoSt
        .Charset = "Unicode"
        .Open
        .LoadFromFile (strFile)
        strLine = .ReadText(adReadLine)  '1行目項目名カラ読み
        Do Until .EOS
        strLine = .ReadText(adReadLine) '2行目から

WPFはキャプチャ領域を取得するのが肝!Actualが必要です。

PCカメラをつかってキャプチャができないか考えていました。ExcelVBAからWindowsAPIを使ってWebCamに接続する方法が紹介されていましたが、Windows10では動作が不安定なのであきらめました。

そこでC#で作成することを考えましたが、同じく不安定なコードしか見つかりませんでした。いろいろ試した末、GitHUBでC#のWPFを使った唯一安定して接続できるコードが公開されていました。

URL:https://github.com/jsinh-blog-code/wpf-mvvm-webcam-snapshot

これでキャプチャはできました。ただし、WPFはこれまでにはない注意が必要でした。

キャプチャをファイルとして保存すること、Excelへ出力すること、WPFで実行ファイルとDLLを一つにまとめることの3つに分けて考えます。

1番目はキャプチャをファイルとして保存することです。

URL:http://qiita.com/hbsnow/items/8ffd3b6d077d84a92900で公開されているコードは訂正が必要でした。キャプチャ領域を取得することのここが肝ですね。

×imgScreen.Width = (int)pictureBox1.Width;     ※pictureBox1はImageコントロールの名前
×imgScreen.Height = (int)pictureBox1.Height;

imgScreen.Width = (int)pictureBox1.ActualWidth;
imgScreen.Height = (int)pictureBox1.ActualHeight;

2番目はExcelへ出力する方法です。

URL:http://symfoware.blog68.fc2.com/blog-entry-1145.htmlで公開されているコードとURL:http://symfoware.blog68.fc2.com/blog-entry-1147.htmlで公開されているコードをマッチングします。


3番目は実行ファイルとDiLLを一つにまとめることです。

URL:http://qiita.com/VBmouiya/items/d388d49328cb0298eb96で公開されているコードにURL:http://yomon.hatenablog.com/entry/2014/07/14/202243の対処が必要です。

これ以外に、NuGeTパッケージのA.Forge関連やGalasoft.MvvmやClosedXMLなどを参照する必要があります。



技術情報ではないのですが、すみません。記事にしたかったので…。

昨日、私が使っているEvernoteが無料プラン「ベーシック」の容量の上限を超えてしまったので、思案の末、有料プラン「プラス」に入ることにしました。当然、PayPalかクレジット決済ですからクレジットカードが必要ですよね。

Evernoteアプリからクレジットカード情報を入力するのは危険と考えた私は、ブラウザ(Chromeです。)からにしました。

いざ、入力フォームにNameを入力しようとすると、頭文字のアルファベットをいれるとすべてが表示されるではありませんか。それだけではなく、クレジットカードの番号を入力するボックスにも、期限を入れるボックスにも、住所の入れるボックスにも!Evernoteとはいままで直接的な関係はなかったにもかかわらずです。

これが、Ajaxということか。ブラウザですべてのことができるようになることで、EvernoteのECサイト側もそれを利用しているから、オートコンプリートが効いてしまうことになるということか。先日、ブラウザからFacebookにクレジット情報を入力したのをブラウザが記憶していたのか。もし、これを狙われたら大変なことになると恐ろしく思いました。

一昨日、Facebookが持っている私の個人情報をダウンロードすると、電話帳から私の友人の情報が全て取得されていることがわかりました。どおりで、加入したときに、すぐ友人から友達リクエストがきたはずです。その友人には害はなかったことになると思いますが、別の友人にはどうだったでしょうか?企業同士が連携することで個人が特定され、直接的にはその企業に必要ではない情報が集約されていってしまう。そして、企業はそれをマーケット戦略として利用するようになる。私たちは丸ハダカで、意気揚々と通りを歩いていることになります。

私もElon Musk氏と同じ考えを持つようになりました。人類は神(Elon Musk氏は悪魔といっておられますが、)を作ろうとしている。アンドロイドでも超人的なAIでもなく、絶対の支配者を作ろうとしているのでは?それを人間が利用し、また十分コントロールできると思っていることがさらに怖い。ただ、そう考えると、企業や個人を攻撃しているクラッカーやアタッカーも、同じ”あちら側の人間”で、つまり、AIから見ると自分の進化を助けてくれている人間と解釈できないでしょうか。私の日和見主義を反省いたします。

個人を守る、個人本位のアプリを作りたい。性善説という立場に立ち、UIやUXばかりを追ってはいけない。そして、本当に個人を守るアプリというのは常に改善を怠ってはいけない。使っておられる人に迷惑をかけてしまう。アプリを生み出した以上は責任をもって、その行く末も見届けねばならないと思う今日一日でした。

EVERNOTEとの共有について IFTTTの良し悪し

私はずいぶん前からEvernoteを利用しています。ノートブックは500を超えます。でもベーシックです。つまり無料ユーザーです。すみません。

今まではほとんどがWeb共有、Evernote Web Clipperを使うことでした。今ではMicrosoft Edgeもあるようですが、依然存在意義は衰えていません。

さて、最近このEVERNOTEの活用術について2015年2月出版された書籍を購入しましたが、「Webサービスとの連携」という項でIFTTTオンリーで書かれていて、私は違うぞという意見を述べさせてもらいます。

1.メールとの連携
× Gmail→IFTTT→Evernote
これでは、いちいちメールをGmailに転送しなければいけませんし、HTMLメールは正しく表示できません。
OutlookのアドインEvernoteをつかうほうが便利です。ただし、Outlookを使わないといけませんが…。また、3で述べますように、iCloudをインストールすると、Evernoteアドインを弾き飛ばしてしまいます。オプションで再びアドインを読み込むようにしても、不安定な状態です。

2.Pocketとの連携
× Pocket→IFTTT→Evernote
これも私的にはダメです。写真が表示されません。
Pocketの共有機能の方を使い、IFTTT経由しない方がかんたんです。是非この方法をとってください。

3.iphoneカメラロールとの連携
△ Instagram→IFTTT→Evernote
写真のLinkを送れるところがいいです。iCloudの方が正解なのでしょうが、私はあまり賛成しません。後で連携メニューを変更できるとはいえ、初めて連携したときに自分のいらないものまで、何から何まで連携しまくってしまいます。しかも、Bonjour付きのアプリケーションをPCにインストールしなければなりません。私は連携したいときだけ連携したいです。

FacebookログやYouTubeやLinkedlnとの連携は試していません。まだ、必要ないからです。

なお、IFTTTを削除したい場合は、レシピを削除してからアプリを削除してください。そうしないとレシピは残り続けます。このレシピはアカウントごとの端末ごとになので注意してください。別の端末ではアカウントが同じでも参照できません。

スクリーンショットの縮小は縮小専用アプリで

ソフトのマニュアルをHTML文書化していたときに困ったことが起こりました。今までは、Worパソコン画面のスクリーンショットをWordにクリップボード経由で貼り付けて文書を作成し、それをPDF文書化してたんです。画像自体は縮小せずにWordの中で見かけサイズを小さくしただけでした。別段画像が荒いとか特段感じたことはありませんでした。

ところが、今度はHTML文書をつくろうとして同じことをすると、文字がつぶれてしまってとても汚い画像で仕上がってしまうのです。画像自体をリサイズせず、タグ打ちで見かけを小さくしても同じ状態です。これはパソコンの解像度の問題なのかと、あれやこれやパソコンをいじりました。パソコンを変えても、キャプチャソフトを変えても、JPEGからPNGに変えても同じ状態です。ネットを再度ググってやっとたどりつきました。

教えていただいたリサイズ専用ソフトでリサイズした画像をそのままHTMLでタグ打ちすると、なんと文字が判別できる画像になりました。もう開発の終了したソフトなのかもしれませんが、私にはこれで十分です。どうもありがとうございました。

参照:http://ringonoki.net/tool/convert/smahey.php
作者:http://www.uranus.dti.ne.jp/~y-akita/