Excel VBA質問箱 IV

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

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


40489 / 76732 ←次へ | 前へ→

【41341】Re:動作速度について
回答  Hirofumi  - 06/8/6(日) 23:02 -

引用なし
パスワード
   まず、元々のコードの何処が悪いのかを説明して置きます
これは、関連の無いループ(「For co1 = 1 To 40」、「For i = 1 To 400」)をネストした事によります
此れを分けるだけで、440回の代入だけに成りますので、相当速く成ります


Public Sub Sample3()

  Dim i As Long
  Dim co1 As Long
  Dim co As Long
  Dim cou As Long
  
  Worksheets(Mys).Select
  
  For i = 1 To 400
    Select Case i
      Case 1 To 10: co = 3: cou = 17
      Case 11 To 20: co = 4: cou = 7
      Case 21 To 30: co = 5: cou = -3
      Case 31 To 40: co = 6: cou = -13
      Case 41 To 50: co = 7: cou = -23
      Case 51 To 60: co = 8: cou = -33
      Case 61 To 70: co = 9: cou = -43
      Case 71 To 80: co = 10: cou = -53
      Case 81 To 90: co = 11: cou = -63
      Case 91 To 100: co = 12: cou = -73
      Case 101 To 110: co = 13: cou = -83
      Case 111 To 120: co = 14: cou = -93
      Case 121 To 130: co = 15: cou = -103
      Case 131 To 140: co = 16: cou = -113
      Case 141 To 150: co = 17: cou = -123
      Case 151 To 160: co = 18: cou = -133
      Case 161 To 170: co = 19: cou = -143
      Case 171 To 180: co = 20: cou = -153
      Case 181 To 190: co = 21: cou = -163
      Case 191 To 200: co = 22: cou = -173
      Case 201 To 210: co = 23: cou = -183
      Case 211 To 220: co = 24: cou = -193
      Case 221 To 230: co = 25: cou = -203
      Case 231 To 240: co = 26: cou = -213
      Case 241 To 250: co = 27: cou = -223
      Case 251 To 260: co = 28: cou = -233
      Case 261 To 270: co = 29: cou = -243
      Case 271 To 280: co = 30: cou = -253
      Case 281 To 290: co = 31: cou = -263
      Case 291 To 300: co = 32: cou = -273
      Case 301 To 310: co = 33: cou = -283
      Case 311 To 320: co = 34: cou = -293
      Case 321 To 330: co = 35: cou = -303
      Case 331 To 340: co = 36: cou = -313
      Case 341 To 350: co = 37: cou = -323
      Case 351 To 360: co = 38: cou = -333
      Case 361 To 370: co = 39: cou = -343
      Case 371 To 380: co = 40: cou = -353
      Case 381 To 390: co = 41: cou = -363
      Case 391 To 400: co = 42: cou = -373
    End Select
    If Me.Controls("combobox2").Value = "4月" Then
      If Me.Controls("CheckBox" & i).Value Then
        Cells(co, i + cou).Value = "○"
      Else
        Cells(co, i + cou).Value = "×"
      End If
    ElseIf Me.Controls("combobox2").Value = "5月" Then
      If Me.Controls("CheckBox" & i).Value Then
        Cells(co, i + cou + 12).Value = "○"
      Else
        Cells(co, i + cou + 12).Value = "×"
      End If
    ElseIf Me.Controls("combobox2").Value = "6月" Then
      If Me.Controls("CheckBox" & i).Value Then
        Cells(co, i + cou + 24).Value = "○"
      Else
        Cells(co, i + cou + 24).Value = "×"
      End If
    End If
  Next i
    
  For co1 = 1 To 40
    If Me.Controls("combobox2").Value = "4月" Then
      Cells(co1 + 2, 17) = Me.Controls("label" & co1).Caption
    ElseIf Me.Controls("combobox2").Value = "5月" Then
      Cells(co1 + 2, 29) = Me.Controls("label" & co1).Caption
    ElseIf Me.Controls("combobox2").Value = "6月" Then
      Cells(co1 + 2, 41) = Me.Controls("label" & co1).Caption
    End If
  Next co1

End Sub

次に、「Select Case i」の部分が煩雑ので此れを整理します
其処で、1〜400まで1列に並んだ「CheckBox」を如何やって方形に並び替えるかを考えます
昔から、商を求める演算子「¥」と剰余を求める演算子「Mod」を使って、
1元の配列を2元に並べる定石の様な物が存在します
今回の場合、1〜400の番号を、10日毎のグループ分けを行う訳なのですが?
話を簡単にする為、0〜399の番号として考えます

iの値が0〜399まで変かする時
i = 0の時、0 \ 10 = 0、0 Mod 10 =0
i = 1の時、1 \ 10 = 0、1 Mod 10 =1
i = 2の時、2 \ 10 = 0、2 Mod 10 =2
  ・
  ・
i = 398の時、398 \ 10 = 39、398 Mod 10 =8
i = 399の時、399 \ 10 = 39、398 Mod 10 =9

と成り、「¥」はグループ番号(この場合「行」)、
「Mod」はグループ内の順位(この場合、「列」)を表します
また、Cellに対して1つづつ代入を行うと非常に遅く成るので、
配列を使って範囲に値を一遍に代入します

Public Sub Sample()

  Dim i As Long
  Dim lngRow As Long
  Dim lngColumn As Long
  Dim vntResult1(1 To 40, 1 To 10) As Variant
  Dim vntResult2(1 To 40, 1 To 1) As Variant
  
  'CheckBoxの1〜400まで繰り返し
  For i = 1 To 400
    '配列の行位置を取得
    lngRow = (i - 1) \ 10 + 1
    '配列の列位置を取得
    lngColumn = (i - 1) Mod 10 + 1
    'CheckBoxのi番がTrueの場合
    If Me.Controls("CheckBox" & i).Value Then
      '配列のlngRow行、lngColumn列に"○"を代入
      vntResult1(lngRow, lngColumn) = "○"
    Else
      vntResult1(lngRow, lngColumn) = "×"
    End If
  Next i
  
  For i = 1 To 40
    'Labelのi番の値を配列のi行目に代入
    vntResult2(i, 1) _
        = Me.Controls("Label" & i).Caption
  Next i
  
  With Worksheets(Mys)
    'ComboBox2の値が
    Select Case Me.Controls("combobox2").Value
      Case "4月"
        '基準位置からの列Offsetを0とする
        lngColumn = 0
      Case "5月"
        lngColumn = 12
      Case "6月"
        lngColumn = 24
    End Select
    '基準位置から、lngColumn分右のセル位置を先頭として40×10の範囲に結果配列の値を代入
    .Cells(3, 18 + lngColumn) _
        .Resize(UBound(vntResult1, 1), _
            UBound(vntResult1, 2)).Value = vntResult1
    '基準位置から、lngColumn分右のセル位置を先頭として40×1の範囲に結果配列の値を代入
    .Cells(3, 17 + lngColumn) _
        .Resize(UBound(vntResult2, 1)).Value = vntResult2
  End With
  
End Sub
1 hits

【41276】動作速度について てっちゃん 06/8/3(木) 16:42 質問
【41279】Re:動作速度について neptune 06/8/3(木) 17:09 発言
【41280】Re:動作速度について Jaka 06/8/3(木) 17:15 発言
【41281】Re:動作速度について てっちゃん 06/8/3(木) 17:30 お礼
【41283】Re:動作速度について neptune 06/8/3(木) 19:17 発言
【41286】Re:動作速度について Hirofumi 06/8/3(木) 20:17 回答
【41288】Re:動作速度について Hirofumi 06/8/3(木) 21:15 回答
【41319】Re:動作速度について Hirofumi 06/8/4(金) 19:24 回答
【41328】Re:動作速度について てっちゃん 06/8/6(日) 8:57 発言
【41341】Re:動作速度について Hirofumi 06/8/6(日) 23:02 回答
【41377】Re:動作速度について てっちゃん 06/8/8(火) 7:59 お礼
【41298】Re:動作速度について Jaka 06/8/4(金) 9:15 発言
【41327】Re:動作速度について てっちゃん 06/8/6(日) 8:52 お礼

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