Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


503 / 13645 ツリー ←次へ | 前へ→

【80018】オプションボタンのコードの簡略化をしたいです。 703 18/6/29(金) 0:43 質問[未読]
【80019】Re:オプションボタンのコードの簡略化をし... よろずや 18/6/29(金) 6:39 回答[未読]
【80021】Re:オプションボタンのコードの簡略化をし... 703 18/6/29(金) 9:01 質問[未読]
【80020】Re:オプションボタンのコードの簡略化をし... γ 18/6/29(金) 7:17 回答[未読]
【80022】Re:オプションボタンのコードの簡略化をし... 703 18/6/29(金) 9:07 質問[未読]
【80023】Re:オプションボタンのコードの簡略化をし... γ 18/6/29(金) 18:45 発言[未読]
【80027】Re:オプションボタンのコードの簡略化をし... 703 18/7/1(日) 11:25 お礼[未読]
【80024】Re:オプションボタンのコードの簡略化をし... hatena 18/6/30(土) 1:45 回答[未読]
【80025】Re:オプションボタンのコードの簡略化をし... hatena 18/6/30(土) 2:53 回答[未読]
【80026】Re:オプションボタンのコードの簡略化をし... 703 18/7/1(日) 11:23 お礼[未読]

【80018】オプションボタンのコードの簡略化をした...
質問  703  - 18/6/29(金) 0:43 -

引用なし
パスワード
   お世話になります。
マクロを勉強中の初心者です。
アンケートの集計フォームをつくっています。
アンケートの設問がQ1~Q17まであり、各設問に答えがA1~A10またはA1~A20ほどあります。

240個のオプションボタンがあり、チェックがついたら、そのオプションボタンに対応したセルの値を、別のシートのセルに投入していく(積上げていく)作業を繰り返し行いたいです。

色々なサイトを参考にし以下のようにコードを書いてみたのですが、プロシージャが大きすぎるエラーがでます。
どうすればシンプルなコードになるでしょうか。for next構文など、調べているのですが、なかなかうまくいかず、シンプルにしたコードを教えて頂きたいです。

以下 コードです。
Private Sub CommandButton1_Click()

Dim a As Integer
a = Worksheets("シートA").Range("投入範囲").Rows.Count
Worksheets("シートA").Range("投入範囲").Rows(a).Insert Shift:=xlDown
Worksheets("シートA").Range("投入範囲").Cells(a, 1).Value = TextBox1

If Frame1.OptionButton1.Value = True Then
Worksheets("シートA").Range("投入範囲").Cells(a, 2).Value = Worksheets("アンケート項目").Cells(3, 2)
ElseIf Frame1.OptionButton2.Value = True Then
Worksheets("シートA").Range("投入範囲").Cells(a, 2).Value = Worksheets("アンケート項目").Cells(4, 2)

…これが続いて

ElseIf Frame1.OptionButton10.Value = True Then
Worksheets("シートA").Range("投入範囲").Cells(a, 2).Value = Worksheets("アンケート項目").Cells(12, 2)

Else
End If

…設問がQ1からQ2に変わります

If Frame2.OptionButton11.Value = True Then
Worksheets("シートA").Range("投入範囲").Cells(a, 3).Value = Worksheets("アンケート項目").Cells(3, 3)
ElseIf Frame2.OptionButton12.Value = True Then
Worksheets("シートA").Range("投入範囲").Cells(a, 3).Value = Worksheets("アンケート項目").Cells(4, 3)

…と続き

ElseIf Frame17.OptionButton240.Value = True Then
Worksheets("シートA").Range("投入範囲").Cells(a, 18).Value = Worksheets("アンケート項目").Cells(22, 18)

End Sub
までで終わります。

どうすればシンプルにコード数を減らせるでしょうか。
ご教示頂ければ幸いです。

【80019】Re:オプションボタンのコードの簡略化を...
回答  よろずや  - 18/6/29(金) 6:39 -

引用なし
パスワード
   ▼703 さん:
>色々なサイトを参考にし以下のようにコードを書いてみたのですが、
>プロシージャが大きすぎるエラーがでます。

240個のオプションボタンの規則性が判らないので、とりあえずプロシージャの分割のみの提案です。

>Private Sub CommandButton1_Click()
>
>Dim a As Integer
>a = Worksheets("シートA").Range("投入範囲").Rows.Count
>Worksheets("シートA").Range("投入範囲").Rows(a).Insert Shift:=xlDown
>Worksheets("シートA").Range("投入範囲").Cells(a, 1).Value = TextBox1
Call Q1_Proc
Call Q2_Proc
:
Call Q17_Proc
End Sub

Private Sub Q1_Proc()
>If Frame1.OptionButton1.Value = True Then
>Worksheets("シートA").Range("投入範囲").Cells(a, 2).Value = Worksheets("アンケート項目").Cells(3, 2)
>ElseIf Frame1.OptionButton2.Value = True Then
>Worksheets("シートA").Range("投入範囲").Cells(a, 2).Value = Worksheets("アンケート項目").Cells(4, 2)
>
>…これが続いて
>
>ElseIf Frame1.OptionButton10.Value = True Then
>Worksheets("シートA").Range("投入範囲").Cells(a, 2).Value = Worksheets("アンケート項目").Cells(12, 2)
>
>Else
>End If
End Sub

Private Sub Q2_Proc()
>If Frame2.OptionButton11.Value = True Then
>Worksheets("シートA").Range("投入範囲").Cells(a, 3).Value = Worksheets("アンケート項目").Cells(3, 3)
>ElseIf Frame2.OptionButton12.Value = True Then
>Worksheets("シートA").Range("投入範囲").Cells(a, 3).Value = Worksheets("アンケート項目").Cells(4, 3)
>
>…と続き
>
>ElseIf Frame17.OptionButton240.Value = True Then
>Worksheets("シートA").Range("投入範囲").Cells(a, 18).Value = Worksheets("アンケート項目").Cells(22, 18)
>
>End Sub

【80020】Re:オプションボタンのコードの簡略化を...
回答  γ  - 18/6/29(金) 7:17 -

引用なし
パスワード
   シートモジュールに書いてください。
テストを十分していないので、そちらで検証してください。

Sub test()
  Dim ws As Worksheet
  Dim rng As Range
  Dim j  As Long
  Dim jj As Long
  Dim k  As Long
  Dim ruiseki As Long
  Dim p  As Long
  Dim ary As Variant
  
  Set rng = Worksheets("シートA").Range("投入範囲")
  Set ws = Worksheets("アンケート項目")
  
  'オプションの数
  ary = Array(10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20)
  
  For k = 1 To 17
    For j = 1 To ary(k - 1)
      jj = ruiseki + j
      If Me.OLEObjects("OptionButton" & jj).Object.Value = True Then
        rng.Cells(a, k + 1).Value = ws.Cells(j + 2, k + 1)
        ' Exit For
      End If
    Next
    ruiseki = ruiseki + ary(k - 1)
  Next
End Sub

【80021】Re:オプションボタンのコードの簡略化を...
質問  703  - 18/6/29(金) 9:01 -

引用なし
パスワード
   よろずや さん
ご回答ありがとうございます。


提案頂いた通りに分割してみたところ、実行はできるのですが
ボタンクリック時に、毎回1番上の行のセルに入力されてしまいます。
投入範囲はボタンクリック毎に1つ下の行にずれているのですが、
どうすればよいでしょうか…


>240個のオプションボタンの規則性が判らないので、とりあえずプロシージャの分割のみの提案です。

質問が分かりづらくてすいません。
Q1-Q10は A1-A10まで、
Q11-Q17は A1-A20まで回答項目があります。

Q1だと フレーム1つの中にオプションボタンを10個配置しているイメージです。

【80022】Re:オプションボタンのコードの簡略化を...
質問  703  - 18/6/29(金) 9:07 -

引用なし
パスワード
   γ さん ご回答ありがとうございます。

今までシートモジュールに書いたことがなく
重ねての質問になってしまい申し訳ないのですが、

vbaの画面で投入シートを右クリックし、コードの表示を押し

そこに
Private Sub CommandButton2_Click()

Dim a As Integer
a = Worksheets("シートA").Range("投入範囲").Rows.Count
Worksheets("シートA").Range("投入範囲").Rows(a).Insert Shift:=xlDown
Worksheets("シートA").Range("投入範囲").Cells(a, 1).Value = TextBox1

Sub test()
  Dim ws As Worksheet
  Dim rng As Range
  Dim j  As Long
  Dim jj As Long
  Dim k  As Long
  Dim ruiseki As Long
  Dim p  As Long
  Dim ary As Variant
  
  Set rng = Worksheets("シートA").Range("投入範囲")
  Set ws = Worksheets("アンケート項目")
  
  'オプションの数
  ary = Array(10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 20, 20, 20, 20, 20, 20, 20)
  
  For k = 1 To 17
    For j = 1 To ary(k - 1)
      jj = ruiseki + j
      If Me.OLEObjects("OptionButton" & jj).Object.Value = True Then
        rng.Cells(a, k + 1).Value = ws.Cells(j + 2, k + 1)
        ' Exit For
      End If
    Next
    ruiseki = ruiseki + ary(k - 1)
  Next
End Sub

を入力する形でよいのでしょうか。

【80023】Re:オプションボタンのコードの簡略化を...
発言  γ  - 18/6/29(金) 18:45 -

引用なし
パスワード
   いいんじゃないですか?
動きませんか?

【80024】Re:オプションボタンのコードの簡略化を...
回答  hatena  - 18/6/30(土) 1:45 -

引用なし
パスワード
   ▼703 さん:
>アンケートの集計フォームをつくっています。
>アンケートの設問がQ1~Q17まであり、各設問に答えがA1~A10またはA1~A20ほどあります。

>240個のオプションボタンがあり、チェックがついたら、そのオプションボタンに対応したセルの値を、別のシートのセルに投入していく(積上げていく)作業を繰り返し行いたいです。

オプションボタンといってもいろいろあります。
下記のどれでしょうか。

1.ワークシート上に、フォームコントロールのグループボックスとオプションボタンを配置した。

2.ワークシート上に Active X のオプションボタンを配置した。

3.ユーザーフォーム上に、フレームを配置して、その上にオプションボタンを配置した。

提示のコードから推測すると 3.だと思いますが、どうですか。

【80025】Re:オプションボタンのコードの簡略化を...
回答  hatena  - 18/6/30(土) 2:53 -

引用なし
パスワード
   3.の場合だとすると、下記のコードでどうしょう。

Private Sub CommandButton1_Click()
  Dim i As Long, j As Long
  Dim rngOutput As Range, wsInput As Worksheet
  Dim a As Long

  Set wsInput = Worksheets("アンケート項目")
  Set rngOutput = Worksheets("シートA").Range("投入範囲")
  a = rngOutput.Rows.Count
  rngOutput.Rows(a).Insert Shift:=xlDown
  rngOutput.Cells(a, 1).Value = Me.TextBox1
  
  For i = 1 To 17
    With Me.Controls("Frame" & i)
    For j = 0 To .Controls.Count - 1
      If .Controls(j).Value Then
        rngOutput.Cells(a, i + 1).Value = wsInout.Cells(j + 3, i + 2)
      End If
    Next
    End With
  Next
End Sub

【80026】Re:オプションボタンのコードの簡略化を...
お礼  703  - 18/7/1(日) 11:23 -

引用なし
パスワード
   ご回答ありがとうございます。
仰る通り3の場合です。分かりづらい質問ですいませんでした。
頂いたコードを元に再度見直してみたところ
無事エラーなく動きました。
大変ありがとうございました。

【80027】Re:オプションボタンのコードの簡略化を...
お礼  703  - 18/7/1(日) 11:25 -

引用なし
パスワード
   ご回答ありがとうございました。
シートの方に書くことは初めてだったため、大変勉強になりました。
頂いたコードを元に改めて考えて、エラーなく動かすことができました。
大変ありがとうございました。

503 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free