質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

2797閲覧

【ExcelVBA】【VBA高速化】For~Each文でのRange操作

Tera-Tomi

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/08/19 05:56

For~Each文でのRange操作で、以下のマクロを高速化したいです。(現状、かなり遅い)

マクロの概要

  • 条件付き書式でグレーアウトされているセルをロック
  • 数式が入力されているセルをロック

vb

1 Dim rng As Range 2 With wsBSinput 3 eRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 4 .Range(.Cells(pcDataRow, 9), .Cells(eRow, 52)).Locked = False 5 6 For Each rng In .Range(.Cells(pcDataRow, 9), .Cells(eRow, 52)) 7 ' グレーアウトされているセルはロック 8 If rng.MergeArea.DisplayFormat.Interior.ColorIndex = 15 Then 9 rng.MergeArea.Locked = True 10 ' 自動計算セルはロック 11 ElseIf rng.MergeArea(1, 1).HasFormula = True Then 12 rng.MergeArea.Locked = True 13 End If 14 Next rng 15 End With

なお、このプロシージャを呼ぶ前に、以下のことはすでにしています。

  • イベントの抑制
  • 画面描画の停止
  • 自動計算を手動

何かわかる方いたらご教授いただければ幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

数式の部分はFor Eachの外でもいけるかと思いました。

VBA

1.Range(.Cells(pcDataRow, 9), .Cells(eRow, 52)).SpecialCells(xlCellTypeFormulas, 23).Locked = True

投稿2020/08/19 06:55

radames1000

総合スコア1923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tera-Tomi

2020/08/19 13:30

最初、SpecialCellsで数式部分をロックする方法もやったのですが、改善されず。 しかし、このようにFor Eachの外でもできるのですね。勉強になりました。ありがとうございます。
guest

0

ベストアンサー

これでどうでしょうか。

VBA

1Dim rng As Range 2Dim sel As Range 3With wsBSinput 4 eRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 5 .Range(.Cells(pcDataRow, 9), .Cells(eRow, 52)).Locked = False 6 7 Set sel = Range("A1") ' A1をダミーで登録 8 For Each rng In .Range(.Cells(pcDataRow, 9), .Cells(eRow, 52)) 9 ' グレーアウトされているセルはロック 10 If rng.MergeArea.DisplayFormat.Interior.ColorIndex = 15 Then 11 Set sel = Union(sel, rng.MergeArea) 12 ' 自動計算セルはロック 13 ElseIf rng.MergeArea(1, 1).HasFormula = True Then 14 Set sel = Union(sel, rng.MergeArea) 15 End If 16 Next rng 17 sel.Locked = True ' 一括ロック 18 Range("A1").Locked = False ' A1のロックを解除 19End With 20

投稿2020/08/19 06:30

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tera-Tomi

2020/08/19 13:27

このようにすれば一括でロックできるのですね。勉強になりました。 実際に、こちらのマクロで動かしてみたところ、劇的に早くなりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問