Access VBA質問箱 IV

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

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


154 / 2272 ツリー ←次へ | 前へ→

【12803】帳票で階段状に塗り潰し せいさん 15/4/11(土) 13:05 質問[未読]
【12804】Re:帳票で階段状に塗り潰し せいさん 15/4/11(土) 15:22 発言[未読]
【12810】Re:帳票で階段状に塗り潰し かるびの 15/4/14(火) 2:51 回答[未読]
【12812】Re:帳票で階段状に塗り潰し せいさん 15/4/14(火) 22:01 質問[未読]
【12813】Re:帳票で階段状に塗り潰し かるびの 15/4/15(水) 0:45 回答[未読]
【12814】Re:帳票で階段状に塗り潰し せいさん 15/4/15(水) 14:14 質問[未読]
【12815】Re:帳票で階段状に塗り潰し せいさん 15/4/15(水) 18:11 発言[未読]
【12816】Re:帳票で階段状に塗り潰し かるびの 15/4/16(木) 1:10 回答[未読]
【12817】Re:帳票で階段状に塗り潰し せいさん 15/4/16(木) 15:47 質問[未読]
【12818】Re:帳票で階段状に塗り潰し せいさん 15/4/16(木) 19:54 質問[未読]
【12820】Re:帳票で階段状に塗り潰し かるびの 15/4/17(金) 1:20 回答[未読]
【12821】Re:帳票で階段状に塗り潰し せいさん 15/4/17(金) 18:14 お礼[未読]
【12822】Re:帳票で階段状に塗り潰し せいさん 15/4/17(金) 23:19 質問[未読]
【12823】Re:帳票で階段状に塗り潰し かるびの 15/4/18(土) 1:07 回答[未読]
【12824】Re:帳票で階段状に塗り潰し せいさん 15/4/18(土) 11:33 お礼[未読]

【12803】帳票で階段状に塗り潰し
質問  せいさん  - 15/4/11(土) 13:05 -

引用なし
パスワード
   帳票フォームで指定した文字数を表示したいです。頭からではなく最初が2文字指定したら決まった文字が頭から2文字表示され次のレコードに3文字指定したら2文字開けて3文字を表示するといった感じです順番はnoフィールドで入れ替えています

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

引用なし
パスワード
   追加ですがやりたいことはチャートみたいにする目的です

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

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

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

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


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


 提示された情報が少ないので、回答もこの程度で。 

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

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

【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つ追加してやる必要があります。

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

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

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

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

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

【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の表示がおかしいです
数を変更すると表示がもっとおかしくなります
規則性は無いように見えます。
うまく伝わっているとよいのですが
足りないところがあったら教えてください
よろしくお願いします

【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ビューの内容をそのまま貼り付けてください。

【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でつながったテーブルを利用してできないか考えていました

こんな内容でご理解いただけたでしょうか

【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;


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

【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)
などと入力し、どういう値が返されるか実験してみてください。

【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;

こんな感じになりました
いろいろと
ありがとうございました

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

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

【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 ………

とします。

【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」とすべきです。
> 

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


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

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

154 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free