2021年8月21日土曜日

vbaでタイム計測


 基本のコードは、以下のとおり。

Debug.print Time&"-XXXXXXXX(Process Name) started"
    (VBA codes)
Debug.print Time&"-XXXXXXXX(Process Name) completed

  VBAデバッグのイミディエートウィンドウには200行ぐらいしか出力(ログ)できないので、テキストファイルに出力する、自分専用のログ出力ルーチンを作るのが良い。

 こんな感じでもいいかも

Dim sTime,eTime,pTime as Double
    sTime = Time
    (procces)
    eTime = Time
    pTime = eTime - sTime
    Debug.Print "所要時間:" & Minute(pTime) & "分" & Second(pTime) & "秒"

  ベランダ菜園の唐辛子は、花が咲き始めているのに8月の長雨というか、今年二度目の梅雨?のために、唐辛子の実がつかない。自然は思う通りにならない。

後日談。長雨の後、虫にやられました。全滅。こまめに面倒見ないと駄目ですね。虫が出たら、木酢液を掛けないとね。来年、リベンジします。

boy202108

2021年8月20日金曜日

DOSバッチのSET 文で「無効な数字です」と怒られたが、それは先頭0 を勝手に8進数とみなし08は8進数じゃないよと怒るマイクロソフトのバグ。でも直すのは、ワタシのバッチという矛盾に辿り着き、100を足して100を引くまでの物語。

  これまで快調に動作していた、ワタシのDOSバッチ。2021年08月になると、突然、動かなくなってしまった。新型コロナウィルスのせいではない。ワンステップずつ、動かして見ると、

SET /A MM=%DATE:~5,2%*1

のSET文で、

SET /A MM=08*1
「無効な数値です。数値定数は10進(17桁)、16進(0x11桁)、または8進(021桁)です」

というエラーが出る。昨日までちゃんと動いていたのにだ。早速、ググってみた。そして、また、先人たちの教えに助けられた。どうも、先頭に0が付くと、8進数とみなすようだ。つまり、8月になり、DATE関数から得た月を示す定数となる部分である「%DATE:~5,2%」が08という定数になってしまった。先頭に0が付いてる8進数の定数なのに、08とはけしからんというわけだ。08は8進数じゃないよと怒っているのだ、(マイクロソフト)なので、先人の教えどおりに、100を足して、100を引いてみた。つまり、

SET /A MM=1%DATE:~5,2*1-100

とワタシの方が変更してみた。これで定数部分が08になることを回避する訳だ。そしたら、見事に動いた。ここまで辿り着くのに、色々、あって半月も要した。

  先頭に0があるから、8進数だと思うのは、マイクロソフトのバグ(コンピュターの黎明期の低級な言語ではよくある陳腐な前提だが、今の時代でも開き直ってる)だが、結局、直すのは、いつも、ワタシの方で、ワタシのDOSバッチである。 もう1つ疑問なのは、昨年の08月にワタシのバッチは異常を訴えなかった。もしかして、マイクロソフトは、パッチで1回修正したのに、それが最近、ハズレたのかなぁ。

  ここでちょっと一息のコーナー。ベランダ菜園の唐辛子の隣に見慣れない蔓草。パプリカかと思つて引き抜いたら、じゃがいもみたいなので、戻しておいた。しばらく、様子を見ることにする。

  もう1つ。関東圏からから関西圏へ引越し、はや2年。関東の醤油ラーメンが恋しい。あのキレのある、しっかりした醤油味のラーメンは、関西にはない。とても残念だ。なぜ、関西の醤油ラーメンは甘たるい醤油味なんだろうね。

canbusgirl20211001




2021年8月12日木曜日

vba で「byRef引数の型が一致しません。」を解決するまでの物語

 EXCEL vba でツールを作っていたら、「byRef引数の型が一致しません。」というエラーが出た。しかし、自分のコードを何回、確認しても型の不一致は見当たらない(不幸にも型の不一致がある場合には型を合わせれば良いだけだ)。そこで、ググってみた。型をなんでもOKのvariantにするといいらしい。やってみたら、文句は言わなくなった。果たして、それでいいのか?納得がいかない。そこで、再び、ググってみた。これらのページに辿り着き、回避できた。

http://blog.subnetwork.jp/?p=1298

http://tsuchida0815.blogspot.com/2008/03/excelvba.html

 結論は、マイクロソフトのバグのようだ。

 そして、上記のページで示されていた解決方法に従い、Dim 変数1,変数2 As Stringと1行にまとめていた宣言をDim 変数1 As Stringと Dim 変数2 As Stringの2行にしてみた。文句が出なくなった。動いた。

 ちなみに、マイクロソフトの説明は、以下で、つまりは、呼び出し元と呼び出し先で型宣言が異なるというものしかなく、そうでない場合に対しては、説明が珍紛漢紛(チンプンカンプン)だ。なんのこっちゃ。https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/byref-argument-type-mismatch

 ここで、一息のコーナー。姫女苑(ヒメジョオン)は、キク科の雑草だ。似たものにハルジオンというのがあるそうだ。ググって見たら、とてもよく似ている。それは、区別できそうでもあり、そうできそうにもない。

carrot20211019

 ロバート・ゴダードの「惜別の賦」(Beyond Recall,1997)を読んだ。他人を簡単に信用すると騙されてエラい目に遭うことになる。

 

2021年7月8日木曜日

accessのクエリで2つのフィールドの和や差をとるといった四則演算ができない現象を解決する物語

  accessのクエリで2つのフィールド(A,B)の和(A+B)や差(A-B)といった四則演算ができない現象に遭遇した。何故、たかが足し算や引き算が出来きんのかなぁ、何が原因なのだろうといろいろと試行錯誤した。計算ができない事態が起きている。その原因は何だろう。そして、突然、閃いた。クエリーで取ってきたフィールドの値がNullになっている箇所があり、それが故に計算できないのではないかと仮定してみた。何故、そんな都合よく、思いついたのか、わからない。

 兎も角、そこで、Nz(A,0)+Nz(B,0)1とかNz(A,0)-Nz(B,0)1という具合にNz関数を使用し、和や差をとってみた。そして、見事に計算できた。

 Nz(A,0)はフィールドAがNull以外ならば Aの値を、Nullならば0をセットする関数だ。つまり、Nullの代替値として0をセットし、Nullがあるが故に演算できないという事態を回避できる訳だ。

 逆に言えば、accessはNullが混じると四則演算といった単純な演算ができず、おまけに出来ないことを知らせるエラーメッセージさえも出さない(出せない)ヤツなので、自分で気が着くしかないということだ。    

 このNz関数が使いこなせるようになれば、access名人に向けて、「ワンランク昇格」だ。

 ここで、一息のコーナーは、ステーキの焼き方だ。

 1センチの肉を焼く時間は、片面1分30秒、もう片面は45秒。1センチ増すごとに+30秒だ。強火で、肉は常温に戻さない。フライパンに蓋をして、2分余熱で通す。




2021年6月17日木曜日

ACCESS(もしくはSQL)で2つのテーブルの片方にしかないデータを抽出するまでの物語

 ACCESSで2つのテーブル(TABLE_AとTABLE_B)が同じKEYフィールドを持つ場合、片方にしかないKEYフィールドのデータを抽出するには、どうすれば良いのか?
AleftOuterJoinBonA.KEY=B.KEYwhereB.KEY=NULL
 【テーブルAにしかないデータを抽出】





 例えば、TABLE_Aにのみ存在するKEYフィールドのデータを抽出するには、SQLビューで、SELECT  * FROM TABLE_A LEFT OUTER JOIN TABLE_B ON TABLE_A.KEY = TABLE_B.KEY WHERE TABLE_B.KEY = NULLと打ち込めで、クエリを作ればいいのだ。
 このSELECT * を使うと、テーブルTABLE_AからKEY が TABLE_Bにはない値を持つデータ(レコード。即ち、行)を抽出してくれる訳だ。


 この=NULLが使いこなせるようになると(この壁を乗り越えるのは意外と簡単ではないが)、ACCESS(SQL)名人に向けて、「ワンランク昇格」だ。いや、「スリーランク昇格」かもしれない。

 ここで、一息、レンチンのとうもろこし。トウモロコシの薄皮を1枚残し、塩水を振りかけて、600度で片側2分、ひっくり返して、600度でもう2分だ。とても美味しいとうもろこしの出来上がりだ。美味しい。もう水から茹でるなんてしない。



  

2021年4月23日金曜日

FMV-BIBLO NB50S slacko7にath5kがなかったので、やむを得ず、kernelを再構築し、ワイヤレスでネットにやっとつなげることができるまでの物語

 slacko7(puppyLinux)がなかなかクールだったので、FMV-BIBLO NB50Sにいれてみた。ところが、カーネルにath5kがないため、ワイヤレスでネットにつなげることができなかった。


それならば、カーネルを再構築するしかないなーと。カーネルソースのsfsとmakeするためのdevナントカ.sfs(開発環境)をインストールし、cd /usr/src/linuxし、make menuconfigでath5kがコンパイルされるようにした。ざっくりといえば、network driver-->のnetwork device support-->のatherosチームを<M>としてみた。そして、make modulesし、make modules_installした。ついにath5k.koができたので、make bzImageでできたbzImageをvmlinuzに変更して、再起動し無事にネットにつながったFMV-BIBLO NB50Sで、この記事を書いているのだ。なお、dmesg | grep ASPMすると、ath5KでASPMのエラーがでていた。エラー回避のために、terminalで以下のコマンドをはたいておかないといけない。
rmmod ath5kし、modprobe ath5k nohwcrypt=1 no_hw_rfkill_switch=1をたたく。次回の起動時に自動的にこれを行うため、echo "options ath5k nohwcrypt=1 no_hw_rfkill_switch=1" > /etc/modprobe.d/ath5k.confも叩いておく。

 J・P・ホーガンの「星を継ぐもの」「ガニメデの優しい巨人」「巨人の星」の3部作を読んだ。振り返ると、第1作目が一番、衝撃的で、面白かったと思う。小説は面白いですね。電車通勤をするようになり、本が読めるようになって、よかった。

 

 

2021年4月7日水曜日

前月同日は、DATE(YEAR(B2),MONTH(B2)-1,DAY(B2))ではなく、EDATE(B2,-1)を使う~EXCELの関数技のお話

 EXCELの関数で、前月同日はどう表現するのか、最初にググって、試したのは、DATEとYEAR,MONTH,DAYを組み合わせたものだった。当日の日付がB2セルに設定されていると仮定する。前月同日は、=DATE(YEAR(B2),MONTH(B2)-1,DAY(B2))という関数で求めることができる。  

 ところが、=DATE(YEAR(B2),MONTH(B2)-1,DAY(B2))だと、当日が月末(29日~31日)に差し掛かると前月同日が同じ日が存在しないため、マズいことが起こる。例えば、当日が2021年3月31日であった場合、前月同日は2021年2月28日となるべきだが、このDATE,YEAR,MONTH,DAYの組み合わせだと、2021年3月3日?になってしまうのだ。  

 こんなときは、=EDATE(B2,-1)を使うと、具合が良くなるのだ。先の例でも、これなら、ちゃんと2021年2月28日を求めることができるのだ。 

 前月同日の関数は、=DATE(YEAR(B2),MONTH(B2)-1,DAY(B2))ではなく、=EDATE(B2,-1)を使いましょう!(B2セルに当日の日付が設定されていると仮定) 

 そして、前年同日の関数は、 =DATE(YEAR(B2)-1,MONTH(B2),DAY(B2))ではなく、=EDATE(B2,-12)を使いましょう!

 ちなみに、ACCESSだとEDATE関数が使えず、DateAdd関数を使う。同月同日ならばDateAdd("m",-1,[日付])やDateAdd("m",-1,TODAY()-1)。前年同日ならばDateAdd("yyyy",-1,[日付])とかDateAdd("yyyy",-1,TODAY()-1)といった「さばき」になる。

 ここで、一息のコーナー。空豆を茹でると、栄養分が湯に流れ出るので、勿体ない。そこで、レンジで600w、2分30秒から3分で鞘のついたまま、チン。ホクホクして、実においしい。