Access VBA質問箱 IV

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

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


496 / 9994 ←次へ | 前へ→

【12809】Re:クエリ:クロス集計について
回答  hatena  - 15/4/14(火) 1:01 -

引用なし
パスワード
   >>元テーブルに枝番フィールドを追加すればどうでしょうか。
>といいますのは、
>かるびの様のおっしゃっているワークテーブルや追加クエリは使わずに、
>Q集計元1に枝番フィールドを追加する、という解釈でいいのでしょうか?

クエリの元になっているテーブルつまり「作業内容」テーブルに「枝番」という数値型フィールドを追加してください。

> 載せていただいたページを見ていたのですが、
>たくさんの知らない文に圧倒されてしまい…ただ文字通り見ているだけになってしまいました。

下記の関数をコピーして標準モジュールに貼り付けてください。(リンク先のページにある関数です。)

'グループ毎の連番を入力する関数
'引数 FieldName:連番を格納するフィールド名(データ型は数値型)
'   TableName:対象のテーブル名またはクエリ名(パラメータクエリは不可)
'   GroupBy:グループ化するフィールド名(省略可能)
'        複数フィールドをカンマ区切りで指定可能
'        省略した場合は全レコードを通しての連番になります。
'   Orderby:並べ替えするフィールド名(省略可能)
'        SQLのORDER BY句内の式と同一
'        省略した場合は並び順は不定になります。
'   WhereCondition:抽出条件式(省略可能)
'        SQLのOWHERE句内の式と同一
'        省略した場合は全レコードが対象になります。
'使用上の注意: DAO ライブラリへの参照設定が必要です。
Public Function SetSequenceNumber( _
    FieldName As String, _
    TableName As String, _
    Optional GroupBy As String, _
    Optional Orderby As String, _
    Optional WhereCondition As String) As Boolean
  Dim rs As DAO.Recordset
  Dim c As Long, GCnt As Long, i As Long
  Dim strSQL As String, strOrderby As String
  Dim v() As String
  On Error GoTo ErrHdl

  SetSequenceNumber = True

  'SQL文生成
  strSQL = "SELECT " & FieldName
  If LenB(GroupBy) > 0 Then
    strSQL = strSQL & ", " & GroupBy
    strOrderby = "," & GroupBy
  End If
  strSQL = strSQL & " FROM " & TableName
  If LenB(WhereCondition) > 0 Then strSQL = strSQL & " WHERE " & WhereCondition
  If LenB(Orderby) > 0 Then strOrderby = strOrderby & "," & Orderby
  If LenB(strOrderby) > 0 Then strSQL = strSQL & " ORDER BY " & Mid$(strOrderby, 2)
  strSQL = strSQL & ";"
  Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)


  'グループ化するフィールド数分の動的配列確保
  GCnt = UBound(Split(GroupBy, ","))
  If GCnt > -1 Then ReDim v(GCnt)
  '連番書き込みループ
  Do Until rs.EOF
    For i = 0 To GCnt
      If v(i) = rs(i + 1) Then
      Else
        c = 0
        v(i) = rs(i + 1)
      End If
    Next
    c = c + 1
    rs.Edit
    rs(0) = c
    rs.Update
    rs.MoveNext
  Loop

Ext:
   On Error Resume Next
   rs.Close
  Set rs = Nothing
  Exit Function
ErrHdl:
  MsgBox Err & ":" & Err.Description
  SetSequenceNumber = False
  Resume Ext
End Function

この関数の内容は理解できなくても結構です。
使い方さえ理解すればOKです。
(ほとんどのPCユーザーはPCの仕組みは理解できていないが、PCは使えるというのと同じことです。)
使い方は、下記のコードを、クロス集計クエリを開く前に実行します。

SetSequenceNumber "枝番", "作業内容", "日付,社員番号"

これで、「作業内容」テーブルに「枝番」フィールドに、日付、社員番号毎に連番がふられます。

現状のクロス集計クエリの「列見出し」フィールドを下記に変更します。

式1: [社員] & IIf([枝番]=1,"",[枝番])

これで列見出しが下記のようになります。

 佐藤   佐藤2  本田   川村

もう少し具体的にいうと、例えば、
フォーム上にコマンドボタンを配置して、そのクリック時のイベントプロシージャを下記のように記述すればいいでしょう。

Private Sub コマンド_Click()

  SetSequenceNumber "枝番", "作業内容", "日付,社員番号"
  DoCmd.OpenQuery "クロス集計クエリ"

End Sub

これで希望のクロス集計クエリで開きます。

508 hits

【12799】クエリ:クロス集計について 木葉 15/4/10(金) 17:05 質問[未読]
【12800】Re:クエリ:クロス集計について かるびの 15/4/11(土) 2:18 回答[未読]
【12801】Re:クエリ:クロス集計について hatena 15/4/11(土) 5:19 回答[未読]
【12802】Re:クエリ:クロス集計について 木葉 15/4/11(土) 11:08 発言[未読]
【12806】Re:クエリ:クロス集計について 木葉 15/4/13(月) 17:16 質問[未読]
【12809】Re:クエリ:クロス集計について hatena 15/4/14(火) 1:01 回答[未読]
【12811】Re:クエリ:クロス集計について 木葉 15/4/14(火) 15:56 お礼[未読]

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