「Select Case」より短く組む方法はあるでしょうか?

このQ&Aのポイント
  • 印刷したいレポートが24種類あり、各レポートには1月~12月のどれかが印刷されます。
  • 月が印刷済の用紙を再使用する場合もあり、印刷済の月に消線をする処理があります。
  • 一部抜粋されたコードでは、Select Case文を使用して各レポートと月の組み合わせに応じた処理を行っています。しかし、コードが長くなりすぎてしまっています。より短く組む方法はないでしょうか?
回答を見る
  • ベストアンサー

「Select Case」より短く組み方法はあるでしょうか?。

「Select Case」より短く組み方法はあるでしょうか?。 VB初心者です。 印刷したいレポートが24種類あり、各レポートには1月~12月のどれかが印刷されます。 また月が印刷済の用紙を再使用する場合もあり、印刷済の月に消線をする処理があります。 下記が印刷済の月に消線をする処理(一部抜粋)ですが、あまりに大きくなる為、これより 短く組む方法はあるでしょうか?。 なにかヒントになるような事でも構いません。 どなたかご教授願います。 よろしくお願い致します。 stdocname:レポート名 delt:印刷済の月 Select Case stdocname & delt Case "レポート01上" & "1" Reports!レポート01上!直線A01.Visible = True Reports!レポート01上!直線B01.Visible = True Reports!レポート01上!直線C01.Visible = True Case "レポート01上" & "2" Reports!レポート01上!直線A02.Visible = True Reports!レポート01上!直線B02.Visible = True Reports!レポート01上!直線C02.Visible = True : : : Case "レポート01上" & "11" Reports!レポート01上!直線A11.Visible = True Reports!レポート01上!直線B11.Visible = True Reports!レポート01上!直線C11.Visible = True Case "レポート01上" & "12" Reports!レポート01上!直線A12.Visible = True Reports!レポート01上!直線B12.Visible = True Reports!レポート01上!直線C12.Visible = True : : : Case "レポート12下" & "1" Reports!レポート12下!直線A01.Visible = True Reports!レポート12下!直線B01.Visible = True Reports!レポート12下!直線C01.Visible = True Case "レポート12下" & "2" Reports!レポート12下!直線A02.Visible = True Reports!レポート12下!直線B02.Visible = True Reports!レポート12下!直線C02.Visible = True : : : Case "レポート12下" & "11" Reports!レポート12下!直線A11.Visible = True Reports!レポート12下!直線B11.Visible = True Reports!レポート12下!直線C11.Visible = True Case "レポート12下" & "12" Reports!レポート12下!直線A12.Visible = True Reports!レポート12下!直線B12.Visible = True Reports!レポート12下!直線C12.Visible = True End Select

  • ttgk
  • お礼率100% (38/38)

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

「VB」と一言で言っていますけど、VB6(VBA/VBS含む)と VB.NET(VB2008等)では全く異質な言語です。 正しく環境を記述しないと、判断できません。 Reports というコレクションから判断してAccess・VBAだと 仮定します。 先ず、stdocnameがレポート名を示しているので、次のように オブジェクトを設定します。 Dim Repo As Report Set Repo = Reports(stdocname) '名前で取得する方法 次にdeltが月を示しているようなので、これを名前の一部と します。 Dim m As String m = Format(delt, "00") '必ず2桁の数字になる 以上を組み合わせると、以下のようになります。 Dim Repo As Report Dim m As String Set Repo = Reports(stdocname) m = Format(delt, "00") Repo.Controls("直線A" & m).Visible = True Repo.Controls("直線B" & m).Visible = True Repo.Controls("直線C" & m).Visible = True 先ず、FormsとかReportsと複数になっているものは コレクションと呼ばれ、オブジェクトの集合を表します。 これから単数のオブジェクトを得るには名前(文字列)か インデックス(数値)を指定します。上の例ではRepoの データ型はReport(単数形)ですね。 このReportオブジェクトにはコントロールコレクションが あります。これが、Controlsです。これも名前を指定する ことで、特定のコントロール(オブジェクト)を示すことが できます。 今後は「Reports!レポート12下!~」のような記述は避ける ことをお勧めします。

ttgk
質問者

お礼

どうもありがとうございます。 「レポート印刷実行時に明細項目が#Errorになってしまいます。」 同様、作り直しをしてみようと思います。 今後は「Reports!レポート12下!~」のような記述は避ける ことをお勧めします。 上記ご指南頂いたように、レポートの見直しもあわせてみてみたいと思います。

ttgk
質問者

補足

ご回答ありがとうございます。 無知で申し訳ありません。 要するに、添え字(Index)を使用した方が良いと言う事でしょうか?。

関連するQ&A

  • vbaレポート名の指定が間違っている!。

    vbaレポート名の指定が間違っている!。 stdocnameの中身も確認しました。 でも下消又は上消の処理へ行くと上記エラーが表示されます。 この文のReports!stdocname!直線103.Visible = True書き方がおかしいようです。 どなたかご指南いただけますでしょうか。 よろしくお願い致します。 '*** stdocname(判定で指定されたレポート)を仮に開く DoCmd.OpenReport stdocname, acViewPreview '*** 消線の種類で印刷処理選択/消無は通常印刷 ---> 消線と月消を判定 If Forms!メイン画面![リストDELSEN] = "下消" Then GoTo SetLowerLine End If If Forms!メイン画面![リストDELSEN] = "上消" Then GoTo SetUpperLine End If GoTo Insatumae '*** 下消処理 SetLowerLine: Reports!stdocname!直線103.Visible = True Reports!stdocname!直線104.Visible = True Reports!stdocname!直線105.Visible = True Reports!stdocname!直線106.Visible = True Reports!stdocname!直線107.Visible = True '*** 下消時の月消処理(00は処理しない) Format ("00") ii = Forms!メイン画面![テキストDELTUKI] If ii = "00" Then Else Reports!stdocname!("直線A" & "ii").Visible = True Reports!stdocname!("直線B" & "ii").Visible = True Reports!stdocname!("直線C" & "ii").Visible = True End If GoTo Insatumae '*** 上消処理 SetUpperLine: Reports!stdocname!直線103.Visible = True Reports!stdocname!直線104.Visible = True Reports!stdocname!直線105.Visible = True Reports!stdocname!直線106.Visible = True Reports!stdocname!直線107.Visible = True '*** 上消時の月消処理(00は処理しない) Format ("00") ii = Forms!メイン画面![テキストDELTUKI] If ii = "00" Then Else Reports!stdocname!("直線A" & "ii").Visible = True Reports!stdocname!("直線B" & "ii").Visible = True Reports!stdocname!("直線C" & "ii").Visible = True End If GoTo Insatumae '*** 印刷前処理 Insatumae:

  • '2465'指定した式で参照している'直線Aii'フィールドが見つかり

    '2465'指定した式で参照している'直線Aii'フィールドが見つかりません。 入力されたテキストDELTUKIをiiにセットして直線Aii~Ciiに反映させたいです。 DELTUKIには0~12までのどれかがセットされて、00の場合には未可視、それ以外は 該当月の直線Aii~Ciiを可視化させたいです。 ですが、上記エラーが発生します。 どなたかご指南頂きたくよろしくお願い致します。 ※.メイン画面の画像添付参照願います。 ※.vba vb6 winXP SetLowerLine: With objrep !直線103.Visible = True !直線104.Visible = True !直線105.Visible = True !直線106.Visible = True !直線107.Visible = True End With 'Reports(stdocname)!直線103.Visible = True 'Reports(stdocname)!直線104.Visible = True 'Reports(stdocname)!直線105.Visible = True 'Reports(stdocname)!直線106.Visible = True 'Reports(stdocname)!直線107.Visible = True Format ("00") ii = Forms!メイン画面![テキストDELTUKI] If ii = "00" Then Else objrep.Controls("直線A" & "ii").Visible = True objrep.Controls("直線B" & "ii").Visible = True objrep.Controls("直線C" & "ii").Visible = True End If

  • このVBAの構文は正しいのでしょうか?。

    このVBAの構文は正しいのでしょうか?。 以前ご教授頂いたものを修正してみたのですが。 どなたか分かる方ご教授願います。 Option Explicit Dim rpt As Report Dim stdocname As String Dim delt As String  :  :  : Private Sub 印刷_Click() On Error GoTo Err_印刷_Click Dim Repo As Report Dim m As String Dim i As Integer  :  :  : Set Repo = Reports(stdocname) m = Format(delt, "00") If delt = "0" Then Else For i = 1 To 12 Step 1 If delt = i Then Repo.Controls("直線A" & m).Visible = True Repo.Controls("直線B" & m).Visible = True Repo.Controls("直線C" & m).Visible = True End If Next End If

  • select case文について

    リストから選択とリストに無い値の入力のリストへの追加をしたく、あちこちの情報をつぎはぎで下記のようにVBAで動かそうとしましたが、うまく動いてくれません。 前(Case A)は動くのですが、あと(Case 2)が機能しません。 それと、3つ以上をSelectCaseで組む場合の方法も合わせてお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range Dim LastR As Long Select Case Target.Address(0, 0) Application.EnableEvents = False Case "D1" With Worksheets("Sheet2") LastR = .Range("A36636").End(xlUp).Row Set c = .Range("A1:A" & LastR).Find( _ Target.Value, , xlValues, xlWhole, xlByColumns, xlPrevious, True) If c Is Nothing Then If vbNo = MsgBox("リストに追加しますか?", _ vbYesNo, "追加の確認") Then Application.EnableEvents = True Exit Sub End If .Range("A" & LastR + 1).Value = Target.Value .Range("A1:A" & LastR + 1).Name = "リストA" End If With Target.Validation .Delete .Add Type:=xlValidateList, Formula1:="=リストA" .ShowError = False End With Case "E1" With Worksheets("Sheet2") Set c = .Range("B1:B" & LastR).Find( _ Target.Value, , xlValues, xlWhole, xlByColumns, xlPrevious, True) If c Is Nothing Then If vbNo = MsgBox("リストに追加しますか?", _ vbYesNo, "追加の確認") Then Application.EnableEvents = True Exit Sub End If .Range("B" & LastR + 1).Value = Target.Value .Range("B1:B" & LastR + 1).Name = "リストB" End If End Select End With With Target.Validation .Delete .Add Type:=xlValidateList, Formula1:="=リストB" .ShowError = False End With Application.EnableEvents = True End Sub

  • Select Case組み合わせ条件について

    例えば、「Aの値」&「Bの値」で処理をする場合には Select Case "A"&"B" Case "11" '(A=1&B=1の場合) で処理できると思うのですが、「B=1~5」として組み合わせることは可能でしょうか? 現在、下記のようにSelect文の中にSelectを組み合わせていますが、 どうにか上記のようにひとつのSelect文で処理できないかな~と思っています。 Select Case "A" Case 1 Select Case "B" Case 1 To 5 ご存知の方がいらっしゃいましたら、ぜひご回答の程お願いいたします。

  • 変数にフォームからの入力値は入るのですが。

    変数にフォームからの入力値は入るのですが。 VBA初心者です。下記コードを書きました。 フォームからの入力値をレポート印刷しようとしています。 MSGBOXで内容を参照したところ、変数の内容は入っています。 入っているのですが、レポート上、項目が#Errorになってしまいます。 どこが悪いのでしょうか?。 お分かりになる方でおみえならご教授下さい。 Option Explicit '共通変数の宣言 Dim stdocname As String Dim repo As Report Dim delt As String Dim kmsg As String        :        :        : Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim tuki As String Dim mais As Integer Dim denp As Integer Dim busu As Integer Dim joge As String Dim kmsg As String '*** 変数に入力値をセット mais = 0 delt = Forms!メイン画面![リストDELTUKI] joge = Forms!メイン画面![リストJYOGEDAN] tuki = Forms!メイン画面![リストTUKI] denp = Forms!メイン画面![テキストSBAN] busu = Forms!メイン画面![テキストEBAN] '*** 消し月と印刷月重複不可チェック If delt = tuki Then GoTo Err_印刷月_Click End If '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" Case "上段" & "2" stdocname = "レポート02上" Case "上段" & "3" stdocname = "レポート03上"        :        :        : Case "下段" & "10" stdocname = "レポート10下" Case "下段" & "11" stdocname = "レポート11下" Case "下段" & "12" stdocname = "レポート12下" Case Else stdocname = "レポート原稿" End Select kmsg = MsgBox(joge & tuki & stdocname)

  • 変数にフォームからの入力値が入らない。

    変数にフォームからの入力値が入らない。 VBA初心者です。下記コードを書きました。 フォームからの入力値をレポート印刷しようとしています。 MSGBOXで内容を参照したところ、JOGEしか入っていませんでした。 どこが悪いのでしょうか?。 お分かりになる方でおみえならご教授下さい。 Option Explicit '共通変数の宣言 Dim stdocname As String Dim repo As Report Dim delt As String Dim kmsg As String        :        :        : Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim tuki As String Dim mais As Integer Dim denp As Integer Dim busu As Integer Dim joge As String Dim kmsg As String '*** 変数に入力値をセット mais = 0 delt = Forms!メイン画面![リストDELTUKI] joge = Forms!メイン画面![リストJYOGEDAN] tuki = Forms!メイン画面![リストTUKI] denp = Forms!メイン画面![テキストSBAN] busu = Forms!メイン画面![テキストEBAN] '*** 消し月と印刷月重複不可チェック If delt = tuki Then GoTo Err_印刷月_Click End If '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" Case "上段" & "2" stdocname = "レポート02上" Case "上段" & "3" stdocname = "レポート03上"        :        :        : Case "下段" & "10" stdocname = "レポート10下" Case "下段" & "11" stdocname = "レポート11下" Case "下段" & "12" stdocname = "レポート12下" Case Else stdocname = "レポート原稿" End Select kmsg = MsgBox(joge, tuki, stdocname)

  • Accessでレポートの項目をVBAで変更したい

    Accessのレポートで年次集計を項目が可変になるため、VBAで書き換えるようにしたのですが、うまく出来ません。 お心当たりのかたいらっしゃいましたら教えて頂けないでしょうか。 フォームの概要(売上集計)     OO年 OO年 OO年 商品A 1,000 2,000 3,000  商品B 1,500 2,500 3,500 商品C 2,500 3,500 4,500 ※年は可変です 次のようにするとフォームが開いていないと言ったエラーが出ます。 stDocName = "年別売上集計レポート" Reports(stDocName).ラベル1.Caption = cstr(Year) + "年" DoCmd.OpenReport stDocName, acPreview, "", [フィルタ] 又次のようにするとエラーは出ませんが、ラベルは書き換わりません。 stDocName = "年別売上集計レポート" DoCmd.OpenReport stDocName, acHidden, "", [フィルタ] Reports(stDocName).ラベル1.Caption = cstr(Year) + "年" DoCmd.OpenReport stDocName, acPreview, "", [フィルタ]

  • VBA Select Caseについて

    エクセルVBAでLike演算子とSelectCase構文を組み合わせたいのですが、以下ではエラーになってしまいます。 どう修正すればいいのでしょうか? ABCを含む文字列、DEFを含む文字列、その他、についての処理の分岐方法です。 Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Value Case Like "*ABC*" `処理A Case Like "*DEF*" `処理B Case Else `処理C End Select End Sub

  • エクセルVBAでSelect...Caseの構文

    エクセルVBAで ■ Select...Caseの構文は、次(構文1)のようになっているとのことですが、 構文2のような、意味でネストして使う使い方は許されているのでしょうか。 (参考 QNo.1965604 の#7に,#8に関係したところをお聞きします。) (構文1) Select Case 変数  Case 値1    変数が値1の時の処理  Case 値2    変数が値2の時の処理  Case Else    他のCaseに合わない場合(その他)の処理 End Select (構文2) Select Case 変数a  Case 値1    変数aが値1の時の処理       Select Case 変数b            Case 値1            変数bが値1の時の処理            Case 値2            変数bが値2の時の処理       Case Else        変数bが、他のCaseに合わない場合(その他)の処理 End Select  Case 値2    変数aが値2の時の処理  Case Else    変数aが、他のCaseに合わない場合(その他)の処理 End Select

専門家に質問してみよう