• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:このVBAの構文は正しいのでしょうか?。)

VBAの構文は正しいのか?

このQ&Aのポイント
  • この質問は、VBAの構文が正しいかどうかを尋ねています。
  • 以前の教えを元に修正してみましたが、正しいかどうか分かりません。
  • 質問者は、分かる方に教えていただきたいと思っています。

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

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

>m = Format(delt, "00") deltが数値型ではないので厳密には間違い。但し、結果オーライ 正確には m = Format(Val(delt), "00")あるいは Right("0" & delt, 2)とすべき。 >For i = 1 To 12 Step 1 delt=iの時しか処理が無いし、ループ中にmは変化しないので、 11回の無駄な繰り返しが生じる。意味のないFor文 >If delt = i Then deltは文字型、iは数値型なので正しくない。但し、deltが 数字だけの場合に限り、数値比較が行われる。 正しくは If Val(delt) = i Then のように文字列を数値化 してから比較するべき。 尚、前にも述べましたが、近年の32ビットマシンでは数値は IntegerよりLongの方が勝ります。 メモリの節約にはなりませんし、演算も速くありません。 唯一、APIとのパラメータで構造体のメンバである場合は アドレスがずれるので、指定された型として使うことが あります。かなり、上級の話なので、知らなくても気にする ことはありません。

ttgk
質問者

お礼

ありがとうございます。 繰り返し処理で何を選択するのが良いのか迷っていました。

ttgk
質問者

補足

メインの処理部分です。 返信頂けましたら、続きをと思います。 Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim Repo As Report Dim m As String Dim i As Integer 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 tuki = Forms!メイン画面![リストTUKI] denp = Forms!メイン画面![テキストSBAN] busu = Forms!メイン画面![テキストEBAN] delt = Forms!メイン画面![リストDELTUKI] joge = Forms!メイン画面![リストJYOGEDAN] '*** 消し月と印刷月重複不可チェック 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 "上段" & "4" stdocname = "レポート04上" Case "上段" & "5" stdocname = "レポート05上" Case "上段" & "6" stdocname = "レポート06上" Case "上段" & "7" stdocname = "レポート07上" Case "上段" & "8" stdocname = "レポート08上" Case "上段" & "9" stdocname = "レポート09上" Case "上段" & "10" stdocname = "レポート10上" Case "上段" & "11" stdocname = "レポート11上" Case "上段" & "12" stdocname = "レポート12上" Case "下段" & "1" stdocname = "レポート01下" Case "下段" & "2" stdocname = "レポート02下" Case "下段" & "3" stdocname = "レポート03下" Case "下段" & "4" stdocname = "レポート04下" Case "下段" & "5" stdocname = "レポート05下" Case "下段" & "6" stdocname = "レポート06下" Case "下段" & "7" stdocname = "レポート07下" Case "下段" & "8" stdocname = "レポート08下" Case "下段" & "9" stdocname = "レポート09下" Case "下段" & "10" stdocname = "レポート10下" Case "下段" & "11" stdocname = "レポート11下" Case "下段" & "12"

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

その他の回答 (3)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

もう一つ、正しいか正しくないかは別として、 Option Explicit Dim rpt As Report Dim stdocname As String Dim delt As String のフォームの先頭に Dim rpt As Report とオブジェクト変数の宣言をしていますが、 この変数を使ったあとのオブジェクトの 開放はできていますか。あるいは 開放できなくともあるいはしなくとも 問題はないですか。

ttgk
質問者

お礼

ありがとうございます。 初心者で申し訳ありません。 多分?一回ごとに使用していますので、 した方が良いのかと思います。

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

それと、 >On Error GoTo Err_印刷_Click これをどこに飛ばすのか明確に されていないので、このプロシージャ の終わる前に Err_印刷_Click: MsgBox("エラーが出ました") End Sub としてエラーを知らせるか、あるいは マイクロソフト推奨のエラートラップ をするかです。 示されたコードは全部でないので何が どうなっているのわかりません。

ttgk
質問者

お礼

ありがとうございます。 一応、以下の様なエラー処理にしています。 Err_印刷月_Click: kmsg = MsgBox("消し月と印刷月を同じ月に指定出来ません", vbCritical, "警告メッセージ") Forms!メイン画面![リストDELTUKI] = "0" Forms!メイン画面![リストDELSEN] = "消無" Forms!メイン画面![リストJYOGEDAN] = "下段" Forms!メイン画面![リストTUKI] = "1" Forms!メイン画面![リストHINICHI] = "1" Forms!メイン画面![リストLOTMARK] = "A" Forms!メイン画面![リストKINMU] = "昼" Forms!メイン画面![リストTANTO] = "ハル" Forms!メイン画面![テキストSBAN] = denp Forms!メイン画面![テキストEBAN] = 1 Exit Sub Err_印刷_Click: MsgBox (Err.Number & " " & Err.Description) ' MsgBox Err.Description ' kmsg = MsgBox("印刷時にエラーが発生しました!", vbCritical, "警告メッセージ") ' Resume Exit_印刷_Click Exit_cancel: End Sub

すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

エラーが出たのかあるいは思ったように プログラムが動かないのかを示さないと 何を答えていいのかわかりませんが、 >If delt = "0" Then >Else ここの部分で、 >If delt = "0" Then Exit Sub >Else とすれば、プロシージャから抜ける ことが出来る、というくらいですが。 修正しなければdelt="0"であっても そのまま実行されるというくらいです。

ttgk
質問者

お礼

ご指摘ありがとうございます。

ttgk
質問者

補足

プログラムは一応一通り実行されますが、#errorがリポートに出てしまいます。 nda23さんにも教えて頂いた事です。 acViewPreviewで見ると、リポートは出力されるのですが、どうしても、明細 部分に#errorが出てしまっている状態です。 あとは、私が超初心者なのと、他の方が作られたプログラムと、非常に長い プログラムになってしまっている事です。

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

関連するQ&A