この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
>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とのパラメータで構造体のメンバである場合は
アドレスがずれるので、指定された型として使うことが
あります。かなり、上級の話なので、知らなくても気にする
ことはありません。
質問者
お礼
ありがとうございます。
繰り返し処理で何を選択するのが良いのか迷っていました。
質問者
補足
メインの処理部分です。
返信頂けましたら、続きをと思います。
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"
もう一つ、正しいか正しくないかは別として、
Option Explicit
Dim rpt As Report
Dim stdocname As String
Dim delt As String
のフォームの先頭に
Dim rpt As Report
とオブジェクト変数の宣言をしていますが、
この変数を使ったあとのオブジェクトの
開放はできていますか。あるいは
開放できなくともあるいはしなくとも
問題はないですか。
エラーが出たのかあるいは思ったように
プログラムが動かないのかを示さないと
何を答えていいのかわかりませんが、
>If delt = "0" Then
>Else
ここの部分で、
>If delt = "0" Then
Exit Sub
>Else
とすれば、プロシージャから抜ける
ことが出来る、というくらいですが。
修正しなければdelt="0"であっても
そのまま実行されるというくらいです。
お礼
ありがとうございます。 繰り返し処理で何を選択するのが良いのか迷っていました。
補足
メインの処理部分です。 返信頂けましたら、続きをと思います。 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"