• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:vbaレポート名の指定が間違っている!。)

VBAレポート名指定の間違いと処理エラーについて

このQ&Aのポイント
  • VBAのレポート名の指定が間違っている場合に、エラーメッセージが表示される問題が発生しています。
  • 具体的には、下消や上消の処理に進む際にエラーが発生しています。
  • Reports!stdocname!直線103.Visible = Trueの書き方が誤っている可能性があります。解決方法を教えていただけますか?

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

No.1です。 まず、前回の訂正から(汗) 前回回答の末尾で > Reports(stdocname).Controls("直線A" & "ii").Visible = True としましたが、「Set objRep = ~」の実行後はここでもobjRepを使用して   objRep.Controls("直線A" & ii).Visible = True というようにします。 (前回のように「Reports(~)」を使用してもエラーにはなりませんが) なお、前回気づいていなかったのですが、「Controls(~)」の中の「ii」は 変数なので、そちらは「"」(ダブルクォート)で括らず、上記のように 「Controls("直線A" & ii)」としてください。 (こちらはそうしないとエラー('2465')になります) > '2451'から明細#errorとなります。 こちらで確認したところ、「Set objRep = Reports(stdocname)」の実行時に stdocnameで指定したレポートが開いていないと、このエラー('2451')となる ようです。 > '*** stdocname(判定で指定されたレポート)を仮に開く > DoCmd.OpenReport stdocname, acViewPreview > Set objrep = Reports(stdocname) ・・・レポートを開いた直後、ですか・・・(汗) これだと、「stdocname」に実在しないレポート名を指定していたら、レポートを 開こうとした時点でエラーが発生するはずなのですが・・・(汗) 念のための確認になりますが、「On Error GoTo Err_印刷_Click」で飛ばす エラー処理の中で、「実行時エラー'2497'」(レポート名に空文字を指定した 場合などに発生するエラー)に対する処理を組んでいないでしょうか。 もしそうでしたら、  a)エラー処理内で「2497」エラーと同様の処理を「2451」に対しても実行する、  b)「Select Case」の最後に「Case Else」(その前のCaseに該当しない場合)   の処理として「Exit Sub」を追加する、 といった対処をすることになるかと思います。 上記の予想(=stdocnameに正しいレポート名が指定されていない場合にエラー 処理を組んだ上で「Resume Next」で処理を継続している)が外れていた場合は、 ちょっと原因の推測ができません(汗) (・・・或いは、レポート側の「開く時」(Openイベント)で、閉じるかキャンセルが  入っている・・・ということはないですよね?(汗))

ttgk
質問者

お礼

ありがとうございます。 まで修正してみてご返答致します。

ttgk
質問者

補足

(1)."ii"の件。 Reports(stdocname).Controls("直線A" & "ii").Visible = True ↓ objrep.Controls("直線A" & ii).Visible = True に修正しました。 以下、実行後、プレビュー(#Errorのまま)はされますが、 '2465'指定した式で参照されている'直線A0'フィールドが見つかりません。となります。 (2).・・・レポートを開いた直後、ですか・・・(汗) これだと、「stdocname」に実在しないレポート名を指定していたら、レポートを 開こうとした時点でエラーが発生するはずなのですが・・・(汗)の件。 '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" : : : Case "下段" & "12" stdocname = "レポート12下" Case Else stdocname = "レポート原稿" End Select '*** stdocname(判定で指定されたレポート)を仮に開く DoCmd.OpenReport stdocname, acViewPreview Set objrep = Reports(stdocname) 上記の様に'case else'で対処しております。 (3).上記の予想(=stdocnameに正しいレポート名が指定されていない場合にエラー 処理を組んだ上で「Resume Next」で処理を継続している)が外れていた場合は、 ちょっと原因の推測ができません(汗)の件。 '*** 上消時の月消処理(00は処理しない) Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim stdocname As String Dim objrep As Report Dim delt As String Dim ii As String Dim tuki As String Dim mais As Integer Dim denp As Integer Dim busu As Integer Dim joge As String Dim kmsg As String : : : '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" : : : 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 GoTo Insatumae '*** 印刷前処理 Insatumae: '*** stdocname(判定で指定されたレポート)を最大プレビューで開く DoCmd.OpenReport stdocname, acViewPreview DoCmd.Maximize : : : '*** エラーを無視して出口へ Err_印刷_Click: MsgBox (Err.Number & " " & Err.Description) MsgBox Err.Description kmsg = MsgBox("印刷時にエラーが発生しました!", vbCritical, "警告メッセージ") Resume Exit_印刷_Click resumeで対応しております。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

> この文のReports!stdocname!直線103.Visible = True書き方がおかしいようです。 「stdocname」はString型の変数だと思いますので、最も単純には上記の式は Reports(stdocname)!直線103.Visible = True になります。 ただ、ご質問のコードでは、これに該当するものがかなりの数ありますので、 オブジェクト型の変数の宣言を追加したり、Withを使用した方がよいかと 思います。 【現状(一部のみ抜粋)】 '*** 下消処理 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 【上記を正しい構文に書換】 '*** 下消処理 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 【オブジェクト型の変数を使用した書換】 '以下は「Dim stdocname As String」を宣言しているのと同じ辺りに追加 '(レポートオブジェクト型の変数の宣言) Dim objRep As Report '以下は「stdocname」にレポート名を代入した後に追加 Set objRep = Reports(stdocname) '*** 下消処理 SetLowerLine: objRep!直線103.Visible = True objRep!直線104.Visible = True objRep!直線105.Visible = True objRep!直線106.Visible = True objRep!直線107.Visible = True '以下はこのコードを記述しているSubの終わる直前に追加(メモリの解放) Set objRep = Nothing 【さらにWithを使用した書換】 '*** 下消処理(上の「【オブジェクト型の変数を使用】」 の下消処理を差替) '(上記の「Dim objRep As Report」等の行はこちらでも必要。あくまで「下消 ' 処理」のみを差替になります) SetLowerLine: '※「With ○○ ~ End With」の間に書かれたコードでは、「!」や「.」で始まる   ものは、「○○!~」「○○.~」と指定されたのと同じ動作になります。 With objRep   !直線103.Visible = True   !直線104.Visible = True   !直線105.Visible = True   !直線106.Visible = True   !直線107.Visible = True End With ・・・以上です。 なお「上消時の月消処理」のところで > Reports!stdocname!("直線A" & "ii").Visible = True という記述がありますが、これも以下のような修正が必要です: 【正】 Reports(stdocname).Controls("直線A" & "ii").Visible = True

ttgk
質問者

お礼

ありがとうございます。 以下修正してみます。

ttgk
質問者

補足

'2451'から明細#errorとなります。 ご指摘頂いた箇所を修正してみたところ、上記のようになりました。 Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim stdocname As String Dim objrep As Report : : : '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" Case "上段" & "2" stdocname = "レポート02上" : : : End Select '*** stdocname(判定で指定されたレポート)を仮に開く DoCmd.OpenReport stdocname, acViewPreview Set objrep = Reports(stdocname) '*** 消線の種類で印刷処理選択/消無は通常印刷 ---> 消線と月消を判定 If Forms!メイン画面![リストDELSEN] = "下消" Then GoTo SetLowerLine End If If Forms!メイン画面![リストDELSEN] = "上消" Then GoTo SetUpperLine End If GoTo Insatumae '*** 下消処理 SetLowerLine: With objrep !直線103.Visible = True !直線104.Visible = True !直線105.Visible = True !直線106.Visible = True !直線107.Visible = True End With '*** 下消時の月消処理(00は処理しない) Format ("00") ii = Forms!メイン画面![テキストDELTUKI] If ii = "00" Then Else Reports(stdocname).Controls("直線A" & "ii").Visible = True Reports(stdocname).Controls("直線B" & "ii").Visible = True Reports(stdocname).Controls("直線C" & "ii").Visible = True End If GoTo Insatumae : : : '*** 上消時の月消処理(00は処理しない) Format ("00") ii = Forms!メイン画面![テキストDELTUKI] If ii = "00" Then Else Reports(stdocname).Controls("直線A" & "ii").Visible = True Reports(stdocname).Controls("直線B" & "ii").Visible = True Reports(stdocname).Controls("直線C" & "ii").Visible = True End If GoTo Insatumae '*** 印刷前処理 Insatumae: '*** stdocname(判定で指定されたレポート)を最大プレビューで開く DoCmd.OpenReport stdocname, acViewPreview DoCmd.Maximize

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • '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

  • 下記コードはどう動くと思われますか。

    下記コードはどう動くと思われますか。 WinXP VBA(VB6.0)です。 下記のコードを実行した時、どう動くと思われますか?。 ご教授下さい。 よろしくお願い致します。 ii = Format(Forms!メイン画面![テキストZZZ], "00") 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

  • 「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

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

    変数にフォームからの入力値は入るのですが。 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)

  • エクセルVBAでShapesまたはDrawingObjects

    シート上のフォームなどを表示/非表示するためtest04を書きましたが、「実行時エラー438 オブジェクトはこのプロパティまたはメッソッドをサポートしていません」となります。 しかし、Test05のように同じことをForNextで回せばうまくいきます。 また、Test06のようにShapesをDrawingObjectsに書き換えただけでもうまくいきます。 では、Test04がエラーになるのはなぜでしょうか? Sub test04() With ActiveSheet.Shapes If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub Sub test05() For Each sp In ActiveSheet.Shapes If sp.Visible = False Then sp.Visible = True Else sp.Visible = False End If Next End Sub Sub test06() With ActiveSheet.DrawingObjects If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub

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

    「変数にフォームからの入力値は入るのですが2。」 VBA初心者です。 以前のご回答ありがとうございます。 (1).画面を開き、条件を設定する。     →初期値設定ぐらいしかやっていません。 (2).レポートをデザインビューにし、レコードソースの所でクエリビルダを起動。 (3).クエリビルダでデータシートビューを開く     →クエリビルダまで行けるのですが、データシートビューを開くがありません。 (4).データシートビューに#Errorの欄があるようなら、クエリの     該当部分がオカシイので、クエリのSQLを提示してください。      (クエリビルダで、SQLビューを開くと表示される)     データシートビューが正常に表示されている場合は問題の     テキストボックスのコントロールソースを提示してください。     →データベースのクエリを見てもクエリは無いようです。      データシートビューは(レポート?)#Errorで表示されています。 ※.他の方が作られたものを修正している為、いまいち把握できていません。 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 '*** 上段・下段使用と対象月から使用レポートを判定 Dim 月 As Long 月 = Val(tuki) If (joge = "上段" Or joge = "下段") & (月 >= 1 & 月 <= 12) Then stdocname = "レポート" & Format(月, "00") & Left(joge, 1) Else stdocname = "レポート原稿" End If kmsg = MsgBox(joge & tuki & stdocname) '*** stdocname(判定で指定されたレポート)を仮に開く DoCmd.OpenReport stdocname, acViewPreview '*** レポートのセット Set repo = Reports(stdocname) 上記、「型が一致しません」となってしまいました。 お分かりになる方でおみえならご教授下さい。

  • Excel VBAにて2つの処理を同時実行可能?

    是非お力をお貸し下さい。 よろしくお願いします。 Windows XP Excel2003 (VB6.0) メイン処理が非常に時間がかかるため、フォームを表示させ 文字(Label)を点滅させて「動いている(ハングアップしていない)」ことを 使用者に伝えようとしています。 --- Form1内のコード(メイン) --- Sub Main() Form2.Show vbModeless [ ~メイン処理~ ] End Sub --- Form2内のコード --- Sub UserForm_Initialize() Call Blink End Sub --- 標準モジュール内のコード --- Sub Blink() If Form2.Label1.Visible = True Then Form2.Label1.Visible = False Else Form2.Label1.Visible = True End If Form2.Repaint DoEvents Application.OnTime Now + TimeValue("00:00:01"), "Blink" End Sub これを実行すると、メイン処理が終了した後にForm2内の文字が 点滅します。 実現したいのは「使用者が動いていることを(ハングアップしていない ことを)確認出来る」という点です。 どうぞ よろしくお願いします。

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

    VBAの正しい構文なのでしょうか?。 以下の構文は正しいのでしょうか?。 Option Explicit Dim stdocname As String Dim repo As Report      :      :      : Private Sub 印刷_Click() On Error GoTo Err_印刷_Click      : Set repo = Reports(stdocname)