Access VBA質問箱 IV

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

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


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

【12784】Re:所得税の算出
発言  かるびの  - 15/3/29(日) 2:47 -

引用なし
パスワード
   > 次に、社会保険料等控除後金額から税額表の「以上」フィールドの値を求める
>ユーザー定義関数を作ります。

 興味が湧いたので、このユーザー定義関数を考えてみました。

Function FnIjogaku(lngKojogo As Long) As Long
  Dim lngHasu As Long
  Dim lngRslt As Long
  
  If lngKojogo < 1010000 Then
    Select Case lngKojogo
      Case Is < 99000
        lngHasu = lngKojogo Mod 1000
    
      Case Is < 221000
        lngHasu = (lngKojogo - 99000) Mod 2000
  
      Case Is < 1010000
        lngHasu = (lngKojogo - 221000) Mod 3000
    End Select

    lngRslt = lngKojogo - lngHasu
  Else
  
  End If
End Function

 補足すると、引数のlngKojogoは、社会保険料等控除後の給料額です。

 以上と未満の幅は、
控除後給料額が   0〜  99,000のとき、1000円幅、
        99,000〜 221,000のとき、2000円幅、
       221,000〜1,010,000のとき、3000円幅
ですが、変数lngHasuは、この幅に満たない端数のことです。

 社会保険料等控除後の給料額からこの端数を引けば、
所得率表テーブルの「以上」フィールドの値になるはずです。

 返り値は、所得率表テーブルの「以上」フィールドの数値です。

 Else以下、つまり、社会保険料控除後の給料額が101万円以上の場合も
書こうかと思ったのですが、力尽きました。
・ツリー全体表示

【12783】Re:複数抽出
回答  かるびの  - 15/3/29(日) 2:09 -

引用なし
パスワード
   >> 「Me.口座番号」というのは、「Me」テーブルの「口座番号」フィールド
>>という意味になります。
>> しかし、「口座番号」フィールドが所属しているのは
>>「利用者」テーブルであり、「Me」なんて名前のテーブルは存在しませんよね。
>> したがって、「『Me』テーブルの『口座番号』フィールド」
>>というフィールドは、存在しないフィールドです。
>> 上記の文字列中に「Me.」が入り込まないようにする必要があります。
>
>非常に混乱しております。

 ここは、VBAとSQLは違うよということです。

 イベントプロシージャのコードは、VBAというプログラミング言語で書かれています。
 これに対し、Filterプロパティに設定する値、言い換えれば、strFilterに格納する値は、
SQLというプログラミング言語で書く必要があります。

 SQLといっても、文法自体はかなり単純であり、
SQLでクエリを作るという経験がないと、
SQLが独自のプログラミング言語であるということ自体意識しにくいと思います。
 しかし、VBAとSQLは全く異なる言語です。
 そのため、VBAで使えた言葉がSQLでは使えないとか、
SQLで使えた言葉がVBAでは使えないといったことあります。

 「Me」は、その例の一つであり、VBAでは「このフォーム」という意味ですが、
SQLでは特別の意味を持ちません。
 また、SQLでは、「A.B」とあった場合、AテーブルのBフィールドという意味になります。
これ以外の意味を持つことはありません。
 他方、VBAでは、「A.B」とあった場合、AテーブルのBフィールドという意味にはならず、
AオブジェクトのBプロパティとか、
Aオブジェクトに対するBメソッドとか、
Aオブジェクトの、(その下位概念である)Bオブジェクト
など幅広い意味を持ちます。
 したがって、strFilterに格納された値(文字列)中に、
VBA用語である「Me」を入れてはいけないということです。


>If Not IsNull(利用者ID) Then
>  strFilter = " AND " & BuildCriteria("利用者ID", _
>      dbLong, 利用者ID)
>End If

 本題ではありませんが、フィールドの名前とテキストボックスの名前を同じにするのは、
やめた方がいいと思います。
 両者を混同してしまいがちだからです。
 テキストボックスの名前は、元のとおり「txt_利用者ID」の方がいいと思います。


>If Not IsDate(利用開始日) Then
>  strFilter = strFilter
>End If

 2つの問題があります。

 まず、「If Not IsDate(利用開始日) Then」ということの意味ですが、
「『利用開始日』テキストボックスの値が日付ではない場合」という意味になります。
 この場合は、何もする必要はないわけですが、
これとは逆に、「利用開始日」テキストボックスの値が日付である場合には、
何か処理をする必要があるのではないですか。


 次に、「利用開始日」テキストボックスに入力された値を使った抽出条件が書かれていません。
 これでは、「利用開始日」テキストボックスや「利用終了日」テキストボックスに
どんな値を入力しても、それをフィルタに反映させることはできず、
「利用開始日」テキストボックスなどに入力した値を使ってのレコードの抽出はできません。

 元の
>strFilter = strFilter & " AND Me.開始日 >= #" & Nz(Me.txt開始日) & "#"
というコードのうち、フィールド名のところだけを直せば良かったのに
(IF文も直す必要がありますが)。


>  strFilter = Mid(strFilter, 6)
 Mid関数の第2引数がなぜ「8」ではだめなのか、本件では「6」でなければならないのはなぜか
ということを御理解いただけたようで、何よりです。
・ツリー全体表示

【12782】Re:複数抽出
質問  ゆか  - 15/3/28(土) 17:08 -

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

いつも本当にありがとうございます!!!
そして、返信が遅くなってすみません。
IsDateについて色々試してみました!
?IsDate("2015/03/32")
False
?IsDate("2015/03/30")
True
?IsDate("H32/3/5")
True
?IsDate("平成32/2/1")
True
?IsDate("3月31日")
True
の様に、日付表示で対応されるものは正しいと表示されることはわかりました。

また
? Mid("あいうえおかきくけこ",2)
いうえおかきくけこ
? Mid("あいうえおかきくけこ",9)
けこ
? Mid("あいうえおかきくけこ",5)
おかきくけこ
? Mid("あいうえおかきくけこ",1)
あいうえおかきくけこ
? Mid("あいうえおかきくけこ",15)

という結果も出て、Mid(抽出対象,抽出対象の最初を指定)
のような意味であるということまでは認識でしました。
そして、イミディエイトウィンドウも?を遣えば答えが出てくるともわかりました。
ありがとうございます!


> 2つの問題点があります。
>
> まず、一つめ。
> 問題となるのは「Me.」です。
>
> 「Me.口座番号」というのは、「Me」テーブルの「口座番号」フィールド
>という意味になります。
> しかし、「口座番号」フィールドが所属しているのは
>「利用者」テーブルであり、「Me」なんて名前のテーブルは存在しませんよね。
> したがって、「『Me』テーブルの『口座番号』フィールド」
>というフィールドは、存在しないフィールドです。
> 上記の文字列中に「Me.」が入り込まないようにする必要があります。

非常に混乱しております。
Private Sub cmdFilter_Click()
  Dim strFilter As String, strExp As String, aryOpe As Variant


  If Not IsNull(利用者ID) Then
    strFilter = " AND " & BuildCriteria("利用者ID", _
      dbLong, 利用者ID)
  End If
  
  
   If Not IsNull(口座番号) Then
    strFilter = " AND " & BuildCriteria("口座番号", _
      dbLong, 口座番号)
  End If
  
 
  If Not IsNull(口座名義人) Then
    strFilter = strFilter & " AND 口座名義人 Like '*" & 口座名義人 & "*'"
  End If
  
 
  If Not IsNull(利用者名) Then
     strFilter = strFilter & " AND 利用者名 Like '*" & 利用者名 & "*'"
  End If
  
 
   If Not IsNull(利用施設) Then
     strFilter = strFilter & " AND 利用施設 Like '*" & 利用施設 & "*'"
  End If
  
  
  If Not IsDate(利用開始日) Then
    strFilter = strFilter
  End If
  
  
  If Not IsDate(利用終了日) Then
    strFilter = strFilter
  End If


If Not IsNull(利用終了者) Then
    strFilter = "(" & strFilter & ") or 利用終了者"
End If

 Debug.Print "Mid関数前:" & strFilter
  strFilter = Mid(strFilter, 6)
   Me.Filter = strFilter
Debug.Print "Mid関数後:" & strFilter
  If strFilter = "" Then
    Me.FilterOn = False
   Else
    Me.FilterOn = True
  End If
 
End Sub

Private Sub cmdFilterOff_Click()
  Me.Filter = ""
  Me.FilterOn = False
  利用者ID = Null
  口座名義人 = Null
  利用者名 = Null
  利用施設 = Null
  利用開始日 = Null
  利用終了日 = Null
  口座番号 = Null
  利用終了者 = Null
End Sub

と直してみて抽出したのですが、
レコードの一番上を抽出すことが出来る様になりました!
ただ、テキストボックスに入力したものと全く無関係という…。
理解力のなかさに呆れてしまわれてると思いますが、
ご教授いただければ幸いです。
何卒、宜しくお願いいたします。
・ツリー全体表示

【12781】Re:所得税の算出
回答  かるびの  - 15/3/28(土) 1:21 -

引用なし
パスワード
   >> これに関し、国税庁のホームページ中に
>>
>>ht tp://www.nta.go.jp/shiraberu/ippanjoho/pamph/gensen/shikata2015
>>/pdf/06.pdf
>>
>>というページがあります。PDFのページですが、その14ページに
>>「(平成27年分の年末調整のための算出所得税額の速算表)」という表が
>>あります。

とレスしましたが、上記は、年間の税額を計算する方法なので、ちょっと違いますね。

 むしろこっちの方ですね。

月額表の甲欄を適用する給与等に対する源泉徴収税額の電算機計算の特例
ht tp://www.nta.go.jp/shiraberu/ippanjoho/pamph/gensen/zeigakuhyo2014/data/05.pdf 


 ただ、
ht tp://www.nta.go.jp/shiraberu/ippanjoho/pamph/gensen/zeigakuhyo2014
/data/01.pdf
を見ると、税額表による源泉額と、電算機計算の特例による源泉額とでは、
若干の差が出るみたいです。


>>このようなユーザー関数化も一法ではないかなと思います。
>
>具体的な方法はどの様にすればよろしいでしょうか?

 このユーザー定義関数は、クエリからアクセスできる必要があるので、
標準モジュールに書きます。
 引数を、社会保険料等を控除した後の給与等の金額
及び控除対象扶養親族の数とし、返り値を源泉所得税額とします。


 触りのところだけ書くと、 

Function FnGensenGaku(lngSalary As Long,bytFuyo As Byte) As Long

End Function

となります。

 Function で始まる行と、End Function の行の間に
コードを書いていくことになります。
 コードの組み立ては、上記の電算機計算の特例に記載された手順を
丹念になぞっていけばいいと思います。
 なお、私からコードを示すつもりはありません。


 今回ちょっと調べた結果、
税額表による源泉額と電算機計算の特例による源泉額とでは、
差が出ることがわかったので、
やっぱり税額表を使う方法による方がいいのかなと思い始めています。

 その方法ですが、まず、税額表から「未満」フィールドを削除したテーブルを
用意します。

以上   扶養人数 所得税額
380,000     0  15,040
380,000     1  11,800
380,000     2   8,570
        ・・・・・・
383,000     0  15,280
383,000     1  12,050
383,000     2   8,810

 次に、社会保険料等控除後金額から税額表の「以上」フィールドの値を求める
ユーザー定義関数を作ります。
 すなわち、控除金額が392,050円の人は、
税額表において控除金額が392,000円以上395,000円未満の行に該当するので、
392,000円という値を返し、
控除金額が394,000円の人は、392,000円という値を返し、
控除金額が397,000円の人は、395,000円という値を返す
という処理をする関数を作ります。

 その上で、従事者テーブルにプラスして
この関数を使った演算フィールド(フィールド名「基準額」)
を持つクエリを作り(クエリ名「Q一次」)、
Q一次と税額表とを、「基準額」フィールドと「以上」フィールド、
及び「扶養人数」フィールドで結合させたクエリを作ります
(クエリ名「Q二次」)。

 このようにすれば、結合条件に不等号を使わずに済むので、
いくらかはクエリが速くなるのではないかと思います。
 ただし、試したわけではないので、本当に速くなるかどうかは未知数です。


 これでもまだ遅いようであれば、
Q一次と税額表との結合は1フィールドだけにして、
もう片方の結合条件は、抽出条件とするという方法を試すことになりそうです。
・ツリー全体表示

【12780】Re:所得税の算出
質問  ppp3  - 15/3/27(金) 21:31 -

引用なし
パスワード
       お返事有難う御座います

> なお、結合条件に不等号を使うと、クエリが極端に遅くなるという印象です。
> なので、できたら、上記の結合条件は避けた方が無難ではないかと思います。

以下を参考に実装した所表示までに1分30秒程掛かりました。
結合をしてもほぼ同じような感じがします

www.税務経理.com/accessで源泉所得税を計算1./


源泉税額: Int(DLookUp(“源泉税額”,”源泉徴収税額表”,”[以上]<=” & [給料] & “” & ” and ” & “[未満]>” & [給料] & “” & ” and ” & “[扶養親族]=” & [扶養] & “”))/1

> これに関し、国税庁のホームページ中に
>
>ht tp://www.nta.go.jp/shiraberu/ippanjoho/pamph/gensen/shikata2015
>/pdf/06.pdf
>
>というページがあります。PDFのページですが、その14ページに
>「(平成27年分の年末調整のための算出所得税額の速算表)」という表が
>あります。
> この表による計算をユーザー関数化したら、
>所得率表テーブルなど不要になると思います。
>
> 上述のアクセスとエクセルの対比のところに記載したことと
>ちょっと矛盾しますが、
>このようなユーザー関数化も一法ではないかなと思います。

具体的な方法はどの様にすればよろしいでしょうか?
・ツリー全体表示

【12779】Re:所得税の算出
回答  かるびの  - 15/3/27(金) 1:23 -

引用なし
パスワード
   >給料明細クエリの所得税
>にどのような式を組み込めばよいですか?

 アクセスには、エクセルにおけるHLookUp関数と同様の働きをする関数はありません。

 また、発想の方向性が少しズレていると思います。
 「式を組み込む」という発想がアクセス的ではありません。
 エクセルでは、集計ないし計算結果を表示するセルに
どのような式ないし関数を設定するかが勝負となりますが、
アクセスでは、どのテーブルとどのテーブルとを、どのように結合させるか
という発想が中心になります。


 そこで、給料明細クエリをどのように作るかですが、その前提として、
所得率表テーブルのテーブル構成がまずいと思います。
 
 エクセルでは、表が所与のものとしてあって、
これをどのように集計・計算していくかという視点から、
関数ないし計算式を考えていきます。
 これに対し、アクセスでは、集計・計算しやすいようにテーブルを作ります。

 
 アクセスは、条件に合うレコードを見つけることは大得意ですが、
条件に合うフィールドを見つけるということはできません。
 扶養人数が3である場合に、
所得率表テーブルの「3人」フィールドを見つけてくるということ
ができないのです
(なお、VBAを駆使すればできないことはありませんが、パフォーマンスは悪くなります)。

 そのため、所得率表テーブルは次のような構成にします。

以上    未満  扶養人数 所得税額
380,000  383,000     0  15,040
380,000  383,000     1  11,800
380,000  383,000     2   8,570
        ・・・・・・
383,000  386,000     0  15,280
383,000  386,000     1  12,050
383,000  386,000     2   8,810

 これに対し、テーブルが見づらくなるという批判が出てくるだろうと思います。
 しかし、テーブルは、レコードを格納するたのオブジェクトであって、
レコードを表示させるためのオブジェクトではないので、
人間にとっての見やすさを考慮する必要はありません。
 むしろ、コンピュータにとっての使いやすさこそを優先させたテーブル構成
としなければなりません。
 また、扶養人数が横に展開していくような形でレコードを表示したいなら、
クロス集計クエリを使えば、そのような形でのレコード表示が可能です。
 

 そして、給料明細クエリにおける結合条件を
     従事者テーブル.控除後金額 >= 所得率表テーブル.以上
   AND 従事者テーブル.控除後金額 < 所得率表テーブル.以下
   AND 従事者テーブル.扶養人数 = 所得率表テーブル.扶養人数
とします。
 不等号を使った結合条件は、クエリ・デザイナでは作れなかったと思います。
なので、給料明細クエリSQLビューを使い、
SQL文を記述して作成してください。


 なお、結合条件に不等号を使うと、クエリが極端に遅くなるという印象です。
 なので、できたら、上記の結合条件は避けた方が無難ではないかと思います。


 これに関し、国税庁のホームページ中に

ht tp://www.nta.go.jp/shiraberu/ippanjoho/pamph/gensen/shikata2015
/pdf/06.pdf

というページがあります。PDFのページですが、その14ページに
「(平成27年分の年末調整のための算出所得税額の速算表)」という表が
あります。
 この表による計算をユーザー関数化したら、
所得率表テーブルなど不要になると思います。

 上述のアクセスとエクセルの対比のところに記載したことと
ちょっと矛盾しますが、
このようなユーザー関数化も一法ではないかなと思います。
・ツリー全体表示

【12778】所得税の算出
質問  ppp3  - 15/3/26(木) 19:53 -

引用なし
パスワード
   お世話になります
所得税の算出に困ってます
以下のテーブルから給料明細クエリの所得税
にどのような式を組み込めばよいですか?

従事者テーブル
氏名    雇用区分    控除後金額    扶養人数
太郎    社員      392050        1
次郎    社員      389100        4
三郎    非社員     380001        1
五郎    正社員     0           4

所得率表テーブル
以上    未満    0人    1人    2人    3人    4人    5人    6人    7人
380,000  383,000  15,040  11,800   8,570    6,820  5,200    3,580  1,970    350
383,000  386,000  15,280  12,050   8,810    6,940  5,320    3,710  2,090    470
386,000  389,000  15,530  12,290   9,060    7,070  5,440    3,830  2,220    590
389,000  392,000  15,770  12,540   9,300    7,190  5,560    3,950  2,340    710
392,000  395,000  16,020  12,780   9,550    7,310  5,690    4,070  2,460    840


給料明細クエリ
氏名    雇用区分    控除後金額    扶養人数       所得税
太郎    社員      392050        1        12780
次郎    社員      389100        4        5560
三郎    非社員     380001        1        0
五郎    正社員     0           4        0

access 2007
ご教授頂ければ幸いです
・ツリー全体表示

【12777】Re:複数抽出
回答  かるびの  - 15/3/26(木) 2:26 -

引用なし
パスワード
   >Is date関数って=dateと同じだったんですね!
>「Is Date
>式を日付に変換できるかどうかを調べ、結果をブール値で返します。」
>strFilter = strFilter & " AND Me.終了日 <= #" & Nz(Me.利用終了日) & "#"
>が何をいれてみたらよいかが見当もつきませんでした。

 第1に、IsDate関数ですが、Is と Date の間にスペースは入りません。


 第2に、IsDate関数とDate関数は、機能が全然異なる関数です。


 第3に、IsDate関数がどのような働きをするものなのかを把握するため、
次の操作を行ってみてください。 
 イミディエイトウィンドウにカーソルを移し、
   ? IsDate("2015/3/25")
と手入力し、エンターキーを押してみてください。
 次の行にIsDate関数の返り値が表示されます。

   ? IsDate("2015/13/32") 
とか
   ? IsDate("あいう")  
とか
   ? IsDate("")  
とか
   ? IsDate(Null)
も試してみてください。
 どういうときにTrueになり、どういうときにFalseになるか確認してください。


 第4に、IsDate関数を使うとすれば、
「If Not IsNull(Me.txt終了日) Then」とのコードで使います。
「strFilter = strFilter & " AND Me.終了日 <= #" & Nz(Me.利用終了日) & "#"」
のコードでは、IsDate関数は使いません。


>Mid関数も調べてみました。

>ということだったので、文字数の最大値を設定すればいいってことで
>宜しいでしょうか?理解力が低くて申し訳ありません。

 違います。

 イミディエイトウィンドウに
   ? Mid("あいうえおかきくけこ",2)
と手入力し、エンターキーを押してください。
 次の行にMid関数適用の結果が表示されます。
 
   ? Mid("あいうえおかきくけこ",5)
とか
   ? Mid("あいうえおかきくけこ",9)
も実行してみてください。
 その上でヘルプの説明をもう一度読み直してみてください。
 これでMid関数が何をする関数なのかイメージがつかめると思います。


>Mid関数前: AND Me.口座番号=843803 AND Me.口座名義人 Like '**' AND Me.利用者名 Like '**' AND Me.利用施設 Like '**'
   
 2つの問題点があります。

 まず、一つめ。
 問題となるのは「Me.」です。

 「Me.口座番号」というのは、「Me」テーブルの「口座番号」フィールド
という意味になります。
 しかし、「口座番号」フィールドが所属しているのは
「利用者」テーブルであり、「Me」なんて名前のテーブルは存在しませんよね。
 したがって、「『Me』テーブルの『口座番号』フィールド」
というフィールドは、存在しないフィールドです。
 上記の文字列中に「Me.」が入り込まないようにする必要があります。
 

 二つめ。
 例えば、「Me.口座名義人 Like '**'」です。
 「*」が二つ連続してしまっている点が問題です。

 そうならないようにするために、「If Not IsNull(Me.txt口座名義人) Then」
という条件分岐を入れているわけですが、
txt口座名義人の値が長さ0の文字列である場合、それはNullではないので、
条件成就となり、
「strFilter = strFilter & " AND Me.口座名義人 Like '*" & Me.txt口座名義人 & "*'"」
というコードが実行され、strFilter中に「Me.口座名義人 Like '**'」という
文字列が含まれてしまうわけです。
 「If Not IsNull(Me.txt口座名義人) Then」に加えて
「txt口座名義人の値が長さ0の文字列でない場合」という条件を付加する必要があります。

 もっとも、「口座名義人 Like '**'」という抽出条件だと、
口座名義人フィールドがNullでないレコードが全て抽出されるので、
この点についての対策を取らなくても、今回に限っては問題ないと思います。


>Mid関数前: AND Me.口座番号=843803 AND Me.口座名義人 Like '**' AND Me.利用者名 Like '**' AND Me.利用施設 Like '**'
>Mid関数後:座番号=843803 AND Me.口座名義人 Like '**' AND Me.利用者名 Like '**' AND Me.利用施設 Like '**'

 Mid関数前は「 AND Me.口座番号=843803・・・」だったものが、
Mid関数後には     「座番号=843803・・・」となってしまっていますが、
その理由は、上記のイミディエイトウィンドウを使った実験により、
もうおわかりですよね。

 それがわかれば、「strFilter = Mid(strFilter, 8)」において
Mid関数の引数に何を指定したらよいか考えてみてください。
・ツリー全体表示

【12776】Re:OnMouseDownでShiftを取得するには?
お礼  キンパレ  - 15/3/25(水) 23:35 -

引用なし
パスワード
   hatenaさま

ご回答ありがとうございます。
やはり普通にはできないのですね。
クラスモジュールのリンク先内容を試したところ、
応用すればやろうとしていることが実現できそうです。
この機会にクラスについても勉強しようと思います。

大変助かりました。
この度はどうもありがとうございました。
・ツリー全体表示

【12775】Re:複数抽出
質問  ゆか  - 15/3/25(水) 18:56 -

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

有難うございます!

IsDate関数やMid関数について調べてみました。

Is date関数って=dateと同じだったんですね!
「Is Date
式を日付に変換できるかどうかを調べ、結果をブール値で返します。」
strFilter = strFilter & " AND Me.終了日 <= #" & Nz(Me.利用終了日) & "#"
が何をいれてみたらよいかが見当もつきませんでした。
すみません。

Mid関数も調べてみました。
Mid(string, start [, length ] )
「必ず指定します。Long データ型 の値を指定します。引数 string の先頭の位置を 1 として、どの位置から文字列を取り出すかを先頭からの文字数で指定します。start で指定した値が、string の文字数より大きい場合、Mid 関数は、長さ 0 の文字列 ("") を返します。」
ということだったので、文字数の最大値を設定すればいいってことで
宜しいでしょうか?理解力が低くて申し訳ありません。


> このコードを
>   strFilter = Mid(strFilter, 8)
>   Me.Filter = strFilter
>に変えてください。
> そして、前回のレスで紹介した「Debug.Print ××」のコードを
>「strFilter = Mid(strFilter, 8) 」のコードの前後に入れてください。
> その上で、イミディエイトウインドウにどのような文字列が表示されるのか
>確認してみてください。
>
>> エラーになる一つの原因は、「Me.txt利用者ID」です。
>
> Filterプロパティに設定する文字列の基本は、
>   フィールド名 = 値
>です。
> 「Me.txt利用者ID」は、フィールド名ではなく、テキストボックス名です。
> 「Me.txt利用者ID」の部分をフィールド名へと変えてください。
>
> フィールドとテキストボックスをごっちゃにしている人をよく見かけますが、
>両者は全然別のものなので、きちんと区別する必要があります。
> フィールド名は、テーブル又はクエリにおける列の見出しのことです。
> フォームには、フィールドという概念はありません。
>
> また、書いてよいフィールド名は、
>フォームのレコードソースたるテーブル又はクエリに存在するフィールド名に限ります。
>
>
> 「Me.開始日」や「Me.終了日」についても同様です。

早速フィールド名に変更してみました!
ただ、

> もう一つの原因は、「Me.開始日 >= ## 」です。
> #と#の間には、例えば「2015/03/24」のような文字列が入っていなければいけないわけですが、
>それが入っていないということです。
>
>>上記で教えていただいたように、IsNullをIsDateに変更させていただきました。
> おそらく、「If Not IsNull(Me.txt開始日) Then」における「IsNull」を「IsDate」に
>変えただけなんでしょう。
> そのようにすれば、「Me.開始日 >= ## 」という条件式が生成されてしまいます。
> でも、それではだめですよ。
>
> 「If Not IsNull(Me.txt開始日) Then」は、「txt開始日の値がNullでなければ」
>という条件なわけですが、
>IsDate関数を使うのであれば、「txt開始日の値が日付として使える文字列であれば」という
>条件にする必要があります。
>
> IsNull(××)において「××」がNullのときにIsNull関数が何を返すのか、
>「××」がNullでなければIsNull関数が何を返すのか、
>IsDate(××)において「××」が日付として使用可能な文字列のときに
>IsDate関数が何を返すのか、
>「××」が日付として使用不可な文字列のときに
>IsDate関数が何を返すのか、
>をヘルプで確認してみてください。
>

がいまいちわかっていないためか、パラメータの入力をして下さい。
という表示がでて、イミディエイトには
Mid関数前: AND Me.口座番号=843803 AND Me.口座名義人 Like '**' AND Me.利用者名 Like '**' AND Me.利用施設 Like '**'
Mid関数後:座番号=843803 AND Me.口座名義人 Like '**' AND Me.利用者名 Like '**' AND Me.利用施設 Like '**'

と出てきました。益々こんがらって来ました。
物わかりが悪く、本当に申し訳ありません。
・ツリー全体表示

【12774】Re:複数条件での抽出
お礼  木葉  - 15/3/25(水) 17:21 -

引用なし
パスワード
   ▼hatena様:
お返事ありがとうございます。

>書式プロパティに日付の書式を設定すると、日付/時刻型のValueを持つテキストボックスと判断されるようです。

>ですので日付以外のデータを入力するとエラーメッセージが表示されます。このエラーは更新前イベントより前に発生するので更新前イベントでは補足できません。

なるほど…そういうことなのですね…
テキストボックスのイベントを巡って色々試していたのですが、すべてエラーが先に出てしまうので、頭を抱えておりました。

>が、フォームのエラー時のイベントで補足できます。

ご丁寧にコードまで、ありがとうございます!
Responseという単語、調べてもあまり検索に引っかからないようで、
良く分からなかったですが、解決致しました!

一応完成したものを載せておきます

【検索ボタン】クリック時
Private Sub cmdFilter_Click()

Dim strFilter As String

Dim torihiki As Variant
Dim startt As Variant
Dim start As Variant
Dim goalt As Variant
Dim goal As Variant
Dim sday As Variant
Dim gday As Variant

torihiki = cbo取引先.Value
startt = txt発地都道府県.Value
start = txt発地.Value
goalt = txt着地都道府県.Value
goal = txt着地.Value
sday = txt開始日.Value
gday = txt終了日.Value


If Not Nz(torihiki, "") = "" Then
strFilter = " AND " & "取引先コード Like '" & torihiki & "'"
 End If

If Not Nz(startt, "") = "" Then
strFilter = strFilter & " AND 発地都道府県 Like '*" & startt & "*'"
End If

If Not Nz(start, "") = "" Then
strFilter = strFilter & " AND 発地 Like '*" & start & "*'"
End If

If Not Nz(goalt, "") = "" Then
strFilter = strFilter & " AND 着地都道府県 Like '*" & goalt & "*'"
End If

If Not Nz(goal, "") = "" Then
strFilter = strFilter & " AND 着地 Like '*" & goal & "*'"
End If

If Not Nz(sday, "") = "" Then
strFilter = strFilter & " AND 日付 >= #" & sday & "#"
End If

If Not Nz(gday, "") = "" Then
strFilter = strFilter & " AND 日付 <= #" & gday & "#"
End If

Debug.Print strFilter

  Me.Filter = Mid(strFilter, 6)
  If strFilter = "" Then
    Me.FilterOn = False
  Else
    Me.FilterOn = True
  End If


End Sub


【フォーム】エラー時

Private Sub Form_Error(DataErr As Integer, Response As Integer)
If DataErr = 2113 Then
    MsgBox "おかしな日付です。"
    Response = acDataErrContinue '既定のエラーメッセージを表示しない
    End If
End Sub

--------
Variant型は省略してもいいと書かれていましたが一応…

かるびの様にご指摘いただいていた分、訂正できたと思います!
(あまり自信はないですが)

長い期間お世話になりましたかるびの様、
お助けいただいたhatena様、
初心者である私に親切に、ご丁寧にご教授いただきありがとうございます!

また質問させていただくことがありましたら宜しくお願いします^^
・ツリー全体表示

【12773】Re:数値の種類をカウントするには
お礼  まなび  - 15/3/25(水) 16:47 -

引用なし
パスワード
   hatenaさま

早々に返信ありがとうございました。

>クエリを新規作成して、SQLビューにしてそこに、前回の SQL文を貼り付ければOKです。

上記のやり方で貼り付けたところ、さっそく集計ができました!
式の意味は分からないですが、すぐに結果が出て感動しました!
4月から稼働させるものだったので、本当に助かりました。
お手数とお時間を使って回答していただきありがとうございました。
・ツリー全体表示

【12772】Re:複数条件での抽出
回答  hatena  - 15/3/25(水) 16:04 -

引用なし
パスワード
       ▼木葉 さん:
>試しに「13/32」と入力してみたのですが、「おかしな日付です」は出ずに、
>「このフィールドに入力した値は正しくありません」と出ます。

書式プロパティに日付の書式を設定すると、日付/時刻型のValueを持つテキストボックスと判断されるようです。

ですので日付以外のデータを入力するとエラーメッセージが表示されます。このエラーは更新前イベントより前に発生するので更新前イベントでは補足できません。が、フォームのエラー時のイベントで補足できます。

Private Sub Form_Error(DataErr As Integer, Response As Integer)
  Msgbox "エラー番号は" & DataErr
  Response = acDataErrContinue '既定のエラーメッセージを表示しない
End Sub

として日付以外のデータを入力すると「エラー番号は2113」と表示されます。
そこで下記のように書き換えれば希望のメッセージに変更できます。

Private Sub Form_Error(DataErr As Integer, Response As Integer)
  If DataErr = 2113 Then
    MsgBox "おかしな日付です。"
    Response = acDataErrContinue '既定のエラーメッセージを表示しない
  End If
End Sub
・ツリー全体表示

【12771】Re:複数条件での抽出
質問  木葉  - 15/3/25(水) 15:13 -

引用なし
パスワード
   何度もごめんなさい…

私の勘違いでした…。

ただ、やはり
>Private Sub txt開始日_BeforeUpdate(Cancel As Integer)
>L If IsDate(Nz(txt開始日.Value, "")) = False Then
>    MsgBox "おかしな日付です。"
>    Cancel = True
>  End If
>
>End Sub

を実行する前にエラーメッセージが出てしまうようです。

試しに「13/32」と入力してみたのですが、「おかしな日付です」は出ずに、
「このフィールドに入力した値は正しくありません」と出ます。

う〜ん、どうしたものか…
・ツリー全体表示

【12770】Re:数値の種類をカウントするには
回答  hatena  - 15/3/25(水) 14:57 -

引用なし
パスワード
   ▼まなび さん:
>しかし、二つ目のクエリで集計したところ、月別の実参加人数ではなく、延べ人数が集計されてしまいます。
>format関数で表示を月に統一しても、データの持っている中身自体は変わらないからなのでしょうか。

最初の集計クエリで、参加者番号 と 年月: Format([参加日],"yyyy/mm") 以外のフィールドを表示させてませんか。

どうしてもうまくいかないなら、SQLビューにして表示されるSQL文をコピーしてここに貼り付けてください。


>後者の、サブクエリでひとつのSQLで処理する方法は、やり方が分からず試せていたいのですが、前者と原理が同じであれば、やはり同じ結果になるのでしょうか。

クエリを新規作成して、SQLビューにしてそこに、前回の SQL文を貼り付ければOKです。
・ツリー全体表示

【12769】Re:数値の種類をカウントするには
質問  まなび  - 15/3/25(水) 12:46 -

引用なし
パスワード
   何度も失礼します。
先ほどのエラーの件ですが、再度作り直したところエラーなしにできました。

しかし、二つ目のクエリで集計したところ、月別の実参加人数ではなく、延べ人数が集計されてしまいます。
format関数で表示を月に統一しても、データの持っている中身自体は変わらないからなのでしょうか。

後者の、サブクエリでひとつのSQLで処理する方法は、やり方が分からず試せていたいのですが、前者と原理が同じであれば、やはり同じ結果になるのでしょうか。

何か他に良い案があればよろしくお願いしたします。


▼まなび さん:
>hatena さま
>
>早々にご回答いただきありがとうございました。
>前者のほうのやり方でしたいのですが、
>
>
>>フィールド 参加者番号 年月: Format([参加日],"yyyy/mm")
>>集計    グループ化 グループ化
>
>このクエリの作成時に、 Format([参加日],"yyyy/mm")を入力しようとすると、
>“指定した構文が正しくありません。たとえば、演算子のような〜”と出てしまいます。スペースが入っていないかなど確認したのですが、エラーの意味がよくわかりませんでした。
>もし、エラーの解消法をご存知でしたら教えていただけると助かります。
・ツリー全体表示

【12768】Re:複数条件での抽出
発言  木葉  - 15/3/25(水) 11:24 -

引用なし
パスワード
   あ、ごめんなさい。 
>>書式設定は関係ないと思います。
とおっしゃっていただきましたね

>前にも書いた通り、テキストボックスには書式設定を日付(S)にしています。
>なので、「3/25」と入力すれば自動で「2015/3/25」と表示されるようにしていますが、それに原因があったりしますか?
これは無視してください^^;
・ツリー全体表示

【12767】Re:複数条件での抽出
質問  木葉  - 15/3/25(水) 11:19 -

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

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

> strFilter中の日付に関する条件式は、
>   日付 >= #2015/3/24#  
>のようになっていなければいけないのですが、
>「2015年3月24日」などとなっていたり、「2015/03」(日にちなし)となっていたりしませんか。
>
「AND 日付 <= #2015/03/24#」と表示されました。
ということは正常・・?


> 私なら、
>Private Sub txt開始日_BeforeUpdate(Cancel As Integer)
>  If IsDate(Nz(txt開始日.Value,"")) = False Then
>    Msgbox "おかしな日付です。"
>    Cancel = True
>  End
>End Sub
>とします。
> 12755のレスでは、cmdFilter_Clickイベントでメッセージを出すコードを紹介したところですが、
>入力チェックをするなら、BeforeUpdateで行うのが常道です。

勉強になります。
こちらも試してみたのですが、普通の日付を入力しても「おかしな日付です。」と表示されてしまいました。
前にも書いた通り、テキストボックスには書式設定を日付(S)にしています。
なので、「3/25」と入力すれば自動で「2015/3/25」と表示されるようにしていますが、それに原因があったりしますか?
また、「2015/3/25」や「2015/03/25」と入力してもおかしな日付と表示されてしまいました…。

入力規則ですが、自分で提案しておいて何ですが、苦手なものでやはり避けたい気持ちでいっぱいです…
・ツリー全体表示

【12766】Re:数値の種類をカウントするには
質問  まなび  - 15/3/25(水) 11:03 -

引用なし
パスワード
   hatena さま

早々にご回答いただきありがとうございました。
前者のほうのやり方でしたいのですが、


>フィールド 参加者番号 年月: Format([参加日],"yyyy/mm")
>集計    グループ化 グループ化

このクエリの作成時に、 Format([参加日],"yyyy/mm")を入力しようとすると、
“指定した構文が正しくありません。たとえば、演算子のような〜”と出てしまいます。スペースが入っていないかなど確認したのですが、エラーの意味がよくわかりませんでした。
もし、エラーの解消法をご存知でしたら教えていただけると助かります。
・ツリー全体表示

【12765】Re:OnMouseDownでShiftを取得するには?
回答  hatena  - 15/3/25(水) 2:37 -

引用なし
パスワード
   方法としては下記の2つですね。

1.APIを使ってシフトキーが押されているかどうか判定する。

下記が参考になるかと。

3.1 キーボードからの入力を判定する- Excel VBA ゲーム Tips
www.happy2-island.com/excelsmile/smile04/capter00301.shtml

2.クラスモジュールを使う

下記にラベルをクラスにするコード例があります。これを少し変更すれば希望のことは可能ですので参考にしてください。

ドラッグできるラベルのクラス化 - hatena chips
hatenachips.blog34.fc2.com/blog-entry-160.html
・ツリー全体表示

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