• 締切済み

Select Case の使い方について

はじめて質問します。 Windows XP  Access2000 の環境で作業しています。 お客様より頂いたCSVデータをもとに商品を出荷する出荷指示書を作成しています。 これまでは全てのお客様(約500店舗)に毎日出荷が基本でしたが、都合により50店舗ほど 週2回の出荷になりました。 実際の作業現場へ指示書を回す際に指示書の所定の位置に Select Case 使ってテキストを出力したいのですが最初のページがうまくいきません。 最初のページに[該当曜日]、[店番]があってもテキストが表示されないのです。その後のページには 正常に出力されます。 初心者ゆえの乱文を容赦願いまして、何が原因なのかご指導いただけば幸いです。 Private Sub Report_Page() Select Case [店番] & "#" & Weekday(Date) Case "10121#2" テキスト66 = "水曜出荷"   Case "10121#3" テキスト66 = "水曜出荷" Case "10121#4" テキスト66 = "出荷なし" Case "10121#5" テキスト66 = "土曜出荷" Case "10121#6" テキスト66 = "土曜出荷" Case "10121#7" テキスト66 = "出荷なし" Case "52114#2" テキスト66 = "火曜出荷" Case "52114#3" テキスト66 = "火曜出荷" Case "52114#4" テキスト66 = "出荷なし" Case "52114#5" テキスト66 = "金曜出荷" Case "52114#6" テキスト66 ="出荷なし" Case "52114#7" テキスト66 = "出荷なし"      ・      ・      ・  このような曜日と地域(翌着、中1日着等)による処理が50件ほど続きます。      ・      ・     End Select

みんなの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

解決されてましたらスルーで レポートについては詳しくないのですが > Private Sub Report_Page() 処理を記述するイベントはここで良いですか? うまくいっていると思われる2ページ以降ズレていたりしませんか? 例えば、1ページ目のものが2ページ目になっていたりしませんか? ページフッタのフォーマット時とかで処理してみては? Report_Page は描画系のみの様な記述がヘルプにあります。 やるとすれば、 Private Sub Report_Page()   Dim sS As String   Select Case XXXX     Case xx: sS = "水曜出荷"     ・・・・   End Select   ' テキスト66 の情報を入手設定して、そこに Print   With Me.テキスト66     Me.FontName = .FontName     Me.FontSize = .FontSize     Me.CurrentY = .Top + 20 ' ★     Me.CurrentX = .Left + .Width - Me.TextWidth(sS) - 15 ' ★   End With   Me.Print sS ※ ★:20 とか 15 は、印字位置微調整用数値 以下余談で Select Case の Case 処理が1行しかない場合、以下の様な記述も出来ます。 見易い記述にされたらと思います。 Select Case [店番] & "#" & Weekday(Date)   Case "10121#2": テキスト66 = "水曜出荷"   Case "10121#3": テキスト66 = "水曜出荷"   Case "10121#4": テキスト66 = "出荷なし"   Case "10121#5": テキスト66 = "土曜出荷"   Case "10121#6": テキスト66 = "土曜出荷"   Case "10121#7": テキスト66 = "出荷なし"   Case "52114#2": テキスト66 = "火曜出荷" ・・・・ また、以下は Select Case を使わない方法になりますが、参考程度で テーブル「T出荷要領」なるものを新設します (このテーブルには、毎日出荷以外の情報を入れておきます) フィールドは、 「an」:オートナンバ 「店番」:長整数に仮定 「曜日」:長整数 「対応」:以下のパターンにより変わってきます 「an」を主キーとし、「店番」「曜日」に重複ありのインデックスを付けるか、 「an」は設けず「店番」「曜日」の2つで主キーとするか パターン1)「対応」:テキスト型 サンプルデータは、 an 店番 曜日 対応 1 10121 2  水曜出荷 2 10121 3  水曜出荷 3 10121 5  土曜出荷 4 10121 6  土曜出荷 5 52114 2  火曜出荷 処理としては、 ・DLookup("店番","T出荷要領","店番=" & [店番]) で、毎日出荷の店番なのか判別します。 ・店番があったら テキスト66 = Nz(DLookup("対応","T出荷要領","店番=" & [店番] & " AND 曜日=" & Weekday(Date)),"出荷なし") ※ 上記 DLookup 2発で、Select Case は不要になります。 ※ また、毎日出荷の情報も盛り込んでおくと、1発目の DLookup は不要になります。 ※ 現状の Select Case の Case Else でもそうだと思いますが、毎日出荷する時には テキスト66 = Format(Date + 1, "aaa") & "曜出荷" とでもすれば、翌日で曜日が作られます。 パターン2)「対応」:長整数 サンプルデータは、 an 店番 曜日 対応 1 10121 2  4 2 10121 3  4 3 10121 5  7 4 10121 6  7 5 52114 2  3 処理としては、 ・DLookup("店番","T出荷要領","店番=" & [店番]) で、毎日出荷の店番なのか判別します。 (ここまでは、上記と同じです) ・店番があったら、 1~7はそのままの曜日扱いで、データが無かったら8とし、Choose で切り分け テキスト66 = Choose(Nz(DLookup("対応","T出荷要領","店番=" & [店番] & " AND 曜日=" & Weekday(Date)),8), _    "日曜出荷","月曜出荷","火曜出荷","水曜出荷","木曜出荷","金曜出荷","土曜出荷","出荷なし") ※※ 上記への変更で、都合により・・・は、テーブルのデータ増減で対応できます   (都度、VBA を変更する必要はなくなります) 発展した例その1) ・パターン1の方法をとるものとします。 ・毎日出荷する店番情報は持ちませんが、毎日用にデータを盛り込んでおきます サンプルデータは、 an 店番 曜日 対応 1   0 1  月曜出荷 2   0 2  火曜出荷 3   0 3  水曜出荷 4   0 4  木曜出荷 5   0 5  金曜出荷 6   0 6  土曜出荷 7   0 7  日曜出荷 8 10121 2  水曜出荷 9 10121 3  水曜出荷 10 10121 5  土曜出荷 11 10121 6  土曜出荷 12 52114 2  火曜出荷 ・1発目の DLookup の戻り値が Null ならば、次の DLookup 時の店番を0で抽出します ★★ = Nz(DLookup("店番","T出荷要領","店番=" & [店番]),0) テキスト66 = Nz(DLookup("対応","T出荷要領","店番=" & ★★ & " AND 曜日=" & Weekday(Date)),"出荷なし") 発展した例その2) ・xx曜出荷・・・って何日よ ・パターン2の方法で、「対応」の設定値の意味を変更します。 (何日後・・・・の値を入れておきます) ・毎日出荷する店番情報は持ちませんが、毎日用にデータを盛り込んでおきます サンプルデータは、 an 店番 曜日 対応 1   0 1  1 2   0 2  1 3   0 3  1 4   0 4  1 5   0 5  1 6   0 6  1 7   0 7  1 8 10121 2  2 9 10121 3  1 10 10121 5  2 11 10121 6  1 12 52114 2  1 ・1発目の DLookup の戻り値が Null ならば、次の DLookup 時の店番を0で抽出します ★★ = Nz(DLookup("店番","T出荷要領","店番=" & [店番]),0) ☆☆ = Nz(DLookup("対応","T出荷要領","店番=" & ★★ & " AND 曜日=" & Weekday(Date)),-1) If (☆☆ < 0) Then   テキスト66 = "出荷なし" Else   テキスト66 = Format(Date + ☆☆, "m/d aaa") & "曜出荷" End If ※ ★★、☆☆には、適当な変数名を ※※ 後は、テーブル「T出荷要領」メンテナンス用にフォーム1つでも作っておけば・・・

itabasi350
質問者

お礼

chayamatiさま、30246kikuさま 貴重なご回答ありがとうございます。 未だ問題は解決しておりませんが皆様から頂いたご指導を参考にもう少し 勉強してまいります。

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.3

>最初のページに[該当曜日]、[店番]があってもテキストが表示されないのです。 最初の店番分がそっくり抜けると言うことでよろしいですね Do Loop命令を使っていませんか 1.loopに入る前に[STOP]命令を入れる 2.実行 3.[STOP]命令の位置で一時停止してコードを表示します  ここで店番または日付にマウスカーソルを合わせると、その値が表示されます 4.F8キー押下で1ステップづつプログラムが進みます。 これでLoopの状況が確認できます。 ご参考までに、 コーディングに実数字を使用するのは感心できません 例えば消費税率ですが4月より変更になりました。 また年内に変更になるようですね。 変更のつどプログラムの修正が必要になります。 プロフィールテーブルを用意し、ここへ会社名、住所に加えて 有効期限、税率のフィールドを定義します コーディングではこのフィールドを参照する事になります。 今回ですが、店番別出荷日テーブルを作成しこれを参照するようにします。 参照方法は テーブルのデザインビューのルックアップタグからコンボボックスで参照します この方法でSelect区は不用です。 店番出荷日テーブル ・ID ・店番とweekday ・出荷日(テキスト型)

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.2

>と記述した店番以外の全ての店番を >Case Else…に記述するのでしょうか? Case で設定した条件以外の全てのコードが Case Else の式で実行されますので店番の記述は必要ありません。

itabasi350
質問者

補足

拙い質問に早々のご回答ありがとうございます。 Case Else テキスト66 = ""   抜けていた上コードを記述して表示されるようになりました。 しかし、プレビューで確認すると最初のページだけは正常な判定が できていないようです。 >End Selectの前に >Case Else >テキスト66 = [店番] & "#" & Weekday(Date) 先に教えていただいた上記記述で確認すると 1ページ目以外は 10121#2 のように店番と作業日の曜日を正確に 表示されます。 1ページ目のみ違う店番が表示されてしまいます。 レコードソース(クエリ)も確認してみましたが正常なデータでした。 他に原因があるのでしょうか? 宜しくお願いします。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

原因は分かりませんが、検証は可能です。 End Selectの前に Case Else テキスト66 = [店番] & "#" & Weekday(Date) として、何が入力条件になってるか確認してください。 対応するCase文がないのか、誤入力があるかもしれません。

itabasi350
質問者

補足

 mshr1962 様 早々のご回答ありがとうございます。    ご指摘どおり Case Else… の記述が抜けておりました。  しかし、この場合   Case "10121#2" テキスト66 = "水曜出荷" Case "10121#3" テキスト66 = "水曜出荷" Case "10121#4" テキスト66 = "出荷なし" Case "10121#5" テキスト66 = "土曜出荷" Case "10121#6" テキスト66 = "土曜出荷" Case "10121#7" テキスト66 = "出荷なし" と記述した店番以外の全ての店番を Case Else…に記述するのでしょうか?

関連するQ&A