Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


18 / 500 ページ ←次へ | 前へ→

【12966】Re:パスワード一括設定方法
回答  かるびの  - 16/3/10(木) 2:07 -

引用なし
パスワード
    まず、当該ファイルの拡張子を確認してください。

 拡張子が mdb であれば、オブジェクトを変更することができますし、
VBAのコードを表示させることもできますし、
VBAのコードを変更することもできます。

 しかし、拡張子が mde であれば、オブジェクトの変更が一切できませんし、
VBAのコードを表示させることはもとより、コードの変更もできません。
 mde ファイルはそれをさせないためのファイル形式です。
 この場合は、VBAコードを変更することは諦めるしかありません
(マシン語を操れるくらいの超絶エキスパートであれば、
mde ファイルでも何とかできるのではないかとは思いますが)。


 私もかつて、Vectorからアクセスのファイルをダウンロードしたことがありますが、
その拡張子は mde でした。
 たぶん、当該ファイルの拡張子は mde だと思うんですよね。
・ツリー全体表示

【12965】Docmd.RunSQLだと問題ないのにDatabase....
質問  亀マスター  - 16/3/9(水) 23:55 -

引用なし
パスワード
   初めて質問させていただきます。

現在、社内システムをAccessで構築していますが、
INSERT INTOやDELETEのSQLをVBAから実行する際、
実行方法によってはデータベースへの反映に
時間がかかり、SQL実行直後にデータを拾おうと
すると更新前のデータになってしまうことがあり、
困っています。

具体的には、ある帳票フォームにレコードの削除・更新等のボタンを配置し、
そのクリックイベントとして以下のようなものを書いています。

−−−−−−−−−−−−−−−−−−−−−−−−−−
環境
Windows 7 Pro 32bit
Access 2013

※説明の簡略化のためエラートラップは省略しています
Dim strSQL As String
Dim WSP As Workspace
Dim DB as DAO.Database

strSQL = "削除クエリ、追加クエリ等"

'↓↓Execute使用パターン↓↓
Set WSP = Workspaces(0)
Set DB = CurrentDb

WSP.BeginTrans
DB.Execute strSQL
WSP.CommitTrans dbForceOSFlush

DBEngine.Idle dbRefreshCache

Set DB = Nothing
Set WSP = Nothing
'↑↑Execute使用パターン↑↑

'↓↓DoCmd.RunSQL使用パターン↓↓
DoCmd.RunSQL strSQL
'↑↑DoCmd.RunSQL使用パターン↑↑

Me.Requery
−−−−−−−−−−−−−−−−−−−−−−−−−−
実は元々DoCmd.RunSQLを使っており、その際は問題なかったのですが、
複数のSQLを連続して使う際にあまりよくないと聞いたもので、
Database.Executeを使うパターンに切り替えたのです。
しかし、そうすると、Me.Requeryをしたにも拘わらず、更新前の
ままになってしまいます。また、別のフォームで、
Me.RequeryのところにDLookupを使っているものがあるのですが、
そちらでも、更新前のデータしか得られません。

ただ、Me.RequeryやDLookupの前にMsgBoxやSleepで
5秒程度(2〜3秒ではうまくいくことといかないことがある)
待ってやると、うまく更新後のデータが拾えるようです。
このことから、キャッシュによるラグが生じていると予想
されるのですが、その対策として
WSP.CommitTrans dbForceOSFlush
DBEngine.Idle dbRefreshCache
を入れているのに、改善されません。

なお、更新対象のテーブルはサーバー上のAccdb(データ専用)に
リンクしているものと、ユーザー側のAccdb(プログラム用)に
システムデータ用に使っているものがありますが、どちらの
テーブルでも同じことが起こります。プログラム用のテーブル
相手でも起こることから、少なくともそちらはサーバーとの
接続速度の問題ではないと思うのですが…。

一応、Sleepで待ってやれば対応出来るのですが、それは
うっとうしいし、なんとか即時反映させたいのですが…
どなたか、お知恵を拝借出来ないでしょうか。
・ツリー全体表示

【12964】Re:パスワード一括設定方法
質問  迷いネコ  - 16/3/9(水) 21:50 -

引用なし
パスワード
   お返事ありがとうございます。
フリーソフト自体はアクセス2002のVBAで作成されているのですが、
VBAのどの場所をどのように変えればよいかが解らず困っております。
ソフトの出所は以下のとおりです。
ht tp://www.vector.co.jp/soft/winnt/util/se377890.html
・ツリー全体表示

【12963】Re:パスワード一括設定方法
回答  かるびの  - 16/3/9(水) 10:40 -

引用なし
パスワード
    フリーソフト自体は手にしているが、そのコードは見られていないという状態なんですかね。

 ソフトからそのプログラムたるコードを見るというのは、かなりな難問だと思います。
 少なくとも私にはできません。

 ましてどんな言語で書かれたのかがわからないとなると、なおさらだと思います。


 それでも諦めきれないというのであれば、自分で作るしかないですね。

 エクセルファイルやワードファイルのパスワード設定を行うVBAコードを、検索して見てみました。

ht tp://www.officepro.jp/excelvba/book_new/index7.html



ht tp://www.asahi-net.or.jp/~zn3y-ngi/YNxv9d3674.html

が見つかりました。

 いずれもそれほど複雑そうなでもないので、ある程度VBAを使えれば、
自作できそうに思います。


 その場合に引っかかりそうなのは、パスワード設定よりも、
ユーザーインターフェイスを整えることになりそうです。
 例えば、パスワードを設定するファイルをどのようにして選択するかとか、
そういうファイルをどのようにして取得するかとかですね。
 でも、それらについても、ネットで検索すれば、類似の、ないし参考となるコードは見つかりそうです。
・ツリー全体表示

【12962】Re:パスワード一括設定方法
回答  迷いネコ  - 16/3/7(月) 20:45 -

引用なし
パスワード
   ▼かるびの さん:しつ

「AutoPass」(ネット検索でも出てきます)というフリーソフトが元々の出所なのですが、10年以上前に公開されたもので、最新のワードやエクセルに対応しておらず、作者の方に連絡の取り方が解らないため、困っているところです。
・ツリー全体表示

【12961】Re:パスワード一括設定方法
回答  かるびの  - 16/3/7(月) 16:45 -

引用なし
パスワード
   >access2013を使って、wordやexcelの複数のファイルにパスワードを一括設定するvbaについてですが、doc形式やxls形式の場合のプログラムを参考に見つけたのですが、

 手動でのパスワード設定もほとんどやったことがありませんし、
VBAでそれを設定するなんてことは一度もやったことがありませんし、
当方のOfficeは2003であって、そもそも私に回答する資格があるのかとも思いますが、
見つけたというコードを提示されれば、何かわかることがあるかもしれません。


>これらをdocxやxlsx形式でも対応できるようにするためには、どのあたりを替えればよいのでしょうか?

 コードを見ないうちは何とも言えませんが、参照設定あたりかなという気がします。
・ツリー全体表示

【12960】パスワード一括設定方法
質問  迷いネコ  - 16/3/5(土) 18:57 -

引用なし
パスワード
   access2013を使って、wordやexcelの複数のファイルにパスワードを一括設定するvbaについてですが、doc形式やxls形式の場合のプログラムを参考に見つけたのですが、これらをdocxやxlsx形式でも対応できるようにするためには、どのあたりを替えればよいのでしょうか?
プログラム中で記述されているdocやxlsをdocxやxlsxに変えるだけではうまくいきません。
おそらく、パスワードを設定した後の保存時にwordやexcelの最新版にフォーマットするよう定義するのかと思うのですが、どのようにすればよいのでしょうか?
ご教授いただけると助かります。
・ツリー全体表示

【12959】Re:タブ付ドキュメントからそうでないも...
質問  柚木健夫 E-MAIL  - 16/3/5(土) 13:39 -

引用なし
パスワード
   ▼hatena さん:
>> 8.上記7.を実現するためにメニューフォームの「貸出し記録入力フォーム」をクリックしたときに3つのフォームが「タブ付きドキュメント」で開き、「メニューフォームに戻る」をクリックした時に、これが解除されるという対応が可能かどうかご検討いただけないでしょうか。よろしくお願いします。
>「ウインドウを重ねて表示する」と「タブ付きドキュメント」の切り替えには再起動が必用なので、これは不可能です。
>
>代替案として、「ウインドウを重ねて表示する」で、単票フォームにタブコントロールを配置して、ページを3ページにして、各ページにそれぞれのフォームをサブフォームとして埋め込めば、タブの切替で切り替え表示できます。
>
>こうすれば、ほぼタプ付きドキュメントと同じUIになります。さらに、おまけに、メインフォームに対してサイズの設定が可能ですので、
>
>>「タブ付きドキュメント」で開くと、サイズの設定が用をなさず背景色が画面一杯に表示されるという犠牲を伴いますがこのことは断念するしかありません。
>
>この点を断念する必用はなくなります。
>
>> 7.パラメータークエリーからレポートを作成するメニューが5つあります。
>> パラメーターを入力する時に、クエリの画面上で入力するのではなく、真っ白な画面上で入力できるように、マクロには「クエリを開く」の下に「ウインドウの最小化」を設定しています。当然これらに対しては「タブ付きドキュメント」で開いては「ウインドウの最小化」の設定が用をなしません。
>
>「パラメータークエリーからレポートを作成する」というのが何を意味するのか掴みかねますが、パラメータクエリをレコードソースとするレポートを開くという意味ならば、クエリを開く必用はないです。パラメータを、規定のパラメータダイアログではなくフォーム上のテキストボックスで入力したいということなら、パラメータの式をフォームを参照するようにすればいいです。
>
>■T'sWare Access Tips #216 〜フォームのテキストボックスを抽出条件とするクエリー〜
>tsware.jp/tips/tips_216.htm
タブコントロールの配置で1つのフォームに複数のページを作ることができることを経験させていただきました。これで「タブ付きドキュメント」で開く効果と同じであること、および「サイズ設定」が生かされていることがよく判りました。ご教示に厚く感謝申し上げます。残念ながら私には、また新たな問題が発生しました。お手数をおかけしますが再度よろしくご対応をお願い申しあげます。
「貸出品」フォームに作成していた、コンポボックスで検索する値を選択した後、「検索」ボタンをクリックすると、それに該当するデーターが抽出される仕組みが機能しなくなりました。元々作成していた手順は次の通りです。
1.「貸出品」フォームのヘッダーセクションにコンポボックスを配置→プロパテイシートの「すべて」タブの「名前」欄に「Compo商品番号」と記入→「値集合ソース」欄でテーブル「貸出品」を選択→左端の「・・・」をクリック→テーブルを基にしてクエリビルダが起動されました→はい→「商品番号」だけをデザイングリッドにドラッグ&ドロップ→閉じる→SQLステートメントの変更を保存しプロパテイーの更新しますか?→はい。
2.「作成」→「マクロ」→「フイルターの実行」を選択→「Where条件式」欄に [商品番号]=[Forms]![貸出品]![Compo商品番号]と入力→マクロ名「コンポ検索」として保存
3.「コンポボックス」の横に「コマンドボタン」を配置→「書式」タブの「標題」に「検索」と記入。「イベント」タブの「クリック時」欄に「コンポ検索」を登録。
今回、
[タブコントロール付きフォーム]の名前を[タブコントロール付き貸出し品入力フォーム]として作成しました。「貸出品」フォームの「タブ」の名前を「ページ6」から「貸出品」に修正しました。元あったコンポボックスと検索ボタンを削除して、改めてコンポボックスと検索ボタンを新設し、「Where条件式」欄に次の6とおり記入しましたが、どれも機能しません。
・[商品番号]=[Forms]![ページ6]![Compo商品番号]
・[商品番号]=[Forms]![タブコントロール付き貸出し品入力フォーム]! [貸出品]! [Compo商品番号]
・[商品番号]=[Forms]![タブコントロール付き貸出し品入力フォーム]! [ページ6]! [Compo商品番号]
・[商品番号]=[Forms]![タブコントロール付き貸出し品入力フォーム]![Forms]![貸出品]![Compo商品番号]
・ [商品番号]=[Forms]![タブコントロール付き貸出し品入力フォーム]![Forms]![ページ6]![Compo商品番号]
・[商品番号]=[Forms]![ページ6]!Form[Compo商品番号]

ご教示ください。
・ツリー全体表示

【12958】Re:タブ付ドキュメントからそうでないも...
お礼  柚木健夫 E-MAIL  - 16/3/4(金) 20:32 -

引用なし
パスワード
   ▼柚木健夫 さん:
>▼hatena さん:
>>> 8.上記7.を実現するためにメニューフォームの「貸出し記録入力フォーム」をクリックしたときに3つのフォームが「タブ付きドキュメント」で開き、「メニューフォームに戻る」をクリックした時に、これが解除されるという対応が可能かどうかご検討いただけないでしょうか。よろしくお願いします。
>>「ウインドウを重ねて表示する」と「タブ付きドキュメント」の切り替えには再起動が必用なので、これは不可能です。
>>
>>代替案として、「ウインドウを重ねて表示する」で、単票フォームにタブコントロールを配置して、ページを3ページにして、各ページにそれぞれのフォームをサブフォームとして埋め込めば、タブの切替で切り替え表示できます。
>>
>>こうすれば、ほぼタプ付きドキュメントと同じUIになります。さらに、おまけに、メインフォームに対してサイズの設定が可能ですので、
>>
>>>「タブ付きドキュメント」で開くと、サイズの設定が用をなさず背景色が画面一杯に表示されるという犠牲を伴いますがこのことは断念するしかありません。
>>
>>この点を断念する必用はなくなります。
>>
>>> 7.パラメータークエリーからレポートを作成するメニューが5つあります。
>haya
>
>早々にご回答をいただき大変恐縮です。しかし残念ながらご回答の内容がよく理解できません。もう少しかいつまんだ手順とか方法を記述いただけませんか。パラメータークエリからレポートを作成する意味は、あなた様のご解釈どうりです。
>お手数をかけますがよろしくお願いします。
タブコントロールの配置で対応しなさいということは理解できました。チャレンジしてみます。これが成功すればクエリーの方はいままでどうりでいいわけですから
すべて解決となります。なにはともあれタブコントロールの配置にチャレンジし、その結果を報告させていただきます。ありがとうございました。
・ツリー全体表示

【12957】Re:タブ付ドキュメントからそうでないも...
お礼  柚木健夫 E-MAIL  - 16/3/4(金) 20:15 -

引用なし
パスワード
   ▼hatena さん:
>> 8.上記7.を実現するためにメニューフォームの「貸出し記録入力フォーム」をクリックしたときに3つのフォームが「タブ付きドキュメント」で開き、「メニューフォームに戻る」をクリックした時に、これが解除されるという対応が可能かどうかご検討いただけないでしょうか。よろしくお願いします。
>「ウインドウを重ねて表示する」と「タブ付きドキュメント」の切り替えには再起動が必用なので、これは不可能です。
>
>代替案として、「ウインドウを重ねて表示する」で、単票フォームにタブコントロールを配置して、ページを3ページにして、各ページにそれぞれのフォームをサブフォームとして埋め込めば、タブの切替で切り替え表示できます。
>
>こうすれば、ほぼタプ付きドキュメントと同じUIになります。さらに、おまけに、メインフォームに対してサイズの設定が可能ですので、
>
>>「タブ付きドキュメント」で開くと、サイズの設定が用をなさず背景色が画面一杯に表示されるという犠牲を伴いますがこのことは断念するしかありません。
>
>この点を断念する必用はなくなります。
>
>> 7.パラメータークエリーからレポートを作成するメニューが5つあります。
haya

早々にご回答をいただき大変恐縮です。しかし残念ながらご回答の内容がよく理解できません。もう少しかいつまんだ手順とか方法を記述いただけませんか。パラメータークエリからレポートを作成する意味は、あなた様のご解釈どうりです。
お手数をかけますがよろしくお願いします。
・ツリー全体表示

【12956】Re:タブ付ドキュメントからそうでないも...
回答  hatena  - 16/3/4(金) 17:11 -

引用なし
パスワード
   > 8.上記7.を実現するためにメニューフォームの「貸出し記録入力フォーム」をクリックしたときに3つのフォームが「タブ付きドキュメント」で開き、「メニューフォームに戻る」をクリックした時に、これが解除されるという対応が可能かどうかご検討いただけないでしょうか。よろしくお願いします。
「ウインドウを重ねて表示する」と「タブ付きドキュメント」の切り替えには再起動が必用なので、これは不可能です。

代替案として、「ウインドウを重ねて表示する」で、単票フォームにタブコントロールを配置して、ページを3ページにして、各ページにそれぞれのフォームをサブフォームとして埋め込めば、タブの切替で切り替え表示できます。

こうすれば、ほぼタプ付きドキュメントと同じUIになります。さらに、おまけに、メインフォームに対してサイズの設定が可能ですので、

>「タブ付きドキュメント」で開くと、サイズの設定が用をなさず背景色が画面一杯に表示されるという犠牲を伴いますがこのことは断念するしかありません。

この点を断念する必用はなくなります。

> 7.パラメータークエリーからレポートを作成するメニューが5つあります。
> パラメーターを入力する時に、クエリの画面上で入力するのではなく、真っ白な画面上で入力できるように、マクロには「クエリを開く」の下に「ウインドウの最小化」を設定しています。当然これらに対しては「タブ付きドキュメント」で開いては「ウインドウの最小化」の設定が用をなしません。

「パラメータークエリーからレポートを作成する」というのが何を意味するのか掴みかねますが、パラメータクエリをレコードソースとするレポートを開くという意味ならば、クエリを開く必用はないです。パラメータを、規定のパラメータダイアログではなくフォーム上のテキストボックスで入力したいということなら、パラメータの式をフォームを参照するようにすればいいです。

■T'sWare Access Tips #216 〜フォームのテキストボックスを抽出条件とするクエリー〜
tsware.jp/tips/tips_216.htm
・ツリー全体表示

【12955】タブ付ドキュメントからそうでないものへ...
質問  柚木健夫 E-MAIL  - 16/3/4(金) 15:29 -

引用なし
パスワード
   私は73歳の男性ですが、ボケ防止のため、昨年12月にAccess2013ソフトを購入しAccessの学習をしています。スポーツ用品貸出し業務をする仮想店舗を想定した業務システムの構築をしています。
1.フォームは「メニューフォーム」以外に「会員名簿」「貸出し記録入力」「貸出品」の3種類あります。この3つには「背景色」を付け、「ウインドウの移動とサイズの変更」で画面に表示する大きさを指定した体裁に整えています。
2.「会員名簿」は150名分あります。「フイルター」を使って会員を探し当てるようにしています。
3.「貸出し記録入力」フォームは、単票形式の「会員名簿」のフォームにサブフォームとして埋め込んだ形で作成してあります。
4.「貸出品」は商品番号、品名、単価、適用時期の4つのフイールドからなる表ですが、リストボックスでは表示しきれない点数があり、コンポボックスでは、単価がひんぱんに変更されることを前提にすると、スクロールバーでの検索では見落とす危険を回避するべく、次のような工夫をこらしました。「貸出品」フォームに、「コンポボックス」と「検索」ボタンを配置し、コンポボックスで商品番号を検索した後、検索ボタンをクリックするとその商品番号のものが全てリストアップされるという仕組みにしています。
5.以上の2.3.4.の事情から
「貸出し記録入力フォーム」を開く際には、「会員名簿」と「貸出品」の3つのフォームを同時に開くことにし、3つのファイルの識別がしやすいように「タブ付きドキュメント」で開くようにしています。「タブ付きドキュメント」で開くと、サイズの設定が用をなさず背景色が画面一杯に表示されるという犠牲を伴いますがこのことは断念するしかありません。
入力が済んだら、3つのフォームのフォームフッターにそれぞれ「メニュフォームに戻る」コマンドボタンを配置しています。
6.断念するならすべてを「タブ付きドキュメント」で開いたらいいじゃないかとなりますが、次項の点から、そうはしたくありません。
7.パラメータークエリーからレポートを作成するメニューが5つあります。
パラメーターを入力する時に、クエリの画面上で入力するのではなく、真っ白な画面上で入力できるように、マクロには「クエリを開く」の下に「ウインドウの最小化」を設定しています。当然これらに対しては「タブ付きドキュメント」で開いては「ウインドウの最小化」の設定が用をなしません。
8.上記7.を実現するためにメニューフォームの「貸出し記録入力フォーム」をクリックしたときに3つのフォームが「タブ付きドキュメント」で開き、「メニューフォームに戻る」をクリックした時に、これが解除されるという対応が可能かどうかご検討いただけないでしょうか。よろしくお願いします。
「ファイル」「オプション」「現在のデーターベース」「ドキュメントウインドウオプション」と進み、「ウインドウを重ねて表示する」と「タグ付きドキュメント」の二者択一。
・ツリー全体表示

【12954】Re:サブフォームの横スクロールバーの幅...
お礼  春は近い E-MAIL  - 16/3/2(水) 15:47 -

引用なし
パスワード
   ありがとうございます

色々とヒントになる情報を頂きましたので
試してみます

▼かるびの さん:
>>きれいに右端に表形式のフォームの右側が止まるようにする
>>VBAのコマンドはありますか
>
> そういうメソッドやプロパティは聞いたことがないです。
> 
> ヘルプをざっとみてみましたが、
>スクロールバーに関しては、Form オブジェクトのScrollBars プロパティ
>テキストボックス、コンボボックス又はリストボックスの ScrollBarAlign プロパティ
>くらいしか見つからず、これらは本件で使えそうなプロパティではないですね。
>
> ちょっとだけネットを検索してみましたが、
>アクセスのフォームのスクロールバーを制御するプロパティやメソッドはないみたいです。
>
>
> 同じような状況を再現させられるかと思って、サンプルを作ってみましたが、
>再現しませんでした。
> でも、サブフォームの大きさに比べて、横スクロールできる範囲が広過ぎるという状況は、
>確かに経験したことがあります。
>(でも、それをどうやって直したのかは記憶にないんですね。そもそもそれが直ったのかどうかも、
>記憶があやふやです。)
>
>
> 原因を想像してみると、おそらく、
>サブフォームとして使うフォームについて、
>当該フォームが保有している、スクロールバーの最大値(スクロールバーを一番右に移動させたときの位置についての数値)が
>大き過ぎるからではないかと想像します。
> この数値は、フォームの幅を変更すると、それに伴って変わらなければならないものですが、
>何かの拍子でそれが変わらなくなってしまっているのだろうと想像します。
> それは、つまり、フォームが壊れているということだと思います。
>
>
> なので、対策として私にアドヴァイスできるのは、
>サブフォームとして使うフォームとサブフォーム・コントロールとを一から作り直してみたらどうか
>ということくらいです。
>
>
> あまりお役に立てなく申し訳ありません。
・ツリー全体表示

【12953】Re:サブフォームの横スクロールバーの幅...
回答  かるびの  - 16/3/2(水) 14:52 -

引用なし
パスワード
   >きれいに右端に表形式のフォームの右側が止まるようにする
>VBAのコマンドはありますか

 そういうメソッドやプロパティは聞いたことがないです。
 
 ヘルプをざっとみてみましたが、
スクロールバーに関しては、Form オブジェクトのScrollBars プロパティ
テキストボックス、コンボボックス又はリストボックスの ScrollBarAlign プロパティ
くらいしか見つからず、これらは本件で使えそうなプロパティではないですね。

 ちょっとだけネットを検索してみましたが、
アクセスのフォームのスクロールバーを制御するプロパティやメソッドはないみたいです。


 同じような状況を再現させられるかと思って、サンプルを作ってみましたが、
再現しませんでした。
 でも、サブフォームの大きさに比べて、横スクロールできる範囲が広過ぎるという状況は、
確かに経験したことがあります。
(でも、それをどうやって直したのかは記憶にないんですね。そもそもそれが直ったのかどうかも、
記憶があやふやです。)


 原因を想像してみると、おそらく、
サブフォームとして使うフォームについて、
当該フォームが保有している、スクロールバーの最大値(スクロールバーを一番右に移動させたときの位置についての数値)が
大き過ぎるからではないかと想像します。
 この数値は、フォームの幅を変更すると、それに伴って変わらなければならないものですが、
何かの拍子でそれが変わらなくなってしまっているのだろうと想像します。
 それは、つまり、フォームが壊れているということだと思います。


 なので、対策として私にアドヴァイスできるのは、
サブフォームとして使うフォームとサブフォーム・コントロールとを一から作り直してみたらどうか
ということくらいです。


 あまりお役に立てなく申し訳ありません。
・ツリー全体表示

【12952】サブフォームの横スクロールバーの幅調整
質問  春は近い E-MAIL  - 16/3/2(水) 2:49 -

引用なし
パスワード
   サブフォーム内の横スクロールバーで右端まで移動させると
表形式のフォームの右端がかなり左側までスクロールしてしまいます

きれいに右端に表形式のフォームの右側が止まるようにする
VBAのコマンドはありますか

よろしくご教授ください
・ツリー全体表示

【12951】Re:ユニオンクエリの昇順並べ替えについて
お礼  まるこ  - 16/2/20(土) 15:11 -

引用なし
パスワード
   かるびの様

できました!
ヘルプは見落としていました。
何度もお手を煩わせてすみませんでした。
ありがとうございました
・ツリー全体表示

【12950】Re:dcount関数について
お礼  ささや  - 16/2/20(土) 10:26 -

引用なし
パスワード
   ▼かるびの さん:

とてもわかりやすくて丁寧な説明をありがとうございました。

・ダブルコーテーションとシングルコーテーションの違い
・Andなどが入る場合の構文
・"[社員ID]" &[社員ID] の意味など
まさに知りたかったことを全部教えていただいて大変助かりました。
おかげでDCOUNT関数で担当件数を計算することができました。

ところで、計算できたはいいのですが、関与テーブルをベースに計算したため、
これを社員テーブルと結合するクエリをつくると一社員一テーブルにならない
問題が起きることが分かりました。

そこで、アドバイスいただいたように、サブフォームでフォームに表示させ、
その部分だけ集計クエリで担当件数を計算しすることにしました。
(もともと本当は社員フォーム上で入力をできるようにしたかったのですが、
サブフォームの仕組みや関連付けの方法がわからず避けていました。)
いろいろ調べてどうにか、
社員のほかのフィールド値が社員フォーム上で編集可能にしたまま
担当件数もフォーム(サブフォーム)に表示するという目的が達成できました。

本当にありがとうございました。
・ツリー全体表示

【12949】Re:dcount関数について
回答  かるびの  - 16/2/19(金) 4:06 -

引用なし
パスワード
    書き忘れです。


 クエリの演算フィールドでDCount関数やDSum関数など、D系関数と呼ばれる関数を使うと、
クエリがものすごく重くなります。
 つまり、クエリを開こうとしても、クエリがなかなか開いてくれないということになります。

 どのくらいクエリが重くなるかは、パソコンの性能や、各テーブルのレコードの件数次第なので、
何とも言えませんが、
私の認識としては、クエリでD系関数は使ってはいけないと考えています。


>ここで、社員ごとに継続中の案件数を計算するクエリをつくりたいのですが、そのクエリで社員名などを編集できやるようにしておきたく、
 解説本などを読むと、クエリでレコードを編集するということが堂々と書いてありますが、
クエリで編集するというのはデータベースの使い方として外れています。

 エクセルでは、データの保存、データの計算、データの表示、データの入力・訂正、データの印刷
を全てワークシートでやってしまいますが、
アクセスでは、それら別々のオブジェクトで行います。
 データの保存はテーブル、データの計算はクエリ、データの表示とデータの入力・訂正はフォーム、データの印刷はレポートです。

 確かに、テーブルやクエリでも、データの表示や入力・訂正はできますが、
それは本来の使い方ではないので、人間にとっての使いやすさを追求することができません。


 今回の場合、メイン/サブ形式のフォームを使うことができるかもしれません。

 メインフォームには、社員テーブルのデータを表示するようにし、
サブフォームには、集計クエリを表示するようにし、
メインフォームとサブフォームとを社員IDでリンクさせます。


 ただ、どこかの掲示板での回答のため、途中までサンプルを作ってみたのですが、
メインフォームをデータシートにした場合は、思い通りにならなかったんですね。
 メインフォームを帳票フォームにしたら、どうだろうかとも思うのですが、
こちらの方は未実験です。


 とはいえ、クエリから入力した方が人間にとって使いやすいということも考えられるので、
メイン/サブ形式のフォームがベストだとは言い切れませんけどね。
・ツリー全体表示

【12948】Re:dcount関数について
回答  かるびの  - 16/2/19(金) 3:46 -

引用なし
パスワード
    冒頭から余談で恐縮ですが、
社員テーブルと案件テーブルは、多対多結合ですかね。

 そのため、両者の結合テーブルとして関与テーブルを設けたということなんでしょうね。

 で、社員テーブルと関与テーブルと案件テーブルは、一対多対一になるので、
この3つのテーブルを使って作ったクエリは、更新不可のクエリになると思うんですよね。

 更新不可のクエリになると、レコードの新規入力やレコードの訂正を行えなくなってしまいます。

 本題とは全く関係ありませんが、ちょっと気になったので、書いてみました。


 さて、本題のDCount関数についてです。

 DCount関数の第3引数(抽出条件)の書き方って難しいですね。
 私の初心者のころ散々悩まされました。ヘルプを見ても全く分からないんですね。
 でも、この第3引数の書き方なんですが、
アクセスを利用する際は、いろいろなところで使うことになります。
かなり重要度が高いです。
 是非マスターしてほしいと思います。


 で、第3引数の書き方ですが、その典型は、
   フィールド名 = 値
です。
 これを文字列として第3引数に指定します。


 ただ、値の書き方にはクセがあります。

 フィールド名のフィールドのデータ型がテキスト型の場合、
値はダブルコーテーションで囲います。例えば、
   氏名 = "かるびの"
です。
 ただ、第3引数全体が文字列となるため、
第3引数全体をダブルコーテーションで囲うことになります。
 そうすると、第3引数全体を囲うダブルコーテーションと、
値を囲うダブルコーテーションとを区別できなくなってしまいます。
 そこで、このような場合、
値を囲う方は、シングルコーテーションにします。例えば、
   氏名 = 'かるびの'
です。


 フィールド名のフィールドのデータ型が日付型の場合、
値はシャープで囲います。例えば、
   生年月日 = #2016/01/01#
です。


 フィールド名のフィールドのデータ型が数値型の場合、値は何も囲いません。
 例えば、
   数量 = 123
です。


 なお、複数の条件を指定する場合は、複数の「フィールド名 = 値」を AND や OR でつないだ文字列を第3引数に指定します。例えば、 
   "氏名 = 'かるびの' AND 数量 = 123"
です。

 ANDをダブルコーテーションの外に出してしまう奴が後を絶ちませんが、    
ANDをダブルコーテーションの外に出してしまうのは間違いです。


 次の問題は、DCount関数をクエリで使う場合、クエリのフィールドの値を使って
第3引数を設定することになるのが多いわけですが、それをどう表現するかですね。
 ヘルプでは、これがわかりにくいんです。


 少しはそちらでも考えてほしいので、御希望のこととはちょっと異なる例を使います。
 例えば、案件テーブルをベースとして、
案件に関わっている社員のうち、最大の社員IDを得るクエリを作るとします。
 この場合、最大の社員IDを得るための演算フィールドに設定する式は、
   DSum("社員ID","関与テーブル","案件ID = " & 案件ID)
となります。

 これをSQL文で書くと、

SELECT 案件ID
   ,案件名
   ,DSum("社員ID","関与テーブル","案件ID = " & 案件ID) AS 最大社員ID
FROM 案件テーブル

となります。

 で、DSum関数の第3引数ですが、
「"案件ID = " & 案件ID」における左側の「案件ID」は、
関与テーブル中の案件IDフィールドという意味です。
 左側の「案件ID」は、ダブルコーテーションの内側に入っているので、
DSum関数の第2引数に指定された「関与テーブル」のフィールドだということになります。

 一方、右側の「案件ID」は、案件テーブル中の案件IDフィールドの値という意味です。
 というのは、右側の「案件ID」は、ダブルコーテーションの中に入っていません。
 案件テーブルをベースにしたクエリの中で、ダブルコーテーションの外にいるわけですから、
右側の「案件ID」は、案件テーブルのフィールドです。

 そして、案件テーブルのフィールドであるということは、クエリにおいては、
レコードごとに異なる値をとるということです。
 したがって、右側の「案件ID」は、
案件テーブル中の案件IDフィールドの値を意味することになります。


 そこで、例えば、クエリで案件IDフィールドの値が456であるレコードにおいて、
DSum関数がどうなるかというと、
案件テーブル中の案件IDフィールドは456なのですから、
   "案件ID = " & 案件ID 
という文字列式は、
   "案件ID = " & 456
ということになり、この式が計算されて
   "案件ID = 456"
ということになります。

 そして、当該レコードの「最大社員ID」フィールドには、
   DSum("社員ID","関与テーブル","案件ID = 456")
が返す値が表示されるということになります。

 
 敢えて、そのものズバリの回答とはせず、少し回り道をした回答にしてみましたが、
以上のことを踏まえて、自分で考えてみてください。
・ツリー全体表示

【12947】Re:ユニオンクエリの昇順並べ替えについて
回答  かるびの  - 16/2/19(金) 2:08 -

引用なし
パスワード
   >SELECT クエリA.CD, クエリA.取引先名, クエリA.支払予定日, クエリA.明細, クエリA.サブID
>FROM クエリA
>GROUP BY クエリA.CD, クエリA.取引先名, クエリA.支払予定日, クエリA.明細, クエリA.サブID, ク>エリA.抽出日付, クエリA.式1
>HAVING (((クエリA.抽出日付)=[Forms]![フォームA]![コントロールA]))
>ORDER BY クエリA.式1                          ・・・・・・※
>
>Union all SELECT クエリB.CD, クエリB.取引先名, クエリB.支払予定日, クエリB.明細, クエリB.サブID
>FROM クエリB
>GROUP BY クエリB.CD, クエリB.取引先名, クエリB.支払予定日, クエリB.明細, クエリB.サブID, クエリB.抽出日付
>HAVING (((クエリB.抽出日付)=[Forms]![フォームA]![コントロールA]))
>
>UNION ALL SELECT クエリC.CD, クエリC.取引先名, クエリC.支払予定日, クエリC.明細, クエリC.サブID
>FROM クエリC
>GROUP BY クエリC.CD, クエリC.取引先名, クエリC.支払予定日, クエリC.明細, クエリC.サブID, クエリC.抽出日付
>HAVING (((クエリC.抽出日付)=[Forms]![フォームA]![コントロールA]));
>
>※の ORDER BY が全く機能せず、順番がぐちゃぐちゃになります

 当然の結果ですね。

 ユニオンクエリの場合、ORDER BY 句は、一番最後にしか書けません。
 具体的に言うと、クエリCから成るクエリの HAVING 句の次にしか書けません。
 それ以外のところに ORDER BY 句を書いても無視されます。
 確か、ヘルプに書いてあったと思います。


 ただ、一番最後に「ORDER BY クエリA.式1」を書いたとすると、
クエリBやクエリCには、「式1」フィールドはないのでしょうから、
「式1フィールドがないよ」というような内容のエラーになるはずです。
 具体的には、「式1」と表示されたパラメータ・ボックスが出てくると思います。


 そこで、どうするかですが、クエリBやクエリCに「式1」フィールドを設けてやればいいです。
 
 その場合、クエリBやクエリCの「式1」フィールドには、
クエリAの並び替えを邪魔しないような定数を指定することになると思います。
 なお、この定数は、クエリAの「式1」フィールドのデータ型に合うものとしてください。

 例えば、クエリAの「式1」が長整数型の値を返すとすれば、こんな感じです。
SELECT CD, 取引先名, 2147483647 AS 式1
FROM クエリB
GROUP BY CD, 取引先名
HAVING 抽出日付=[Forms]![フォームA]![コントロールA]

 なぜ、定数を「2147483647」という時にしたかというと、
長整数型の数値の中で最大のものだからです。
 「2147483647」なら、クエリAの並べ替えを邪魔しないと思います。


>※の ORDER BY が全く機能せず、順番がぐちゃぐちゃになります
>
>ちなみにクエリABC単体ではちゃんと機能して昇順に並びます

 アクセスって、というよりも、リレーショナルデータベースってそういうものです。

 テーブルやクエリの各レコードは、並び順の情報を持っていません。
 例えば、クエリ甲で並べ替えを行い、クエリ甲をベースにして作ったクエリ乙があるとして、
 もしレコードが並び順の情報を持っていれば、それに基づいて、
クエリ乙にクエリ甲の並べ替え結果を反映させられますが、
レコードが並び順の情報を持たない以上、クエリ乙にはクエリ甲の並べ替えの結果は反映されません。

 あるいは、こうも言えるかもしれません。
 クエリ甲からクエリ乙に対して、クエリ甲で ORDER BY 句が設定されているという情報を通知してくれれば、
クエリ乙にクエリ甲の並べ替え結果を反映させられますが、
アクセスというアプリケーションは、そういう通知はしないという設計になっているのです。

 クエリ乙においてクエリ甲での並べ替えを反映させたければ、
クエリ乙において、改めて並び順を指定する必要があります。

・ツリー全体表示

18 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free