Access VBA質問箱 IV

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

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


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

【5909】Re:集計について
回答  てっちゃん  - 05/8/18(木) 17:12 -

引用なし
パスワード
   ▼Seri さん:
# 小僧さんの回答で解決となるかもしれませんが、せっかく作ったので...

自作関数で、日付をグループ化するコードを考えてみました。
まず、標準モジュールに、次のコードをコピペして下さい。
'--------------------------------------------------------------------------
Function fxGroupDate(ByVal myHIDUKE As Long, _
           ByVal myHINBAN As String) As Long
  Dim myDCnt   As Long   '前作業日の製造有無
  Dim myDmaxDay  As Long   '前作業日
  
  myDmaxDay = Nz(DMax("日付", "aaT_集計前", "日付<" & myHIDUKE), 0)
  myDCnt = DCount("*", "aaT_集計前", "日付=" & myDmaxDay & _
       " and 品番='" & myHINBAN & "'")
  
  Do Until myDCnt = 0   '連続生産時は遡る
    myHIDUKE = myDmaxDay
    myDmaxDay = Nz(DMax("日付", "aaT_集計前", "日付<" & myHIDUKE), 0)
    myDCnt = DCount("*", "aaT_集計前", "日付=" & myDmaxDay & _
         " and 品番='" & myHINBAN & "'")
  Loop
  
  fxGroupDate = myHIDUKE
  
End Function
'--------------------------------------------------------------------------
'日付は長整数型、品番はテキスト型、と想定してます。

次に以下のクエリーを作ります。
SELECT テーブル.鋳造機,
    fxGroupDate([テーブル]![日付],[テーブル]![品番]) AS 日付,
    テーブル.コード,
    テーブル.品番,
    テーブル.品名,
    Sum(テーブル.目標数) AS 目標数の合計,
    Sum(テーブル.実績数) AS 実績数の合計
FROM テーブル
GROUP BY テーブル.鋳造機,
     fxGroupDate([テーブル]![日付],[テーブル]![品番]),
     テーブル.コード,
     テーブル.品番,
     テーブル.品名
ORDER BY fxGroupDate([テーブル]![日付],[テーブル]![品番]),
     テーブル.品番;


テーブル名を「テーブル」としています。適宜変更してください。

また、日付はデータから判断してますので、例えば、
鋳造機   日付  コード  品番  品名  目標数  実績数    
10    20050601  0907   5678  AAAAA   400   320    
10    20050615  0907   5678  AAAAA   500   580    
このようなデータからは、

鋳造機   日付  コード  品番  品名  目標数  実績数    
10    20050601  0907   5678  AAAAA   900   900   
このように集計されます。
(連続した日付ではなく、製造日から判断してます)

さらに、小僧さんがご指摘されてる
>  ・20050601 に 鋳造機「9」と「10」で同じ製品が作られることはないのか。
>  ・コード・品番・品名は一意なのか。
>    (コードが決定したら品番と品名は決定されるのか。)
>  ・鋳造機ごとに作られる製品は決まっているのか。
>
> 等…がはっきりとしておりません。
これらについても考慮しておりませんので、結果についてはよく確認して下さい。

参考になれば幸いです。
・ツリー全体表示

【5908】Re:時間の計算について
発言  小僧  - 05/8/18(木) 16:54 -

引用なし
パスワード
   ▼わん さん:
ご提示されたコード確認致しました。
こちらの環境でも問題なく動作しております。

ところで当方がコードを作成するとしたら…
根っからの横着モノなので

>If IsNull(Me.コンボ年) Then
>  MsgBox "入団年数を入力して下さい。"
>  Me.コンボ年.SetFocus
>  Exit Sub
>End If

と3回(くらいならいいかな…)も同じコードを書くのが面倒くさいので、

Dim strCtrl(1 To 3) As Variant
Dim I As Long
  strCtrl(1) = "コンボ年"
  strCtrl(2) = "コンボ月"
  strCtrl(3) = "テキストポジション"
  
  For I = 1 To 3
    If IsNull(Me.Controls(strCtrl(I))) Then
      MsgBox strCtrl(I) & "を入力してください。"
      Me.Controls(strCtrl(I)).SetFocus
      Exit Sub
    End If
  Next

とでもします(笑)。
このままですとメッセージボックスの表示が良くないので
コントロール名自体も変えちゃうと思います。

今回は「Null」チェックが3回でそのままでも良いのですが、
もっと多い場合には有効になると思います。
・ツリー全体表示

【5907】Re:集計について
回答  小僧  - 05/8/18(木) 16:23 -

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

>テーブルのデータに入力されている日付で並び替えをすれば可能になりますか?

可能だと思います。

>同じ製品を続けて生産した場合

という基準を明確にする必要があると思いますが…。
こちらとしては Seri さんの状況が解らないので

  ・20050601 に 鋳造機「9」と「10」で同じ製品が作られることはないのか。
  ・コード・品番・品名は一意なのか。
    (コードが決定したら品番と品名は決定されるのか。)
  ・鋳造機ごとに作られる製品は決まっているのか。

等…がはっきりとしておりません。

テーブルの形が

SEQ 鋳造機 日付  コード 品番  品名  目標数 実績数
1   9  20050601 1336  1234 fffff  100   85
1   9  20050602 1336  1234 fffff  200   150
2  10  20050602  907  5678 AAAAA  100   90
2  10  20050603  907  5678 AAAAA  300   220
2  10  20050604  907  5678 AAAAA  100   85
3   9  20050606  906  8888 ddddd  100   90
4   9  20050607 1336  1234 fffff  200   160

こんな感じですと、

SELECT P.SEQ,
      Min(T_Test.日付) AS 日付の最小,
      T_Test.コード,
      T_Test.品番,
      T_Test.品名,
      P.目標数の合計,
      P.実績数の合計
FROM [
SELECT T_Test.SEQ,
      Sum(T_Test.目標数) AS 目標数の合計,
      Sum(T_Test.実績数) AS 実績数の合計
FROM T_Test
GROUP BY T_Test.SEQ
]. AS P
INNER JOIN T_Test ON P.SEQ = T_Test.SEQ
GROUP BY P.SEQ, T_Test.コード,
        T_Test.品番,
        T_Test.品名,
        P.目標数の合計,
        P.実績数の合計;

という SQL で一発で結果を表示できます。
・ツリー全体表示

【5906】Re:時間の計算について
お礼  わん  - 05/8/18(木) 16:12 -

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

色々と初歩的なことに、お付き合いして頂きありがとうございました。
感謝の気持ちでいっぱいです。

何とかできました。
お忙しいとは思いますが、確認して頂けますでしょうか?

Private Sub 検索ボタン_Click()
 If IsNull(Me.コンボ年) Then
 MsgBox "入団年数を入力して下さい。"
  Me.コンボ年.SetFocus
  Exit Sub
 End If
 If IsNull(Me.コンボ月) Then
 MsgBox "入団月数を入力して下さい。"
  Me.コンボ月.SetFocus
  Exit Sub
 End If
 If IsNull(Me.テキストポジション) Then
 MsgBox "ポジションを入力して下さい。"
  Me.テキストポジション.SetFocus
  Exit Sub
 End If
Me.Filter = "Left(入団日, 4) = '" & Me.コンボ年 & "' AND mid(入団日,6,2) = " & Me.コンボ月 & "AND ポジション = '" & Me.テキストポジション & "' "
Me.FilterOn = True
  Me.テキスト人数 = Me.Recordset.RecordCount
End Sub

もし、何かおかしいところがあればご指摘していただきたいと思います。
宜しくお願い致します。
・ツリー全体表示

【5904】Re:集計について
質問  Seri  - 05/8/18(木) 15:50 -

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

>Seri さん のお持ちのAccessで表示されているレコードは、
>次に開いた時に同じ順番で表示されているとは限りません。
>
>通常は順番が入れ替わる事などそうお目に掛かれませんが
>ある時突然レコードの順番が入れ替わることがありえますので、
>
>>続けて生産した分
>
>というのをAccessに認識させるキーが必要となります。
>
>テーブルに「1」「2」「3」…(1で始まる必要はありませんが)のようなフィールドがあれば、
>そのフィールドでソートすると意図した順番に並び替えられるので集計も可能になると思います。

テーブルのデータに入力されている日付で並び替えをすれば可能になりますか?
・ツリー全体表示

【5903】Re:集計について
発言  小僧  - 05/8/18(木) 15:43 -

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

>同じ製品を続けて生産した場合、続けて生産した分の目標数、実績数の合計を
>求めるようにしたいのですができるでしょうか?

と言う事ですが、このままですと残念ながらできません。

Microsoft サポートページより MDB のレコードの並び順について
http://support.microsoft.com/default.aspx?scid=kb;ja;834927

Seri さん のお持ちのAccessで表示されているレコードは、
次に開いた時に同じ順番で表示されているとは限りません。

通常は順番が入れ替わる事などそうお目に掛かれませんが
ある時突然レコードの順番が入れ替わることがありえますので、

>続けて生産した分

というのをAccessに認識させるキーが必要となります。

テーブルに「1」「2」「3」…(1で始まる必要はありませんが)のようなフィールドがあれば、
そのフィールドでソートすると意図した順番に並び替えられるので集計も可能になると思います。
・ツリー全体表示

【5902】集計について
質問  Seri  - 05/8/18(木) 13:33 -

引用なし
パスワード
   こんにちは。
以下のテーブルにあるデータを

鋳造機   日付     コード     品番     品名    目標数    実績数    
9    20050601  1336   1234  fffff   100    85
9    20050602  1336   1234  fffff   200   150    
10    20050602     0907   5678  AAAAA   100    90    
10    20050603     0907   5678  AAAAA   300   220    
10    20050604     0907   5678  AAAAA   100    85    
9    20050606     0906   8888  ddddd   100    90
9    20050607  1336   1234  fffff   200   160

下記の集計結果になるよう集計したいのですが
どのように集計すればよいのかわかりません。
わかる方がいましたら教えてください。
よろしくお願いします。

同じ製品を続けて生産した場合、続けて生産した分の目標数、実績数の合計を
求めるようにしたいのですができるでしょうか?
また、集計後の日付は生産を開始した日付を使いたいです。

**************************集計結果***************************

鋳造機   日付     コード     品番     品名    目標数    実績数
9    20050601  1336   1234  fffff   300   235
10    20050602  0907   5678  AAAAA   500   395
9    20050606  0906   8888  ddddd   100    90
9    20050607  1336   1234  fffff   200   160
・ツリー全体表示

【5901】Re:時間の計算について
お礼  わん  - 05/8/18(木) 12:51 -

引用なし
パスワード
   小僧さん:
こんにちわ。

回答ありがとうございます。

色々試してやっとこさ自力でできたことをご報告しようと思ったところです。
どうやら、コード内の 「"」、「'」の付け方や半角空ける等の基本的なところが
適切でなかったために上手くいかなかったようです。
ご迷惑おかけしました。

今度は名前入力(ここではポジション入力)のためのテキストボックスについて
つまずいてます。
昨日、教えて頂いた内容ですとテキストボックスでも同様だということなので
また、書き方が間違っていないか検証中です。

1つ素朴な疑問なのですが、コンボ等に類似するものには、
集合値ソースが必要なのになぜテキストボックスには要らないのですかね??


>まずは骨格を決める為に、処理速度を考えずに作られた方が良いかもですね。
>処理速度を気にするようになる頃には わん さん の Access のスキルも
>あがっていると思いますし、段々良いアイデアが出てくると思います。
>「処理速度をあげるには」という感じで改めてご質問されても良いですしね。
>(ExcelVBAの掲示板の方にたまにありますよね)

はい、とりあえず今回作成中のものを最後まで作り上げるなかで
経験しながら、全体像を把握して処理速度のことも考えられるようになりたいと思います。
遠回りかもしれませんが、はじめは仕方ないと思って頑張るしかありません。

とりあえずは、抽出ができるようにし、
その後、○○件のレコードを入れて試験をして見たいと思います。

先は長そうです。ふぅ〜。
・ツリー全体表示

【5900】Re:時間の計算について
回答  小僧  - 05/8/18(木) 12:02 -

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

>どこがいけないのでしょうか?
>宜しくお願いします。

値集合ソースでやった事をフィルタにもやってあげましょう。

  Me.Filter = "Left(入団日,4) = '" & Me.コンボ年 & _
     "' AND MID(入団日,6,2) = '" & Me.コンボ月 & "'"

>>給与計算のところで Iif をクエリで使いましたが、
>>本当はあれもあまり良くないですね…。
>他に方法を知らないのですが・・・。

>>・mdbは年度単位
>>・テーブルは「今月テーブル」「先月以前テーブル」(もちろん名前は違いますが)
>できることならそうしたいですが、

まずは骨格を決める為に、処理速度を考えずに作られた方が良いかもですね。
処理速度を気にするようになる頃には わん さん の Access のスキルも
あがっていると思いますし、段々良いアイデアが出てくると思います。
「処理速度をあげるには」という感じで改めてご質問されても良いですしね。
(ExcelVBAの掲示板の方にたまにありますよね)
・ツリー全体表示

【5899】Re:エクセルを開く
お礼  さとこ  - 05/8/18(木) 11:58 -

引用なし
パスワード
   [本文なし]
・ツリー全体表示

【5898】Re:エクセルを開く
発言  あああ  - 05/8/18(木) 11:35 -

引用なし
パスワード
   モーグに"エクセル自動化"みたいなのでmatikoって名前で同じ内容質問してんじゃん
・ツリー全体表示

【5897】エクセルを開く
質問  さとこ  - 05/8/18(木) 9:20 -

引用なし
パスワード
   "基本体"というテーブルに"身長"のフィールドがあります。
そのテーブルをエクセル"身長.xls"に出力する設定まで完了致しました。
次に"身長.xls"のシートをコマンドボタンをクリックすることで開けるように
したいです。
教えて下さい。またその"身長.xls"はマイドキュメントの下にあります。

マクロで作成しようと思ったのですが、他人が使うものを作っていますので、
VBAを勧められました。
VBAはあまりよく分からないのですいませんが、お願いします。
・ツリー全体表示

【5896】Reキツイ事を言いましたが
質問  たん  - 05/8/18(木) 8:39 -

引用なし
パスワード
   >分からないのを聞くのは恥ずかしい事ではありません。
>ただ、「分からない」事を隠す為に、複数の匿名を使ったり、
>「何も分からない」と開き直るのは、恥ずかしい事です。

昨日はキツイ事を書きましたが、質問をする側にも「分からない」なりの
(相手に見える形での)努力はして欲しいのです。

「言われた通りにやりました→駄目でした」の発言の前に、
言われた事を調べ、知識にする努力をしましょう。

今貴方が手がけているmdbは、今作って動けばそれでいいという
シロモノでは無い筈です。
自分自身でメンテナンスや機能追加をしなければならない筈です。

その時に、自分で直せなければどうします?という事なのです。

物を教わるのと、物を作ってもらうのは別なのです。
物を作ってもらおうとするのなら、それなりの代価と、作るという事を
了承している方にお願いすべきです。

物を教わるという事は、教えてもらう事は貴方の環境・都合に合わせた
ものでは必ずしもないのです。
ヘルプや教本も同じ事です。
・ツリー全体表示

【5895】Re:コンボボックスの編集不可&ヘッダ...
回答  ちゅう吉  - 05/8/18(木) 7:59 -

引用なし
パスワード
   A1.
人によったり、仕様によったり、変わるんでしょうけど、自分なら・・・
「コンボ編集する」というボタンを作成し、このボタンを押した時に、
[コンボの名前].Enabled = True
としたりするでしょうね。

A2.
ACCESS2000では、フォーム自体の書式プロパティの
「区切り線」を「いいえ」にします。
・ツリー全体表示

【5894】Re:時間の計算について
質問  わん  - 05/8/18(木) 2:23 -

引用なし
パスワード
   小僧さん:
こんばんわ。
ずーっと、トライしましたが上手くいきません。
一体、どこが悪いのでしょうか?

[#5863]の例ですと、「ポジション」と「年齢」で抽出していましたが、このへんを
「打刻日付の左4文字」  と 「年コンボ」
「打刻日付の6、7文字目」 と 「月コンボ」
を比較すれば可能ですね。この場合は文字列での比較になります。

まずは、[#5863]からトライしたのですが上手くいきません。
T_選手
背番号  :数値型(主キー)
選手名  :テキスト型
ポジション:テキスト型
年齢   :数値型
年棒   :通貨型

背番号  選手名  ポジション  年齢  年棒
2      もとき  内野手   34  \12,000
5      きよはら 内野手   38  \45,000
6      こくぼ  内野手   34  \21,000
8       にし   内野手   34  \15,300
18      くわた  投手    37  \30,500
20      ろおず  外野手  37  \54,000
33      えとう  内野手   35  \21,500
47      くどう  投手    42  \28,000

これに、入団日を付け加えてトライしました。
入団日:日付型
フィールドには適当な年月日を入力

【コンボ年】:コンボボックス
   値集合ソース:SELECT Left(選手1.入団日,4) FROM 選手1 GROUP BY Left(選手1.入団日,4); 
【コンボ月】:コンボボックス
   値集合ソース:SELECT Mid(選手1.入団日,6,2) FROM 選手1 GROUP BY Mid(選手1.入団日,6,2);   
【テキストポジション】:テキストボックス
【テキスト人数】:テキストボックス
【検索ボタン】:コマンドボタン

Private Sub 検索ボタン_Click()
Me.Filter = "入団日 = '" & Me.コンボ年
  Me.FilterOn = True
  Me.テキスト人数 = Me.Recordset.RecordCount
End Sub

何度やっても上手く行かないので1つずつ確認しながら実行するために短くしました。

これで、実行すると
“このオブジェクトに値を代入することはできません。”となってしまいます。
Dim〜As Stringを使うのかとも考え、やってみたのですが結果は同じでした。
どこがいけないのでしょうか?
宜しくお願いします。


給与計算のところで Iif をクエリで使いましたが、
本当はあれもあまり良くないですね…。

他に方法を知らないのですが・・・。


・mdbは年度単位
・テーブルは「今月テーブル」「先月以前テーブル」(もちろん名前は違いますが)

できることならそうしたいですが、どの書籍も詳細から書き始めて
結果的にこうなるというような書き方をしているものが多く、
Access全体を把握しきれていない私には根本的にどう作り上げていくのか考えが及びません。
情けないですが・・・。
・ツリー全体表示

【5893】コンボボックスの編集不可&ヘッダ、フ...
質問  su  - 05/8/17(水) 23:03 -

引用なし
パスワード
   こんばんは。
VBAとは異なるかも知れませんがどなたか教えてください。

1.コンボボックスで選択するフォームの場合、選択後、編集できないように
したいのですが、どのような設定をしたらよいのでしょうか?
プロパティの「使用可能」や「編集ロック」をすると選択ができなくなるので他に良い方法はありますか?

2.同じくフォームでページヘッダ、詳細、ページフッタでビューした場合、この3点の境線をなくしたいのですが、どこをどうしたらいいのでしょうか?

宜しくお願い致します。
・ツリー全体表示

【5892】Re:複雑なクエリ処理方法について
お礼  MK&db  - 05/8/17(水) 21:21 -

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

問題解決!
ありがとうございました。
・ツリー全体表示

【5891】Re:時間の計算について
発言  小僧  - 05/8/17(水) 18:19 -

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

>>レコード数が増えると、使用されている環境によりますがAccessの動作が遅くなります。
>>5万件位のレコードで速度に問題があるようでしたら(クエリの表示、抽出など)
>>テーブルの設計等を少し考え直す必要があるかもしれません。
>
>過去ログを読むとかなりのデータ量でも耐えられるような気がしますが。

一般的に言われていることですが、文字列操作(Left、Instrなど)を使ったり
クエリからクエリを呼び出したりすると動作が重くなるそうです。

また以前他の方の回答であったのですが
検索の際にレコードが多いと画面が固まってしまう事があったそうです。
(レコード件数はどれくらいか解りませんが)

何件を超えると…というデータがある訳ではないので、
現在のところ推定これだけは使いそうだ、×1.2くらいのレコード数で
一応実験しておいた方が無難かもしれません。

給与計算のところで Iif をクエリで使いましたが、
本当はあれもあまり良くないですね…。

>私としては、データを年度末若しくは月末に清算できるような
>マクロ記述により別テーブルを作成するようなことができればいいと
>考えているのですが難しいのでしょうか?
>それとも、基本のテーブル設計をより良いものに考え直す方がいいのでしょうか?

月ごとのテーブルを持たせるメリットとデメリットがはっきりしていれば
そう難しくない話だと思います。

メリット :扱うデータ量が少ないので処理が軽い!
デメリット:1) 月をまたぐ処理(15日から翌月15日までとか…)の処理に手間がかかる。
      2) テーブル数が多くなるので必然的にmdbの容量が増える。
      3) テーブル名を直接記述できない。

当方が使っているmdbですと、
・過去月のデータを見るのは1年に数回
・前年以前のデータはまず見ない

事から、

・mdbは年度単位
・テーブルは「今月テーブル」「先月以前テーブル」(もちろん名前は違いますが)

として、

・今月の処理(参照、更新)は速い
・先月以前の参照は呼び出すのに3秒くらい時間がかかる場合がある
・前年以前はその年のmdbを開き直せ

という感じですね。
・ツリー全体表示

【5890】Re:エクセルへの自動出力
お礼  aki  - 05/8/17(水) 18:04 -

引用なし
パスワード
   コピペしたらできました!
ありがとうございました!!
・ツリー全体表示

【5889】Re:エクセルへの自動出力
質問  aki  - 05/8/17(水) 17:58 -

引用なし
パスワード
   そうなんですか。
そのパスを
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "テストテーブル", "C:\テスト.xls"

"C:\テスト.xls"の中に修正して加えればよいということですか?
・ツリー全体表示

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