|
ACCESSのデータを使う |
| 5 |
2006/1/30
SQL文で時刻列で昇順(降順)で並べ替えるときの失敗
時刻列には文字列で0:00〜24:00までのデータが入っています。
SQLstr="Select * from myList Order By TimeValue(時刻列) ;"
とやったらエラーとなってしまった。
ACCESS(mySQLなども)では23:00〜24:00はエラーとなるのです
かといって今さらデータのほうを変えることはできません。
TimeValueのところをVal(時刻列)としたらすんなり行きました。
欲しいのは並べ替えなのでうまくいけばいいのです。
ところがやってみると一応うまく並ぶようなのだがときどき
9:30よりも9:45が前に来ることがあるなど完全ではないことが分かった。
やはり姑息なことではうまくいかない。
Hour(時刻列),Minute(時刻列)を使って
SQLstr="Select * from myList Order By Hour(時刻列),Minute(時刻列) ;"
としたらうまくいきました。
2006/6/1追記
一応これでいいのですが
私のデータの中に時刻列Aにはブランクがありました。
Hour(時刻列A)で問題ないようです。
実際はOrder By Hour(時刻列A),Minute(時刻列A)
としました。
時刻列Bには”24:00”というデータの存在を否定できません。
Hour(時刻列)は0〜23までの制限がありますのでこの場合エラーになってしまいます。のでHour(時刻列B)は使わないことにしました。
|
| 4 |
2006/1/28
データ検索して複数データが抽出された場合同じデータは表示しない。
データの表示はリストボックスに行うとして下記の構文によって複数の条件を設定できる
Do While rS.EOF = False
With ListBox
ListCount = .ListCount
Select Case ListCount
Case Is = 0
.AddItem
.List(0, 0) = rS!A
Case Is >= 1
'-----条件の一致する重複データを表示しない
TyoufukuSuu = 0
For ListCount = 0 To ListCount - 1
If .List(ListCount, 0) & .List(ListCount, 2) & .List(ListCount,
3) = rS!A & rS!B & rS!C Then
'----条件が一致したらTyoufukuSuuの値は>0となる
TyoufukuSuu = TyoufukuSuu + 1
End If
Next
'-----TyoufukuSuu = 0の場合のみリストに加える
If TyoufukuSuu = 0 Then
.AddItem
.List(ListCount, 0) = rS!A
End If
End Select
End With
rS.MoveNext
Loop
|
| 3 |
2005-12-31
DBのリストBのデータを抽出してリストAに入れる
SQL文は
INSERT into List_A
Select * From List_B Where ・・・・
これでうまくいった。
コードも短いし、比較的時間も短い。なぜか時間はばらつきがある。
また二つのリストは同じDBにある場合だ。
別のDBにある場合はどうするか。
これまではデータのレコードを一つづつDoLoopを使って入れていたが時間が結構かかるし、コードも長くなる。
この構文で約100000レコードのデータの検索を早くするのに
EXCEL起動時に検索用の一時的なデータベースに抜き出しておくことによってストレスなしで行えるようになりました。
|
| 2 |
ACCESSの日付データをリストボックスに表示するとき
2005/10/1形式にらるのと
2005/01/01形式になるのとがあるのに気づいた。
2005/10/01になっていないとデータ処理上困るのであった。
rs!日付だと2005/10/01になってリストボックスに入っている。
Month(rS!日付) &"/" & Day(rS!日付) だと 10/1になってリストボックスに入るようだ |
| 1 |
ACCESSのデータベースにADO接続するとき
UserFormが開けないというエラーが出ました。
具体的にはACCESSデータベースのPathがときどき認識できないらしいのです。
いろいろ調べたがよくわかりませんです。
この現象はEXCELXPパーソナル版で出ました。Pro版だと出ないようなのですが自宅のノートに搭載されているパーソナル版では出ないのです。
対策は何かしなくてはならないので
UserFormがActivateになるときのコードを変更しました。
これまではUserform_activate()のコードのすぐ下にACCESSデータベース接続のコードを記述していたのを最後の方に記述してみました。
試してみたところ今のところうまく動作しています。
どうしてもだめならPRO版に変更してみようと思っています。
|
| 1-1 |
ACCESSに接続文字列に問題があるようです。
姑息な手段ではやはりうまくいかない。
うまくいっているように見えても何回も繰り返すうちにエラーがでてしまう。
これでは実用的ではない。
対策を急ぐので思い切ってコントロールパネルの「管理ツール」−「ODBC」を開いて
「ODBCデータソースアドミニストレータ」で
ユーザDSNを設定し(ドライバーはMicrosoft Access Driver(*.mdb)を選択)た。
接続文字列を"DSN=abcd" として設定しユーザさんにテストを依頼した。
接続文字列に"DSN=abcd ;"と”;”をつけるのとつけないのとあるかもしれないと思ったが
他の例を参考にして今回は;をつけないでやってみることにした。
ところが改めてEXCELにADO接続するマイクロソフトのオンラインサポートを見てみると(Accessの接続なのにExcelの接続例を見てしまいました。ごめん。でもいいわけですが参考になるとおもいます)
DSN を含む接続文字列を使用する ODBC プロバイダの例として
"DSN=abcd;"と";"がついているではないか。
それにエクセルに接続する例として
With cN
.Provider="MSDASQL"
.connectionString="DSN=MyExcelDSN;"
.Open
End with
となっている。やはり”;”をつけるのが正しいようだね。
それに
Excelに接続する場合は
.Provider="MSDASQL"はつけるらしいね。
それでMSDASQLの後に";"はつけないようだね。
Accessに接続する場合は
.Provider="Microsoft.Jet.OLEDB.4.0;"
ですね。
改めてこれまでのコード
myFileName="mayu.mdb"
cNstr="Provider=Microsoft.Jet.OLEDB.4.0;" _
&"Data Source=" _
& kdkPath & myFileName
With cN
.ConnectionString=cNstr
.Open
End with
を眺めてみると接続文字列の最後には”;”がついていない。
これはミスですね〜。
しかしもう遅い。今回のテストの結果がどうでも下記のように改めてやってみることにした。
cNstr="Provider=Microsoft.Jet.OLEDB.4.0;" _
&"Data Source=" _
& kdkPath & myFileName &";"
などとすべきだった
|
| 1-2 |
With cNのところは
Accessに接続する場合は
With cN
.Provider="Microsoft.Jet.OLEDB.4.0;"
.ConnectionString="Data Source=" & Path & FileName
&";"
.Open
End with
と考えると俺流にはわかりやすいのだが。
ちなみに
Excelに接続する場合は
(DSN=MyExcelDSNを設定している場合)
(DSNの設定のところは別項で)
With cN
.Provider="MSDASQL" ・・・・”;”をつけない
.ConnectionString="DSN=MyExcelDSN;"
.Open
End with
|
| 1-3 |
やっと見つけたぞ!2005-12-21
エラーになるはずのない実行時エラー”DSN=○○;”が見つかりません。というやつ。
実はNtusRealTimeBackupというバックアップソフトを使っているのだが対象のフォルダーのファイルが保存されると3秒後にバックアップを開始するという優れものなのだが、今回はこれが裏目に出ていた。誤解をしないために蛇足だがNtusRealtimeBackup自体の問題ではないよ。くどいようだが。
つまり
ACCESSのデータが書き換わってすぐに(バックアップソフトがAccessデータをバックアップしている最中に)別のプロシジャーでACCESSを読みに行くと実行時エラーになることがわかった。
それでこのバックアップ動作を停止して同じ操作をしてみると
なんの異常もなく動作するではないか。
自分の環境(WinXPPro+officeXPPro)では何の問題も起きなかったのだがユーザの環境(WinXPHome+officePersonal)では起きる。
環境だけの違いなのか、その他に何かあるのかは現在不明だが
ここまではわかった。たぶん環境の違いではないように思う。
いままでの経過を思い出してみるとここには書いてない現象ともつじつまが合う。
それでたまたまユーザのところでこの作業を完了した直後にユーザがデータの修正があるとのことでバックアップを停止した状態で作業を進めてもらった。
結果問題なくユーザの作業は終了した。
これで今回の騒動は終わりになる見込みがついた。
バックアップは作業終了EXCELが終了したタイミングでNtusRealtimeBackupを引数つきで起動するかPCを停止するときのタイミングで行うようにしたいのだが。これは残件とする。 |