Access総合相談所 其の21 【桐にしとけ】

このエントリーをはてなブックマークに追加
936名無しさん@そうだ選挙にいこう:2009/08/31(月) 21:35:09
>>934
なにかキーになるフィールドがないとダメダメだろうよ。
どういう出方するか保証されないぞ。
数回5ページを指定して、つど違う内容でいいのか?
937933:2009/08/31(月) 22:54:15
>>932の要求内容をおそらく満たさないが、印刷プレビューの状態から
表示されているページのみの印刷ならできそうだな。

俺的には、見込みと限界が掴めたからもういいや。
938932:2009/09/01(火) 08:49:24
みなさん、ありがとうございます。

>>936
連番がふられていないというのはユニークなIDはあるけど1,2,3,4...のように連続していないという意味でした。
わからない書き方をしてごめんなさい。

>>937
プレビューからDoCmd.PrintOutでページ指定ができると思います。

  Dim pgMax As Integer
  Dim pgPrt As Integer
  Dim rpt As Report
  Set rpt = Reports!TestRpt

  pgMax = rpt.Pages
  pgPrt = 1
  Do Until pgPrt > pgMax
    MsgBox pgPrt & "目を印刷します"
    DoCmd.PrintOut acPages, pgPrt, pgPrt
    pgPrt = pgPrt + 1
  Loop

今Accessが手元にないので試せないのですが
こんな感じでやってみようと思います。
939名無しさん@そうだ選挙にいこう:2009/09/03(木) 23:16:10
会社内で受注管理システムを構築しています。
社内LAN内にデータファイルを置こうと思うのですが
LAN接続の外付けHDDとサーバーPCのどちらに置いた方が
アクセス速度は上がりますか?
操作用のファイルはLAN内の個々のPCにあります。
データのアクセス頻度は五分に一度くらいですが同時に3人が
アクセスしたりします。

940名無しさん@そうだ選挙にいこう:2009/09/04(金) 04:43:37
>>939
>LAN接続の外付けHDD
NASとは違うの? 回線速度が速くて、アクセスする人が少ないほうが早いだろう。
941名無しさん@そうだ選挙にいこう:2009/09/05(土) 18:54:04
XP access2002で
サブフォームを61個作ったら
そのフォームを開くときに
「これ以上テーブルまたはクエリーを開くことはできません」
ってポップアップが5回出て来ました。
OKを5回押すと消えて正常にフォームが表示されるのですが、
警告が出ない様にする方法はないでしょうか?
942名無しさん@そうだ選挙にいこう:2009/09/05(土) 19:17:15
あるよ
943名無しさん@そうだ選挙にいこう:2009/09/05(土) 19:56:37
>>941
On Error GoTo
944名無しさん@そうだ選挙にいこう:2009/09/06(日) 11:36:07
VBA上のエラーではなく、フォーム上のエラーメッセージなので
On Error Go To では意味内はず

Docmd.Setwarning False
で警告を無効化できるはず

ただし、その後Access起動中のその後の全ての警告が無効化されてしまうので
フォームクローズイベントかなんかで
Docmd.Setwarning True
を設定してやらないとね
945名無しさん@そうだ選挙にいこう:2009/09/06(日) 12:57:40
ただ警告メッセージは抑えられたとしても、はたしてそれで正しい動作が保障されるか
どうかは、はなはだ疑問ですね
946名無しさん@そうだ選挙にいこう:2009/09/06(日) 13:07:02
>>944
SetWarningで切り替えれるのは
システムメッセージ(アクションクエリ・オブジェクト削除・レコード変更)じゃなかったっけ?
947名無しさん@そうだ選挙にいこう:2009/09/06(日) 14:31:40
そうだっけか?
少なくともデータベースウィンドウで手動で削除しようとした時にメッセージ無効扱いだと
確認なしに無条件で削除されてしまってたけどな
948名無しさん@そうだ選挙にいこう:2009/09/06(日) 14:55:42
サブフォーム61個設置して確かめようとする気にもならんのである
949名無しさん@そうだ選挙にいこう:2009/09/06(日) 16:23:49
>945 に禿同
火災報知機がうるさいから切ればおk
みたいな流れに聞こえるが、それでいいのか?

サブフォーム61個は設計ミスの腐臭がする
950名無しさん@そうだ選挙にいこう:2009/09/06(日) 21:58:36
サブフォームが61個か。想像すらできん。
タブ使っているのかなぁ。レコードソース入れ替えるだけで実現できたりして。
951名無しさん@そうだ選挙にいこう:2009/09/06(日) 23:08:44
一体どういった用途に使ってるんだかそっちの方が気になる
そもそもそんなにあったら、よっぽどの大画面モニターでないと1画面に入りきらないだろうに
グルーピングするなりしないで、返って見づらくないか?
952名無しさん@そうだ選挙にいこう:2009/09/07(月) 00:11:49
1画面の総コントロール数が50個ぐらいになると
情報量として「多すぎるかな」と思っていた俺の存在は……
953名無しさん@そうだ選挙にいこう:2009/09/07(月) 08:50:41
具体的に聞きたいな。
954名無しさん@そうだ選挙にいこう:2009/09/07(月) 13:52:26
【 システム環境  . 】 Windows XP SP3 → Windows Vista SP, Access 2007
【 VBAが使えるか .】 はい
【 VBAでの回答  】 可
【 検索キーワード 】 3265
             要求された名前、または序数に対応する項目がコレクションで見つかりません。

質問です。
最近、XPからVistaに乗り換えたのですが、その際、XPで何ら問題なく動いていた
AccessのVBAが、Vistaでは頻繁に止まり、デバッグモードになってしまう
問題が起きて困っています。

出てくるエラーメッセージは上記にあるとおりです。
また、このメッセージを無視してそのまま再開すると何ら問題なく動き、
また、数分後から数十分後に同じエラーメッセージで止まります。

VBAで行っている処理はだいたい以下のとおりです。

・ADODBでConnectionとRecordsetを定義しテーブル・クエリを開く
・開いたテーブル・クエリの値を元に計算 ← ここでエラーメッセージになる
・別のテーブルに計算結果を格納
・その計算結果を含むクエリをExcelファイルとして出力
・ConnectionとRecordsetを閉じる

どのように対処すれば、エラーを起こさずVBAを回せますでしょうか。
どうかよろしくお願いします。
955名無しさん@そうだ選挙にいこう:2009/09/07(月) 14:09:57
ありそうなパターンは、タブコントロールで取引先ごとにページを作り、
ページごとに抽出条件が異なるサブフォームを配置──かな?
それだったら、>>960のとおり、サブフォームは1つで
あとはインデックスでレコードソースを変えれば済む話なのだが。

>>954
ttp://www.kitagawa-hanga.com/se/s_vberr.html#E3265

書かれている項目で思い当たる節はないか?
意外と型宣言を省略したり、予約語・好ましからざる文字を使っていたりすると
環境が変わるといままで動いていたものが動かなくなったりする。

956名無しさん@そうだ選挙にいこう:2009/09/07(月) 14:15:36
>>954

あ、ADOか。接続ははCurrentProjectでやっているの?
それとも接続文字列を打ち込んでいるの?
後者だったら、サービスプロバイダー名が変わったんじゃなかったっけ?
957名無しさん@そうだ選挙にいこう:2009/09/07(月) 14:28:58
>>954
まず先に、ファイル破損の可能性について対応してみれ
次に、Option Explicitでコンパイルしなおしてみれ
958名無しさん@そうだ選挙にいこう:2009/09/07(月) 18:28:20
>>955-957
回答ありがとうございます。
残念ながら、現状、エラーは出続けているままです。

>954のサイトで思いあたる節はありません。演算に使っている変数の名前を
換えてみたりもしましたが結果は変わりませんでした。

ADOの接続はCurrentProjectでやっています。
参照設定をチェックしてバージョンの新しいものに置き換えたりしてみたのですが
うまくいっていません。

ファイル破損については考えにくいです。数〜数十回以内では連続Loop処理はできています。
また、念のため、適時最適化はかけています。

最後に、Option Explicitでコンパイルしなおしてみましたがやはりダメでした。


気付いたのは、Vistaで何かしら新たにやり始めると止まることが多いことです。
Excelファイルを開いたり、
放置してスクリーンセイバーが起動したり、
ブラウザを開き直したり
などするとエラーが出てVBAが止まります。


引き続きよろしくお願いいたします。
959名無しさん@そうだ選挙にいこう:2009/09/07(月) 18:33:05
該当コードも書かずに…
960名無しさん@そうだ選挙にいこう:2009/09/07(月) 18:47:10
>>958
このエラーってSQLが正しくないと出てきた気がする。
だからコンパイルは通っちゃうんだよね。
別PCにmdbを移動させると、クエリの計算フィールドの名前が変わったりすることがあるけど、
その確認もした?
961名無しさん@そうだ選挙にいこう:2009/09/07(月) 18:48:36
>>959
すみません。
200行を超えるので貼るのは適当ではないかなと判断したのと、
先述のとおり、XPでは問題なく動いていたコードなので、
何らかの設定の違いが問題なのではと考えています。
962名無しさん@そうだ選挙にいこう:2009/09/07(月) 18:58:52
>>960
XPのときから、accdbで使っています。
コードで使用しているフィールド名についても変更がないことは確認しました。
963名無しさん@そうだ選挙にいこう:2009/09/07(月) 19:21:40
原因が不明で解決できそうもないときは
新規accdbにインポートして再構築を実施するようにしてる。
それとoffice修復くらいかの
964名無しさん@そうだ選挙にいこう:2009/09/07(月) 19:32:26
>>962
VBAで呼び出しているクエリを作り直したほうが早そうだな。
あとはcurrentprojectが正しい接続文字列を生成しているか(Debug.Printあたりを使えばいい)、
テーブル名やクエリ名の先頭に半角英字をつけてみるとかぐらいかなぁ。
あとはエラーでとまったところのコードを数行前から提示してみるとか。

965名無しさん@そうだ選挙にいこう:2009/09/07(月) 20:43:39
@ ADODBでConnectionとRecordsetを定義しテーブル・クエリを開く
A 開いたテーブル・クエリの値を元に計算 ← ここでエラーメッセージになる
B 別のテーブルに計算結果を格納
C その計算結果を含むクエリをExcelファイルとして出力
D ConnectionとRecordsetを閉じる

これ@〜Dをかなりの回数ループさせてるってこと?

XP→VISTAで高速PCに乗り換えて、DoCmd.TransferSpreadsheet使ってるなら
むしろ俺はCから疑ってみる。
966名無しさん@そうだ選挙にいこう:2009/09/07(月) 21:31:29
俺、VISTAにしたらExcelの同名上書きを、OSが勝手に既存Excelファイルに行追加にしたりで困った経験あるよ
967名無しさん@そうだ選挙にいこう:2009/09/07(月) 22:17:23
>>963-965
回答ありがとうございます。
しかし、残念ながら、まだ解決しません。

>>963
新規accdbにインポートして再構築をしてみました。office診断もかけてみました。
結果は変わらずでした。

>>965
>954の記載が誤っていました。正しくは、

@ ADODBでConnectionとRecordsetを定義しテーブル・クエリを開く
A 開いたテーブル・クエリの値を元に計算 ← ここでエラーメッセージになる
B 別のテーブルに計算結果を格納
C ConnectionとRecordsetを閉じる
D その計算結果を含むクエリをExcelファイルとして出力

これのA〜Bを40000〜60000ループくらい、
そのA〜Bを含め@〜Dを1700ループくらいです。
Excelファイル出力には、DoCmd.OutputTo acQueryを使い、
新規ファイルを作成しています。
968名無しさん@そうだ選挙にいこう:2009/09/07(月) 22:18:19
>>964
止まる部分ではクエリはいじっていません。
また、CurrentProjectが文字列を引き渡せているかについて、
止まるごとにウォッチ式で確認を取っているのですが、
計算式に使用されているトラックはどうも正常に値を渡しているようです。
テーブル名・クエリ名は頭文字をTやQにしています。
969名無しさん@そうだ選挙にいこう:2009/09/07(月) 22:20:26
> あとはエラーでとまったところのコードを数行前から提示してみるとか。
以下に示しました。よろしくお願いいたします。

rs_mahalanobis_distance_output.Open "T_mahalanobis_distance_output", cn_mahalanobis_distance_output, adOpenKeyset, adLockOptimistic
rs_x_y_aa.Open "Q_m_d_1", cn_x_y_aa, adOpenStatic, adLockReadOnly
rs_sigma_inverse.Open "T_sigma_inverse", cn_sigma_inverse, adOpenStatic, adLockReadOnly

Do Until rs_x_y_aa.EOF
rs_mahalanobis_distance_output.AddNew
rs_mahalanobis_distance_output![ID] = rs_x_y_aa![ID]
rs_sigma_inverse.MoveFirst
For i1 = 1 To 18
temp(i1) = _
rs_sigma_inverse![列1] * rs_x_y_aa![式1] _
           …
+ rs_sigma_inverse![列18] * rs_x_y_aa![式18] ←ここで止まります
rs_sigma_inverse.MoveNext
Next i1
rs_mahalanobis_distance_output![mahalanobis_distance] = _
Sqr(temp(1) * rs_x_y_aa![式1] + _
           …
temp(18) * rs_x_y_aa![式18])
rs_mahalanobis_distance_output.Update
For i1 = 1 To 18
temp(i1) = 0
Next i1
rs_x_y_aa.MoveNext
rs_mahalanobis_distance_output.Update
Loop
970名無しさん@そうだ選挙にいこう:2009/09/07(月) 22:29:55
OS:WindowsXP
Access:2003

テーブルに登録してるフィールドを以下の条件でレポートに
文字変換表示させるようにしています。レコードがNULLの場合は
何も表示させたくないのですが、どのように条件を変更したら
よろしいでしょうか?

=IIf([決定 必修 評価]="欠席","欠席",IIf([決定 必修 評価]="","","認定"))
971名無しさん@そうだ選挙にいこう:2009/09/07(月) 22:57:35
>>969
ちなみにi1がいくつのときにエラーが出るの?
なんかコードを見た感じ、配列が原因っぽいけど。

972名無しさん@そうだ選挙にいこう:2009/09/07(月) 23:04:02
>>971
ばらばらです。直近では、1、11、8。
973名無しさん@そうだ選挙にいこう:2009/09/07(月) 23:30:51
>>970
Nz関数使うか、Switch関数に変更
974名無しさん@そうだ選挙にいこう:2009/09/07(月) 23:52:02
>>954
レコードセット[rs_sigma_inverse] の [列18] を参照できていない旨のエラーだから、
rs_sigma_inverse![列1] → rs_sigma_inverse.Fields(0)
rs_sigma_inverse![列18] → rs_sigma_inverse.Fields(17)
のように参照方法を書き直したら動くかもしれない。

それでも駄目なら、rs_sigma_inverse を ループ前に adOpenStatic で1回だけ開いて
MoveFirst で 使い回すのを止めて、MoveFirst の所で adOpenForwardOnly で都度開く
ようにしたらどうかな?

>>970
NULLを扱うときはNz関数が便利。
975名無しさん@そうだ選挙にいこう:2009/09/07(月) 23:58:59
>>969の件
エラーメッセージからするとフィールド名を見失ってるって感じよねぇ
私も>>974と同じ感想を持った

rs_mahalanobis_distance_output.Updateが2行あるけど、見ないふりした
976名無しさん@そうだ選挙にいこう:2009/09/08(火) 00:20:42
Q_m_d_1の取得をクエリ名ではなくてSQL文字列で書いてみるとか

しかし、何が原因やろね
XP→Vista→7と環境変えてるけど遭遇したことない内容だな
977名無しさん@そうだ選挙にいこう:2009/09/08(火) 00:46:50
rs_sigma_inverse![列1]とかの[ ](中括弧だっけ?)はフィールド名を強調しているだけかと思った。
仮に括弧なしにはコンパイルが通らないなら、そもそもフィールド名に問題があることになるな。
問題があるような名前は、いっそのことエラーではじいてくれたほうが便利なのだが。
978名無しさん@そうだ選挙にいこう:2009/09/08(火) 13:53:02
>>974-977
回答ありがとうございます。
結果は、変わらずです。

>974の2つの方法、>976のSQLでの書法など試してみましたが駄目でした。
Access自体のアンインストール→インストールも行ってみましたが効果なしです。

BTO-PCで相性の悪いババを引いてしまったものとして諦めました。
動かないわけではないので、お守をしながら回していこうと思います。
相談に乗っていただきましてありがとうございました。
979名無しさん@そうだ選挙にいこう:2009/09/08(火) 14:28:28
>>978
メモリにエラーがあるのかもね。お疲れ様です。
チェックして交換してもおうぜ。
980名無しさん@そうだ選挙にいこう:2009/09/09(水) 09:15:26
一気じゃなくて少しづつ計算したらどう?
VB6で1行の長さで引っかかったことがある>外してそうだけど
981名無しさん@そうだ選挙にいこう:2009/09/10(木) 02:23:23
>>939
俺も営業所内で使うシステム自作して、
フォームやVBAなどのMDBファイルは各PCに置いて、
テーブルのMDBファイルはLANタイプHDDに置いて、
同時に数台からのアクセスがある環境で使ってるけど、
全く問題無い。

HDDなら1万円くらいで買えるし、まずはHDDでやってみては?
982981:2009/09/10(木) 02:34:20
補足だけど、連結フォームで作ると、複数PCでの使用はダメでした。
また、フォーム自体は非連結フォームでも、
テーブルをデータソースにしてるコンボボックスが1つでもあるとダメだった。

面倒だけどフォームは全部非連結フォームで、
処理は全部VBAでADO使って書きまくるのが、一番サクサク動く感じがする。
俺が下手なだけかもしれないけど・・・。
983名無しさん@そうだ選挙にいこう:2009/09/10(木) 10:33:57
>>982
access だと、データ処理はローカルで実行するって理解してて
組んだのかなと思う
#データは全部LAN経由で読み込んでから、クエリ処理を行う

>処理は全部VBAでADO使って書きまくるのが、一番サクサク動く感じがする。
これは、普通に正しいと思うが
#もしくは パス・スルー・クエリ使うとか

メンテの時検索できないといやだから、極力VBA+ADOだね
#クエリよりSQLの方が見通しがいいし
#BackはSQLServerEX、Accessはフロントだけが多いw
984名無しさん@そうだ選挙にいこう:2009/09/10(木) 18:36:51
#クエリよりSQLの方が見通しがいいし
#クエリよりSQLの方が見通しがいいし
#クエリよりSQLの方が見通しがいいし
985名無しさん@そうだ選挙にいこう
>>984
UNION はかけないしな
100個近いクエリで、クエリ内クエリが3重、4重の
他人の作ったmdbをメンテすることになったときに、実感すると思うよ
#テーブル変更なんざ、出来ねーよ 簡単に
#大体、^Fで検索対象外だしな