2020年12月3日木曜日

access docmdコマンドではクエリのパラメタを設定できない。じゃ、どうすればいいんだ?

 accessのクエリをDocmdコマンドで自動化しようとしたのだが、そのクエリでは日付をパラメタで指定する必要があるにもかかわらず、Docmdコマンドではパラメタを設定できないことが判明した。それが仕様だ。どうしよう(仕様)もない、しよう(仕様)がないらしい。 やれやれ、
 何かいい手はないものかと、つらつらと考えた。要するに、日付のパラメタを止められればいいわけだ。幸い、ワタシの場合、前日、前々日、前月前日、前年前日の4パターンでクエリーを動かせば事足りる。それならば、日付別に4つクエリーを作れば、パラメタをやめることができる。クエリの日付の抽出条件にそれぞれの日付、つまり、前日にはDate()-1を、前々日にはDate()-2を,前月前日にはDateAdd("m", -1, Date())を、前年前日にはDateAdd("yyyy", -1, Date())をそれぞれ設定すればよいことを思いついてしまった。どうだろう。逆転とまではいかないが、いい感じでしょ。あきらめないこと、それが大事だ。 
 村上春樹さんの「走ることについて語るときに僕の語ること」では「考えるために書く」ことを述べている箇所がある。書かないと考えがまとまらない、深められないのだと。そういえば、Writing is thinkingもしくはThinking is writingみたいなことをスティーブン・キング氏(Stephen Edwin King)が言っていたとおもう。そういうタイトルの本を出していた。いや、On writingだった。

2020年11月30日月曜日

vba pivotitemクラスのvisibleプロパティを設定できません

 vbaで「pivotitemクラスのvisibleプロパティを設定できません。」というエラーが出た。 原因は、ピボットのフィルターに古いアイテムが残るためだ。 
 対処は、[ピボットテーブル オプション] ダイアログ ボックスの [データ] タブの [データ ソースから削除されたアイテムの保持] の [1 フィールドに保持するアイテム数] で [なし] を選択して、[OK] をクリックする。そして、ピボットを更新すればよい。 もしくは、以下のようなvbaを書く。
Dim pvotItem As PivotItem
    Worksheets("WorksheetNameA").PivotTables("pivottable1").PivotCache.MissingItemsLimit = xlMissingItemsNone
    Worksheets("WorksheetNameA").PivotTables("pivottable1").PivotCache.Refresh
    For Each pivotItem In WorkSheets("WorksheetNameA").PivotTables("pivottable1").PivotFields("fieldA").PivotItems
        If pvotItem like "key" then
            povotItem.visible = True
        else
            pvotItem.visible = False
        End If
    Next

2020年10月8日木曜日

windowsでディレクトリ配下の全てのtxtファイルを結合する便利コマンド

type *.txt > all.txt 2>&1
2>&1を付けると、ファイルの内容に先行し、ファイル名が出力されるのだ。 2>&1とは、2番で表現される標準エラー出力も1番で表現される標準出力に出してしまう、いわば、「おまじない」だ。

2020年9月26日土曜日

accessで連番を振るにはdcount関数でカウントする際、idのようなユニークキーを持つフィールドが必須だ

 Accessで連番を振るには条件にあう行をカウントする為、dcount(*,テーブル 名,連番を振りたい条件)と言う感じで書くことになるが、連番の条件にidのようなユニーク(値が重複しない)なキーがなければ、そのようなキーを持つフィールドが必要になる。これがないと、連番を振りたい条件に合致する行が複数ある場合、順番に番号を振ることができない。

 ここで一息のコーナー。超簡単な枝豆の作り方です。
 まず、枝豆を洗う。
 次にフライパンに枝豆+水(枝豆2袋なら70cc)を入れてフタをして中火で7分ぐらい蒸す(ツマミぐして、食べ頃を見極めるのが肝要)。
 時々、かき混ぜる。
 余った水分を切り、最後に塩をツマミ振って、これで完成だ。

2020年9月18日金曜日

Accessで連番を振るDcountで日時データを指定する際、型エラーを避ける為に”#”で挟め

 Accessで連番を振るDcountで日時データを指定する際、型エラーを避ける為には”#”で挟んでおく。 
 即ち、Dcount( "*", "テーブル 1","ID <= " & [テーブル 1]![ID] & " And [日時データフィールド] >=" & "#" & [ テーブル 1]![日時データフィールド[ & "#")としておく。

マイクロソフトはAccessで日時データを扱う時には#で挟むという「おまじない」
を強制するので、忘れないようにするしかない。
  さて、ここで一息のコーナー。  これまでのやり方にはこだわらず、新しいやり方を探求するといいことがある。
  トウモロコシは茹でるよりもレンジでチンすると、美味しくなる。やり方はこうだ。まず、塩水が沁みやくする為、皮を1枚残し、塩水をまぶす。次に、ラップに包んで600wで2分。そして、反転させてもう2分で完成だ。
 これまで食べたことがないくらい、美味しいトウモロコシができるよ。

2020年8月2日日曜日

accessで特定の条件に一致するレコード数をカウントしたいのであれば、sum関数とIIf関数でできるよ

 MS accessを使っていて、特定の条件を満たすレコードの数をカウントしたいことがある。
 そんなときには、sum関数とIIf関数の組合せで実現できる。
 例えば、レコードに「氏名」、「年齢」、「性別」のフィールドがあるとします。
 年齢が60以上の数をカウントしたい場合、クエリのデザインで、名前フィールドに60才以上の数: Sum(IIf[年齢]>=60,1,0)という式を設定し、Σのマークのクリックで集計クエリにし、集計フィールドには「演算」にする。
 このSumで合計、IIfで条件を設定すればよい訳です。

2020年7月13日月曜日

accessのODBC接続でSQLサーバからデータ取得するときにVBAでログイン

 accessのODBC接続でSQLサーバからデータ取得するときに、SQLサーバの参照の度にログイン画面がでてくのは、ウザイ。VBAでログイン処理を書いて自動化したい。つまり、ログイン画面をポップアップさせずに、VBAでODBCでSQLサーバにログインし、データを取って来たいのだ。  よくあるやりかたとしては、ADOコネクションを生成し、DB接続情報をセット(ODBC)、接続をOpenするというrecordsetでデータを取得するというアプローチで、1レコードずつ処理することになるので、面倒くさい。
Set objConn = CreateObject("ADO.Connection")
objConn.ConnectionString = "DSN=DSN1;UID=user1;PWD=password1;" 
objConn.Open
 SQLサーバのテーブルをリンクした、選択クエリを作成している場合、SQLサーバのテーブルへアクセスするのにログイン画面がでてくる。 そのログイン画面を出さないためには、Docmdを使った「簡単な」方法があるのだ。 以下のコードを標準モジュールのどこかに記述してやる。
DoCmd.DeleteObject  Actable,"dbo_TBL-A"
DoCmd.TransferDatabase acLInk,"ODBC Database", _
 "ODBC;DSN=dsn_name;UID=user_id;PWD=pass_wd; _
 & "DATABASE= database_name",acTable,"tabl_name","dbo.tbl_name"
 このテクニックのミソは、TransferDatabaseでSQLサーバのテーブルへのリンクをログイン画面をださすに接続できる、つまり、自動的にコード内で密かにログインしているところだ。そのためにTransferDatabase acLInkの後ろにDB接続情報を記述している。そこがミソなのだ。ちなみにこの文字列はACCESSのリンクテーブルにカーソルを持っていくと、ヌッと表示されるのだ。試してもらいたい。  そして、SQLのテーブルを参照した選択クエリを実行し、EXCELにエクスポートするという2つの操作を1つのDocmdで実現できてしまうのだ。実に効率がいいね。
Dim file1 As String
Docmd TransferSpreadsheet acExport,acSpreadsheetTypeExcel12Xmi,"SELECT_QUERY_USING_SQLserversTable",file1,True