2023年5月13日土曜日

入力補助用便利機能を組み込んで見る

 またまた便利マクロを思いついたのでメモ。ていうか職場でもう実用してます。

擬似的なデータベースファイルとして動作させる

例えばSheet1に請求明細を入力するときに、Sheet2の口座や住所などを記載した利用者名簿からIDを引っ張って来たい場合。新しいウィンドウを開いて「並べて表示」してもいいが、スクロールしたりするときに各々切り替えて操作するのが微妙に面倒。シート切り替えもいちいちマウス持ちたくないのにキーボードだけだと[Ctrl]+[PageDown/Up]でこれも操作が微妙。紙に印刷しておくとかはもう論外です。

なので、Sheet1のID列のセルをダブルクリックしたときに、Sheet2の名簿に検索をかけることにします。このとき、検索キーは氏名にします。テーブルの構成は画像の感じです。

※Sheet1は「請求先マスタ」という名前になっています。またSheet2にはIDを入力したときにVLOOKUPで氏名とフリガナを取得する数式を仕込んでいます。ありがちなやつです。

実コード

ここで仕込むマクロが以下。Sheet2のモジュールに記述するだけです。

Function Search_ID() As String
 Dim buf As String
 Dim Trg As Worksheet
 Dim Reg As Range
 
 If IMEStatus = vbIMEModeOff Then SendKeys "{kanji}"
 buf = InputBox("氏名を入力してください", "利用者氏名検索", "")
  If buf = "" Then Exit Function
  
 Set Trg = Sheets("請求先マスタ")
 
 Set Reg = Tgr.Range("B:B").Find(what:=buf)
 If Reg Is Nothing Then
  MsgBox "該当なし"
  Else: Search_ID = Reg.Offset(0, -1).Value
 End If
 
 If IMEStatus = vbIMEModeOn Then SendKeys "{kanji}"
 
End Function

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 If Not Intersect(Target, Range("A2:A1048576")) Is Nothing Then
  Dim num As String
  num = Search_ID
  Target.Value = num
  SendKeys "{ESC}"
 End If
End Sub

本当はWorkbook.OpenイベントにApplication.Onkeyで[F8]キーかなんかに割り当てるマクロを呼び出させて動作させようと思っていたんですが、職場のセキュリティ設定の関係か動作せず、こんなコードを書きました。

マクロ無効セキュリティの突破

勿論、そうなるとマクロ付きブックであってもただ開いただけではマクロ無効になってしまうので、これを動作させるためにはVBS等からの呼び出しが必要です。念のため、以下記述します。

Dim xlApp
Dim xlWbk

Set xlApp = CreateObject("Excle.Application")
xlApp.Visible = True

Set xlWbk = xlApp.Workbooks.Open("\Hoge\HogeHoge\Hoge001.xlsm", True)

Exit

これをメモ帳などで記述し、拡張子「.vbs」で保存します(なおフォルダおよびファイル名(HogeとかHogeHogeとか)はダミーですので、環境に合わせてフルパスを書いてください)。そのままスクリプトファイルをダブルクリックでもいいし、心配ならショートカットを作成します。これならスクリプトファイルやマクロ付きブックファイルはどこかに隠しておくことが可能なので、削除されてしまうことはありません。

注意事項

ちなみに、これはOfficeの仕様ですが、VBSを使ってマクロ有効でブックを開くと独立のExcelインスタンスとなるため、そのプロセス以外ではマクロ無効となります。その辺は安心なんですが、マクロ有効のインスタンスに他所のマクロを呼び込んだりしないように注意が必要です。

おわりに

このマクロのいいところは、最悪マクロ無効のままでもブックの機能自体は保たれるところです。コードでは別シートの数値(文字列型だけど)を取得してセルに書き込む、つまり手入力を代行しているだけですので。実作業でも同じIDの明細を連続して入力する場合、上のセルの値を手入力すればいいのでこの機能は使わないでしょう。

ちょっとして手間の軽減に応用できればよいと思います。

2022年9月15日木曜日

ChromeOS からラズパイをアップデートなどする方法

 AcerのノートPCをChromeOS Flexにしてしまったので、ラズパイをいじる方法が少々違ってきてしまいました。

NASの操作をするのはこれまで通りブラウザで良いので、Chromeがメインである以上特に変わらないんだけど、問題はラズパイOSのアップデートやアップグレード。LinuxのTerminalやWindowsのコマンドプロンプト/PowerShellに相当するアプリがない。

設定アプリ→(デバイス?→)詳細設定に「Linux開発環境」という項目があり、これをONにする(インストール)と「ターミナル」アプリを使えるように。


使えるようにはなったんですが、これだけだとSSHでraspberrypi.localにはアクセスできませんでした。

なので、Chrome アプリストアから「Secure Shell」というのを入れました。ただこれサポート期限切れてますとか更新してくださいとメッセージが出て、追加の拡張機能をインストールしてっも変わらないのです。ちょっと不安かも。他に適当なアプリがあれば乗り換えるか…

ともかく、一旦はこれでSSH接続できるようになりました。

※ただし、初期設定でSSH有効にしていないとできません

タブに表示されるTerminalで要求されるパスワードを入力したら、ラズパイにログオンしています。

ここで

  1. sudo apt update
  2. sudo list --upgradable
  3. sudo apt full-upgrade
  4. sudo apt autoremove
  5. sudo apt clean

この5つのコマンドを順番に処理させていくだけです。

ちなみに、これはOSバージョン10.0以降(コードネーム"Buster")で推奨の方法だそうです。9.x("Stretch")以前はよくわかりませんが、少なくともStretchについては同じ方法でやっている記事を見かけます。

また、メジャーアップデート(.以前の数字が増える/コードネームが変わる)では非推奨、SDカードに入れて再インストールが良いとのことなので、とりあえずはこれで行きたいと思います。カーネルバージョンを確認するのは

cat /etc/debian_version

でOKです。

同じLinuxベースだから…などと高を括っていたらちょっとやられました。まあ知っていればどうってことはないんですけどね。

今後はaptなどでのメジャーアップデートが可能になるのを期待です。

2022年8月21日日曜日

ChromeOS Flexのキーボードショートカット

 Chromebookのリファレンス、販売されているもの用の記載しかないんですね。DIY版の場合、ショートカットキーはどのキーを使えばいいのか全然わかんなかったりするので備忘録です。

『ウインドウを表示』キーは「F5」

ウィンドウを表示って、何?という感じだが、AndroidやiOS/iPad OSで(スワイプとかホームボタンとかで)アプリの一覧を表示する動作のこと。それはそれとして、このキーを使うとウィンドウ関連のショートカットが使える。ウィンドウ関連なら何と言ってもスクリーンショットです。

スクリーンショット関連のショートカット

  • 画面全体:[Ctrl]+[F5]
  • 画面の一部:[Ctrl]+[Shift]+[F5]
  • アクティブなウィンドウ:[Ctrl]+[Alt]+[F5]

ディスプレイ・デスクトップ関連のショートカット

あまり縁がなさそうだけど、マルチディスプレイを使っている場合や仮想デスクトップを使っている場合はWindows(田)キー。
  • 画面をロック:[田]+[L]
  • スリープする:[田]+[Shift]+[L]
  • ウィンドウを他のディスプレイに切り替え(マルチディスプレイ):[田]+[Alt]+[M]

上2つはわりと使えそう。電池保ちはかなりいいですからね。

Windowsっぽい挙動のためのショートカット

田キーは普通にアプリランチャー呼び出しが使えます。これはちょっとWindowsっぽいです。他にも使えるのは以下でしょうか。

  • ファイルエクスプローラー(「ファイル」アプリ):[Shift]+[Alt]+[M]
  • アクティブウインドウを閉じる:[Ctrl]+[W] ※[Alt]+[F4]は不可
  • タスクマネージャ:[田]+[Esc] ※Windowsとは違うが、なかなか面白い

他にもたくさんあって書ききれないし、忘れてしまったら

  • ショートカット一覧の表示:[Ctrl]+[Alt]+[/]

これだけモニタの端っこに貼っておくのもアリかな。

(参考:https://4thsight.xyz/41777 )

しかしBloggerはリアルタイムで解釈するからか、重たいなぁ。 

2022年8月7日日曜日

Chrome OS Flexの導入

 遂に、念願のChrome OS Flexを導入しました。

ちょっと検索すればやり方は出てきます。何しろGoogle公式が解説してくれていますから。しかし、古いPCを復活させる救世主伝説!あたぁ!と謳われてはいるものの、色々と謎…というか罠が多く、その辺を備忘録として記しておきます。誰かの役に立てばなお幸い。

あまりに古いマシンは無理ぽ

まずはハードウェア要件を確認します。以下、公式より引用。

Chrome OS Flex をインストールする Windows、Mac、Linux デバイス - 対象デバイス

認定モデルでのみ、Chrome OS Flex 機能の正常な動作を保証しています。

認定モデルの類似品では予期しない問題が発生する可能性があります。

認定を受けていないデバイスでも Chrome OS Flex を使用できる場合がありますが、パフォーマンス、機能、安定性は保証されません。

デバイスの最小要件:

アーキテクチャ: Intel または AMD x86 の 64 ビット互換デバイス

RAM: 4 GB

内部ストレージ: 16 GB

USB ドライブからの起動をサポート

BIOS: すべての管理者権限 - 問題が発生した場合、管理者は Chrome OS Flex USB インストーラから起動して BIOS で設定する必要があります。

プロセッサとグラフィック: 2010 年より前に製造されたコンポーネントは、動作が不安定になる可能性があります。

注: Intel GMA 500、600、3600、3650 のグラフィック ハードウェアは、Chrome OS Flex のパフォーマンス基準を満たしていません。

(https://support.google.com/chromeosflex/answer/11552529?hl=ja)

とのことです。基本的には64bit対応プロセッサでないとダメ。ちなみに、認定モデルリストというのもあり、こちらに含まれているハードウェアなら公式で導入実績がある/導入できます、というお墨付きです。はじめにチャレンジしたDELLの『Inspiron mini 10』は、OSロゴから進まずダメでした。さすがに13年前のしかもネットブック(死語)では無理でしたか。幸いもうひとつ手持ちであるAcerの「Aspire R3-131T」はリストに含まれていました。Windows10入れてはいるけど、イマイチもっさりしているし実際Chromeとエクスプローラーくらいしか使ってないから、この際やっちゃおうということになりました。

…が、うまく導入できなかったのです。

ふたつの罠

以下、導入の進捗を書いていきます。つまづいた点は2つありました。

ポートの罠

まず、USBブートができない。

公式の指示どおり、Chromeの拡張機能に『Chromebook リカバリ ユーティリティ』を追加し、そこからUSBリカバリディスクを作成します。

そしてWindowsをShiftキー押しながら再起動かけると、ブートオプションを選択できます。そこで「USBドライブ」を選択するのですが、起動したときに「No Bootable Disk」と言われてしまうのです。これが結構な罠で、BIOSを一生懸命いじってBoot PriorityをUSB FDD/HDD優先にするんだけど、起動画面(この場合Acerロゴ表示)でF12押してもブートオプションに「USB Flash Drive」の項目がないのです。

結論としては、ノートPC(特に、安いもの)の場合はUSBブートできるポートは決まっているということのようです。今回の場合は「手前側」のポートに挿すとブートオプションに表示され、起動できました。あと、もしかしたら再起動ではなくシャットダウンしてからでないとダメかも知れません。たしかに、公式にはそう書いてあるからねぇ。

でも、これに気づいても一旦はChrome OSロゴで止まってしまった。次の罠があったのです。

USBメモリの罠

これはひどいなあと思ったのですが、あちこち検索かけると「ダメなときはHDDを変えてみましょう」と書いている記事がありました。でもさ、HDDでしょ?これはフラッシュドライブだから関係ね…あ、続きがあった…「SanDiskの製品だと起動しないことがあります」だと?たしかにAmazonレビューでケチョンケチョンに書かれているメーカーだな…俺が使ってるこれはたしかにSanDiskではないけど、庶民の味方 E L E C O M だ 。

手持ちにBuffaloのメモリがあったので、ギリギリ8GBだったけどこれでリカバリディスクを再作成してみました。そしたら最初の32GBメモリよりもなんだか時間がかかっている…ってことは前回やっぱり正しく作れていなかったってことなのか?恐る恐る再度挿して電源を入れると…インストーラが起動しました!


あとはGoogleにログインし直せばもうChromeをスマホやデスクトップPCなどと同様に使えるってわけです。あーもうこれでいいじゃん。わざわざWindows導入する必要ないわ。Irfanview使えないのはちょっと残念だけど、逆にGoogleフォトをデフォルトで使えるので、ほぼなんの問題もないわけです。

NASへのアクセスも「ファイル」アプリでできますし。とりあえず動作は軽く、常識的な利用の範囲ではかなり快適っぽいです。

万人におすすめできるわけではないけれど

という事で、Chrome OS Flex。まだまだ導入にそれなりのハードルはありました。ただ、他のLinuxディストリビューションのようなtar zxvfしてとかsudoしてaptで…みたいな何日も、下手したら何週間も掛かってしまいそうな高いハードルではありませんでした。自分でPCを組めるくらいのレベルの方なら全然導入できそうですし、それこそノートPCと言わず古いマザボやCPUで家族用の情報端末を作ろう!とかめちゃめちゃアリなのではと思います。

Microsoft Officeのソフトも使えるようですし、家庭用PCは今後Windowsにとって代わられるのではないかなと思います。コロナ禍やロシアのウクライナ侵略等で続く世界的な半導体不足や、SDGsとかそういった面でもPCのリユースは注目されていますし。

個人的には、これは今後使っていくべきものかな、という印象です。今後導入を目論んでいる方に、この記事が一助となれば幸いです。

2022年1月28日金曜日

VBAでOneDriveのパスを取得する

 世の中リモートワークの機会が増え、クラウドストレージを使う企業も増えてきたことと思います。自分の会社は準エッセンシャルワーカーな職種なためリモートワークとかないんですが、それでも会議はじめオンラインの利用機会が増えたこともあり、OneDriveを使ってね!と言われるようになりました。特に別店舗で同じカテゴリのファイルを上長が見るよ、みたいなケースで。そんな中でマクロ集計とかもするわけですが、継続的に出したいデータ作成なんかでGetOpenFileNameを使いたいときに、ルートディレクトリがOneDriveだとパスを出すのが面倒です。

具体的には”Thisworkbook.Path”とかやってもhttp://から始まるURLが戻ってくるので、操作できねーじゃん、という感じです。ただエクスプローラーからはCドライブに接続されているように見える(だって自動でバックアップされてるわけだし)ので、何かしら方法があるはずです。

「OneDrive」環境変数

ということで多少ググると、マイクロソフトのサポートページに解説がありました(今はリンク見失ってしまって貼れてないんですが)。以下の環境変数があるようです。

  1. OneDriveCommercial:企業アカウントでログインしている場合。
  2. OneDriveConsumer:個人アカウントでログインしている場合。
  3. OneDrive:原則1と同じ。なんで二つあるの?
なので、VBAからはEnviron()を使えば取得できます。例えばChDir()カレントディレクトリを変える場合のコーディングは、

ChDir(Environ(“OneDrive”))

等と書けば良い訳です。はい解決。

と言いたいところですが、実際にはもう少し問題があります。OneDrive直下ファイルだけで済めば世話がないですが、大抵はそんな訳なく、必要なファイルはサブフォルダに分かれて配置されていますよね。先に”Thisworkbook.Path”というネタを出していますが、それを取得できる方法が欲しい。

しかも現実的に、自分の職場は店舗で使っているMicrosoftアカウントが別だという。どうやって接続したのかはよくわかんないけど…。そんな事情もあり、色々考えた末に以下の方法を考えました。

文字列置換Functionを考えてみた

本当はReplace関数あたり使えると便利なんだけど、Thisworkbookから取得できるURLからInStrでディレクトリ名を探してString操作で置換することにしました。

Function OneDrivePath ( tgFile As Workbook, tgFolderName As String ) As String
 Dim fPath As String, uDir As String
  fPath = tgFile.Path
  uDir = Environ ( “OneDrive” )
 OneDrivePath = uDir & Right ( fPath, Len ( tgFile ) - InStr ( 1, fPath, _
 	tgFolderName, vbTextCompare ) - Len ( tgFolderName ) + 1 )
End Function

こんなFunctionをこしらえて、Subプロシージャから

 Dim myPath As String
 myPath = OnedrivePath ( ThisWorkbook.Path, “Documents” )

とかで呼び出すことでパスを作成できます。ちなみにFunctionのRightで文字数指定する際に+1してるのは”/“の分です。

実際に使う

これでパスを作成できたら、あとはChDirして、Application.GetOpenFileNameを呼び出せば狙ったディレクトリからファイルを選択させることができます。一般の方は割とディレクトリの概念自体を理解していないことも多いので、こういう配慮は必要です。もちろんディレクトリ固定なら直接読みに行ってもいいと思います。Open #してLine Inputして…とか。

今後はOneDriveで共有する機会もさらに増えると思われるので、覚えておくと良いかもしれません。

2021年10月13日水曜日

ラズパイのファンを制御する

 前回のラズパイNAS、ひと月ほど使ったところでファンがうるさくなってきてしまいました。古くなった冷蔵庫がたまに唸りを上げますがそれより耳障りな高い音のジーっと言うような音。色々調べたらどうもファンの取り付け方向が逆だったようです…。


(こういうことらしい)

そこで付けなおしてみたんですけど、特にそれで静かになりません。気になり始めるとより気になるのが人の常、下手したら電気ビーバーよりうるさい。おまけに安物ケースだからか取り付け時に締めすぎたのか、ネジ止めの支柱?みたいのがねじ切れてしまいました。

また安物ファンでも本体についている電源GPIOピンを使えばSoC温度が低いときにはファンを止めておけるかも、という情報を得て挑戦しましたがこれも動作せず。でもさらに調べるうちに公式が温度で制御可能なファンを販売しているらしい…そもそもファン制御の機能はわざわざ追加されたものらしいので。

ということなので、公式(スイッチサイエンス)でケースと合わせて購入しました。なんてったって、ケース・ファン・送料全部コミで3000円以下ですから。

Raspberry Pi 4 用ケースファン

上記リンク先見ていただけば分かりますが、組付けはここに書いてある通りです。

公式ケース。

ファンの箱。マニュアルはこれと

これだけ。

ファンの取り付け方だけちょっと分かりにくかったんですが、上記商品ページの動画を見ればおそらく大丈夫。私はわかりました。

GPIOヘッダーの5Vピン(4番)に赤、GND(6番)に黒、GPIO14(8番)に青を挿します。
(ピン番号とGPIOナンバーとの対照表。わかりにくい)


前のスターターキットから本体基盤を取り外します。以下の写真ではまだヒートシンクがついていますが、全て外してファン付属の大きなヒートシンクをSoCにだけ、貼り付けて公式ケースに組み込みました。

途中経過をもっとこまめに撮っておけばよかった…

あとは電源を入れて、設定をします。商品ページにある説明はGUI前提で書かれていますが、当方CUI(Rapsbian Lite)なので、TeraTerm等でRaspberry.localにアクセスし、以下で呼び出します。

$ sudo raspi-config

Configを呼び出したら2以降は書いてある通り。私は設定温度だけ60℃にしました。今のところ全然動作していませんが、60℃を超えるとファンが回り始めるのは確認しました。これで安心です。動作していなければ言うまでもなく静かです。冷蔵庫の方がうるさいです(笑)

ファンが回っていないと、55~56℃くらいで推移しているみたいですね。まあこのくらいの温度なら大丈夫じゃないでしょうか。

一安心したので、ついでにファイアウォールの設定をしました。「ufw」をインストールして、(詳しくは省きますが)家庭内ネットワークのみ許可していったん終了。ユーザー管理だとかポートをどうしようとかありますが、今後VPNサーバーとしての運用も考えているので、それ調べるときにでも設定をするつもりです。


今回の教訓は、「まず公式から買え」ということかな。結果的に余計な出費となってしまった感は否めませんでした。安きゃいいってもんではない、とは思っていたけど、やはりAmazonに頼りすぎだったかも…。


2021年9月4日土曜日

Raspberry PiでNASを自作する

 メインのデスクトップマシンのDドライブ交換、中古で入手した2in1ノートのCドライブSSD換装で余ったHDDが、3.5インチ/2.5インチ各1個ずつありまして。これまでブログ書いたりするときに、画像を使いたい場合はGoogleフォト、書いたテキストを見返したりする場合はGoogleドライブを使用していたんですが、容量が統合になり、そして上限が設けられ、先の見通しを考えるとすべてGoogleサービス依存はリスクが。

 しかもGoogleフォトについてはいったんダウンロードしないといけない(Androidなら問題ないんですけどねえ)というのも不便でして。しかも手間もさることながら、同じデータを自宅のPC2台のストレージに持ってるのはなんだか釈然としないので、2.5HDDを玄人志向のケースに入れて2台のPCでやりとりする運用を始めました。でも割と不便なんですよね、2台のストレージ構成は違っているので、表示されるボリューム記号が違って、その都度頭の切り替えが必要になってしまいます。

 で思いついたのが、この2台のHDDをファイルサーバーに使うということ。メモリを限界まで増強したネットブックがあるので、これにUSBハブを介してHDDを繋げたらどうかな?と。しかしハブはバスパワーだし、10年も前の格安マシンですから、スペック的にさすがに心もとない。しかもスペースもそこそこ取るし、24時間365日稼働ってわけにもいかず、毎日一旦シャットダウンしないと電気代だってバカにならないし、ディスプレイがダメになる可能性も高いわけで。でもそのためにまたデスクトップ1台組むと結局場所も取るしカネかかるでしょ?

 と、これまで興味がありながらも用途を思いつかずスルーしてきたRaspberry Pi(以下ラズパイ)を思いつきました。ちょっとググったらもう4GBメモリモデルもあるし、NAS自作できるって書いてある!windows経由でアクセスすればモニタもキーボードも必要ないし、もうやるしかないぞと。

 早速スターターキットを注文し、設定を開始しました。

尼レビューでは箱が傷だらけとか、まあ動きゃいいので気にしてません

尼レビューには「組み込みがわからなくて不親切」みたいなことが書いてありますが、日本語マニュアルも付いていますし、それ見てやればできるでしょう。プラモデルを作った経験があればおそらく…

マザボ組み込みしたことある方なら余裕でしょう

 一応補足するとしたら、CPUファン(ちっちゃくてかわいい!)はラベル内側が正しい取付位置のようです。

 ハードウェアの組み込みが終われば、実際問題ググればいくらでも構築方法については学べます。一応、参考にした記事どもをリンクで紹介しておきますが。

ラズパイで自宅ファイルサーバを作る ~自作NAS「openmediavault」編~(ITmedia News)

Raspberry pi 4 でNAS(openmediavault)を構築する方法 (Qiita)

【初心者向け】ラズパイの初期設定をするよ【win/mac対応】 (sukiburo)

 少し前の記事のため既に公式のラズパイソフトウェアに「Raspbian」が無くてCUI版なら「Raspberry Pi OS Lite」にしなくちゃいけないとか、コマンドプロンプトでpingしたときにIPv6を有効にしてると面倒で、とかいろいろあったんですけど、基本上記3サイトの内容を組み合わせれば設定できます(※ping等IPアドレスに関しては「raspberrypi.local」を使えば概ね解決します)。ぜひリンク先をご確認ください。

SDカードに書き込んでるところ

HDD2台つないだところ

NASのフォルダ2つ共有完了したところです

 こうなると、とにかく便利ですね。ちなみにスマホからでもアクセス可能です。iOS/iPadOSは通常機能でできるし、AndroidでもSMB対応アプリがあれば余裕です。

 残念ながら、HDDレコーダーは標準機能でNAS接続できないので、録画データを移すとかは無理ですが、その辺は著作権保護の規格とかまた勉強しないといけない点でもありますので、おいおいやっていきたいところです。

 さて次はVPNで出先でもアクセスできるようにすることかな…