Excel VBA質問箱 IV

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

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


6913 / 13644 ツリー ←次へ | 前へ→

【42337】プロシージャの大きすぎて処理出来ない タツミ 06/9/7(木) 0:59 質問[未読]
【42338】Re:プロシージャの大きすぎて処理出来ない ichinose 06/9/7(木) 8:16 発言[未読]
【42340】Re:プロシージャの大きすぎて処理出来ない タツミ 06/9/7(木) 9:30 お礼[未読]
【42355】Re:プロシージャの大きすぎて処理出来ない タツミ 06/9/7(木) 20:46 発言[未読]
【42356】Re:プロシージャの大きすぎて処理出来ない ichinose 06/9/7(木) 22:29 発言[未読]
【42368】Re:プロシージャの大きすぎて処理出来ない タツミ 06/9/8(金) 10:44 お礼[未読]
【42344】Re:プロシージャの大きすぎて処理出来ない m2m10 06/9/7(木) 10:11 発言[未読]

【42337】プロシージャの大きすぎて処理出来ない
質問  タツミ  - 06/9/7(木) 0:59 -

引用なし
パスワード
   いつも拝見させて貰い参考にしています。

ユーザーに投入位置を特定させた後,その位置に基づいてフォームから
シートへデータを投入する為の記述をしました。
        ↓
Private Sub CommandButton1_Click()
If UserForm5.TextBox29.Value = "1" Then
If UserForm5.OptionButton1.Value = True Then
Cells(9, 6) = TextBox2.Value
Cells(9, 7) = TextBox7.Value
Cells(9, 3) = ComboBox1.Value
Cells(9, 4) = ComboBox2.Value
Cells(9, 5) = ComboBox3.Value
Cells(9, 10) = TextBox28.Value
Cells(9, 18) = ComboBox4.Value
Cells(9, 19) = ComboBox5.Value
Cells(9, 36) = ComboBox6.Value
Cells(9, 37) = ComboBox7.Value
Cells(9, 20) = ComboBox8.Value
Cells(9, 9) = ComboBox9.Value
Cells(9, 12) = ComboBox10.Value
Cells(9, 14) = ComboBox11.Value
Cells(9, 13) = ComboBox12.Value
Cells(9, 15) = TextBox26.Value
Cells(9, 16) = TextBox25.Value
Cells(9, 17) = TextBox24.Value
Cells(9, 22) = TextBox15.Value
Cells(9, 23) = TextBox14.Value
Cells(9, 24) = TextBox13.Value
Cells(9, 25) = TextBox16.Value
Cells(9, 27) = TextBox17.Value
Cells(9, 28) = TextBox18.Value
Cells(9, 29) = TextBox19.Value
Cells(9, 32) = TextBox20.Value
Cells(9, 33) = TextBox22.Value
Cells(9, 34) = TextBox21.Value
Cells(9, 35) = TextBox23.Value
End If
End If
If UserForm5.TextBox29.Value = "1" Then
If UserForm5.OptionButton2.Value = True Then
Cells(10, 6) = TextBox2.Value
Cells(10, 7) = TextBox7.Value
Cells(10, 3) = ComboBox1.Value
Cells(10, 4) = ComboBox2.Value
Cells(10, 5) = ComboBox3.Value
Cells(10, 10) = TextBox28.Value
Cells(10, 18) = ComboBox4.Value
Cells(10, 19) = ComboBox5.Value
Cells(10, 36) = ComboBox6.Value
Cells(10, 37) = ComboBox7.Value
Cells(10, 20) = ComboBox8.Value
Cells(10, 9) = ComboBox9.Value
Cells(10, 12) = ComboBox10.Value
Cells(10, 14) = ComboBox11.Value
Cells(10, 13) = ComboBox12.Value
Cells(10, 15) = TextBox26.Value
Cells(10, 16) = TextBox25.Value
Cells(10, 17) = TextBox24.Value
Cells(10, 22) = TextBox15.Value
Cells(10, 23) = TextBox14.Value
Cells(10, 24) = TextBox13.Value
Cells(10, 25) = TextBox16.Value
Cells(10, 27) = TextBox17.Value
Cells(10, 28) = TextBox18.Value
Cells(10, 29) = TextBox19.Value
Cells(10, 32) = TextBox20.Value
Cells(10, 33) = TextBox22.Value
Cells(10, 34) = TextBox21.Value
Cells(10, 35) = TextBox23.Value
End If
End If
If UserForm5.TextBox29.Value = "1" Then
If UserForm5.OptionButton3.Value = True Then
.................
............................
この後,延々と続く(34×5行=170行=170セット)のですが
これではプロシージャが大きすぎて処理出来ません。
(ヘルプでは64KBまでの処理と制限)

プロシージャを分割する良い方法はないものでしょうか?
ちなみに,34×5行とは,項目番号1に対して5行分のデータを投入す
るフォーマットになっているからです.....

【42338】Re:プロシージャの大きすぎて処理出来ない
発言  ichinose  - 06/9/7(木) 8:16 -

引用なし
パスワード
   ▼タツミ さん:
おはようございます。

>ユーザーに投入位置を特定させた後,その位置に基づいてフォームから
>シートへデータを投入する為の記述をしました。
>>この後,延々と続く(34×5行=170行=170セット)のですが
>これではプロシージャが大きすぎて処理出来ません。
これは、OptionButton1〜OptionButton5まであるということですか?

コードをコンパクトにするためには、
ループ(繰り返し処理)をさせることです。

ループ処理行うためには、共通処理と非共通処理を見極めて
規則性を見出さなければなりません。

提示されたコードではまだすべての規則性が把握できませんので、
提示されたコードだけ見ての判断です。

'===============================
Private Sub CommandButton1_Click()
  Dim o_rw As Variant
  o_rw = Array(9, 10, 11, 12, 13)
  Dim idx As Long
  For idx = 1 To 5
    If Controls("OptionButton" & idx).Value = True Then
     Exit For
     End If
    Next idx
  
  If TextBox29.Value = "1" And idx < 6 Then
    Call set_form_data(o_rw(idx - 1))
    End If

End Sub
'============================================================
Sub set_form_data(rw As Variant)
  Cells(rw, 6) = TextBox2.Value
  Cells(rw, 7) = TextBox7.Value
  Cells(rw, 3) = ComboBox1.Value
  Cells(rw, 4) = ComboBox2.Value
  Cells(rw, 5) = ComboBox3.Value
  Cells(rw, 10) = TextBox28.Value
  Cells(rw, 18) = ComboBox4.Value
  Cells(rw, 19) = ComboBox5.Value
  Cells(rw, 36) = ComboBox6.Value
  Cells(rw, 37) = ComboBox7.Value
  Cells(rw, 20) = ComboBox8.Value
  Cells(rw, 9) = ComboBox9.Value
  Cells(rw, 12) = ComboBox10.Value
  Cells(rw, 14) = ComboBox11.Value
  Cells(rw, 13) = ComboBox12.Value
  Cells(rw, 15) = TextBox26.Value
  Cells(rw, 16) = TextBox25.Value
  Cells(rw, 17) = TextBox24.Value
  Cells(rw, 22) = TextBox15.Value
  Cells(rw, 23) = TextBox14.Value
  Cells(rw, 24) = TextBox13.Value
  Cells(rw, 25) = TextBox16.Value
  Cells(rw, 27) = TextBox17.Value
  Cells(rw, 28) = TextBox18.Value
  Cells(rw, 29) = TextBox19.Value
  Cells(rw, 32) = TextBox20.Value
  Cells(rw, 33) = TextBox22.Value
  Cells(rw, 34) = TextBox21.Value
  Cells(rw, 35) = TextBox23.Value
End Sub

提示されたコードを見た限りでは、
セルにデータをセットするコードはデータを書き出すセルの行の情報を変数化
すれば、実際に書き出すコード

(Cells(rw, 6) = TextBox2.Value・・・
 Cells(rw, 35) = TextBox23.Value)

は一度だけの記述で済みます。


規則性をもっと検討すれば、他にも簡素化できる箇所はあるかもしれませんよ!!

【42340】Re:プロシージャの大きすぎて処理出来ない
お礼  タツミ  - 06/9/7(木) 9:30 -

引用なし
パスワード
   ▼ichinose さん:
ありがとうございます。
ご提示頂いた例を参考に検討してみます。

また宜しくお願い致します。

【42344】Re:プロシージャの大きすぎて処理出来ない
発言  m2m10  - 06/9/7(木) 10:11 -

引用なし
パスワード
   こんちは

Cells(rw, 6) = TextBox2.Value
>     ^^  ^^^^^^^^ 
 
TextBox2 の名前を TextBox6 
のように合わせたら変数でループが可能です。  
 

【42355】Re:プロシージャの大きすぎて処理出来ない
発言  タツミ  - 06/9/7(木) 20:46 -

引用なし
パスワード
   ▼ichinose さん:

先ほどはありがとうございます。
ichinoseさんより教えて頂いたコードを元にあれこれ悪戦苦闘しています。
           ↓
>ユーザーに投入位置を特定させた後,その位置に基づいてフォームから
>シートへデータを投入する為の記述をしました。
>この後,延々と続く(34×5行=170行=170セット)のですが
>これではプロシージャが大きすぎて処理出来ません。
           ↓
>これは、OptionButton1〜OptionButton5まであるということですか?
           ↓
私目の表現方法が悪かったですね。OptionButtonは1〜5までありますが
そのほかにTextBox(29)があり、そのTextBoxの値との組み合わせによりセル
位置を特定しています。

TextBox29.Value="1"に対して1〜5(行は、9,10,11,12,13を指定)
TextBox29.Value="2"に対して1〜5(行は、14,15,16,17,18を指定)
TextBox29.Value="3"に対して1〜5(行は、19,20,21,22,23を指定)
       ・
       ・
       ・
つまり、こんな感じの表構成になっています。

      A   B   C   D   E  
8   |  |    |   |   |   |
    ----------------------------------------------
9   |  |    |   |   |   | →A系列データ
     |  |--------------------------------------
10   |  |    |   |   |   | →B系列データ
     |  |--------------------------------------
11   | 1 |    |   |   |   | →C系列データ
    |  |--------------------------------------
12   |  |    |   |   |   |
    |  |--------------------------------------
13   |  |    |   |   |   |
    ----------------------------------------------
14   |  |    |   |   |   |
     |  |--------------------------------------
15   |  |    |   |   |   |
     |  |--------------------------------------
16   | 2 |    |   |   |   |
    |  |--------------------------------------
17   |  |    |   |   |   |
    |  |--------------------------------------
18   |  |    |   |   |   |
    ----------------------------------------------
19   |  |    |   |   |   |

TextBoxで列Aの5行単位(1〜34)のセルを、
OptionButton1でその5行単位内の順番を、
それぞれ特定するようにしています。

ご提示頂いたコードは下記のような意味かと考えますが、
    ↓
Dim o_rw As Variant       →変数の配列(名称)を宣言し、
o_rw = Array(9, 10, 11, 12, 13) →内容を列挙(リスト)
Dim idx As Long         →?
For idx = 1 To 5         →インデックスの有効範囲?

If Controls("OptionButton" & idx).Value = True Then
Exit For
                →OptionButtonとインデックス値を取得後


Next idx

If TextBox29.Value = "1" And idx < 6 Then
Call set_form_data(o_rw(idx - 1))
→TextBox29の値が1であればset_form_dataを呼び出し実行する。

私のレベルではこの程度の解釈しか出来ず....

どうでしょう....

【42356】Re:プロシージャの大きすぎて処理出来ない
発言  ichinose  - 06/9/7(木) 22:29 -

引用なし
パスワード
   ▼タツミ さん:
こんばんは。

>
>先ほどはありがとうございます。
>ichinoseさんより教えて頂いたコードを元にあれこれ悪戦苦闘しています。
>           ↓
>>ユーザーに投入位置を特定させた後,その位置に基づいてフォームから
>>シートへデータを投入する為の記述をしました。
>>この後,延々と続く(34×5行=170行=170セット)のですが
>>これではプロシージャが大きすぎて処理出来ません。
>           ↓
>>これは、OptionButton1〜OptionButton5まであるということですか?
>           ↓
>私目の表現方法が悪かったですね。OptionButtonは1〜5までありますが
>そのほかにTextBox(29)があり、そのTextBoxの値との組み合わせによりセル
>位置を特定しています。
>
>TextBox29.Value="1"に対して1〜5(行は、9,10,11,12,13を指定)
>TextBox29.Value="2"に対して1〜5(行は、14,15,16,17,18を指定)
>TextBox29.Value="3"に対して1〜5(行は、19,20,21,22,23を指定)
>       ・
>       ・
>       ・
これの最後の値が
  Textbox29.Value="34"

ということですか?
 
>TextBoxで列Aの5行単位(1〜34)のセルを、
>OptionButton1でその5行単位内の順番を、
>それぞれ特定するようにしています。
↑これの意味は私には理解できませんが、


>
>ご提示頂いたコードは下記のような意味かと考えますが、
>    ↓
>Dim o_rw As Variant       →変数の配列(名称)を宣言し、
>o_rw = Array(9, 10, 11, 12, 13) →内容を列挙(リスト)
>Dim idx As Long         →?
>For idx = 1 To 5         →インデックスの有効範囲?
>
>If Controls("OptionButton" & idx).Value = True Then
>Exit For
'                選択されたOptionButtonの番号を取得
>
>
>Next idx
>
>If TextBox29.Value = "1" And idx < 6 Then
>Call set_form_data(o_rw(idx - 1))
>→TextBox29の値が1であればset_form_dataを呼び出し実行する。
>
>私のレベルではこの程度の解釈しか出来ず....
>
>どうでしょう....

概ね良いかと思います。

が、Textbox29の値と選択されたオプションボタンによって
書き込む行が取得できるようにするには

'=======================================
Private Sub CommandButton1_Click()
  Dim idx As Long
  Dim t_val As Variant
  t_val = Val(TextBox29.Value)
  If Int(t_val) = t_val And t_val >= 1 And t_val <= 34 Then
'        Textbox29の値が1〜34だったら?
    For idx = 1 To 5
     If Controls("OptionButton" & idx).Value = True Then
       Exit For
       End If
     Next idx
 
    If idx < 6 Then
     Call set_form_data(t_val * 5 + idx + 3)
'                ↑この計算式で書き込む行を算出
     End If
    End If
End Sub
'============================================================
Sub set_form_data(rw As Variant)
  Cells(rw, 6) = TextBox2.Value
  Cells(rw, 7) = TextBox7.Value
  Cells(rw, 3) = ComboBox1.Value
  Cells(rw, 4) = ComboBox2.Value
  Cells(rw, 5) = ComboBox3.Value
  Cells(rw, 10) = TextBox28.Value
  Cells(rw, 18) = ComboBox4.Value
  Cells(rw, 19) = ComboBox5.Value
  Cells(rw, 36) = ComboBox6.Value
  Cells(rw, 37) = ComboBox7.Value
  Cells(rw, 20) = ComboBox8.Value
  Cells(rw, 9) = ComboBox9.Value
  Cells(rw, 12) = ComboBox10.Value
  Cells(rw, 14) = ComboBox11.Value
  Cells(rw, 13) = ComboBox12.Value
  Cells(rw, 15) = TextBox26.Value
  Cells(rw, 16) = TextBox25.Value
  Cells(rw, 17) = TextBox24.Value
  Cells(rw, 22) = TextBox15.Value
  Cells(rw, 23) = TextBox14.Value
  Cells(rw, 24) = TextBox13.Value
  Cells(rw, 25) = TextBox16.Value
  Cells(rw, 27) = TextBox17.Value
  Cells(rw, 28) = TextBox18.Value
  Cells(rw, 29) = TextBox19.Value
  Cells(rw, 32) = TextBox20.Value
  Cells(rw, 33) = TextBox22.Value
  Cells(rw, 34) = TextBox21.Value
  Cells(rw, 35) = TextBox23.Value
End Sub


検討してみてください。

【42368】Re:プロシージャの大きすぎて処理出来ない
お礼  タツミ  - 06/9/8(金) 10:44 -

引用なし
パスワード
   ▼ichinose さん:

大変ありがとうございました。
希望通りの事が出来るようになりました。

今回,変数を利用したループ形式は初めてだったのですが
大変参考になりました。

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