• 締切済み

エクセル VBA for文について

再び失礼します。 昨日VBAを始めた初心者です。 1、チェックボタン17個にそれぞれ変数を設定 2、2つだけチェックを入れると仮定して、実行ボタンを押したときに チェックが入っている2つの中で変数の大きいものをMax、小さいものをMinとしてシートに出力したいのですが、”ここ”と書いてあるところに Me("hensuu" & n). hensuu & n など入れてみたのですがエラーになります。 くだらないミスだと思いますがよくわかりません。 どなたかご教授お願いします。 Private Sub CommandButton2_Click() If Check1.Value = True Then hensuu1 = "9" End If If Check2.Value = True Then hensuu2 = "8" End If If Check3.Value = True Then hensuu3 = "7" End If If Check4.Value = True Then hensuu4 = "6" End If If Check5.Value = True Then hensuu5 = "5" End If If Check6.Value = True Then hensuu6 = "4" End If If Check7.Value = True Then hensuu7 = "3" End If If Check8.Value = True Then hensuu8 = "2" End If If Check9.Value = True Then hensuu9 = "1" End If If Check11.Value = True Then hensuu10 = "1/2" End If If Check11.Value = True Then hensuu11 = "1/3" End If If Check12.Value = True Then hensuu12 = "1/4" End If If Check13.Value = True Then hensuu13 = "1/5" End If If Check14.Value = True Then hensuu14 = "1/6" End If If Check15.Value = True Then hensuu15 = "1/7" End If If Check16.Value = True Then hensuu16 = "1/8" End If If Check14.Value = True Then hensuu17 = "1/9" End If Dim n As Long Dim Max As Long Dim Min As Long For n = 1 To 17 If Me("Check" & n).Value = True Then Max = ”ここ” If Me("Check" & n).Value = True Then Exit For Next n For n = Max To 17 If Me("Check" & n).Value = True Then Min = ”ここ” If Me("Check" & n).Value = True Then Exit For Next n Worksheets("Sheet1").Range("A1") = Min Worksheets("Sheet1").Range("B1") = Max MsgBox hensuu End Sub

みんなの回答

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

参考に Private Sub CommandButton2_Click()   Dim n As Long   Dim myMax As Variant   Dim myMin As Variant   For n = 1 To 17     If Me.Controls("CheckBox" & n) Then       If n < 10 Then         myMax = 10 - n       Else         myMax = "'1/" & n - 8       End If       Exit For     End If   Next   For n = 17 To 1 Step -1     If Me.Controls("CheckBox" & n) Then       If n < 10 Then         myMin = 10 - n       Else         myMin = "'1/" & n - 8       End If       Exit For     End If   Next   Worksheets("Sheet1").Range("A1").Value = myMin   Worksheets("Sheet1").Range("B1").Value = myMax End Sub セルにmyMin等を転記にあたり"1/2"などの分数を文字列として取り扱っていますが 数値として転記するのであればFormat関数などで工夫してください。

ya-ha-ya
質問者

お礼

とても参考になりました。 ご丁寧にありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

当面仕方ないが、こんな繰り返しが出てきたら、何か他の方法が無いか考えるのが勉強だ。 SHEET1にチェックボックス5つ貼り付け。 デザインモードを脱して 適当にチェックボックスにチェックを入れる。 下記を実行。 Sub test01() x = Array(0, 3, 4, 6, 9, 5) For i = 1 To 5 If Worksheets("Sheet1").OLEObjects("CheckBox" & i).Object.Value Then If x(i) > m Then m = x(i) End If Next i MsgBox "MAX= " & m End Sub チェックを入れたチェックボックスに対応した数で最大が出る。 質問者はフォーム上に、チェックボックスを貼り付けているのだろうが、あえてシート上にチェックボックスを設けてみた。 ーー 質問者の言っていることに近づけるには 5->15個にする x = Array(0, 3, 4, 6, 9, 5)を15個に拡張。対応した値の設定は 自由なので適当に。 MinはIf x(i) > m Then m = x(i)のところをIf x(i) < n Then n = x(i) ただしnは初期値として、この場合はありえない値をループに入る前にセット(例99999など) コマンドボタンのクリックイベントに上記コードを入れるようにする。 セルにMax,Min値をセット。 == こんな風に短くなるよ。チェックボックスの数が増えてもほとんど変わりなし。 もし受注した業務の中だと考えると、昔はプログラムコード行数で、受注業者はお金を取っていた。それを発注者側からすると、やり方によってこんなに値段が不当に高く不合理になることが起こるの悪い一例になる。 === コントロールの勉強をして、質問を連発する前に、VBAの勉強をするなら、シートのメニューにある操作を、マクロの記録を採ってどうなるか、何処をどう変えると、一般的になるのかを勉強する方が先だと思う。

ya-ha-ya
質問者

お礼

ありがとうございます。 ループ処理などをあまり理解してなく、勉強不足だということがよくわかりました。 なるべく行数が少ない綺麗なプログラムを完成させるよう頑張ります。 ありがとうございました。

noname#102340
noname#102340
回答No.1

Dim hensuu(17) As String hensuu(1) = "9" hensuu(2) = "8" のように配列変数を宣言して値を代入する。 > Max = ”ここ” Max = hensuu(n) Max,Minが整数型,hensuuが文字列型なので統一する。 このあとExit Forしてるので 次のMinを求めるには For n2 = n + 1 To 17 みたいにする。

ya-ha-ya
質問者

お礼

そのようにすればできるのですね! どうもありがとうございます。 とても参考になりました。

関連するQ&A