Excel VBA質問箱 IV

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

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


2404 / 13646 ツリー ←次へ | 前へ→

【68244】マクロの高速化 VBA勉強中 11/2/17(木) 11:19 質問[未読]
【68246】Re:マクロの高速化 SK63 11/2/17(木) 12:49 発言[未読]

【68244】マクロの高速化
質問  VBA勉強中  - 11/2/17(木) 11:19 -

引用なし
パスワード
   ▼概要
INDIRECT関数を使い、1〜5回の結果から一番右端の結果を取得します。
右端が"A"や"B"といった特定の値だった場合、その左隣のセルの値を取得します。
(以降、"A"や"B"といった特定の値は1つずつ左のセルの値を取得する)

▼その他、補足
・列範囲[K:O]に1〜5回の結果
・J列に1〜5回の結果の最新の結果(空欄除く)

作成し、動作も問題ありませんでしたが、
2000行といったデータ範囲になるとかなりの時間がかかります。
以下のコード部分を改善し、マクロを高速化することは可能でしょうか?
※画面更新(ScreenUpdating)をオフにしてもあまり時間は短縮できませんでした。

-------------------------------------------------------------------
Worksheets("追加シート").Range("J32").Select                       
Selection.FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC15),COLUMN(RC11:RC15)))))"         
   If Range("O32") = "A" Or Range("O32") = "B" Or Range("O32") = "" Then     
    Selection.FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC14),COLUMN(RC11:RC14)))))"       
    If Range("N32") = "A" Or Range("N32") = "Aき" Or Range("N32") = "" Then    
      Selection.FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC13),COLUMN(RC11:RC13)))))"     
      If Range("M32") = "A" Or Range("M32") = "A" Or Range("M32") = "" Then  
       Selection.FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC12),COLUMN(RC11:RC12)))))"    
       If Range("L32") = "A" Or Range("L32") = "A" Or Range("L32") = "" Then 
         Selection.FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC11),COLUMN(RC11:RC11)))))"  
       End If
      End If
    End If
   End If

【68246】Re:マクロの高速化
発言  SK63  - 11/2/17(木) 12:49 -

引用なし
パスワード
   ▼VBA勉強中 さん:
>
>作成し、動作も問題ありませんでしたが、
>2000行といったデータ範囲になるとかなりの時間がかかります。
>以下のコード部分を改善し、マクロを高速化することは可能でしょうか?
>※画面更新(ScreenUpdating)をオフにしてもあまり時間は短縮できませんでした。

Range("J32").Selectよりは、
Range("J32").FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC15),COLUMN(RC11:RC15)))))"


If Range("L32") = "A" Or Range("L32") = "A" Or Range("L32") = "" Then 
は、重複している????

イベントとシート再計算をFALSEにする。

比較対象がL~O32なので、一括で配列に入れて判定する。
Dim B as variamt
B = Cells(32, 12).Resize(1, 4).Value

この当たりでしょうか??
>
>-------------------------------------------------------------------
>Worksheets("追加シート").                       
>Selection.FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC15),COLUMN(RC11:RC15)))))"         
>   If Range("O32") = "A" Or Range("O32") = "B" Or Range("O32") = "" Then     
>    Selection.FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC14),COLUMN(RC11:RC14)))))"       
>    If Range("N32") = "A" Or Range("N32") = "Aき" Or Range("N32") = "" Then    
>      Selection.FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC13),COLUMN(RC11:RC13)))))"     
>      If Range("M32") = "A" Or Range("M32") = "A" Or Range("M32") = "" Then  
>       Selection.FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC12),COLUMN(RC11:RC12)))))"    
>       If Range("L32") = "A" Or Range("L32") = "A" Or Range("L32") = "" Then 
>         Selection.FormulaArray ="=INDIRECT(ADDRESS(ROW(),MAX(IF(LEN(RC11:RC11),COLUMN(RC11:RC11)))))"  
>       End If
>      End If
>    End If
>   End If

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