Access VBA質問箱 IV

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

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


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

【10075】Re:WHERE条件式での日付
発言  VBWASURETA  - 07/12/6(木) 16:11 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

それではですね。

>  'クエリの作成
>  str = str & constr & ";"

この部分でブレークを貼ってstrに代入されているSQLの文字列でクエリー実行を
試して貰っても宜しいでしょうか?

恐らくそれで問題となっている点が見える気がします。
・ツリー全体表示

【10074】Re:フォームの操作禁止
お礼  ヒッキー  - 07/12/6(木) 16:04 -

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

こんにちは。

ありがとうございます。
試してみます。

質問なんですが、ダイアログモードで開いたフォーム2を閉じる時はダイアログモードは解除されるんですか?
何もせずに解除できるんなら良いんですが、プログラムを追加しなくてはいけないんであればそれも教えてください。

余談としてWindowModeってOS設定を変えるものなんですか?
それとも表示している部分の設定をするものなんですか?
今後のために教えていただけるとありがたいです。
・ツリー全体表示

【10073】Re:処理方法について
発言  やすじ  - 07/12/6(木) 15:28 -

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

こんにちわ

たびたびすみません。

>このDLLで何のデータを読んでいるのでしょうか?
>CSV・テーブル・Iniファイルとか色々あるかと思いますが。
>後、dllからのレスポンスがどれぐらいとか見られてますか?

↑測定器(計測器)から直接RS−232CケーブルをPCに繫いでデータを読んでいます。
レスポンスは・・・たぶん10msだと思います。


>それと一括取得は試されたということですがこんな感じの
>取得でしょうか?

↑前回記入したものをただ羅列しただけです。(下に表記)
サンプルプログラム例を参照して試して見ます。


Private Sub Form_Timer()

  Dim rData1 As Integer
  Dim rData2 As Integer
  Dim rData3 As Integer
  Dim rData4 As Integer
  Dim rData5 As Integer

  lErr = ReadDevice16("KML", "D10WORD", rData1, 1)
  lErr = ReadDevice16("KML", "D11WORD", rData2, 1)
  lErr = ReadDevice16("KML", "D12WORD", rData3, 1)
  lErr = ReadDevice16("KML", "D13WORD", rData4, 1)
  lErr = ReadDevice16("KML", "D14WORD", rData5, 1)
  
  text1 = rData1
  text2 = rData2
  text3 = rData3
  text4 = rData4
  text5 = rData5

End Sub
・ツリー全体表示

【10072】Re:フォームの操作禁止
回答  小僧  - 07/12/6(木) 15:19 -

引用なし
パスワード
   ▼ヒッキー さん:
こんにちは。


こちらは VBA の掲示板ですので、VBAでお答えすると

  DoCmd.OpenForm "フォーム2", WindowMode:=acDialog

という様な記述になるかと思われます。
・ツリー全体表示

【10071】Re:フォームの操作禁止
質問  ヒッキー  - 07/12/6(木) 15:13 -

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

こんにちわ

>フォーム1に限らず、開いている全てのフォームに対して
>入力の禁止を行ってしまいますが、
>フォーム2を開く際にダイアログモードで開いてみてはいかがでしょうか。

すみませんが”ダイアログモード”ってどうやるんですか?
やってみようかと思ったんですがどうやるのか解らなくって・・・
・ツリー全体表示

【10070】Re:WHERE条件式での日付
質問  あおぎん  - 07/12/6(木) 15:13 -

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


>▼あおぎん さん:
>こんにちは。
>
>クエリーのパラメータ確認は一度クエリーに直接SQLを書いて実行すると
>わかり易いですよ。
>
>合っていればパラメータ入力待ち画面が表示されます。
>(該当フォームを開いていない状態で開く場合)
>
>エラーの場合は的確なエラー指摘が表示されたと思います。

こんにちは。
お返事ありがとうございます。
クエリーに書いて実行してみました。

SELECT UQ_コメント印刷用.* FROM UQ_コメント印刷用
WHERE UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 And Forms!F_コメント印刷!受診日至;

と日付条件だけ入れてみたんですけど、問題なく実行されました。

どうしてうまくいかないんでしょう・・?
・ツリー全体表示

【10069】Re:WHERE条件式での日付
発言  VBWASURETA  - 07/12/6(木) 13:57 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

クエリーのパラメータ確認は一度クエリーに直接SQLを書いて実行すると
わかり易いですよ。

合っていればパラメータ入力待ち画面が表示されます。
(該当フォームを開いていない状態で開く場合)

エラーの場合は的確なエラー指摘が表示されたと思います。
・ツリー全体表示

【10068】Re:処理方法について
発言  VBWASURETA  - 07/12/6(木) 13:36 -

引用なし
パスワード
   ▼やすじ さん:
こんにちは。

すみませんもう少し確認したいのですが、

>  lErr = ReadDevice16("KML", "D10WORD", rData1, 1)
>  ’↑簡易DLLのプログラム。データの読み込みを行っている。
>  ’KMLは設定データの名前で、D10WORDはデータが入っている場所で、
>  ’rData1は読み出したデータを格納する場所、最後の1はデータの数となっている


このDLLで何のデータを読んでいるのでしょうか?
CSV・テーブル・Iniファイルとか色々あるかと思いますが。
後、dllからのレスポンスがどれぐらいとか見られてますか?

それと一括取得は試されたということですがこんな感じの
取得でしょうか?


サンプル例:

'格納するグローバル変数
Public m_dlldata() As Integer
'読み込み中ロック
Public m_DllLock As Boolean

Sub form1のタイマーイベント()
  Dim getdata As Integer
  
  If dll_Read_Process = True Then
    '読み込み中ロック解除
    m_DllLock = False
    getdata = Get_dll_data( 1 ) 'フォーム1のデータを取り出す
  End If
End Sub

'/**dllの一括に読み込む処理**/
Function dll_Read_Process() As Boolean
  On Error GoTo dll_Read_Error
  dll_Read_Process = False
  Const maxdata As Integer = 5
  Dim i As Integer
  Dim lErr As Integer
  
  '読み込み中ロック
  m_DllLock = True
  
  '格納データ動的配列定義
  ReDim m_dlldata(maxdata)

  For i = 1 To UBound(m_dlldata)
    lErr = ReadDevice16("KML", "D10WORD", m_dlldata(i), 1)
    If lErr <> 0 Then
      m_dlldata(i) = -1 'サンプルとしてエラー戻り値を-1にする
    End If
  Next i
  
  dll_Read_Process = True
Exit Function
'エラー処理
dll_Read_Error:
  dll_Read_Process = False
  MsgBox Err.Number & ":" & Err.Description, vbCritical + vbOKOnly, "dll読み込みエラー"
End Function

'/**変数に代入された内容を取り出す処理**/
Function Get_dll_data(FormIndex As Integer) As Integer
  On Error GoTo Get_dll_data_Error
  Dim m_getdata As Integer

  If (m_DllLock = True) Then
    m_getdata = -1 '読み込み中の場合エラー
  ElseIf (FormIndex <= UBound(m_dlldata)) Then '必要データ分配列が用意されているか判定
    m_getdata = m_dlldata(FormIndex) '正常の場合
  Else
    m_getdata = -1 'エラーの場合
  End If
  '結果を代入
  Get_dll_data = m_getdata
Exit Function
'エラー処理
Get_dll_data_Error:
  m_getdata = -1
  Get_dll_data = m_getdata
End Function
・ツリー全体表示

【10067】WHERE条件式での日付
質問  あおぎん  - 07/12/6(木) 13:04 -

引用なし
パスワード
   いつもお世話になってます。

UQ_コメント印刷用を元に、F_コメント印刷 上で条件をつけた Q_コメント印刷用をレポートソースにR_結果通知を印刷しようとしています。
そのため以下のように記述しているのですが、
エラー「実行時エラー’3061’ パラメータが少なすぎます。」が出ます。
このエラーは 検索条件・・日付を書き加えたら出るようになりました。
検索条件・・日付の記述方法がおかしいのだと思いますが、修正方法がよくわかりません。

constr = " WHERE UQ_コメント印刷用.受診日 between #" & Forms!F_コメント印刷!受診日& "# And #" & Forms!F_コメント印刷!受診日至 & "# "
日付を##で囲んだりしたんですが、別のエラーが出ました。

解決方法をどなたかご教示をよろしくお願いします。


Private Sub cmd_印刷_Click()
  Dim db As Database
  Dim qdf As QueryDef
  Dim rst As Recordset
  Dim str As String, constr As String
  
  str = "SELECT UQ_コメント印刷用.* FROM UQ_コメント印刷用"
  constr = ""
  
   '検索条件・・・判定番号
  If IsNull(Me.フレーム6) Then
    constr = ""
  Else
   Select Case フレーム6
   Case 1
    constr = " WHERE UQ_コメント印刷用.判定番号 > 3"
   Case 2
    constr = " WHERE UQ_コメント印刷用.判定番号 < 4"
   End Select
  End If
  '検索条件・・・社員コード
  If constr = "" And Not IsNull(Me.社員コード) Then
    constr = " WHERE (UQ_コメント印刷用.社員コード = " & Me.社員コード & ")"
  ElseIf Not IsNull(Me.社員コード) Then
    constr = constr & " AND (UQ_コメント印刷用.社員コード = " & Me.社員コード & ")"
  End If
  '検索条件・・・カナ氏名
  If constr = "" And Not IsNull(Me.カナ氏名) Then
    constr = " WHERE (UQ_コメント印刷用.カナ氏名 Like '*" & Me.カナ氏名 & "*')"
  ElseIf Not IsNull(Me.カナ氏名) Then
    constr = constr & " AND (UQ_コメント印刷用.カナ氏名 Like '*" & Me.カナ氏名 & "*')"
  End If
  
   '検索条件・・・日付
  If constr = "" Then
    constr = " WHERE UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至"
  Else
    constr = constr & " AND WHERE UQ_コメント印刷用.受診日 between Forms!F_コメント印刷!受診日 and Forms!F_コメント印刷!受診日至"
  End If
 
  
  'クエリの作成
  str = str & constr & ";"
  Set db = CurrentDb()
  Set qdf = db.QueryDefs("Q_コメント印刷用")
  qdf.SQL = str
  qdf.Close
  Set rst = db.OpenRecordset("Q_コメント印刷用")
  If rst.RecordCount = 0 Then
    MsgBox "対象者がいません。", vbOKOnly, "データなし"
    rst.Close
    db.Close
  Else
    rst.Close
    db.Close
    DoCmd.OpenReport "R_結果通知", acViewPreview
  End If
End Sub

(WIN ACCESS ともに2000)
・ツリー全体表示

【10066】Re:フォームの操作禁止
回答  小僧  - 07/12/6(木) 13:02 -

引用なし
パスワード
   ▼ヒッキー さん:
こんにちは。

>フォーム1が表示されてる最中にフォーム2が表示された場合
>フォーム1の操作(コマンドスイッチやテキスト書き込みなど)ができないようにしたい。

フォーム1に限らず、開いている全てのフォームに対して
入力の禁止を行ってしまいますが、

フォーム2を開く際にダイアログモードで開いてみてはいかがでしょうか。
・ツリー全体表示

【10065】フォームの操作禁止
質問  ヒッキー  - 07/12/6(木) 11:19 -

引用なし
パスワード
   お初です。
ヒッキーといいます。

教えてください。

フォーム1が表示されてる最中にフォーム2が表示された場合フォーム1の操作(コマンドスイッチやテキスト書き込みなど)ができないようにしたい。

詳細をお話しすると、
LAN(イーサネット)から送られてくるデータをPCで受信している環境があります。
フォーム1を開いてる最中はLANからデータを受信します。
LAN経由でデータ1のbitが1だったときフォーム2を開き、
フォーム2が開いたらフォーム1を操作できなくし、
フォーム2で解除コードを打ち込み送信すると
LAN経由データ1のbitが0になりそれを受信すると
フォーム2を閉じフォーム1が操作できるようにしたい。

なのでフォーム2が表示中はフォーム1(できればフォーム2以外のすべて)を操作不可にしたいのですがいい案が浮かびません。

御教授ください。お願いします。
・ツリー全体表示

【10064】Re:処理方法について
お礼  やすじ  - 07/12/6(木) 11:05 -

引用なし
パスワード
   ▼VBWASURETA さん:
こんにちわ

>上記にも記載しましたが、1本化つまり、1フォーム内で一括に
>dll値を取得して変数に格納する。
>他のフォームは格納された変数から取得するようなイメージです。

↑実はこの方法は最初の段階で確認しました。
同じフォームで5つのデータを表示しようとすると表示が上手く入ってこなくなりすべて0が表示されるようになってしまいます。(ずっと)
(実際2個のデータを同一フォームで表示しても0になってしまう)

表示がタイマー時間で更新されるのでその時にちらつきが発生しますがとりあえず我慢するしかなさそうですね・・・

すみません。ありがとうございました
・ツリー全体表示

【10063】Re:処理方法について
発言  VBWASURETA  - 07/12/6(木) 9:22 -

引用なし
パスワード
   ▼やすじ さん:
こんにちは。

追記なのですが、同時起動してもdllの読み込むレスポンス差等で
重なる場合があります。

上記にも記載しましたが、1本化つまり、1フォーム内で一括に
dll値を取得して変数に格納する。
他のフォームは格納された変数から取得するようなイメージです。

この方法によりdll取得が重なることを考慮する必要はないはずです。
もしうまくいくようでしたら重なっているような気がします。

ご参考までに。
・ツリー全体表示

【10062】Access2003上でのDAO動作(続報)
発言  raki  - 07/12/5(水) 14:08 -

引用なし
パスワード
   解決策として、
「Access2003へインポートする」を報告しましたが、インポート後、”最適化”を実施したところ、更新不正が発生しました。

また、Access2003だけでなく、Access2000でも本件の現象が発生しました。


よって、解決作としては、”排他で開く”が硬いようです。
現在は、「レコードロック」オプションをつけた場合とはずした場合の動作、性能を調査しています。


おかしな現象ですね。
調査中の事項については何か分かったらまた報告します。
・ツリー全体表示

【10061】Re:うまく値を取得できないのですが・・。
回答  あおぎん  - 07/12/5(水) 13:59 -

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

回答ありがとうございます。
コードがおかしくないとのことで、オプション値を確認したら・・・間違ってました^^;。
よーく確認して投稿したつもりですが、そそっかしくて申し訳ないです。
お騒がせしました。
そして、ありがとうございました。

>>Select Case Forms!F_コメント入力!フレーム33
>> Case 1
>>   DoCmd.GoToRecord , , acNewRec
>>   …
>> Case 2
>>   DoCmd.GoToRecord , , acNewRec
>>   …
>> Case 3
>>   DoCmd.GoToRecord , , acNewRec
>>   …
>> End Select
>
>せっかく Case 文 を使われてるのですから、
>Case内で同じ処理をするのであれば外に出してしまった方が良さそうですね。

最初selectcaseとcase1の間に出したらエラーが出ましたが、位置を変えたらうまくいきました。(いまいちどこに書けばどこの範囲に影響するかわかってなくて・・。)
ありがとうございます。
>
>
>> DoCmd.OpenTable "T_コメント", acNormal, acEdit
>> DoCmd.Close acTable, "T_コメント"
>
>F_コメントリストが連結フォームだと思われるので、
>T_コメントを Open/Close しないでも大丈夫ですね。
>

以前使ったコードやサンプルをコピーして少し書き換えて・・というような感じでやってますので、無駄に記述していることが多いようです。ご指摘ありがとうございます。


>これは意見が分かれる所なのですが、正規化した方が良さそうですね。
>
>T_コメント区分マスタ
>コメント区分コード コメント区分
>1          指導     
>2          再検査    
>3          治療     
>
>
> T_コメント
> コメント区分コード コメント番号 コメント 
> 1           1     ○○に注意しましょう。
> 1           2     ○○を控えましょう
> 2           1     ○○の検査を受けましょう
> 2           2     ▲▲の検査を受けましょう
> 3           1     ○○の治療が必要です。
> 3           2     ▲の値について○○の治療を受けてください。
>
>
>の様にして、クエリで両テーブルを結合したものを
>フォームのレコードソースにする事をお勧めします。

参考にします。

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

【10060】Re:うまく値を取得できないのですが・・。
お礼  あおぎん  - 07/12/5(水) 13:44 -

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

フレームのオプション値の設定がおかしかったです^^;。
ご指摘ありがとうございました。
・ツリー全体表示

【10059】Re:うまく値を取得できないのですが・・。
回答  小僧  - 07/12/5(水) 11:43 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

当方の環境(WinXP SP2、Access2003 SP3)ですと
[F_コメント入力] 上に非連結のフレームを作り、
[F_コメントリスト] 上のコマンドボタンをクリックすると
期待通りの値が得られましたよ。

やりたい事はコード的には間違っていないかと思われますので
何かちょっとした所が問題になってそうですね。
(VBWASURETA さんご指摘のオプション値が 0、1、2 になっていないか等)

>Select Case Forms!F_コメント入力!フレーム33
> Case 1
>   DoCmd.GoToRecord , , acNewRec
>   …
> Case 2
>   DoCmd.GoToRecord , , acNewRec
>   …
> Case 3
>   DoCmd.GoToRecord , , acNewRec
>   …
> End Select

せっかく Case 文 を使われてるのですから、
Case内で同じ処理をするのであれば外に出してしまった方が良さそうですね。


> DoCmd.OpenTable "T_コメント", acNormal, acEdit
> DoCmd.Close acTable, "T_コメント"

F_コメントリストが連結フォームだと思われるので、
T_コメントを Open/Close しないでも大丈夫ですね。


> T_コメント
> コメント区分コード コメント区分 コメント番号 コメント 
> 1          指導     1     ○○に注意しましょう。
> 1          指導     2     ○○を控えましょう
> 2          再検査    1     ○○の検査を受けましょう
> 2          再検査    2     ▲▲の検査を受けましょう
> 3          治療     1     ○○の治療が必要です。
> 3          治療     2     ▲の値について○○の治療を受けてください。


これは意見が分かれる所なのですが、正規化した方が良さそうですね。

T_コメント区分マスタ
コメント区分コード コメント区分
1          指導     
2          再検査    
3          治療     


T_コメント
コメント区分コード コメント番号 コメント 
1           1     ○○に注意しましょう。
1           2     ○○を控えましょう
2           1     ○○の検査を受けましょう
2           2     ▲▲の検査を受けましょう
3           1     ○○の治療が必要です。
3           2     ▲の値について○○の治療を受けてください。


の様にして、クエリで両テーブルを結合したものを
フォームのレコードソースにする事をお勧めします。
・ツリー全体表示

【10058】Re:処理方法について
回答  VBWASURETA  - 07/12/5(水) 11:01 -

引用なし
パスワード
   ▼やすじ さん:
こんにちは。

あまり参考にならないかもしれませんが、

>  lErr = ReadDevice16("KML", "D10WORD", rData1, 1)

ですが、この処理を1本化(関数)にしてみては?
フォームのタイマーは表示させるだけにして、
必要なdllは一定に一括で取得するといったような感じではいかがでしょうか?
・ツリー全体表示

【10057】Re:うまく値を取得できないのですが・・。
発言  VBWASURETA  - 07/12/5(水) 10:56 -

引用なし
パスワード
   ▼あおぎん さん:
こんにちは。

違っていたらすみません。
気になったのは

>Select Case Forms!F_コメント入力!フレーム33
> Case 1
> Case 2
> Case 3
>   End Select

ですが、フレームの値って1からでした?
VBAから離れているもので忘れてます・・・
・ツリー全体表示

【10056】うまく値を取得できないのですが・・。
質問  あおぎん  - 07/12/5(水) 9:54 -

引用なし
パスワード
   いつもお世話になります。
またわからなくなったので教えてください。


健康診断等を管理するデータベースを作成しています。

その中で衛生管理者等の意見を記入するため、コメントリストを作成し選択するようにしています。

T_コメントは
以下のようなテーブル構成で、1指導 2再検査 3治療 3つの区分にわかれ、それぞれにコメント番号を付してコメントリストを作っています。(各区分の項目は現在10〜15くらい)
T_コメント
コメント区分コード コメント区分 コメント番号 コメント 
1          指導     1     ○○に注意しましょう。
1          指導     2     ○○を控えましょう
2          再検査    1     ○○の検査を受けましょう
2          再検査    2     ▲▲の検査を受けましょう
3          治療     1     ○○の治療が必要です。
3          治療     2     ▲の値について○○の治療を受けてください。

このT_コメントを元に各受検者のデータの意見欄に入力していくのですが、リストにない意見をその都度増やす必要があるため、F_コメントリストフォームのコマンドボタンをクリックすると、そのコメントの新しい番号を取得しそのレコードに飛ぶようにコメント追加ボタン(コマンド66)を配置し、下のようにコードを書いています。


Private Sub コマンド66_Click()
On Error GoTo Err_コマンド66_Click
 Dim intX As Integer
Select Case Forms!F_コメント入力!フレーム33
Case 1
   DoCmd.GoToRecord , , acNewRec
   DoCmd.OpenTable "T_コメント", acNormal, acEdit
   intX = DMax("コメント番号", "T_コメント", "コメント番号>0 and コメント区分コード=1 ")
  コメント番号 = intX + 1
  コメント区分コード = 1
  コメント区分 = "指導"
   DoCmd.Close acTable, "T_コメント"
 Case 2
  DoCmd.GoToRecord , , acNewRec
  DoCmd.OpenTable "T_コメント", acNormal, acEdit
  intX = DMax("コメント番号", "T_コメント", "コメント番号>0 and コメント区分コード=2 ")
  コメント番号 = intX + 1
  コメント区分コード = 2
  コメント区分 = "再検査"
  DoCmd.Close acTable, "T_コメント"
Case 3
  DoCmd.GoToRecord , , acNewRec
  DoCmd.OpenTable "T_コメント", acNormal, acEdit
  intX = DMax("コメント番号", "T_コメント", "コメント番号>0 and コメント区分コード=3 ")
  コメント番号 = intX + 1
  コメント区分コード = 3
  コメント区分 = "治療"
   DoCmd.Close acTable, "T_コメント"
   End Select
Exit_コマンド66_Click:
  Exit Sub
Err_コマンド66_Click:
  MsgBox Err.Description
  Resume Exit_コマンド66_Click
 
End Sub

F_コメント入力!フレーム33はコメント区分を選択するオプショングループです。
フレーム33で1を選択すると、コメント区分が「指導」のF_コメントリストフォームが表示されます。

F_コメント入力!フレーム33で「指導」を選択している場合は、T_コメントテーブルの、指導区分のコメント番号のいちばん大きい値を取得し、1を加えた数値をコメント番号に入力し、ついでにコメント区分コードと区分も入力するという処理を行っているつもりなのですが、

実際にコマンドボタンをクリックすると、3の治療を選択しているのにもかかわらず、2の再検査の値を取得したりと、処理がうまくいきません。


解消方法をどなたか教えていただけたらと思います。
よろしくお願いします。

(Win /Accessともに2000)
・ツリー全体表示

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