Access VBA質問箱 IV

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

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


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

【9652】Re:Access VBAの変数について。
発言  小僧  - 07/7/4(水) 11:22 -

引用なし
パスワード
   ▼ジバク さん、hatenaさん

おはようございます。

変数の有効期間については hatena さんのご提示の通りですが、
Public 変数に関して、一部例外があるので補足です。

MSサポートオンラインより
[VBA] Public 宣言された変数の有効期間

h tp://support.microsoft.com/kb/408871/ja

(こちらの掲示板は直リンクが禁止ですので、補完してください。)


そちらのサイトにも

> Public 変数がアプリケーション終了時まで有効であることを期待する
> VBA マクロの実装は、推奨されません。


とありますが、変数の有効期間は小さく取るのが一般的です。
興味がおありでしたら Google等の検索エンジンで「VB」「スコープ」
をキーワードに検索されてみて下さい。


さて、本題の Set XX = Nothing なのですが、
宣言する、しないに関わらずメモリが解放される事がほとんどですので
(一部例外もありますが)

宣言する意味がない場合が殆んどです。


ただ当方が1プログラマとして思うのは
「時が経てば自動でしまる」という扉を、
開けっ放しで去っていくというのはどうかと思います。(笑)

それが仕様なんだからそのままで良い、
という考え方を否定するつもりはありませんが、

日頃から
・自分が Open したオブジェクトは自分で Close する
・自分が呼び出したオブジェクトは自分で解放する

癖をつけておく事が、他トラブル防止につながるのではないでしょうか。


処理によっては
1.オブジェクトをセットする
2.オブジェクトを Open する
3.何らかの処理
4.オブジェクトを Close する
5.オブジェクトを破棄(Set XX = Nothing)する

という一連の流れの中で、
4、5の動作を行わなかったり、
5の順序を間違ったりして
ファイルそのものを壊してしまう事があります。

Set XX = Nothing をしなかったからだ、とは言えませんが
日頃から変数の宣言や挙動に気をつけてれば
回避する事ができるのではないか、と思います。


長くなりましたが、ご参考までに。
・ツリー全体表示

【9651】Re:Access VBAの変数について。
お礼  ジバク  - 07/7/4(水) 2:38 -

引用なし
パスワード
   hatenaさんへ。

ご返信ありがとうございます。

hatenaさんの解り易い解説のおかげで疑問が全て吹き飛びました。ありがとうございます!!。

ヘルプの「変数の有効期間の概要」、メモらせてもらいました。明日、会社に行ったら、見てみようと思います。

正直、自分の能力は、1からAccessで何かを作るといったレベルでは無いので、もっともっと勉強し、なるべく、自己解決できるようにしてしていきたいです。

今回は、有益な情報を提供して戴き、本当にタメになりました。自分も他人に有益な情報を提供できるよう精進致します。

それでは失礼致しますね、本当にありがとうございました。
・ツリー全体表示

【9650】Re:Access VBAの変数について。
回答  hatena  - 07/7/4(水) 0:00 -

引用なし
パスワード
   >Dim strVar As String
>
>っと変数が宣言されていたとします。
>
>この変数に使われたメモリーは、その変数を使う処理が行われた後に、自動で開放されるのでしょうか?

自動で解放されます。しかし、
厳密には「処理が行われた後」ではなく、変数の有効期間が終わったときです。
例えば、Function内で宣言すれば、そのFunctionが終了するとき解放されます。
フォームモジュールで宣言すれば、フォームを閉じるときに解放されます。
標準モジュールでPublic宣言するとAccess自体を閉じるまで解放されません。
詳細はヘルプで、「変数の有効期間の概要」のトピックを検索してみてください。

>色々なHPを見て、参考にしながら、改修を行っているのですが、多くのHPが、
>
>Set strVar = Nothing
>
>と、その変数が使われる処理が抜ける際に書かれ、メモリを開放しているようなのです。

これは、オブジェクト変数の場合ですね。
最初に例示されたString型などの通常の変数ではそのような
記述はできません。

オブジェクト変数の場合も有効期間が終わると自動で解放されます。
ですので通常は必要のない記述です。
たまにしているのを見かけますが、それは念のため、とか、気分的な
要素が多いように思います。
一つの使い道としては、
オブジェクト変数を標準モジュールでパブリック宣言して、共有して
使おうとするときに、使い終わったら
Set objVar = Nothing
と明示的に解放して、他の場所で使うときに、そのオブジェクトが
有効かどうか、
If objVar = Nothing Then
と判断するということはあるかと思います。
・ツリー全体表示

【9649】Re:一覧表示形式のスケジュール閲覧画面に...
回答  hatena  - 07/7/3(火) 23:38 -

引用なし
パスワード
   > ※ 実際は1000レコードもあり、毎年約300レコードずつ増える感じです。
> 10レコード程度なら十分だとしても、レコード追加していく度にサイズが
> 大きくなってしまうのでは、と思い、下記のようにローカルに置いた
> 色ファイルを読み込む方法に変えて、なおかつ、帳票フォームの場合も色を
> 区別できるようにしたい。と思いました。(なるべく、テーブルには
> ビットマップデータを多く保存させたくない、と思っております)

ちょっと勘違いをしてますね。
1000レコード有っても、色の種類が1000種類というわけではないですよね。
必要な種類の色だけのビットマップを、色マスターテーブル(T_色)に
格納すればいいだけですよ。

テーブル名:T_色
> CC  xx           説明
> −−−−−−−−−−−−−−−−−−
> 1   ビットマップイメージ  出社日
> 2   ビットマップイメージ  連休対象日
> −−−−−−−−−−−−−−−−−−

この例なら2つだけです。
で、入力テーブルの方には、色コード(上記のなら、CCフィールドの値)
を格納します。こちらのレコードが1000レコード有っても、ビットマップは
マスターの2つだけです。
一覧表時用に、この入力テーブルと T_色 を CC でリンクさせたクエリを使えば
いいのです。

> Access2000です。(Versionを記入するのを忘れてしまい申し訳ありません)

2000なら条件付き書式が使えます。
ただし、設定できる書式は4種類までです。
裏技的な方法で5種類以上設定する方法もあります。

帳票形式フォームで書式を 5 種類以上設定する方法
www.f3.dion.ne.jp/~element/msaccess/AcTipsExpandConditionalFormatting.html

かなり面倒だし重そうな処理です。

両方試してみて、どちらがいいか判断されてはどうでしょうか。
・ツリー全体表示

【9648】追記
発言  たまお  - 07/7/3(火) 23:27 -

引用なし
パスワード
   度々申し訳ありません。

日01     D01    CC01    T_色_1.P       T_色_1.xx
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
7/25(水)        1    C:\color1.bmp
7/25(水)        2    C:\color2.bmp
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

の状態にしておき、

●帳票フォームを開く時は、

日01     D01    CC01    T_色_1.P       T_色_1.xx
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
7/25(水)        1    C:\color1.bmp   ビットマップイメージ
7/25(水)        2    C:\color2.bmp   ビットマップイメージ
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

という風にVBAで、txtP01(T_色_1.P)が配置されたテキストボックスで
外部ファイルを読み込み、T_色_1.xxに挿入したい。

挿入しておけば、
連結オブジェクト自体が色を区別できそうな気がするのでは、と
思いましたが、いかがでしょうか?(変更前は上記方法で区別できたので)

そもそも、その方法を思いついたものですが、VBAで挿入するプログラムが
書かれた参考となるサイトが見つからなくて困っております。
(関数やプロパティが分からず・・)
ご存知の方おりましたら、ご教示頂けるとありがたいです。

●帳票フォームを閉じる時は、

日01     D01    CC01    T_色_1.P       T_色_1.xx
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
7/25(水)        1    C:\color1.bmp
7/25(水)        2    C:\color2.bmp
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

とすれば良いかな・・・と思いましたが、いかがでしょうか。。。
・ツリー全体表示

【9647】Re:一覧表示形式のスケジュール閲覧画面に...
質問  たまお  - 07/7/3(火) 23:10 -

引用なし
パスワード
   ▼hatena さん:

ご回答を頂き、感謝致します。

>サイズが大きくなることを心配しているようですが、それほど大きくならないと思いますよ。
>まずは、色の画像ファイルですが、サイズは、1×1ピクセルの最小のものに
>しておいて、連結オブジェクトフレームの「OLEサイズ」プロパティを「ストレッチ」
>にすれば、全体に表示されます。16色BMP なら、122バイトです。

>上記の 色テーブル では2件分のレコードなので、244バイト程度です。
>256色BMPで、レコード数を多くしたとしても、たいしたサイズにはならないと
>思いますが、いかがでしょうか。
>AC97で、帳票フォームでレコード毎に色を変える方法はこれぐらいしかないですし。
−−−−−−−−−−−−−−−−−−−−−−
Access2000です。(Versionを記入するのを忘れてしまい申し訳ありません)

●変更前:
テーブル名:T_色
> CC  xx           説明
> −−−−−−−−−−−−−−−−−−
> 1   ビットマップイメージ  出社日
> 2   ビットマップイメージ  連休対象日
> −−−−−−−−−−−−−−−−−−

上記変更前のテーブルは色定義用の「T_色」で、実際に一覧表示の画面に
表示されるものは、以下の「Q_スケジュール(但し、改善前のクエリ)」です。

日01     D01    CC01    T_色_1.xx       日02   D02    CC02    T_色_2.xx
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
4/25(水)        1    ビットマップイメージ  12/28(木)    1    ビットマップイメージ
4/25(水)        1    ビットマップイメージ  4/26(木)        1    ビットマップイメージ
4/25(水)        1    ビットマップイメージ  4/26(木)        1    ビットマップイメージ
7/25(水)        1    ビットマップイメージ  7/26(木)        1    ビットマップイメージ
7/25(水)        2    ビットマップイメージ  8/12(日)        1    ビットマップイメージ
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
※ 実際は1000レコードもあり、毎年約300レコードずつ増える感じです。
10レコード程度なら十分だとしても、レコード追加していく度にサイズが
大きくなってしまうのでは、と思い、下記のようにローカルに置いた
色ファイルを読み込む方法に変えて、なおかつ、帳票フォームの場合も色を
区別できるようにしたい。と思いました。(なるべく、テーブルには
ビットマップデータを多く保存させたくない、と思っております)

●改善の案:
>CC  P        説明
>−−−−−−−−−−−−−−−−−−
>1   C:\color1.bmp  出社日
>2   C:\color2.bmp  連休対象日
>−−−−−−−−−−−−−−−−−−

文字列での保存であれば、変更前のようにビットマップをテーブルに
保存せずに済むのでは・・・と考えておりました。1画面1レコードを表示する
場合は、色を区別できますが、以下のクエリを元に一覧表示画面を作成した場合、
Aさんのレコードが第一優先という風に、BさんもAさんと同じ色になってしまいます。

※ちなみに表示させているコントロールの種類は、「変更前は連結OLEオブジェクト」を
使っていましたが、「改善後はイメージ」を使っています。

日01     D01    CC01    T_色_1.P
−−−−−−−−−−−−−−−−−−−−−−−−−−
7/25(水)    1    C:\color1.bmp       ←Aさん
7/25(水)    2    C:\color2.bmp       ←Bさん
−−−−−−−−−−−−−−−−−−−−−−−−−−

レコード移動時に以下のように、テストプログラムを作ってみたが、1日目の
列全体が同じ色になってしまい、困っています。

Private Sub Form_Current()
  Me.連結01.Picture = ""  
  Me.連結01.Picture = Me.txtP01 
    ↑1日目のパス名は、T_色_1.Pを参照して、色ファイルを読み込み表示。
End Sub

hatenaさんのおっしゃっている通り、上記方法が不可能なら、いろいろ工夫できれば、
と思い、以下のようにしてみました。

●改善の案その2:T_色
CC  P         xx       説明
−−−−−−−−−−−−−−−−−−
1   C:\color1.bmp           出社日
2   C:\color2.bmp           連休対象日
−−−−−−−−−−−−−−−−−−

xxはOLEオブジェクト型で、空白のままにする。
そうなると、クエリは以下のように表示される。

日01     D01    CC01    T_色_1.P       T_色_1.xx
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
7/25(水)        1    C:\color1.bmp
7/25(水)        2    C:\color2.bmp
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

☆部分
T_色_1.xxは空白状態ですが、VBAで「一覧表示画面を表示する場合」のみ、外部ファイルから
指定されたパス名(C:\color1.bmp)を読み込み、挿入することを思いつきましたが、どのようにして
VBAで挿入すればよろしいでしょうか?(連結OLEオブジェクトでコントロールソースはT_色_1.xx)
もちろん、画面を閉じる時は空白に戻したいものですが、、・・・。
挿入するプログラム表現方法を過去ログとかいろんなサイトを探しても類似のものが
見つからなくて困っています。
(レコード移動時に記載するべきか、開く時に記載するべきか・・・など)

(但し、約10人にプログラム本体を配布、データだけの本体をサーバに置くので、
同時に画面を開いた場合、挿入のタイミングも考慮しなければならない。
複数の人が同時に画面を開いている場合、テーブルに挿入したとしたら、1人が画面を閉じて
空白に戻した場合、どうなるものか・・・想像できないんです・・)

●改善の案その3:
以下のように非連結OLEオブジェクト(使用可能はい、ロックいいえ)にしてみて、
以下プログラム作成しても、やはり、同じ色になってしまうようです。

Private Sub 非連結01_AfterUpdate()
  
  If Not IsNull(Me.txtP01) Then
    Me.非連結01.OLETypeAllowed = 1
    Me.非連結01.SourceDoc = Me.txtP01
    Me.非連結01.Action = 0
  End If

End Sub

Private Sub Form_Current()
  
  If Not IsNull(Me.txtP01) Then
    Me.非連結01.OLETypeAllowed = 1
    Me.非連結01.SourceDoc = Me.txtP01
    Me.非連結01.Action = 0
  End If
End Sub

外部ファイルを読み込み、帳票フォームに対してレコード毎に色を区別できる
プログラム表現方法を何度も繰り返して検討してもなかなか進まない状況です。
ご助言、お力、ご教授頂けたら願えたらありがたいです。
☆の部分について、オブジェクト挿入→新規作成、ビットマップイメージ選択を、
VBAで表現する方法をヘルプで探しても見つからないので、分かる方はご教示頂けたら
ありがたいです。
・ツリー全体表示

【9646】Access VBAの変数について。
質問  ジバク  - 07/7/3(火) 22:40 -

引用なし
パスワード
   はじめまして、Accessを使うようになって一週間程度でVBAも今回初めて触っている初心者のジバクと言います。よろしくお願いします。

**環境**
OS:ウィンドウズ2000  Access97です。

**現状**
Accessで作られたシステムの改修をやっています。

**質問**
自分の会社のAccessで使われているプログラムを見ていて疑問に思ったのですが。

Dim strVar As String

っと変数が宣言されていたとします。

この変数に使われたメモリーは、その変数を使う処理が行われた後に、自動で開放されるのでしょうか?

色々なHPを見て、参考にしながら、改修を行っているのですが、多くのHPが、

Set strVar = Nothing

と、その変数が使われる処理が抜ける際に書かれ、メモリを開放しているようなのです。

ところが、改修を行っているAccessのプログラムでは、一度も使われていませんでした。

この事を先輩に告げ、

「そのシステムに使われてる変数に対して、処理の終わりにNothingで開放すると言うのを付け加えて行った方が良いんじゃないですか?」

と、自分が言った所、
先輩は、

「Accessだから、大丈夫なんじゃない?。よくわからんけど、大丈夫だよ」

と、曖昧な返事を返されてしまいました。

実際の所、どうなのだろう・・・?っと気になって仕方が無いです。


言葉足らずな所もありますが、実際はNothingで開放する行為は必要なのでしょうか?

それとも、やらなくても良い事なのでしょうか?

もし、メモリを開放しない事で、システムダウンや不具合が起こる可能性があるとしたら、もう一度、先輩にその事を告げてみようと思います。

自分でも、調べる努力は致しますが、解る方がおられましたら、お教えください。

よろしくお願いします。

以上です。
・ツリー全体表示

【9645】Re:"*"の付いた文字列の抜き出し
回答  ハンマー  - 07/7/3(火) 14:55 -

引用なし
パスワード
   ▼ナオ さん:

まず、クエリに列を1つ追加します。(非表示で構いません)
式1: InStr(1,[フィールド],"*55*")
このフィールドの抽出条件を「<>0」とすると良いです。


SQLで書くと、
〜略〜
WHERE InStr(1,[フィールド],"*55*")<>0

こんな感じでしょうか。


それでは。
・ツリー全体表示

【9644】"*"の付いた文字列の抜き出し
質問  ナオ  - 07/7/3(火) 13:52 -

引用なし
パスワード
   こんにちは、はじめまして。
わからない事があり困っているので質問させていただきました。

動作環境はWin2000_SP6、Access2000です。

あるフィールドの中から抜き出したい情報があるのですが
その情報は"*"に挟まれています。
例えば、あるテーブルに備考と情報というフィールドがあったとして
備考の中に

AAABBBCCC*55*DDEE

CACDND*FB*ERENWMWJU

という2つのデータが入っていて情報フィールドは空白だとします。
そして1つ目のデータの備考にある*55*の部分を同じレコードの情報へ書き込み、
2つ目のデータにある*FB*の部分をそのレコードの情報へ書き込むという
処理がしたい場合はどうすれば良いでしょうか?

*と*の間に挟まれたデータを抜き出して書き込むのが理想なのですが
"*"と"*"の間に挟まれる文字列をマスタ化することも可能です。

どれも上手くいかずに最悪SQL(クエリ)の抽出条件で
抜き出そうかと思って、条件にlike "*" & "*55*" & "*"と記述しても
*はワイルドカードとして認識されて
55を含む物を全て抽出してしまったので全くわからなくなり
質問しました。

説明が下手で申し訳ないのですが宜しくお願い致します。
・ツリー全体表示

【9643】Re:配列変数の引き渡し方
質問  メイ子  - 07/7/2(月) 21:05 -

引用なし
パスワード
   ▼hatena さん
丁寧なご教示ありがとうございます。

丸々コピペさせて頂き、動作させてみましたところ、
「インデックスが有効範囲にありません」というエラーが
RS.FindFirst "出席日=#" & Split(.OnClick,"#")(1) & "#"
のところで出ます。
原因を調べてみようと思い、「.onclick」の使い方をあちこち検索してみましたが、わかりませんでした。
どこか設定が間違っているのか、考えられる原因がありましたら、もう一度ご教示お願いいたします。

>どのような色分けか分からないので、とりあえず、
>出席日 の 出欠 がTrueの時は、青、Falseの時は 赤、それ以外は白 という
>条件で背景色を設定する例です。
>
>Private Sub SetColor(y As Integer, m As Integer)
>Dim i As Integer, j As Integer
>Dim db As DAO.Database
>Dim RS As DAO.Recordset
>Dim strSQL As String
>  strSQL = "SELECT * FROM 出欠 " & _
>      "WHERE 生徒番号=" & Me.生徒番号 & " AND " & _
>      "出席日 Between #" & DateSerial(y, m + 0, 1) & _
>      "# AND #" & DateSerial(y, m + 2, 0) & "#"
>  Set db = CurrentDb()
>  Set RS = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly)
>  
>  For j = 0 To 1
>    For i = 1 To 42
>      With Me(Chr(Asc("d") + j) & i)
>        If .OnClick= "" Then
>          .BackColor = vbWhite
>        Else
>          RS.FindFirst "出席日=#" & Split(.OnClick,"#")(1) & "#"
>          If RS.NoMatch Then
>            .BackColor = vbWhite
>          ElseIf RS!出欠 Then
>            .BackColor = vbBlue
>          Else
>            .BackColor = vbRed
>          End If
>        End If
>      End With
>    Next
>  Next
>  RS.Close
>End Sub
>
>Private Sub Form_Current()
>  SetColor Year(Date), Month(Date)
>End Sub
・ツリー全体表示

【9642】Re:DDE通信でのエラー
お礼  ボビー  - 07/7/2(月) 15:30 -

引用なし
パスワード
   ▼YU-TANG さん:
ありがとうございます。
試してみたいと思います。

>まあ、どうでもいいことかもしれませんが。
>>  Dim MyWK        As Workspace
>>  Dim MyDB        As DATABASE
>>  Dim MyRS        As Recordset
>これは何のための宣言なのでしょうか。
 →直接、質問の処理には関係ない、どうでもいい宣言です。
  無視して下さって結構です。

>> strExcelPath = "C:\Program Files\Microsoft Office\Office\EXCEL.EXE"
>> strFilePath = "C:\\Format\HONBAN\市場技術情報.xls"
>「C:」の後の「\」の数が一致してませんが、どのような意図なので
>しょうか。
 →特別な意図も意味も何もありません。ただの転記ミスです。

>で、本題ですが、起動するだけなら DDE を使う必要がないような気も
>します。
>
>Shell """" & strExcelPath & """ """ & strFilePath & """", vbNormalFocus
>エラー回避が目的であれば、上記で達成できるかもしれません。
>それでは。
・ツリー全体表示

【9641】Re:一覧表示形式のスケジュール閲覧画面に...
回答  hatena  - 07/7/2(月) 14:40 -

引用なし
パスワード
   > 変更前:
> CC  CD          説明
> −−−−−−−−−−−−−−−−−−
> 1   ビットマップイメージ  出社日
> 2   ビットマップイメージ  連休対象日
> −−−−−−−−−−−−−−−−−−
>
> としており、そういう方法ですと、フォーム内の詳細セクションをレコードごとに区別できます。
> しかし、サイズが大きくなるため、ローカルに置いた色ファイルを読み込む方法に変えたため、
> ファイルを読み込む形でフォーム内で詳細セクションをレコードごとに区別するようにしたい。

サイズが大きくなることを心配しているようですが、それほど大きくならないと思いますよ。

まずは、色の画像ファイルですが、サイズは、1×1ピクセルの最小のものに
しておいて、連結オブジェクトフレームの「OLEサイズ」プロパティを「ストレッチ」
にすれば、全体に表示されます。16色BMP なら、122バイトです。

上記の 色テーブル では2件分のレコードなので、244バイト程度です。

256色BMPで、レコード数を多くしたとしても、たいしたサイズにはならないと
思いますが、いかがでしょうか。

AC97で、帳票フォームでレコード毎に色を変える方法はこれぐらいしかないですし。
・ツリー全体表示

【9640】一覧表示形式のスケジュール閲覧画面につ...
質問  たまお  - 07/7/1(日) 23:42 -

引用なし
パスワード
   スケジュール記入は、1人分のカレンダー式のスケジュール表としていましたが、
スケジュール閲覧は、全員分のスケジュールを一覧表示として表示させています。
(記入は個人のみ編集可、閲覧は編集不可)

前回投稿の続きですが、


(1) 閲覧画面を表示させるための、ボタンを押した後は、最初は「No_連休」の大きい数字が
表示される。(以下のクエリなら、75に該当するメンバ全員のスケジュールが表示)

(2) データを閲覧するだけ。(画面を閉じて終了するだけ)

No_連休 ユーザID   組織名 姓名 連休  日01   D01 CC01 T_色_1.P    日02
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
60    a000001   □aa○cc AA  盆07  12/27(水)   1   C:\color1.bmp  12/28(木)・・(略)
65    a000001   □aa○cc AA  夏季07 4/25(水)   1   C:\color1.bmp  4/26(木)・・(略)
65    a000002   □aa○cc SS  夏季07 4/25(水)   1   C:\color1.bmp  4/26(木)・・(略)
70    a000001   □aa○cc AA  秋07  7/25(水)   1   C:\color1.bmp  7/26(木)・・(略)
75    a000001   □aa○cc AA  冬07  8/11(土)   2   C:\color2.bmp  8/12(日)・・(略)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

記入画面の場合は、T_色_1.P でローカルに置いた色ファイルを読み込み、表示させていたが、
一覧表示の場合は、レコード毎に背景色が同じ色になってしまい、困っています。
雅さんのプログラム研究所のAccess 技術情報に、フォーム内の詳細セクションを任意の色に変える方法というもの
があって、それを参考に初めは、

変更前:
CC  CD          説明
−−−−−−−−−−−−−−−−−−
1   ビットマップイメージ  出社日
2   ビットマップイメージ  連休対象日
−−−−−−−−−−−−−−−−−−

としており、そういう方法ですと、フォーム内の詳細セクションをレコードごとに区別できます。
しかし、サイズが大きくなるため、ローカルに置いた色ファイルを読み込む方法に変えたため、
ファイルを読み込む形でフォーム内で詳細セクションをレコードごとに区別するようにしたい。

変更後:
CC  P       説明
−−−−−−−−−−−−−−−−−−
1   C:\color1.bmp   出社日
2   C:\color2.bmp   連休対象日
−−−−−−−−−−−−−−−−−−

参考URL:
Error:本文に禁止語句が含まれています。のため、
URLが載せられません。

Googleで、「フォーム内の詳細セクションを任意の色に変える方法」を
検索したら、1番目に表示されますので、ご参照お願いします。
-----------------------------------ここまで

ローカルに置いた色ファイルを読み込み、フォーム内の詳細セクションを
任意の色に変える方法についてご教示頂けますでしょうか?

例えば、以下のレコードを一覧表示させる場合、5人分のレコードが表示されるわけですが、

1日目に対して、

1行目と4行目、5行目の人は、C:\color2.bmp、2行目、3行目はC:\color1.bmpを読み込んでいます。
色を区別できるように一覧表示させるためにはどのようにプログラム設定すれば良いでしょうか?

改善後:
No_連休 ユーザID   組織名 姓名 連休  日01   D01 CC01 T_色_1.P    日02
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
75    a000001   □aa○cc AA  冬07  8/11(土)   2   C:\color2.bmp  8/12(日)・・(略)
75    a000002   □aa○cc BB  冬07  8/11(土)   1   C:\color1.bmp  8/12(日)・・(略)
75    a000003   □aa○cc CC  冬07  8/11(土)   1   C:\color1.bmp  8/12(日)・・(略)
75    a000004   □aa○cc DD  冬07  8/11(土)   2   C:\color2.bmp  8/12(日)・・(略)
75    a000005   □aa○cc DD  冬07  8/11(土)   2   C:\color2.bmp  8/12(日)・・(略)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

改善前:
No_連休 ユーザID   組織名 姓名 連休  日01   D01 CC01 T_色_1.CC
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
75    a000001   □aa○cc AA  冬07  8/11(土)   2   ビットマップイメージ・・(略)
75    a000002   □aa○cc AA  冬07  8/11(土)   1   ビットマップイメージ・・(略)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

以下、プログラムで1日目の色をテストとして設定してみましたが、同じ色が表示されています。
改善前は、上記のようにビットマップイメージをテーブルに保存したため、色を区別して表示できましたが、
今回はそういう訳にはいかないようです。

ご知恵をお願いします。

改善後:
閲覧画面

Option Compare Database
Option Explicit

Private Sub Form_Current()

  Me.連結01.Picture = ""
  Me.連結01.Picture = Me.txtP01

End Sub

Private Sub Form_Open(Cancel As Integer)

  Dim lngGrey As Long
  Dim No_holi As Integer
  Dim i As Integer

  Me.ShortcutMenu = False
  Me.RecordSource = "・・・略"
  Me.OrderBy = "No_Org, No_Post, No_User"
  Me.OrderByOn = True

  lngGrey = RGB(219, 215, 218)

  Me.cmb_連休 = DLookup("[連休名]", "T_連", "No_連休 = " & DMax("No_連休", "T_連"))
  Me.Filter = "連休名 = '" & Me.cmb_連休.Column(0) & "'": Me.FilterOn = True

  For i = 1 To 17
    Me.Controls("txtD" & Format(i, "00")).BackColor = lngGrey  ←入力できないことが分かるようにグレー色をつける
  Next i
  Me.btn_閉じる.SetFocus

End Sub

Private Sub cmb_連休_AfterUpdate()
  Me.Filter = "連休名 = '" & Me.cmb_連休.Column(0) & "'": Me.FilterOn = True ←他の連休名も参照する
End Sub
・ツリー全体表示

【9639】Re:カレンダー式スケジュール表について(2)
お礼  たまお  - 07/7/1(日) 23:12 -

引用なし
パスワード
   ▼小僧 さん:
遅くなり申し訳ありません。

>For i = 1 to 17
>    Me.Controls("日" & Format(i, "00")).ControlSource = "日" & Format(i, "00")
>    Me.Controls("DD" & Format(i, "00")).ControlSource = "DD" & Format(i, "00")
>    Me.Controls("CC" & Format(i, "00")).ControlSource = CC" & Format(i, "00")
>Next i

Formatを使ってコントロールをまとめる方法があるんですね。
大変、勉強になりました。ありがとうございました。

>当方であれば、T_連 の 日01 フィールドのデータ型を日付型にして
>テキストボックスの書式で m/d(aaa) と設定し表示させ、
>VBA のコードでは日付型で受ける方法を取ると思います。

T_連の、日01フィールド型は12/25(木)という表示形式であれば、
本来は、日付型ですが、以下の理由によりテキスト型にしています。

7/25(水) 7/26(木) 7/27(金) 7/28(土) という表示形式<日01〜日04>もあれば、
連休の事情により、
●:7/25(水) 7/26(木) 7/27(金) 7/28(土) という表示形式にしたい場合も
ありますので、テキスト型にしています。
----------------------------------------------
あと、別件で申し訳ありませんが、スケジュールの記入/閲覧画面に対して
実はイメージをフォームに表示する方法色を表示させるためのテーブル構成に
ついていろいろ考えてみて、以下のホームページの内容の通り変更した。


※ERROR:本文に禁止語句が含まれているため、URLを貼り付けられない
ようなので、大変申し訳ありませんが、

Googleで、「[ACC97] イメージをテーブルに保存せずフォームに表示する方法」と
入れて検索したら、1番目に表示されますので、ご確認下さい。
そのURLのように変更しました。

変更前:
CC  CD          説明
−−−−−−−−−−−−−−−−−−
1   ビットマップイメージ  出社日
2   ビットマップイメージ  連休対象日
−−−−−−−−−−−−−−−−−−

変更後:
CC  P       説明
−−−−−−−−−−−−−−−−−−
1   C:\color1.bmp   出社日
2   C:\color2.bmp   連休対象日
−−−−−−−−−−−−−−−−−−


記入画面は、以下の画面構成ですが、上記のようにテーブル構成にしたため、
色を表示させるものは、日付を表示させるためのテキストボックスの後ろに、
イメージを表示させるためのコントロールを置き、C:\ の下に置いた色ファイルを
読み込む方法でプログラムを作成しました。
そうすることで、以下のサイトのように、Access のテーブルにイメージデータを
保存せずにファイルサイズを小さくできることで対応させて頂きました。

● 画面の内容:単票フォーム

◇記入画面の詳細          No_連休,ユーザID ← 不可視
−−−−−−−−−−−−−−−−−−−−−−−−−−−
場所:                      [保存:コマンドボタン]
姓名:                      [閉じる:コマンドボタン]
−−−−−−−−−−−−−−−−−−−−−−−−−−−
過去の連休名 [夏休み |▼] ← コンボボックスで過去の連休を参照する。(cmb_連休)
−−−−−−−−−−−−−−−−−−−−−−−−−−−
   日    月    火 7/25(水) 7/26(木) 7/27(金) 7/28(土) ←日付を表示
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←スケジュールを記入
7/29(日) 7/30(月) 7/31(火) 8/1 (水) 8/2 (木) 8/3 (金) 8/4 (土)
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←スケジュールを記入
8/5 (日) 8/6 (月) 8/7 (火) 8/8 (水) 8/9 (木) 8/10(金)    土
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←スケジュールを記入
   日    月    火    水    木    金    土
[   ] [   ] [   ] [   ] [   ] [   ] [   ] ←記入不要
−−−−−−−−−−−−−−−−−−−−−−−−−−−

No_連休 ユーザID    組織名 姓名   連休   日01   D01  CC01  T_色_1.P    日02
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
60    a000001    □aa○cc AA    盆07   12/27(水)    1    C:\color1.bmp  12/28(木)・・(略)
65    a000001    □aa○cc AA    夏季07  4/25(水)    1    C:\color1.bmp  4/26(木)・・(略)
65    a000002    □aa○cc SS    夏季07  4/25(水)    1    C:\color1.bmp  4/26(木)・・(略)
70    a000001    □aa○cc AA    秋07   7/25(水)    1    C:\color1.bmp  7/26(木)・・(略)
75    a000001    □aa○cc AA    冬07   8/11(土)    2    C:\color2.bmp  8/12(日)・・(略)
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

日01〜日17:日付表示
D01〜D17:スケジュール記入用
CC01〜CC17:1を選択したらC:\color1.bmp、2を選択したらC:\color2.bmp

以下プログラムです。
小僧さんのプログラムを参考に、1画面1レコード分に対して、以下、やりたい4点ができるように
色を区別できるように表示できました。


しかし・・・・・・問題が発生。閲覧画面は一覧表示のため、色を
区別できません。
新規ページへ続く・・


Option Compare Database
Dim flgSaveOK As Boolean

Private Sub Form_BeforeUpdate(Cancel As Integer)
  If Not flgSaveOK Then
    Cancel = True
  End If
End Sub

Private Sub Form_Current()

  Dim No_holi As Long
  Dim inc01 As Variant
  Dim days01 As Variant
  Dim i As Integer
  Dim lngGrey As Long

  For i = 1 To 28
    Me.Controls("txt日" & Format(i, "00")).ControlSource = ""
    Me.Controls("txtD" & Format(i, "00")).ControlSource = ""
    Me.Controls("txtD" & Format(i, "00")).Locked = False
    Me.Controls("txtD" & Format(i, "00")).BackColor = RGB(255, 255, 255)
    Me.Controls("連結" & Format(i, "00")).Picture = ""
  Next i

  No_holi = Me.No_連休
  inc01 = DLookup("[日01]", "T_連", "No_連休 =" & No_holi)
  days01 = Left(Right(inc01, 2), 1)
  lngGrey = RGB(219, 215, 218)

  If days01 = "日" Then
    For i = 1 To 17
      Me.Controls("txt日" & Format(i, "00")).ControlSource = "日" & Format(i, "00")
      Me.Controls("txtD" & Format(i, "00")).ControlSource = "D" & Format(i, "00")
      Me.Controls("連結" & Format(i, "00")).Picture = Me.Controls("txtP" & Format(i, "00"))
    Next i
    For i = 18 To 28
      Me.Controls("txtD" & Format(i, "00")).Locked = True
      Me.Controls("txtD" & Format(i, "00")).BackColor = lngGrey
      Me.Controls("連結" & Format(i, "00")).BackColor = lngGrey
    Next i

  ElseIf days01 = "月" Then
  ・・・(略)

End Sub

Private Sub cmb_連休_AfterUpdate()

On Error GoTo Err_cmb_連休_AfterUpdate
  Me.Filter = "ユーザID = '" & str1 & "' And 連休対象 = '" & Me.cmb_連休.Column(0) & "'": Me.FilterOn = True

Exit_cmb_連休_AfterUpdate:
  Exit Sub

Err_cmb_連休_AfterUpdate:
  MsgBox "編集中は 検索機能は使えません。", vbExclamation, "通知"
  Resume Exit_cmb_連休_AfterUpdate

End Sub

Private Sub Form_Open(Cancel As Integer)

  Me.ShortcutMenu = False
  DoCmd.MoveSize 2000, 300, 9900, 7500
  Me.RecordSource = "SELECT ・・・略"

  Me.cmb_連休 = DLookup("[連休名]", "T_連", "No_連休 = " & DMax("No_連休", "T_連"))
  Me.Filter = "ユーザID = '" & str1 & "' And 連休対象 = '" & Me.cmb_連休.Column(0) & "'": Me.FilterOn = True

End Sub

Private Sub btn_閉じる_Click()
・・略
End Sub

Private Sub btn_保存_Click()
・・略
End Sub

Private Sub Form_Error(DataErr As Integer, Response As Integer)
・・略
End Sub

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
やりたいことは、以下4点です。

(1)記入画面が開いた時に最初に表示されるスケジュールは、「No_連休」が一番
大きい数字で、なおかつ、ログインしたユーザのレコードが表示されるものとする。

(2)スケジュール記入の最初の日を、曜日位置に合わせて第1週に埋め込む。
例えば、夏休みのスケジュール記入の最初の日は、7/25(水)です。
それを第1週の、4番目の位置〜17日分表示させたい。

日    月    火 7/25(水) 7/26(木) 7/27(金) 7/28(土) ←4番目の位置に表示したい

で、過去の連休名というコンボボックスでは、過去の連休を参照するわけですが、
もし、「冬休み」を選択した場合は、最初の日は、12/25(木)です。

したがって、

日    月    火    水 12/25(木) 12/26(金) 12/27(土) ←5番目の位置に表示したい

という風に表示したい。

(3)スケジュール記入対象日以外の日は日付を埋め込まない。

(4)画面を閉じる時は非連結に元に戻す。
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
・ツリー全体表示

【9638】Re:DDE通信でのエラー
回答  YU-TANG  - 07/7/1(日) 17:30 -

引用なし
パスワード
   まあ、どうでもいいことかもしれませんが。

>  Dim MyWK        As Workspace
>  Dim MyDB        As DATABASE
>  Dim MyRS        As Recordset

これは何のための宣言なのでしょうか。

> strExcelPath = "C:\Program Files\Microsoft Office\Office\EXCEL.EXE"
> strFilePath = "C:\\Format\HONBAN\市場技術情報.xls"

「C:」の後の「\」の数が一致してませんが、どのような意図なので
しょうか。


で、本題ですが、起動するだけなら DDE を使う必要がないような気も
します。

Shell """" & strExcelPath & """ """ & strFilePath & """", vbNormalFocus

エラー回避が目的であれば、上記で達成できるかもしれません。
それでは。
・ツリー全体表示

【9637】Re:文字列から特定な文字を抽出するには
回答  Gin_II  - 07/7/1(日) 0:29 -

引用なし
パスワード
   >ほしいと思って、うまくいきません。

とは?どうなるのかを言っていただかないと・・・ ^^;


>Switch(InStr([文字列], "正") > 0, "正" ,
>    InStr([文字列], "確") > 0, "確" ,
>    InStr([文字列], "性") > 0, "性" ,
>    -1,"不正")

Switch(InStr([文字列], "正") > 0, "正"
   , InStr([文字列], "確") > 0, "確"
   , InStr([文字列], "性") > 0, "性"
   , True, "不正")

だと、どうなります?
・ツリー全体表示

【9636】Re:文字列から特定な文字を抽出するには
質問  夜勤労働者  - 07/6/30(土) 20:15 -

引用なし
パスワード
   文字列には、『正』、『確』、『性』のどれも含まれない場合は、『不正』を返して
ほしいと思って、うまくいきません。
どこに間違っています?

Switch(InStr([文字列], "正") > 0, "正" ,
    InStr([文字列], "確") > 0, "確" ,
    InStr([文字列], "性") > 0, "性" ,
    -1,"不正")
・ツリー全体表示

【9635】Re:配列変数の引き渡し方
回答  hatena  - 07/6/30(土) 8:09 -

引用なし
パスワード
   >これを読み込んで、Form_Currentで生徒ごとの受講曜日と出席日を色分けしたいと思っています。


どのような色分けか分からないので、とりあえず、
出席日 の 出欠 がTrueの時は、青、Falseの時は 赤、それ以外は白 という
条件で背景色を設定する例です。

Private Sub SetColor(y As Integer, m As Integer)
Dim i As Integer, j As Integer
Dim db As DAO.Database
Dim RS As DAO.Recordset
Dim strSQL As String
  strSQL = "SELECT * FROM 出欠 " & _
      "WHERE 生徒番号=" & Me.生徒番号 & " AND " & _
      "出席日 Between #" & DateSerial(y, m + 0, 1) & _
      "# AND #" & DateSerial(y, m + 2, 0) & "#"
  Set db = CurrentDb()
  Set RS = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly)
  
  For j = 0 To 1
    For i = 1 To 42
      With Me(Chr(Asc("d") + j) & i)
        If .OnClick= "" Then
          .BackColor = vbWhite
        Else
          RS.FindFirst "出席日=#" & Split(.OnClick,"#")(1) & "#"
          If RS.NoMatch Then
            .BackColor = vbWhite
          ElseIf RS!出欠 Then
            .BackColor = vbBlue
          Else
            .BackColor = vbRed
          End If
        End If
      End With
    Next
  Next
  RS.Close
End Sub

Private Sub Form_Current()
  SetColor Year(Date), Month(Date)
End Sub
・ツリー全体表示

【9634】Re:配列変数の引き渡し方
質問  メイ子  - 07/6/29(金) 11:22 -

引用なし
パスワード
   ▼hatena さん
ご指導ありがとうございます。以下のような内容でフォームを作っています。

>フォームは単票フォームですよね。
>Form_Currentのイベントを使うと言うことは、連結フォームなんですよね。
>フォームのレコードソースのテーブル(またはクエリ)はどのようなものですか。

フォームは表形式で、連結フォームです。
テーブル名(レコードソース):「名簿管理」
フィールド名:生徒番号  1
       氏名    松井
       フリガナ  マツイ
       クラス   初級
       曜日    火曜日
       出欠    yes, no
       出席日   空
       振替予定日 空
       振替出席日 空
フォームのヘッダー部分で、クラスと曜日を検索し、詳細部分で一覧を表示しています。また、そのヘッダー部分にカレンダーコントロールもどきを6つ配置しています。

>また、「出欠」テーブルに生徒の出欠履歴が入っているようですが、
>どのようなフィールド構成ですか。データ例も出して説明してもらえると
>状況を把握しやすいです。

テーブル名:「出欠」
フィールド名:生徒番号 1
       出席日  2007/06/05
       出欠   yes, no
これを読み込んで、Form_Currentで生徒ごとの受講曜日と出席日を色分けしたいと思っています。「名簿管理」はマスターテーブルなので、出席日、振替予定日、振替出席日のフィールドは仮入力用で、実際の出席日、振替予定日、振替出席日は、「出欠」テーブルに入力していきたいのです。

どうぞよろしくお願いいたします。
・ツリー全体表示

【9633】Re:csvファイルの取込みについて
回答  Gin_II  - 07/6/29(金) 8:29 -

引用なし
パスワード
   >もし、CSVのファイルのA3(セル)から取込みする場合は、可能でしょうか?
>ご伝授ください。

TransferText メソッドでは、無理ですね。

Line Input # ステートメント や FileSystemObject の ReadLine メソッドを
使う必要があります。

FileSystemObject なら、以下のあたりを。
Line Input # ステートメントは、ヘルプで確認をしてください。

TextStream オブジェクト
http://msdn.microsoft.com/library/ja/script56/html/jsobjTextStream.asp

ReadLine メソッド
http://msdn.microsoft.com/library/ja/script56/html/jsmthReadLine.asp

SkipLine メソッド
http://msdn.microsoft.com/library/ja/script56/html/jsmthSkipLine.asp
・ツリー全体表示

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