ACCESS総合相談所 その11

このエントリーをはてなブックマークに追加
943941:05/01/10 14:01:55
レスありがとうございます。
このページは前に参考にさせていただいた事があったのですが、
AccessのVBAで機能の実現ができないかと思い、書き込みさせて
頂きました。
APIを使って>>941の機能は実現できないでしょうか?
>>940
ありがとう

非常に助かったよ。もうなんて言うか、サンキュー
945あさこ:05/01/10 17:09:53
【.  目 的  】 画像を一気に挿入
【.  条 件  】 WinME ACCESS2000
■試したけどうまくいかなかった処理
【. 概  要  】 画像を1レコードに1点ずつ挿入したいのですが、一括挿入する方法はありますか?
【駄目な理由】 1点1点挿入するしかないのでしょうか?
■これだけはやりました
>>1を読んだ】 はい
【Googleで調べた】 はい
【検索キーワードは?】 acccess 画像 挿入
>>945
文面から察するにOLEオブジェクト型のフィールドにBMPかなんかの画像を
ファイルから挿入しておられるのだろうと思いますが
この方法は
・件数が多いと挿入が大変
・挿入する度にデータベースのファイルサイズが膨れ上がっていく
などの理由からあまりおすすめいたしません。

テーブルのテキスト型(もしくはメモ型)のフィールドに画像ファイルのパスを保管し、
フォームなどに配置した非連結のイメージコントロールに表示させる、
(フォームのレコード移動時イベントでイメージコントロールにパスを送るコードを記述する)
こういった方法の方が、仰るような一括処理もしやすく、MDBファイルサイズに影響を与えません。

そんでも一応やり方だけでも・・と思って調べましたが、根性なしなので力尽き、
わからなくてもいいや、どうせやんないし・・とあきらめました。
【.  目 的  】 フォームのデザイン(サイズ)を変えたい。
【.  条 件  】 WinXP ACCESS2002
■試したけどうまくいかなかった処理
【. 概  要  】 windowの最小化や閉じるボタンやスクロールバーなどが隠れて操作できなくなる
【駄目な理由】 ウィンドウサイズの固定?プロパティのシラミツブシ
■これだけはやりました
>>1を読んだ】 はい
【Googleで調べた】 はい
【検索キーワードは?】 acccess 最大化 見えなくなる
948947:05/01/11 16:15:12
プロパティではきちんと各ボタン、バーは表示させてます。
どうもウィンドウサイズが一定に固定されている様子。
サブフォームにはしていません。
>>947
境界線スタイルプロパティを「なし」にしてるとか?
そういう問題じゃない?失礼しました
横の方から失礼
>>フォームなどに配置した非連結のイメージコントロールに表示させる、
>>(フォームのレコード移動時イベントでイメージコントロールにパスを送るコードを記述する)
コントロールはいくつか選択肢がありそうだけど、個人的には
Microsoft Forms 2.0 Image がおすすめ

Dim MyPic as Object
Dim MyCtrl as Control
Set MyCtrl=Me![コントロール名]
Set MyPic=LoadPicture("画像パス")
Set MyCtrl.Picture=MyPic

ちょっと書き足せばスライドショーもいけます
951名無しさん@そうだ選挙にいこう:05/01/13 00:31:54
【.  目 的  】 マクロのセキュリティレベルを下げたい
【.  条 件  】 WinXP SP1  Access2003
■試したけどうまくいかなかった処理
【. 概  要  】 〔ツルー〕からマクロのセキュリティタブがない?
【駄目な理由】 DBを開けるときにいちいち警告ログが出てしまうので何とかしたい

初心者ですヘルプ等調べたが、お手上げですよろしくお願いします
セキュリティ下げる方法もどこかで紹介されてたと思うけど
もう一つ、「デジタル署名」という方法があります。
自分のローカル環境のみでも利用可能です。
発行しておいてからVBEのツール>署名でMDBに署名され、
最初にその署名を許可しておけばあとでダイアログでなくなった。
953名無しさん@そうだ選挙にいこう:05/01/13 09:38:07
Windows XPでAccess2000を使っています。

[受付テーブル]
店1, 店2
1, 2
2, 3
[店テーブル]
ID, 店名
1, FUJITSU
2, TOSHIBA
3, PANASONIC
とします。

選択クエリで[店1]と[店2]の店名を表示しようとしています。
[受付テーブル]の[店1]と[店2]から[店テーブル]の[ID]に
線がつながっている状態ですが、店名を二つ下にドラッグしました。
ですが、クエリを開いても何も表示されません。
どうすれば良いでしょうか。
>>953
[店テーブル]をもう一つFORM句に...店テーブル_1となるから
それと受付テーブルの[店2]を結合させる
>>953
下四行の意味が分からないけど、
店1   店名1     店2   店名2
1    FUJITSU    .2     TOSHIBA
2    TOSHIBA    3     PANASONIC


と表示させたいんなら、クエリデザインで店テーブル二つ表示して


店テーブル        受付テーブル          店テーブル1
ID←-------------------店1
                 店2-----------------→ID

でいいんジャマイカ?
956953:05/01/13 13:45:51
>>954,955
できました、ありがとうございます。
同じテーブルをもう一つ追加できるとは思わなかったです。
957あさこ:05/01/14 00:27:20
>>946
具体的なやり方を教えてくれませんか?
1000枚程あるのですが....。

すいません。是非お願いします。
958946:05/01/14 00:52:01
ttp://www.accessclub.jp/samplefile/samplefile_63.htm

ttp://www.accessclub.jp/samplefile/samplefile_200.htm

この辺を参考にしてみてください。
テーブルの設計とフォームでの画像表示の仕組みについて
解説されています。

テーブルのフィールドには画像のファイル名を入力しておき、
フォームで表示する際にその画像ファイルを随時読み込む
といった感じです。
表示する時にはVBAのコーディングが必要になります。

なお、一括挿入にはVBAで記述するか、もしくはテーブルにファイル名を想起させる
ようなフィールドを含めるという手もあります。
例)テーブルの各レコードのIDと画像ファイル名が一致する([ ID ].bmpとかjpgとか)
テーブルAには他のDBからインポートしたデータがあり、日々その内容が変更されたり追加されたりしているので、
過去半年分削除→追加インポートで更新しています。
テーブルBは、テーブルAと同じ主キーを持ち、テーブルAにはないフィールドを補助的に作っています。

例)
テーブルA(自分では変更不可)
[ID][氏名][住所][電話番号][その他内容が追加変更されるフィールド]....

テーブルB(自由にいじれる)
[ID][担当者][入金額][備考].....

この二つ[ID]を1対1でリレーションさせて使用しているのですが、
テーブルAのレコードが増えるたびに、テーブルBにも手動でIDを追加しなければならず、面倒&追加忘れ多々で
困っています。
テーブルAをインポートした時点で、追加されたIDをテーブルBにも自動で追加することはできますか?
INSERT INTO テーブルB(ID)
SELECT ID FROM テーブルA
WHERE NOT EXISTS (SELECT * FROM テーブルB WHERE テーブルB.ID=テーブルA.ID)
ここに質問するのは間違いだな(藁
962名無しさん@そうだ選挙にいこう:05/01/16 00:15:14
access2000です。
表形式のレポートでコントロールソースに以下の式を入れると#erroになります。
=IIf([フィールド名]=1,"1","0")

実験で
=CStr([フィールド名])
だとエラー

=CInt([フィールド名])
だと0が表示されます。

フィールドの方は数値型(整数型)です。
ちなみにフォームではちゃんと実行されます。
なぜでしょうか。
そのコントロールの名前をフィールド名とは違う名前にしましょう。
>>963
盲点でした!
ものすごく助かりました。ありがとうございました。
965963:05/01/16 16:29:23
>>962
追記
レポート内コントロール、ソースの式の値で、レコードソースのフィールド名と
コントロール名が重複した場合、コントロール名が優先され、
各関数によって自身を再帰的に参照してしまうためエラーになる。
例:CStr()関数のエラー時の戻り値は"エラー" + エラー値として格納されている数値を表す文字列
なのでそのように表示されたのだと思われます。

あ・・書いてる間に解決してるしw
966名無しさん@そうだ選挙にいこう:05/01/20 11:32:53
XPでACCESS2002です。言葉では説明しにくいのですが、
コンボボックスが何個かあります。1個目のコンボボックスにはリストからAを選んだとすると、
2個目のコンボボックスのリストはBからスタートさせたいんです。
どういう設定にすればよいでしょうか?

>>966
2個目のコンボ内容をダイナミックに変更せずに、選択位置だけ変えたいのなら

1個目のコンボボックスの更新後イベントプロシージャに
2個目のコンボボックス表示したい連結列の値(Value)を設定するコードを書く
968名無しさん@そうだ選挙にいこう:05/01/20 15:24:46
バイトの時間管理を acccess2000でつくろうとおもっています

3つのフィールド
[開始時間][終了時間][本日の労働時間]について(型は時刻)

[開始時間]フィールドに時刻を入れる際なるべくキーボードは使いたくないので
コンボボックスで選ぶようにしたいのです
[時間][分] この二つのコンボボックスで選ばれた数値を[開始時間]という
時刻型のフィールドに入れるにはどうしたらいいでしょうか?

また[開始時間]フィールド、[終了時間]フィールドに入った数値から
[本日の労働時間]フィールドに自動的に計算して入力されるようにしたいです
どう計算すれば良いのでしょうか
>>966
私は初心者なので、
「コンボボックス 2段階の絞り込み」でぐぐったサイトを参考にさせてもらいました。
>>968
CDate(Format([時間],"00") & ":" & Format([分],"00"))

終了時間-開始時間でいいのでは?
Format([終了時間]-[開始時間],"hh:nn")

休憩/日付跨ぎなどがあるのならそれなりに...
971名無しさん@そうだ選挙にいこう:05/01/21 15:23:47
【.  目 的  】 動作について皆さんのご意見を聞きたい
【.  条 件  】
PC1:PentiumV600、20G、348MB、 WindowsXP ProSP1、Access2000
PC2:Celellon1G、30G、256MB、 WindowsXP HomePS1、Access2000

■試したけどうまくいかなかった処理
【. 概  要  】
3500ほどのレコードの前日差&前日比を計算させるクエリを作成
テーブルをそのままのフィールドX7、算出フィールドX2

【駄目な理由】
動作が非常に遅い。
PC1のスペックで、クエリを開こうとすると5分くらいかかる。<PC2では2分程度
デザインビューで開く分には問題ない。

■これだけはやりました
>>1を読んだ】 はい
【Googleで調べた】 はい
【検索キーワードは?】 Access、動作が遅い

3500件ほどのテーブルは1つだけで、残り数テーブルは500件程度。
上記PCでは、アンダースペックなのでしょうか?
ちょっとスペック違うけど再現してみようかな・・
3500件のテーブルのデータ型とクエリ内の算出フィールドの計算式を
教えてもらえますか。
>>971
算出式って差と比だけでしょ。数千件程度で所要〜分ってのはちょっと異常
それ以前、たとえば当日分前日分を出す段階で、何か極端に効率の悪いことやってる、とか
まさかとは思うが、そのテーブルはリンクテーブルではないよね?
975名無しさん@そうだ選挙にいこう:05/01/24 00:05:00
>>972-973
遅くなりました。
このレスを書き込む直前に、PC1にて再度動作確認を行ってみたところ
1分ほどでクエリを開けました。<これは"普通"の動作時間でしょうか?

一応、皆さんのご意見を伺いたいので、SQLビューを晒します。
リンクテーブルではありません。

SELECT T.Data, T.[A], T.[B], T.[C], T.[D], ([D]-(SELECT [D]
FROM テーブル名
WHERE DATA = ( SELECT MAX( DATA )
FROM テーブル名
WHERE DATA < T.DATA ))) AS E, [E]/[D] AS F, T.[G], T.[H]
FROM テーブル名 AS T;

フィールドDATA:基テーブルから追加。日付時刻型。
フィールドA,B,C,D:基テーブルから追加。通貨型(5桁+小数点以下2桁)。
フィールドE:前日差(Dataフィールドを参照して、当日・前日のDの差を算出)
フィールドF:前日比(E/D)
フィールドG,H:基テーブルから追加。日付時刻型。

E,F以外はフィールドを追加したのみで、特に計算に利用していません。
A,B,C,Dを通貨型としているのは、「算出精度」が高いと聞いたからです。(真相未確認)
以前は倍精度浮動小数点型でしたが、動作スピードに変わりはありませんでした。

上記SQLも、Web上にてご教示いただいたものです。
「当方のAccessがおかしいかも・・」と思い、Officeの修復・再インストールを行っています。
そのときは、相変わらずPC1でクエリを開くのに5分ほどかかりました。
あー、WHEREでサブクエリ使っちゃったか
いや別に悪いことじゃないんだけど
何となくなるほどって感じ
細かいところまでは見てないから分からないけど
(きょうは眠くてやってられない)、もしかしたら
もっと速くいける方法があるかも
(ずーっと前、1万件ぐらいのデータでWHEREサブクエリ使って、
トイレから戻っても処理が終わらないので頭にきて電源切っちゃった経験あり)
ctrl+breakで中断できなかったっけ?
質問です。アクセスでHTML(ページ)を作るときにはやはり、
HTML言語を学ばないといけないのでしょうか?
それともJAVAスクリプトですか?
979サブクリえん:05/01/25 16:57:22
>>976
そうなんですか。

もしよろしければ動作の速い方法をご教示ください。
このスレを巡回しますので、いつでも結構です。

仮コテつけておきます。
>>978
釣り市ね
>>978
アクセス
>>978
まずはCから

って釣りなの?
983>>979:05/01/26 01:35:48
やろうとしていることに比べてクエリが複雑すぎ
テーブル中、計算に必要なのは日付DATAとDの値だけだよね

ひとまずフィールドA,B,C,G,Hは無視

テーブル(日付, 金額)として、以下をコピペしてみて

たぶん100倍ぐらいは速くなると思う

SELECT Q0.本日, Q0.前日, Q0.金額 AS 本日金額, テーブル.金額 AS 前日金額, [本日金額]-[前日金額] AS E, ([本日金額]-[前日金額])/[本日金額] AS F
FROM (SELECT テーブル.日付 AS 本日, テーブル.金額, [日付]-1 AS 前日 FROM テーブル) AS Q0 LEFT JOIN テーブル ON Q0.前日 = テーブル.日付
984サブクリえん:05/01/26 16:09:44
>>983
うわっ!
めっさ速くなった!!!<一瞬で表示できます

・・・がっ!
前日金額のフィールドが抜けてる箇所があります。
当方の説明不足でしたが、日付データは毎日ではなく、土日祝日を除いた日付です。
(年末年始なども除く)

ですので、以下のような日付の跳んでいる箇所では前日金額が表示されず算出されません。
1991/01/11
1991/01/14:算出されず
1991/01/16:算出されず
1991/01/17:算出OK

この点はどのようにしたら良いのでしょうか?
動作は非常に速いので、ぜひ利用させていただきたいです。
よろしくお願いいたします。
985名無しさん@そうだ選挙にいこう:05/01/26 20:08:34
もう少し自分で考える努力をしたら?
WINDOWS XPでACCESS2003を使用しています。
連結オブジェクトフレームを使用してフォームにjpg画像を表示したいのですが、
アイコン表示になってしまい確認できません。
Photo Editerに変わって入ったPictureManagerにJPGの関連付け機能がないというのが
理由らしい、というのは検索して判ったのですが、「photoEditor」を入手できない状況で
これを解決する方法はありますでしょうか?
>>986
PSPとかは? 試してないけど・・・
988>>984:05/01/27 00:03:23
僕の負け
(たかが「前日」を出すのに何であんな複雑なサブクエリを使ったのか、
理由を読みとれなかったという意味で、負け)

ただの前日ならマイナス1日でいいだろう、前日金額がない日は差比もNullでいいだろうと、
単純にクエリ式で出しちゃったけど、その日にとっての前日がいつなのか状況によって
変わるようなら、別あつらえの当日前日カレンダーみたいなものを用意しなきゃダメっぽい。
ただこれはクエリだけでやろうとするなら、の話。

VBAでレコードセット開けば、何とでもできる(レコード一個一個見て、前日データがなければ
あるところまでさかのぼってそれを前日とする、みたいなやり方。数千件程度だったら
処理時間はそんなにかからないと思う。パズルとしては面白そうなのでそのうち気が向いたら、ね)
989>>984:05/01/27 02:49:57
元テーブル(日付, 金額)
出力用仮テーブル(本日, 前日, 本日金額, 前日金額, 差, 比)

として、モジュールに以下をコピペ

Function KingakuSaHi()
Dim DHon As Date, DZen As Date
Dim GHon As Currency, GZen As Currency
Dim RST0 As New ADODB.Recordset, RST1 As New ADODB.Recordset
Set RST0 = New ADODB.Recordset
Set RST1 = New ADODB.Recordset
CurrentProject.Connection.Execute "DELETE * FROM 出力用仮テーブル"
RST0.Open "SELECT 日付, 金額 FROM 元テーブル ORDER BY 日付 DESC", CurrentProject.Connection
RST1.Open "出力用仮テーブル", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
990続き:05/01/27 02:50:46
RST0.MoveFirst
Do Until RST0.EOF
DHon = RST0![日付]
GHon = RST0![金額]
RST0.MoveNext
If RST0.EOF Then
Exit Function
End If
DZen = RST0![日付]
GZen = RST0![金額]
RST1.AddNew
RST1![本日] = DHon
RST1![前日] = DZen
RST1![本日金額] = GHon
RST1![前日金額] = GZen
RST1![差] = GHon - GZen
RST1![比] = (GHon - GZen) / GHon
RST1.Update
Loop
RST0.Close
Set RST0 = Nothing
RST1.Close
Set RST1 = Nothing
End Function

あとは適当な場所からこのファンクションを呼び出して
(呼び出し方が分かんなかったら
マクロ→プロシージャの実行→プロシージャ名 KingakuSaHi ()
でもいい)

Ac2000, Win98, 400MHz, 128MBで、3秒ぐらい
992
>>979
眺めてたけどやはり>>983氏のアプローチが良いと思う。
しかし休日の問題があるのであらかじめ前後関係をはっきりさせる
"連番"列を追加した"一時テーブル"を作成する。

SELECT 日付,金額 INTO 一時テーブル FROM テーブル ORDER BY 日付;
ALTER TABLE 一時テーブル ADD COLUMN 連番 AUTOINCREMENT;

上記SQLをマクロなどで警告なしで連続実行させた後に
>>983氏のクエリを元にした以下のクエリを実行する。

SELECT Q0.本日, Q0.金額 AS 本日金額, 一時テーブル.金額 AS 前日金額, [本日金額]-[前日金額] AS E,
([本日金額]-[前日金額])/[本日金額] AS F FROM [SELECT 一時テーブル.日付 AS 本日, 一時テーブル.金額,
一時テーブル.連番-1 AS 前日連番 FROM 一時テーブル]. AS Q0
LEFT JOIN 一時テーブル ON Q0.前日連番 = 一時テーブル.連番;

一時テーブルが出来てしまうのがいまいちだけど速度的には問題ないと思うよ。