アプリ版:「スタンプのみでお礼する」機能のリリースについて

質問失礼します。

エクセル2003でラベル(コントロールツール)を作成し、
ラベルの表示/非表示を別に作成したボタンを押すたびに
切り替えるマクロを作成しています。

一応、自分で作成したものは動作するのですが、余りにも処理が遅いです。
(ボタンを押下後、処理が完了するまでに8秒前後かかります。)

『この場合はこうした方がいい』や『こうすれば早くなる』、または『それが限界』などの
ご意見があれば、ご返答お願い致します。

※ラベルは1グループ18個のa・b・cの3グループで合計54個あります。
※ラベルのオブジェクト名はa1・a2・a3・・・という規則性でつけています。

<作成例>
Private Sub button1_Click()
Dim test As Boolean

If a1.Visible Then
test = False
Else
test = True
End If

With ActiveSheet
For i = 1 To 18 Step 1
.OLEObjects("a" & i).Visible = test
.OLEObjects("b" & i).Visible = test
.OLEObjects("c" & i).Visible = test
Next i
End With
End Sub

A 回答 (1件)

> ボタンを押下後、処理が完了するまでに8秒前後かかります。



確かにそれは遅すぎですね。下記ソースを試して下さい。

Sub Sample()
  MsgBox ActiveSheet.DrawingObjects.Count
End Sub

経験上、表示が遅くなる原因は、データ(計算式含む)が
多すぎる、オブジェクトが多すぎるケースが多いと感じます。

編集(例えばコピー&ペースト、行削除)を繰り返すうちに、
幅や高さが 0 となって存在するものの、見た目で見えなく
なったオブジェクトはありませんか?

上記ソースはアクティブシート内に配置されたオブジェクトの
総数を表示します。この数に異常がないか確認して下さい。
もしあれば、不要オブジェクトを削除します。

余談・・・

> If a1.Visible Then
> test = False
> Else
> test = True
> End If

これは、このように 1 行で書けますね。

test = Not a1.Visible

> With ActiveSheet
> For i = 1 To 18 Step 1
> .OLEObjects("a" & i).Visible = test
> .OLEObjects("b" & i).Visible = test
> .OLEObjects("c" & i).Visible = test
> Next i
> End With

この対象となるラベルコントロールを全てグループ化し、
そのグループ名が Group 1 だとすれば、

ActiveSheet.Shapes("Group 1").Visible = test

で一括切り替えできるかもしれません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
不要なオブジェクトがありましたので削除したところ微妙に早くなりました^^;

また、無駄なコードのご指摘ありがとうございました。

お礼日時:2009/10/27 17:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!