Access VBA質問箱 IV

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

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


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

【12825】DLOOKUPのあいまい検索について
質問  まき  - 15/5/11(月) 11:35 -

引用なし
パスワード
   お世話になります

表題がうまくいかないので、ご教示よろしくお願いします

クエリAの内容
[ID]オートナンバー
[日付]日付型
[氏名]テキスト型
[商品ID]整数型
[品名]テキスト型
[サイズ]テキスト型

データ内容

[ID]  [日付]   [氏名]  [商品ID] [品名]        [サイズ]
1   2015/5/1  凸山凹子  1101  みかん          M
2   2015/5/1  ○田×雄  1103  おいしいいちご      L
3   2015/5/3  △島◎太  1111  静岡産のいちじく天然   S

レポートで

A)DLookUp("[サイズ]","クエリA","[品名] Like '*' & 'いちご' AND [ID]=" & [ID])
B)DLookUp("[サイズ]","クエリA","[品名] Like '*' & 'いちじく' AND [ID]=" & [ID])
C)DLookUp("[サイズ]","クエリA","[品名]= 'みかん'")

と書いたら
B)C)に関してはちゃんとサイズが表示されるのですが(それぞれS、M)
A)に関しては全く出ません(エラーも表示されません)

どこがおかしいのでしょうか?
・ツリー全体表示

【12824】Re:帳票で階段状に塗り潰し
お礼  せいさん  - 15/4/18(土) 11:33 -

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

> こんな感じです。
>
>SELECT ……
>  ,Space(累計*2) AS スペース
>  ,Mid(String(60,"■")
>    ,累計+1
>    ,予定日数
>    ) AS 四角
>  ,スペース & 四角 AS 表
>FROM ……
>
> なお、「加工順」フィールドが1である場合や、
>「加工順」フィールドや「累計」フィールド、「予定日数」フィールドが
>Nullである場合は考慮していません。
>


Nullの条件を考えて作ってみます


>
> それから、累計フィールドが
>
>>IIf(IsNull([加工順]),"",DSum("予定日数","Q_工程MC","加工順<" & [加工順])) AS 累計
>
>となっていますが、これはまずいです。
> 累計フィールドは、表フィールドにおいて数値として使うことになるので、
>累計フィールドは数値でなければなりません。
> 問題なのは、IIF関数の第2引数(Trueパート)が「""」となっていることです。
> 累計フィールドは数値でなければならない以上、
>累計フィールドが長さ0の文字列、つまり「""」となってはいけません。
> ここは「0」とすべきです。
> 

了解しました。確かにそうですね
以前からアドバイス頂いていましたね


> うんざりする式ですね。
> 私ならユーザー定義関数を作ります。
>
>
たいへん参考になります

私も書いててワケわかんなくなりそうでした
欲がでてわからなくなったらまた投稿するかもしれません
その時は宜しくお願いします
・ツリー全体表示

【12823】Re:帳票で階段状に塗り潰し
回答  かるびの  - 15/4/18(土) 1:07 -

引用なし
パスワード
   >ちなみに別フィールドでスペースを入れるとするとどういう感じで考えるとよあでしょうか

 こんな感じです。

SELECT ……
  ,Space(累計*2) AS スペース
  ,Mid(String(60,"■")
    ,累計+1
    ,予定日数
    ) AS 四角
  ,スペース & 四角 AS 表
FROM ……

 なお、「加工順」フィールドが1である場合や、
「加工順」フィールドや「累計」フィールド、「予定日数」フィールドが
Nullである場合は考慮していません。


 それから、累計フィールドが

>IIf(IsNull([加工順]),"",DSum("予定日数","Q_工程MC","加工順<" & [加工順])) AS 累計

となっていますが、これはまずいです。
 累計フィールドは、表フィールドにおいて数値として使うことになるので、
累計フィールドは数値でなければなりません。
 問題なのは、IIF関数の第2引数(Trueパート)が「""」となっていることです。
 累計フィールドは数値でなければならない以上、
累計フィールドが長さ0の文字列、つまり「""」となってはいけません。
 ここは「0」とすべきです。


 以下、余談です。
 「表」フィールドの式ですが、
>, IIf(IsNull([予定日数]),"",IIf([加工順]=1,Mid(String(60,"■"),1,[予定日数]),IIf(IsNull([加工順]),"",IIf(IsNull([累計]),"",Space([累計]*2) & Mid(String(60,"■"),[累計]+1,[予定日数]))))) AS 表
 うんざりする式ですね。
 私ならユーザー定義関数を作ります。
 インデント(字下げ)が使えるので、見通しが良くなります。

 まず、標準モジュールに次のコードを書きます。なお、予定日数フィールド、
加工順フィールドが整数型(Integer型)であることが前提です。

Function Fn表(int予定日数 As Integer _
      , int加工順 As Integer _
      , int累計 As Integer) As String

  If IsNull(int予定日数) = True Then
    Fn表 = ""
  Else
    If int加工順 = 1 Then
      Fn表 = Mid(String(60, "■") _
          , 1 _
          , int予定日数 _
           )
    Else
      If IsNull(int加工順) = True Then
        Fn表 = ""
      Else
        If IsNull(int累計) = True Then
         Fn表 = ""
        Else
         Fn表 = Space(int累計 * 2) & Mid(String(60, "■") _
                        , int累計 + 1 _
                        , int予定日数 _
                         )
        End If
      End If
    End If
  End If
End Function

 コードの意味は、上記の式と同じです。


 クエリでは、

SELECT 受注リスト.加工順
    ………
   , Fn表(予定日数,加工順,累計) AS 表
FROM 受注リスト
WHERE ………

とします。
・ツリー全体表示

【12822】Re:帳票で階段状に塗り潰し
質問  せいさん  - 15/4/17(金) 23:19 -

引用なし
パスワード
   >かるびの 様
ちなみに別フィールドでスペースを入れるとするとどういう感じで考えるとよあでしょうか
・ツリー全体表示

【12821】Re:帳票で階段状に塗り潰し
お礼  せいさん  - 15/4/17(金) 18:14 -

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

何とかうまくいったようです
使っていておかしいところが出たらまた考えます

SELECT 受注リスト.加工順, 受注リスト.オーダーNo, 受注リスト.発注日, 受注リスト.発注担当者名, 受注リスト.品番図番, 受注リスト.品名, 受注リスト.部品発注数, 受注リスト.納期, 受注リスト.発注残数, 受注リスト.工程名, 受注リスト.形式寸法, 受注リスト.工程備考, 受注リスト.在庫数, 受注リスト.納期対応, 受注リスト.在庫対応, 受注リスト.進捗, 受注リスト.予定日数, IIf(IsNull([加工順]),"",DSum("予定日数","Q_工程MC","加工順<" & [加工順])) AS 累計, IIf(IsNull([予定日数]),"",IIf([加工順]=1,Mid(String(60,"■"),1,[予定日数]),IIf(IsNull([加工順]),"",IIf(IsNull([累計]),"",Space([累計]*2) & Mid(String(60,"■"),[累計]+1,[予定日数]))))) AS 表
FROM 受注リスト
WHERE (((受注リスト.工程名)="MC"))
ORDER BY IIf(IsNull([加工順]),1,0), 受注リスト.加工順, 受注リスト.納期, 受注リスト.納期対応 DESC;

こんな感じになりました
いろいろと
ありがとうございました
・ツリー全体表示

【12820】Re:帳票で階段状に塗り潰し
回答  かるびの  - 15/4/17(金) 1:20 -

引用なし
パスワード
    テーブル構成、クエリ内容の提示については、了解です。

 テーブルについては、1つのテーブルに情報を盛り込み過ぎている、
言い換えると、もっとテーブルを分割した方がいいのではないか
という印象ですが、
当方には業務の実態が全くわからないので、
テーブル構成の適否を的確に判断できませんし、
今回のスレッドのテーマからは外れてしまうので、
これ以上は触れません。


 SQL文が見づらいので、整形してみました。

Q_工程別

SELECT 加工順
   , オーダーNo
   , 発注日
   , 発注担当者名
   , 品番図番
   , 品名
   , 部品発注数
   , 納期
   , 発注残数
   , 工程名
   , 形式寸法
   , 工程備考
   , 在庫数
   , 納期対応
   , 在庫対応
   , 進捗
   , 予定日数
   , IIf([加工順]=1
     ,Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ",1,[予定日数])
     ,Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ",[累計]+1,[予定日数])
     ) AS 表
   , DSum("予定日数","受注リスト","加工順<" & [加工順]) AS 累計
FROM 受注リスト
ORDER BY IIf(IsNull([加工順]),1,0)
    , 加工順
    , 納期
    , 納期対応 DESC;

>加工順、予定日数が無い時にエラーが出ますがなんとなくアルファベットの表示が[表]に出てくるように
>なりました。あっているかはともかくですが
>いかがでしょうか

 期待どおりの、あるいは予想どおりの文字列が「表」フィールドに
表示されれば、それが正解です。

 強いて言えば、「表」フィールドと「累計」フィールドの順番を入れ替えた方がいいと思います。
 「累計」フィールドを算出した後で、「表」フィールドの値を生成することになるからです。


 あとは、「表」フィールドの結果に、スペースを追加するという処理だけですね。
 なお、この処理を「表」フィールドに盛り込んでもいいのですが、
処理経過を確認するために、
「表」フィールドとスペース追加の処理は、別フィールドにした方がいいと思います。


>加工順、予定日数が無い時にエラーが出ますが

 エラーの原因はわかっていますか。

 エラーの原因ですが、
予定日数がないときは、「予定日数」フィールドの値はNullとなっています。
 したがって、「表」フィールド内のIIF関数のFalseパートにおける
Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ",[累計]+1,[予定日数])
には、第3引数の値としてNullが渡されるわけですが、
Mid関数の第3引数はNull値をとれないため、このMid関数がエラーを返し、
その結果、その外側にあるIIF関数もエラーを返します。
 だから、Mid関数がエラーにならないような値を渡すようにする必要があります。


 VBEのイミディエイト・ウィンドウに、例えば、
   ? Mid("ABCD",2,2)
   ? Mid("ABCD",2,Null)
などと入力し、どういう値が返されるか実験してみてください。
・ツリー全体表示

【12818】Re:帳票で階段状に塗り潰し
質問  せいさん  - 15/4/16(木) 19:54 -

引用なし
パスワード
   その後ですが
少し変えました
基本は同じです

リンクテーブルの元のテーブルに
予定日数(数値型)、表(テキスト型)という形で追加しました


クエリを少しいじって
クエリのSQLが

SELECT 受注リスト.加工順, 受注リスト.オーダーNo, 受注リスト.発注日, 受注リスト.発注担当者名, 受注リスト.品番図番, 受注リスト.品名, 受注リスト.部品発注数, 受注リスト.納期, 受注リスト.発注残数, 受注リスト.工程名, 受注リスト.形式寸法, 受注リスト.工程備考, 受注リスト.在庫数, 受注リスト.納期対応, 受注リスト.在庫対応, 受注リスト.進捗, 受注リスト.予定日数, IIf([加工順]=1,Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ",1,[予定日数]),Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ",[累計]+1,[予定日数])) AS 表, DSum("予定日数","受注リスト","加工順<" & [加工順]) AS 累計
FROM 受注リスト
ORDER BY IIf(IsNull([加工順]),1,0), 受注リスト.加工順, 受注リスト.納期, 受注リスト.納期対応 DESC;


と、なっています。
この選択は良かったのでしょうか
加工順、予定日数が無い時にエラーが出ますがなんとなくアルファベットの表示が[表]に出てくるように
なりました。あっているかはともかくですが
いかがでしょうか
大変申し訳ありませんが
今しばらくおつきあいお願いします
・ツリー全体表示

【12817】Re:帳票で階段状に塗り潰し
質問  せいさん  - 15/4/16(木) 15:47 -

引用なし
パスワード
   お世話になります
いろいろ考えいじっていますが
やはり頓挫しています

現状の構成ですが

テーブル
受注リスト

加工順    数値型
オーダーNo  テキスト型  キー
発注日    日付/時刻型
製番     テキスト型
発注担当者名 テキスト型
品番図番   テキスト型
品名     テキスト型
部品発注数  数値型
納期     日付/時刻型
発注単価   通貨型
発注金額   通貨型
発注残数   数値型
工程名    テキスト型
形式寸法   テキスト型
工程備考   テキスト型
部品備考   テキスト型
在庫数    数値型
納期対応   テキスト型
在庫対応   YES/NO型
進捗     テキスト型


F_工程別で帳票フォームです
コントロールはQ_工程別
受注リストのすべてのフィールドを連結しています
また、コマンドボタンで工程名別のリストが出るように
フォーム上で
Private Sub コマンド26_Click()
Me.Filter = "工程名 = '外注'"
Me.FilterOn = True
End Sub
のように各工程別に内容が切り替わります


Q_工程別のSQLは

SELECT 受注リスト.加工順, 受注リスト.オーダーNo, 受注リスト.発注日, 受注リスト.製番, 受注リスト.発注担当者名, 受注リスト.品番図番, 受注リスト.品名, 受注リスト.部品発注数, 受注リスト.納期, 受注リスト.発注単価, 受注リスト.発注金額, 受注リスト.発注残数, 受注リスト.工程名, 受注リスト.形式寸法, 受注リスト.工程備考, 受注リスト.部品備考, 受注リスト.在庫数, 受注リスト.納期対応, 受注リスト.在庫対応, 受注リスト.進捗
FROM 受注リスト
ORDER BY IIf(IsNull([加工順]),1,0), 受注リスト.加工順, 受注リスト.納期, 受注リスト.納期対応 DESC;

テーブルはリンクテーブルです

この状態から
各工程のフォームで加工順を入力します。この時数十点リストがありますが
順序がわかっているものだけ数字を入れます。その後入力した加工順で並び替えを行います
ここまでが現状です

これに
並び替えたレコードの加工順が入力してあるものの中で加工日数が解っているものに
日数を入れ質問時にはABCD・・・としましたが実際は○○○○○○○・・を
階段状にしたいと考えています
テーブルはリンクテーブルの為
オーダーNoでつながったテーブルを利用してできないか考えていました

こんな内容でご理解いただけたでしょうか
・ツリー全体表示

【12816】Re:帳票で階段状に塗り潰し
回答  かるびの  - 15/4/16(木) 1:10 -

引用なし
パスワード
   >フォームにある、加工順とテキストボックス(数)に数字を入れチャートのようにしたいのですが
>(数)のボックスの更新後処理に
>
>Me!TEXT = Mid("ABCDEFG", Me!累計 = DSum("数", "チャート用", "加工順<=" & [加工順]), Me!数)
>
>としてみましたがプロシージャの呼び出し、または引数が不正です。(Error 5)
>と、なってしまいます
>スペースの入力のまえにこれができないとダメかと思いやっています
>どこがいけないのでしょうか

 確実にだめだと言えるのは、Mid関数の第2引数です。

 Mid関数の第2引数は、文字列の、取り出したい部分の開始位置を指定します。
つまり、先頭から何文字目以降を取り出したいのかということです。
 したがって、第2引数は、最小で1となり、それより小さい数をとることはありません。

 上記のコードでMid関数の第2引数に指定されているのは、
   Me!累計 = DSum("数", "チャート用", "加工順<=" & [加工順])
という式ですが、これは条件式です。
 この式が成り立つならば、この式はTureを返し、成り立たないならば、Falseを返します。
 アクセスやVBAでは、Trueを数値で表すと-1に、Falseは0となります。
 言い換えると、条件式が成り立つならば、
「Me!累計 = DSum("数", "チャート用", "加工順<=" & [加工順])」という式は
-1を意味します。

 第2引数は、最小でも1なのですから、第2引数を-1とか0にしたら、エラーになります。


>Private Sub 数_AfterUpdate()
>
>累計 = DSum("数", "Q_NC", "加工順<=" & Me!加工順)
>
>Me!TXET = Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 累計, Me!数)
>
>Me.Refresh
>Me.Requery
>End Sub
>という形でコードを書きました
>しかしエラーは出ないのですが累計やTXETの表示がおかしいです

 原因は、「累計 = DSum("数", "Q_NC", "加工順<=" & Me!加工順)」のコードでは
「累計」変数の値が、累計になっていないからだと思います。

 第1に、このコードだと、
「加工順」フィールドの値で昇順に並べ替えている場合の
「数」フィールドの累計を求めていることになりますが、
並べ替えは「加工順」フィールドの順でいいのでしょうか。

 第2に、
   ID 数 加工順
    8  2    1
    9  3    4
    5  6    8
となっている場合の「数」フィールドの累計値は、
   ID 数 加工順 累計値
    8  2    1    2
    9  3    4    5
    5  6    8   11
となりますが、こうなっているときに
   ID 数 加工順
   11  4    3
というレコードを追加すると、「累計」変数の値は、
   ID 数 加工順 「累計」変数
    8  2    1       2
    9  3    4       5
    5  6    8      11  
   11  4    3       9
となります。
 上記コードを実行しても、カレントレコードについての累計が求められる
だけであって、
他のレコードにおける累計の値は修正されません。
つまり、IDが11であるレコードを追加しても、
IDが5であるレコードの「累計」変数の値は、15になるのではなく、11のまま
変わりません。

 この2点あたりがうまくいかない原因ではなかろうかと思われます。


 対策ですが、
累計の算出、文字列の取り出し、取り出した文字列へのスペース付与を
すべてクエリで行うことになると思います。

 スペース付与については、Space関数やString関数が使えると思います。


 それから、
これまで回答はこれっきりというつもりで回答してきたので、
敢えて触れなかったのですが、
そちらの現状が今ひとつよくわかりません。
 なので、そちらの現状を示してもらった方がいいと思います。
 つまり、テーブル構成(テーブル名、主なフィールド名及びそのデータ型。主キーフィールド)
及びフォーム構成(レコードソース、主なコントロール名及びそのコントロールソース)
を提示してください。
 レコードソースがクエリの場合は、そのクエリのSQL文も提示してください。
クエリのSQL文は、当該クエリのSQLビューの内容をそのまま貼り付けてください。
・ツリー全体表示

【12815】Re:帳票で階段状に塗り潰し
発言  せいさん  - 15/4/15(水) 18:11 -

引用なし
パスワード
   追記ですが
チャート用とリストのテーブルから選択クエリ(Q_NC)でNという抽出条件で
実行しています
その後ですが

Private Sub 数_AfterUpdate()

累計 = DSum("数", "Q_NC", "加工順<=" & Me!加工順)

Me!TXET = Mid("ABCDEFGHIJKLMNOPQRSTUVWXYZ", 累計, Me!数)

Me.Refresh
Me.Requery
End Sub
という形でコードを書きました
しかしエラーは出ないのですが累計やTXETの表示がおかしいです
数を変更すると表示がもっとおかしくなります
規則性は無いように見えます。
うまく伝わっているとよいのですが
足りないところがあったら教えてください
よろしくお願いします
・ツリー全体表示

【12814】Re:帳票で階段状に塗り潰し
質問  せいさん  - 15/4/15(水) 14:14 -

引用なし
パスワード
   現状ですが
クエリにチャート用テーブルとリストテーブルがありIDで結んでいます
結合プロパティではリストの全レコードとチャート用の同じ結合フィールドのレコードだけを含めるとしてあります
チャート用のテーブルはID、数、TEXT、累計フィールドがあり
リストテーブルにはID、加工順、その他いろいろとなっていて加工順は昇順で表示していますが入力していないデータもあります

フォームにある、加工順とテキストボックス(数)に数字を入れチャートのようにしたいのですが
(数)のボックスの更新後処理に

Me!TEXT = Mid("ABCDEFG", Me!累計 = DSum("数", "チャート用", "加工順<=" & [加工順]), Me!数)

としてみましたがプロシージャの呼び出し、または引数が不正です。(Error 5)
と、なってしまいます
スペースの入力のまえにこれができないとダメかと思いやっています
どこがいけないのでしょうか
・ツリー全体表示

【12813】Re:帳票で階段状に塗り潰し
回答  かるびの  - 15/4/15(水) 0:45 -

引用なし
パスワード
   >Mid(A,(累計をだす何か),[数])
>こんな感じでしょうか

 そんな「感じ」です。
 もっとも、「A」とか「[数]」が何を意味しているのかがわからないので、
あなたがイメージしているものと、私がイメージしているものとが
全く異なっているという可能性はありますが。


>スペースの追加とはどういう感じでしょうか
>形としては
>ABCDEFGHIとテキストがあった場合
>数   表示
>2    AB
>1    ..C
>3    ...DEF
>0    .....F
>2    ......GH
>こんな感じを目指しています
>.はスペースの代わりです。

 上例からすると、スペースを追加する必要があることは
既にわかっておられますよね。

 例えば、「ABCDEFGHI」という文字列の3文字目以降を1文字取り出すと
「C」が取り出されます。
 しかし、これだけだと、タイトルにあるような「階段状」にはなりません。
 「階段状」になるようにするには、
「C」の前にスペースを2つ追加してやる必要があります。
・ツリー全体表示

【12812】Re:帳票で階段状に塗り潰し
質問  せいさん  - 15/4/14(火) 22:01 -

引用なし
パスワード
   回答ありがとうございます
Mid関数は何となく調べてたのですが
累計は頭になかったです
Mid(A,(累計をだす何か),[数])
こんな感じでしょうか
スペースの追加とはどういう感じでしょうか
形としては
ABCDEFGHIとテキストがあった場合
数   表示
2    AB
1    ..C
3    ...DEF
0    .....F
2    ......GH
こんな感じを目指しています
.はスペースの代わりです。
・ツリー全体表示

【12811】Re:クエリ:クロス集計について
お礼  木葉  - 15/4/14(火) 15:56 -

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

お返事ありがとうございます!
>
>この関数の内容は理解できなくても結構です。
>使い方さえ理解すればOKです。
そうなのですね…理解できそうになかったので焦りました。


>フォーム上にコマンドボタンを配置して、そのクリック時のイベントプロシージャを下記のように記述すればいいでしょう。
>
>Private Sub コマンド_Click()
>
>  SetSequenceNumber "枝番", "作業内容", "日付,社員番号"
>  DoCmd.OpenQuery "クロス集計クエリ"
>
>End Sub

実行してみたところうまくいきました!

何から何まで任せっきりになるような形になってしまい申し訳ないです。


前回に引き続きやさしくご回答くださったかるびの様、hatena様、本当にありがとうございました^^
・ツリー全体表示

【12810】Re:帳票で階段状に塗り潰し
回答  かるびの  - 15/4/14(火) 2:51 -

引用なし
パスワード
   >頭からではなく最初が2文字指定したら決まっ
>た文字が頭から2文字表示され次のレコードに3文字指定したら2文字開けて3文字を表示する
>といった感じです

 表示する2文字や3文字の文字列を生成するには、Mid関数を使います。
 Mid関数の第1引数には、上記の「決まった文字」を設定します。
 第2引数には、指定した文字のうち表示するのが何文字目からなのかを設定します。
指定した文字数の累計を設定することになると思います。
 第3引数には、表示する文字の字数を設定します。
これは、指定した文字の数を設定することになると思います。

 指定した文字の数の累計に関して、
累計は、レコードソースたるクエリにおいて求めます。
 アクセスは、あるレコードの値、他のレコードの値に基づいて決めるということは苦手です。
 そのため、アクセスは累計を求めることが苦手なのですが、
累計を求める方法は、あちこちのホームページに載っているので、探してみてください。


 「次のレコードに3文字指定したら2文字開けて」の部分は、
指定した文字の数の累計の応じてスペースを、表示する2文字や3文字の文字列に追加します。


 提示された情報が少ないので、回答もこの程度で。 
・ツリー全体表示

【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

これで希望のクロス集計クエリで開きます。
・ツリー全体表示

【12808】Re:変数、ワークシート関数の書き方
お礼  まき  - 15/4/13(月) 19:36 -

引用なし
パスワード
   すみません スレッド間違えてました こちら閉じてエクセルの方に書き直します
・ツリー全体表示

【12807】Re:変数、ワークシート関数の書き方
発言  独覚  - 15/4/13(月) 17:19 -

引用なし
パスワード
   いろいろと問題点がありますが一番の問題は質問する場所を間違えていることでは?
・ツリー全体表示

【12806】Re:クエリ:クロス集計について
質問  木葉  - 15/4/13(月) 17:16 -

引用なし
パスワード
   遅くなってごめんなさい・・

考えすぎて訳が分からなくなっているだけかもしれませんが…

ひとまずワークテーブルと追加クエリまでは作りました。

>ワークテーブルと作業内容テーブルを結合させたクエリを作ります。
>このクエリがQ集計元2です。

とありますが、

> 次いで、Q集計元1とワークテーブルとを
>各「作業内容番号」フィールドで結合させ、

ここでもさらにクエリを作成したらいいのですか?


結合させるということは新たにクエリを作るとおっしゃっているように聞こえますし、
それだとQ集計元2を作る意味は…?
Q集計元1とワークテーブルを結合させたとしたら、どちらかを持て余す感じになるような気がします。
はたまた何か深い意味があるのか?

などと考えていたらますます こんがらがってきました…。


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

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

かるびの様からご提示いただいた方法と、どちらがわかりやすいか(というよりは見直したときに修正しやすいか)など考えていましたがそれもさっぱりです…。


右も左も分からないような者で申し訳ないですが、
何卒よろしくお願いします。
・ツリー全体表示

【12805】変数、ワークシート関数の書き方
質問  まき  - 15/4/13(月) 17:07 -

引用なし
パスワード
   よろしくお願いします

下記のコードを書きましたがエラー1、エラー2が出てしまいます

Sub ボタン3_Click()
Dim i As Integer
Dim strSheetName As Worksheet
Set strSheetName = ActiveSheet
       ・
       ・
       中略
       ・
       ・  
Sheets(strSheetName).Select ・・・・エラー1(型が一致しません)
       ・
       ・
       中略
       ・
       ・
Range("B27").Select
ActiveCell.Formula = "=Index(Worksheets(strSheetName).Range(""A1:A1000""), Match(D27, Worksheets(strSheetName).Range(""C1:C1000""), False))" ・・・・エラー2(アプリケーション定義またはオブジェクト定義のえらーです。)

※FormulaをValueに変えても同じ

それぞれどこがおかしいかご教示いただくと嬉しいです
よろしくお願いします
・ツリー全体表示

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