2021年12月31日金曜日

accessからexcelへDoCmd.TransferSpreadsheetでexportできるのは新規ファイルのみだ。

 accessからexcelへDoCmd.TransferSpreadsheetでexportできるのは新規ファイルのみだ。既存ファイルへexportするとtoo many filedsみたいな訳がわからないメッセージでDoCmd.TransferSpreadsheetがエラーになる。(と思う)

 どうしても既存のEXCELに落としたい場合、adoとかdaoとかで1レコードずつ、EXCELの既存シートに上書きするという方法(荒技)もあるようだ。

 でも、どうしても既存ファイルと同じ名前のファイルにエクスポートしたければ、それを削除し、エクスポートするという荒技もある。

buf = "¥¥dir1¥dir2"
file1 = buf & "filename.xlsx")
if dir(file1) <> "" then kill file1
DoCmd.TransferSpreadsheetでfile1へexport  

2021年12月21日火曜日

accessなどのデータベースを使い、ある条件のデータ抽出をするシステムを構築する場合、データのクレンジングがとても大切だ。

 データクレンジング(data cleansing)、或いはデータクリーニング(data cleaning)、またデータスクラビング(data scrubbing) は、データベースを構築する時に、まず、最初に考えておかねばならない。

 その中でもユニークデータの唯一性を担保するのは、とても大切だ。人から与えられたデータがマスタ系でユニークデータであるべきデータであるとするならば、使う前に必ず、唯一性をチェックしておこう。それを怠ると、後で、必ず、大きな「しっぺ返し」を被る。転ばぬ先の杖だ。ユニークなデータの唯一性は必ず、担保しておくこと。肝に銘じよう。

 ここで、一息のコーナー。最近、村上 春樹さんの小説1Q84を再読。ドフトエフスキーの「罪と罰」の登場人物であるラスコーリニコフとサーシャの関係性を使った表現が出てきた。 初めて1Q84を読んだ時には、罪と罰を読んでいなかったので、その文章は染みて来なかった。ところが、先日、たまたま、罪と罰を読むことができていたので、なるほどと思った。より、共感できるような気がした。

2021年12月16日木曜日

accessのクエリでこれを覚えていると善きことがある。

 クエリでIIfを使う場合、複数条件になる時には、IIf(exp1,IIf(exp2,trupart2,falsepart2),falsepart1)とIIfの入れ子にするのが楽だ。IIf(eval(exp1 AND exp2),trupart,falsepart)でもいいようだが・・・

 DateDiff関数とDateAdd関数

 開始日から終了日までの日数を求めるには、DateDiff("d",[開始日],[終了日]) 

 DateDiffの"d"を”WW"にすれば、週数がわかる。

 現在から1ケ月後の日付を得るには、DateAdd("m",1,Dtae())

access vbaでexcelを扱う場合にはCreateObjectでExcel.applicationを立上げておくのがいいようだ。

そうしないと、作成したexcelブックが宙に浮いたままになるようだ。つまり、CreateObjectして、ファイルをオープンし、セーブ、クローズ、そして、EXCELアプリを.quitするといったケアをしないと、駄目なようだ。

 

2021年12月12日日曜日

日本郵便のはがきデザインキットの突然の梯子外しで、マイクロソフトのWord差し込み印刷に回帰するまでの物語

 ここ数年、macで日本郵政製のはがきデザインキットなるアプリを使用していた。このアプリは、adobeのairのテクノロジーをベースに作られていたので、adobeがこのテクノロジーをよその会社へ売り飛ばしたか、本当の理由は定かではないが、日本郵政はairベースのはがきデザインキットを提供しなくなってしまった。そして、突然の梯子外しにワタシは途方に暮れた訳だ。正確に言えば、はがきデザインキットはwebベースで出しているのだが、これまでのものとは全く違う、使えない代物。

 幸い、数年前にWindows10のPCを購入していたので、Wordの差し込みハガキ印刷に戻ることにした。

 住所録は、はがきデザインキットの住所録をコピーすれば良いのが、悪いときには悪いことが更に降りかかるのが人生の鉄則だ。その時、ワタシのmacはOSのバージョンアップを迫られ、新しいOSにしたばかりで、年賀はがき作成キットのアプリは起動できなくなっていたのだった。

 でも、人生は悪い事ばかりではないようだ。はがきデザインキット住所録保存場所でググると、はがきデザインキットの住所録は、youbin10.dbというdbに作成されており、そこからデータを抽出できるのだという。世の中には凄い人達がいる。ありがたい。そして、めでたく、住所録を復元し、Wordで差し込みはがき印刷ができるようになった。やれやれ。

2021年12月3日金曜日

access(sql)で特定のフィールド(列)で重複した値を排除し、ユニークな値だけの集まりを作りたい場合、GROUP化すればよい。

 access(sql)で特定のフィールドで重複した値を排除し、ユニークな値だけにしたい場合、GROUP化すればよい。こういうのが2つ、3つある時には、UNION ALLでマージすれば、いい。GROUP化、のちUNION ALLでマージ。これは便利だ。

2021年11月24日水曜日

スマホでnttのdポイントクラブ(d point club)をニックネームで登録したら、IDがほぼ凍結され干されてしまった。解決策を電話で聞いたら、docomoケータイじゃなくても良いので、「docomoショップへ出掛けてください」と。果して、どうなった?

 スマホでnttのdポイントクラブ(d point club)をニックネームで登録したら、IDが半凍結された。解決策を電話で聞く。結論だけ言えば、それは、docomoショップで本名で変更するしてもらうこと。そして、IDは凍結解除された。めでたし、めでたし。

 解決までの道程をもっと、詳しく語ると、こんな感じだ。ワタシはdocomoのケータイまたはスマホのユーザではない。実はocnモバイルワンのユーザだ。にもかかわらず、dポイントクラブのことはdocomoショップで対応してくれるというので、混んでいないと思われる、平日の昼間を狙って、近所のdocomoショップへ出掛けた訳だ。

 docomoショップに到着すると、今時、そこは予約をしてからいく場所だったことがわかる。やむを得ず、入り口の機械で「受付」をして、空きを待つ。コロナ以後は、どこでも、銀行でも予約は必須のようだ。やれやれ。待つしかない。

 しばらくして、フロア係のお姉さん達が2人ががかりで、ワタシの抱えている問題を解決すべく、色々と尋ねてくれた。まさに、解決に向けて立ち向かってくれた。

 「ここの機械は、docomoのケータイまたはスマホユーザのdポイントは、名前変更ができますが、それ以外の方の分が変更できるかどうか、わかりません。が、やってみましょう」と言ってくれたのだった。

 果たして、ワタシのdポイントクラブのIDとパスワードを入れて、ログインし、本名へ変更できた。すんなりと。そして、本人確認の免許証をアップロードしてくれた。そして、IDの半凍結が解除できた。良かった。docomoユーザじゃなくても、親切、丁寧に、対応して戴いた。「本当に、お世話になりました。」とお姉さん達へ感謝の挨拶をして、帰途につく。良かったなぁ

2021年11月15日月曜日

EXCEL のフィルタ作業をvbaにしてみた。でも、currentRegionの分断で、データ破壊してしまったのは、空白列のせいだった。

 EXCELのフィルタ作業をvbaにしてみた。参考にしたのはtanakaさんのvbaページhttp://officetanaka.net/excel/vba/tips/tips155d.htm

 EXCELに様々な条件でフィルターを掛け、絞り込みつつ、色々なセルに値を設定していく。そうすることで、我々の仕事が進む。そんな作業を自動化するにはvbaが一番だ。





Dim R As range
With Range("A1")
  .Autofilter 5,"="
  .Autofilter 3,array("<60","="),xlFilterValues
  If WorksheetFunction.Subtotal(3,Range("A:A")) > 1 then
    With Range("A1").CurrentRegion.Offset(1,0) 
      For Each R in .Resize(.Rows.Count-1).SpecialCells(xlCellTypeVisible).Rows
        R.Range("E1").Value = "C"
      Next R
    End With
  End If
End with

 でも、これだと、CurrentRegionが空白列或いは空白行でいくつかに分断されている(今回は、空白列で分断)と、その塊の単位でCurrentRegionの列なり、行なり(今回は行)を検出するため、意図していないCellにも、得点が60点以下でもないのに、"C"が設定されてしまい、表(データ)破壊をきたしてしまった(下図)。















 

 これはキツいな。そこで、R.Columnが1(A列、つまり、最初のCurrentRegionであるときのみ、得点が60点以下ならば、”C”を設定するようにしてみた。つまり、この    R.Columnが1(つまり、A列だね)のところがミソなのだ。図はEXCELでなく、OpenOfficeなのは、気にしないでね。

Dim R As range
With Range("A1")
  .Autofilter 5,"="
  .Autofilter 3,array("<60","="),xlFilterValues
  If WorksheetFunction.Subtotal(3,Range("A:A")) > 1 then
    With Range("A1").CurrentRegion.Offset(1,0) 
      For Each R in .Resize(.Rows.Count-1).SpecialCells(xlCellTypeVisible).Rows
        If R.Column = 1 then
          R.Range("E1").Value = "C"
        End If
      Next R
    End With
  End If
End with

 これでいいんじゃないのかな?なぜ、CurrentRegionが分断されていると気がつくことができたか?それは、破壊されたセルの規則性と壊れた内容からの類推。そこで、先ほどのrのアドレスを出してみた。Debug.Print r.addressをイミディエートウィンドウで表示すると、複数のエリアに分割されていたのがわかったのだった。

2021年11月9日火曜日

vbaでdir("*.xls")はリモートファイル(共有フォルダ)のxlsxファイルをゲットできなかったよ。Good Grief(やれやれ)。

vbaでdir("*.xls")はローカルファイル(自分のpc)のxlsxファイルはゲットできたんだけど、リモートファイル(共有フォルダ)のxlsxファイルはゲットできなかったよ。やれやれ。また、マイクロソフトのバグ?でも、そんなときは、dir("*.xlsx*")と書けば良いようです。

2021年11月8日月曜日

モノマネvba虎の穴ルール1:vbaでは最大行を求める前にフィルターをクリアしておけ!

 モノマネvba虎の穴ルール1:vbaでは最大行を求める前にフィルターをクリアしておけ。

maxRow = ActiveWorkbook.Worksheets(1).Cells(Rows.Count,1).End(xlUp).Row
if Worksheets(1).FilterMode = True then WorkSheets(1).showAllData

ではなく、これだ

if Worksheets(1).FilterMode = True then WorkSheets(1).showAllData
maxRow = ActiveWorkbook.Worksheets(1).Cells(Rows.Count,1).End(xlUp).Row

やれやれだ。

2021年11月1日月曜日

vbaで前月同日をどう書くか?そして、それをファイル名にするにはどうすればいいのか?

vbaで前月同日は以下のように1ケ月、日を戻すdateaddで取得できる。

dateadd("m",-1,Date-1)

これを利用して、fileNameという変数に前月同日の文字列を入れるには、以下のようにコーディングする。

fileDate = Year(dateadd("m",-1,Date-1)) & Format(dateadd("m",-1,Date-1,"mm") & Format(dateadd("m",-1,Date-1),"dd")

yearもformatで出した方がいいかな

fileDate = format(dateadd("m",-1,Date-1),"yyyy") & Format(dateadd("m",-1,Date-1,"mm") & Format(dateadd("m",-1,Date-1),"dd")

 実は、最後のFormat(dateadd("m",-1,Date-1),"dd")をFormat(Date-1),"dd")としてしまい、変な日付のファイル名になってしまった。ハハハ。人生にはいろんなことが起こる。一筋縄ではいかないこともある。え、こんなミス、したの?あり得ない。

ここで、一息のコーナーだ。

 先日、特定検診をした。最初は、大きな病院の検診センターみたいなところを探したのだが、いつも予約で一杯。そこで、近所の病院の特定検診にしてみた。歩いていけたし、長い待ち行列はなかったし、意外と良かった。来年もこれでいいなぁと思った。遠くの大病院よりも近くの診療所かな。検査の科目ごとに名前と住所など書類を何個も書かされたのには、閉口した。

2021年10月28日木曜日

vbaで 起動済みの IEを捕まえて、webページから必要な情報をゲットする。

マイクロソフトはもはやIEを使うなといっているが、以下のようなvbaでwebページを捕まえて、情報を抽出してみた。

Dim objIE As InternetExplorer
Dim objITEM As Object
Dim objTD As Object
Dim i As Long
Sub Getpage()
    Set objIE = Nothing
    Set objShell = CreateObject("Shell.Application")
    For Each objWindow In objShell.Windows
    If TypeName(objWindow.document) = "HTMLDocument" then 
        Set objIE = objWindows
        debug.print objIE.document.Title
        If objIE.document.Title = "page-title" then 
            objIE.document.forms("formname").param1.value = "KEYWORD"
            objIE.navigate "javascript:js_001;"   ' Execute javascript js_001
            Application.Wait Now + TimeValue(00:00:02")  '画面表示を2秒待つ
            For Each objTD In objIE.document.getElementsByTagName("tr")                     
                For Each objITEM In objIE.document.getElementsByTagName("a")
                '↑↑↑このgetElementsByTagNameで目的のaタグを手繰るところがミソ
                    If Instr(objITEM.outerHTML,"KEYWORD") > 0 then 
                     ' KEYWORDという文字列を持つaタグ(リンク)を探し、リンクをクリックすると、詳細ページが表示されるという構図。

             'このとき、debug.print objITEM.nameとかobjITEM.vakueとかで確認するのがコツです。

                        objITEM.click 'リンク(ボタン)をクリックする
                        Exit For
                    End If
                Next
            Next
            Application.Wait Now + TimeValue(00:00:02") '画面表示を2秒待つ
    
            ' 上記コードをマネし、getElementsByTageNameでタグを手繰り、必要な情報をゲットする。
            ' HTMLページの解析には、IEの開発者タブF12を使う。
        End If
    End If
End Sub

これでいいかな

こうやって、RPA(robot process automation)をVBAの手作りで始められる。

冬の朝。まだ、日が昇る前に歩くのがいい。息は白い。

2021年10月27日水曜日

vbaでIEを起動し、webページから情報を抽出する。

マイクロソフトはもはやIEを使うな、edgeにしてくれといっているが、以下のようなvbaでIEを起動し、webページを巡回し、情報を抽出してみた。

Dim objIE As InternetExplorer
Dim objITEM As Object
Dim objTD As Object
Dim i As Long
Sub main()
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
    objIE.Navigate2 "http://www.sample.com/index.html")
    Do While objIE.Busy = True Or objIE.readyState<>4 
        DoEvents
    Loop
    objIE.document.forms("form01").param1.Value = "KEYWORD"
    objIE.navigate "javascript:js_001;"   ' Execute javascript js_001
    Application.Wait Now + TimeValue(00:00:02")  '画面表示を2秒待つ
    For Each objTD In objIE.document.getElementsByTagName("tr")                     
      For Each objITEM In objIE.document.getElementsByTagName("a")
        '↑↑↑このgetElementsByTagNameで目的のaタグを手繰るところがミソ
        If Instr(objITEM.outerHTML,"KEYWORD") > 0 then 'KEYWORDという文字列を持つaタグを探し
          objITEM.click                                'リンク(ボタン)をクリックする
          Exit For
        End If
      Next
    Next
    Application.Wait Now + TimeValue(00:00:02") '画面表示を2秒待つ
    
    上記コードをマネし、getElementsByTageNameでタグを手繰り、必要な情報をゲットする。
    HTMLページの解析には、IEの開発者タブF12を使う。
    
End Sub

 これでいいかな?

 途中にある以下のコードは、ページが完全に表示されるまでを待つコードとして、ググると出てくるコードだが、その機能はなさそうだ。

    Do While objIE.Busy = True Or objIE.readyState<>4 
        DoEvents
    Loop

 では、どうすればいいか?それは、表示されたページにあるはずの文字列KEYWORD2が出ているかを確認すればいい。こんな感じだ。文字列を間違えると、無限ループになるので、注意が必要だ。詳しくは、こちらで。EXCEL+VBAで仕事を効率化〜既に開いているIEページをつかまえる。InStr関数で確実に!

        Do While Instr(objIE.document.innertext,"KEYWORD2") = 0 then 'KEYWORD2という文字列が表示されていないならば
          Application.Wait Now + TimeValue(00:00:02") '画面表示を2秒待つ
        End If

2021年10月25日月曜日

webページでテキストファイルのアップロードが失敗した。その理由は、そのwebシステムの改行コードがテキストファイルの改行コードとは異なるためだ。

 webページでテキストファイルのアップロードが失敗した。その理由は、そのwebシステムの改行コードがテキストファイルの改行コードとは異なるためだ。

 一般にwindows系のシステムでは、改行コードはCR+LFで2バイトだ(CRとはCarridge Returnの略で、値は0d。LFとはLine Feedの略で、値は0a)。一方、UNIX 系(Linux含む)のシステムの改行コードは、LFのみだ。CRだけのシステムもあるようだ。それゆえ、web系のシステムをlinuxで作ると、改行コードはLFとなる。

 それに対して、クライアントとして、windowsでアップロードするデータのテキストファイルをテキストディタとかvbaとかで作ると、通常、改行コードはCR+LFとなり、webシステムへのテキストファイルのアップロードがフォーマットエラーとなるわけだ。

 そうならないためには、改行コードを意識して、テキストファイルを作成する必要がある。

 たとえば、windowsクライアントのツールをvbaで作る場合、普通のprint s(sはstringの文字変数)ではCR+LFが付くため、わざわざ、print s & vbLf; とするのだ。最後尾の;がCR+LFを抑止し、vbLfでLFのみを付与d切るのだ。

 テキストエディターの場合、そのソフトが改行コードを指定した保存をサポートしていれば、変更できる。

2021年10月22日金曜日

window系OSでテキストファイル(例えばa.txt)をバイナリ表示したければdosコマンドのdebugを使えば良い。

 windows系OSでwindowのテキストファイル(例えばa.txt)をバイナリ表示したければ、dosコマンドのコマンドラインでdebug a.txtと打ち、dでデータを16進表示できる。こんな感じだ。

debug a.txt
> d 
> nnnn:mmmm 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  1...............   

 ちなみにlinuxならばxxd ファイル名だ。
 ここで一息のコーナーです。味噌汁の出汁を取るのに「煮干し」を使っている。事前(例えば、前日)に煮干しのハラワタをとり、椎茸の粉末とともに水につけておく。そして、味噌汁を作るとき、5分ぐらい煮て、出汁を取る。困ったことは、出汁を取った後の出汁ガラの始末だ。捨てるのは、勿体ない。そこで、煮干しガラの佃煮にしている。鍋に煮干し出汁ガラを入れて、砂糖、醤油、みりん、唐辛子、しょうがを加えて、汁気がなくなるまで煮る。最後にゴマを散らして完成だ。とても旨い。

2021年10月13日水曜日

ある期間のデータを朝イチで自動取得するプログラムを作るとき、事前にその期間が決められない場合、どうすれば良いのか

 ある期間のデータを朝イチで自動取得するプログラムを作るとき、事前にその期間が決められない場合、どうすれば良いのか?

tomoka3


 それならば、毎日、データを取得し、その日付を付けたファイルにしておき、必要になったら、特定の日付のデータを選択し、分析なり、処理すればいい。

どんなパソコン作業でもこまめに保存することが実に大事だということに改めて気づく。

 EXCELにしてもACCESSにしても、いやどんなパソコン作業でもこまめに保存することこそが実に大事だということに改めて気づいだ。ある程度、文書なり、プログラムなり、データなりを蓄積したら、一旦、名前をつけて、保存しよう。そうしないと、何時間もかけて、積み上げた成果が一瞬で、消える。ワタシの時間を返してということになる。消えたものはどうにもならに。パソコンの前で、呆然となる自分がいる。そうならないためには、こまめな保存だ。そして、版数を付けて、途中の版も保存しよう!これこそが仕事をうまくこなすワザだ。こういう、常時保存を自動でやってくれる機能がパソコンにあるといいンだけどね。

tomoka


 ここでちょっと一息のコーナー。昨日、米粉と餅粉にミルク、卵、ベーキングパウダー、しお、バターでパンケーキを作ってみた。ベーキングパウダーの量が少なかったのか、ふっくらとできなかった。次回は、ベーキングパウダーを増やし、リベンジだ。バターは重いので、オリーブオイルにしてみるか。水分も少なめにして、もっとふっくらとさせよう。


2021年10月8日金曜日

vbaでファイルのオープン・クローズを繰り返すとメモリ不足でEXCELがコケた。

 同じフォーマットのEXCEL シート(ファイル)をマージ(統合)するvbaコードで、たくさんファイルを読ませると、メモリ不足でEXCELがコケた。
 ググってみたら、マイクロソフトのバグ らしく、ファイルのオープン・クローズを繰り返すだけで、マイクロソフトはメモリ解放のタイミングを逃してしまうようだ。
 例によって、それが仕様なのでしょう。これを回避するには、closeの後にDoEventsという呪文をかけておかなくてはならないようだ。

Optoon Explicit
Dim maxRow As Long
Dim filePath As string
Dim fileName As String
Dim i,j,k As Long
Sub MergeALL()
    j = 1  ' the row counter of TO(COPY)
    filePath = ThisWorkbook.Path & "¥"
    fileName = Dir(filePath & "*DATA*.xlsx") ' Get a file to be merged
    Do While fileName <> "" ' Is there a file to be merged ? 
        Workbooks.Open Filename :=filePath & fileName
        maxRow = ActiveWorkbook.Worksheets(1).Cells(Roes.Count,3).End(xlUp).Row
        If j = 1 then k = 1    ' k: the row counter of FROM(COPY)
        If j > 1 then k = 3
        m = maxRow - ( k - 1 ) ' m: the numbers of lines to be copied
        ActiveWorkBook.Worksheets(1).Range(Rows(k),Rows(maxrow)).Copy
        ThisWorkBook.Worksheets("まとめ").Activate
        ThisWorkbook.Worksheets("まとめ").Range(Rows(j),Rows(j+m-1).PasteSpecial (xlPasteAll)
        application.CutCopyMode = False
        j = j + m
        Workbooks(fileName).Close
        DoEvents   ' give a chance to release memory area
        fileName = Dir() ' Get the next file to be merged
    Loop
End Sub

こんな感じで、今度こそいいと思う。たぶん。ここで、一息のコーナーです。NHKの100分で名著で、ル・ボンの「群集心理」を観た。政治家やメディアは、しばしば、精緻な論理などを打ち捨て、「断言」「反復」「感染」という手法を使って、群衆たちに「紋切り型のイメージ」「粗雑な陰謀論」「敵-味方の単純図式」を流布する。まさに、そのとおりだなと感じた。誠に、空恐ろしい。




2021年10月5日火曜日

同じフォーマットのEXCEL シートをマージ(統合)するvbaコードを書いてみた。

 同じフォーマット(1行目と2行目がタイトル行で、データは3行目から始まると仮定、ファイル名にDATAという文字列が含まれているものとする)のEXCEL シートをマージ(統合)するvbaコードを書いてみた。マージするファイルはマクロブックと同じフォルダにあるとものとする。使うのは、DIR関数とCopy,Pasteメソッドで、それをDo WhileでLoopさせる。とてもシンプルだ。このツールは自身のシート(”まとめ”)にマージした結果を抱え込む。menuシートでマクロ起動ボタンを作り、マクロ登録すれば、完成だ。

Option Explicit
Dim maxRow As Long
Dim filePath As string
Dim fileName As String
Dim i,j,k As Long
Sub MergeALL()
    j = 1  ' the row counter of TO(COPY)
    filePath = ThisWorkbook.Path & "¥"
    fileName = Dir(filePath & "*DATA*.xlsx") ' Get a file to be merged
    Do While fileName <> "" ' Is there a file to be merged ? 
        Workbooks.Open Filename :=filePath & fileName
        maxRow = ActiveWorkbook.Worksheets(1).Cells(Rows.Count,1).End(xlUp).Row
        If j = 1 then k = 1    ' k: the row counter of FROM(COPY)
        If j > 1 then k = 3
        m = maxRow - ( k - 1 ) ' m: the numbers of lines to be copied
        ActiveWorkBook.Worksheets(1).Range(Rows(k),Rows(maxrow)).Copy
        ThisWorkBook.Worksheets("まとめ").Activate
        ThisWorkbook.Worksheets("まとめ").Range(Rows(j),Rows(j+m-1)).PasteSpecial (xlPasteAll)
        application.CutCopyMode = False
        j = j + m
        Workbooks(fileName).Close
        fileName = Dir() ' Get the next file to be merged
    Loop
End Sub

こんな感じになると思う。


2021年9月17日金曜日

VBAで使うrangeオブジェクトのautofilterメソッドをマイクロソフトのサイトで調べてみた。

 VBAでプログラミングするとき、いつも悩むのが、どう記述すれば良いのか、いわゆる文法(書き方)というか、そもそもの仕様の調べ方だ。どこにあるの?
 例えば、Rangeオブジェクトで使うautofilterメソッドは、以下のページで解説されている。
 https://docs.microsoft.com/ja-jp/office/vba/api/excel.range.autofilter 

 ググるときは、
 VBA、Rangeオブジェクト、autofilterメソッド site:microsoft.com

でいいようだ。

202109-girl
2021.09-girl
 ここで一息のコーナー。今回は、大根の冷凍について。大根が使い切れず、だめにしてしまうことが多いので、冷凍を試みた。大根おろしにして、一回分ずつをラップして、冷凍してみた。解凍が難しいのだが、電子レンジならば、200wで2分ぐらい。時間は量に応じて加減した方が良い。やり過ぎると、煮えてしまうので、1分やって具合をみて、残りは少しずつやり、お好みの解凍状態にするのがよい。

excelで、ある列の飛び飛びになったセルたちをコピペしようとすると、連続した領域でないため、拒否られる。では、どうしたらいいの?例えば、1回ソートしてみる。

 excelで、フィルターし、ある列の飛び飛びになったセルたち(ワタシは密かにこれを飛び地と呼んでいる)をコピペしようとすると、連続した領域でないため、拒否られたこと(ワタシは密かにこれを飛び地問題と呼んでいる)がないだろうか?。

 では、どうしたら回避できるのだろう?

 例えば、1回、その列をソートしてみるのはいかがだろう。

 フィルターの条件によるかもしれないが、セルの値で昇順なり、降順なり、並べ替えておけば、フィルターしても、結果が飛び飛びのセルたちにならず、連続したセルたちになり、具合がいいのではないかと・・・・。

 ここで、一息のコーナー。シャトレーゼの生ワインを試した。赤(カベルネ)を買ってみた。手頃な値段で、かつ美味しい。何よりも、参加防止剤や保存料が入っていないところがいい。最初にビンを買い、次回は交換して、中身を入れてくれるのだという。これまで、ワインのビンを捨てるのが、心苦し買ったので、しばらく、これで行こうと思う。今回、赤を試したので、次回は、白(シャルドネ)も試してみよう。



2021年9月14日火曜日

If AutoFilterMode is NOT working in VBA, Use Both FilterMode and autoFilterMode

 EXCEL  のVBAでシートを操作(例えば、行コピー)する場合、フィルタがかかったままだと、誤動作する(列がズレてコピーされる)ことがあるので、フィルタを解除するコードを書いてみた。

If ActiveSheet.AutoFilterMode = True then  ' フィルタがかかっているかを判定する
    ActiveSheet.Range("A1").autofilter ' フィルタをクリア
    ActiveSheet.AutoFilterMode = False  ' ▽ボタンを消す
End If

でもこれ(AutoFilterMode)だとフィルターがかかっていても、then節を実行してくれない。AutoFilterModeがTrueにならないのだ。 色々試行錯誤し、わかったのだが、そんな時には、AutoFilterModeではなく、FilterModeを使うと、うまく行くかもしれない。逆もありうるので、両方のパターンを網羅する。なんだか、元々がバグのようでなので、わけわかりませんが・・・

If ActiveSheet.FilterMode = True or ActiveSheet.AutoFilterMode = True then  ' フィルタがかかっているかを判定する
    ActiveSheet.Range("A1").autofilter ' フィルタをクリア
    ActiveSheet.AutoFilterMode = False  ' ▽ボタンを消す
End If

試してみてね。マイクロソフトは気ままな会社なので、ユーザはとても大変ですね。

 ここで一息のコーナー。今回は、エノキの冷凍について。エノキが使い切れず、だめにしてしまうことが多いので、冷凍を試みた。4〜5センチに切り、一回分ずつをラップして、冷凍してみた。解凍はせず、そのまま、味噌汁の具鍋に投入。物凄く使い易い。これはもはや、茹で卵の作り方みたいに、どうでもいい情報だね。



2021年9月10日金曜日

If IsChanged(boolean variable) then is NOT working in EXCEL 2016 vba, but working in EXCEL 2013 vba

sleepinggirl202109
sleepinggirl202109
The codes " If IsChanged(boolean variable) then" is NOT working in EXCEL 2016 vba, but working in EXCEL 2013 vba. It should be "If IsChanged= True then".

If IsChanged thenはEXCEL 2016 VBA では何故か動かない、という実行が止まる。F8で進めると動くのだが。それをIf IsChanged=True thenにすれば、文句を言わずに動く。EXCEL 2013 VBAでは文句は言わないのだが、やれやれ。





2021年9月3日金曜日

EXCELをパスワード保護すると出てくる「ファイルは次のユーザーによって保護されています」のユーザー名の文字列に個人名を出したくない場合には、EXCELのオプションで基本設定のMicrosoft Officeのユーザー設定の文字列を個人名でないものへ変更し、その後にパスワード保護を行えば良い。

 EXCELをパスワード保護すると出てくる「ファイルは次のユーザーによって保護されています」のユーザー名の文字列に個人名を出したくない場合には、EXCELのオプションで基本設定のMicrosoft Officeのユーザー設定の文字列を個人名でないものへ変更し、その後にパスワー ド保護を行えば良い。

 一度、設定したものは変更できないので、新たに設定することになるだろう。既にパスワードを設定したファイルの場合、パスワードを変更した時点で、その時点の「EXCELのオプション基本設定のMicrosoft Officeのユーザー設定の文字列に」変更されるのかもしれない。



 例えば、EXCELを第3者に提供する場合、パスワードをかけた個人の名前(図の中の黒塗りの箇所だ。ファイル名が個人名になっていて、ややこしいが、そこじゃないよ)になっていると、個人情報漏洩みたいで、実に具合が悪い。格好悪い。

 そこで、会社の略称なんぞにしたい。

 そんなときには、EXCELのオプションにある、基本設定のMicrosoft Officeのユーザー設定にある個人情報っぽい文字列を会社の略称みたいな文字列に変更した後、EXCELの保存メニューのツールでパスワードを指定し、新規ファイル保存すれば良いのだ。



2021年8月31日火曜日

vbaでEXCELのウィンドウ左下隅にあるステータスバーに進行状況(例:処理中ファイル名など)を表示し、今やってますよと説明責任を果たす。

Application.StatusBar = "処理中..." & fileName(例とし、処理対象のファイル名)で進行状況を出し、終わったら、Application.StatusBar = False でクリアしておく。

face












2021年8月25日水曜日

Windows DOSコマンドでできるワンラインコマンド :特定フォルダのtxtファイルを結合する1発コマンド、しかもファイル名付きで。そして、末尾の2>&1は暗号のようにワンラインぽっく絶妙。

 type *.txt > all.txt 2 >&1


WhiteSuitsBoy202108
 vbaのスニペットをイミディエート・ウィンドウに出す方法をググッたら、スニペットにしたいコードの塊をFunctionとして、1行ずつをdebug.print で” (ダブルクォーテーション)で挟んだモジュールを作成する(Funtionの頭文字をユニークな文字列にしておく)というノウハウが紹介されていた。
 その際、コードの中に” (ダブルクォーテーション)があれば、それをエスケープしれおくという注意書きがあった。それは、” (ダブルクォーテーション)を2回続けることだ。その隣に文字列の「開始」或いは「終了(締め)」としての” (ダブルクォーテーション)があると、3回 ” (ダブルクォーテーション)が連続することになるという訳だ。


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分で鞘のついたまま、チン。ホクホクして、実においしい。

 

2021年3月30日火曜日

星を継ぐもの~30年積読を経て

 最近、ジェームズ・P・ホーガンさんの「星を継ぐもの」を最後までやっと、読むことができた。 なにせ、この30年、積読というか、読み始めると、すぐに睡魔に襲われ、何度となく、挫折していたのだった。 何故、今回は最後まで読めたのだろうか?よく、わからないのだが、最初の月面を歩く2人の男のシーンから前に 進むことができなかったのである。わくわくしなかった。 兎に角、そこをじっーと我慢できたのが勝因だろう。 さて、読み終えた感想は、面白い。凄く、面白い。もっと早く、耐えておけばよかったんだけどね。

 そして、続編の「ガニメデの優しい巨人」を読み、巨人たちの哀しみというか、切なさを感じた。さらに、その続編の「巨人たちの星」に挑む。

2021年1月29日金曜日

ubuntu20.04 +macbook pro(late2013)インストール物語

 ライブDVDでは、まず、wifiを認識してくれない。これが最初の壁だ。 原因はbroadcomのwlanドライバがプロプライエタリなためだ。

 ライブDVDを使うだけならば、対策としては、インストール途中にプロプライエタリなドライバーをロードするサービスを利用すればよい。 具体的には、インストール用のアイコンをクリックし、ディスクを選択する直前でプロプライエタリのソフトウェアのダウンロードをするかどうかきかれるので、ダウンロードを選択すればよい。

 その後、インストール先のディスクを選ぶところでインストールを中止すればよいのだ。 その後、設定アイコンをクリックし、wifiタブをみるとドライバがロードされ、アクセスポイントがずらりと並ぶ。 

 実は、この記事はusbへインストールしたubuntuかつ、macbook pro(late2013)で書いているだが、ここまでくるには、もう2つ、3つの壁を超えなくてはならなかった。

  • uefiによるos起動(ググってUSBへgrubをインストールすればいい) 
  • no rootによるkernel panicの回避(ググってinitramfsをつくればよい)
  • keyboardの設定かつ IMEの設定 (ググってaptでアルミかつJISを設定し、・・・)

 結局のところ、ググればなんとかなって、今に至る。いろいろ夢中でやるのが楽しい。誰かに強制された訳ではなく、好きでやってるのだ。楽しすぎる。

 Mozcの調子が悪いときは、ibus-daemon -drxでリセットすればよい。

そして、gimpを入れて、macではwacomが切り捨て、未サポートとなったBanbooFun(CTH-461/S)というペンタブを使えるようになったのだった。とても長い道程だった。

その後、plankというパッケージを入れて、macぽっくしてみた。設定のIcon Zoomでdockをカーソルが移動するときにアイコンが大小にウェーブする動きもできた。

それから、ファンがまわらず、熱を持ってきたので、ググって、mbpfanを入れて、sudo nano /etc/mbpfan.confで、設定値を変更し、ファンがまわるようにしてみた。

先日、村上春樹さんの「ラオスにいったい何があるというんですか」という紀行文集を読んで、気になったワードをメモしておく。 

  • 伊トスカナ地方のワインーコルティブオーノ(いつか飲みたい)
  • 「来熊」(らいゆうと読む) 
  • オレゴン州ポートランドのウィラメットバレーのピノ・ノワール(いつか飲みたい)

2021年1月17日日曜日

macbook pro(retina,late2013) ubuntu 20.04 live DVD wifi(wlan) trouble shooting

macbook pro(retina,late2013)でubuntu 20.04 liveDVDを動かしてみたらwifiを認識しなかった。
どーすればいいんじゃろとググって2日、諦めかけたときに以下の方法に辿り着いた。
ubuntuのLiveDVDに入っている制限付きモジュールでwifi(wlan)を使えるようにできるのだ。
その方法は、以下の通りだ。
cd /cdrom/pool/main/d/dkms/
sudo dpkg -i *.deb
sudo apt install gcc
cd /cdrom/pool/resricted/b/bcmwl/
sudo dpkg -i *.deb
sudo modprobe wl
村上春樹さんの小説を読んだら、とても面白かった。
そして、紀行文集やドキュメンタリーを読んだら
ひょっとしたら、こちらの方が抜群に面白いというか
もっとうまいのではないかと思った。とりわけ、イタリアやギリシャで暮らした話は見事だった。
人の話を聞くのが好きというのが実によくわかった。