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

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

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

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

Q&A

解決済

2回答

2375閲覧

VBA オブジェクトとfor each~next

退会済みユーザー

退会済みユーザー

総合スコア0

VBA

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

0グッド

0クリップ

投稿2017/01/10 10:02

お疲れ様です。

データーを高速に処理するプログラムに改良するため、
セルをループで人る一つ見るのではなく、オブジェクト変数を使った方が高速に処理できるとのことで、オブジェクト変数を勉強しております。

そこで、簡単に以下の処理を書いてみましたが、正しいでしょうか?
処理内容としては、A1~E20のセルにランダムにデーターが入っっており、
空白セルを見つけたら、"-"を入れるという処理です。

一応、意図した通りの動作はしておりますが、果たして正しいのかどうなのか
判断がつかず、自身がもてません。

vba

1Sub test1() 2 3 Dim Area As Range 'A1~E20の範囲を格納 4 Dim null_Cell As Range 5 6 Set Area = Range("A1", "E20") 7 8 For Each null_Cell In Area 9 If null_Cell = "" Then 10 null_Cell = "-" 11 End If 12 Next 13End Sub

どなたかアドバイス、改善点等ご教授下さい。

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

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

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

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

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

guest

回答2

0

オブジェクト
最初は中々イメージできないですよね(´∀`)


オブジェクト。この中にはプロパティ、メソッドと呼ばれるものが格納されています。
プロパティとは**"値"です。
メソッドとは
"処理"**です。

何言っちゃってんのって感じだと思うので下記の画像をご覧下さい。
解説用Excel
A1セルにVBAという文字が格納されています。

さて、この文字のフォントサイズはいくつでしょうか?
はい、11ですよね。なぜ分かったのか?11という**"値"を見たからですよね?
これが
"プロパティ"**というものです。

次に、このA1セルをコピーするにはどうすればいいでしょうか?
はい、A1セルで右クリックしてコピーを選択するという**"処理"をすればいいですね。
これが
"メソッド"**というものです。

A1セルにはこの他にも、フォントの色というプロパティや、文字を中央に揃えるというメソッドなど
様々なプロパティ、メソッドが存在します。
これらをひとまとめにしたものを**"オブジェクト"**と呼びます。

オブジェクトという概念をプログラミング言語に落とし込む場合、下記のように記述します。

VBA

1Range("A1") 'Rangeオブジェクト 2Range("A1").Font.Size 'Rangeオブジェクトのフォントサイズ(プロパティ) 3Range("A1").Copy 'Rangeオブジェクトをコピーする(メソッド)

以上のことを踏まえ、改善点を1つ。
セルの値はValueというプロパティで確認することができます。
なので、null_CellオブジェクトのValueプロパティが""であるかチェックするように修正しましょう。

VBA

1If null_Cell.Value = "" Then 2 null_Cell.Value = "-" 3End If

※Rangeオブジェクトのプロパティを省略した場合、VBAが自動的にValueと判断してくれるようです。
しかし、オブジェクトの理解のためにも省略はあまりよろしくないです。

長々と的外れな回答をしてしまった気がしますが、参考になりましたら幸いです。

投稿2017/01/10 14:07

編集2017/01/10 14:19
N-u-u

総合スコア113

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

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

退会済みユーザー

退会済みユーザー

2017/01/13 22:42

とても参考になりました。
guest

0

ベストアンサー

Nuuさんの回答のように細かい指摘はあるかもしれませんが、概ね問題ないと思います。

オブジェクトで処理した方が速いのか、という個人的な疑問が生じたので計測してみました。
計測に使ったコードは下記です。

オブジェクト版

VBA

1Sub test1() 2 3 Dim t As Single 4 t = Timer 5 6 Dim Area As Range 'A1~E20の範囲を格納 7 Dim null_Cell As Range 8 9 Set Area = Range("A1", "ALL1000") 10 11 For Each null_Cell In Area 12 If null_Cell = "" Then 13 null_Cell = "-" 14 End If 15 Next 16 17 Debug.Print "処理時間は " & Round(Timer - t, 2) & " 秒です。" 18 19End Sub

セル直接参照版

VBA

1Sub test2() 2 3 Dim t As Single 4 t = Timer 5 6 Dim r As Long 7 Dim c As Long 8 9 For r = 1 To 1000 10 For c = 1 To 1000 11 If Cells(r, c) = "" Then 12 Cells(r, c) = "-" 13 End If 14 Next 15 Next 16 17 Debug.Print "処理時間は " & Round(Timer - t, 2) & " 秒です。" 18 19End Sub

質問のコードにあるセルの範囲程度では差が出なかったので、1000x1000に拡大しております。
結果、
オブジェクト版:処理時間は 14.91 秒です。
セル直接参照版:処理時間は 16.57 秒です。
ということになり、1.5秒ほどの高速化が確認できました。

何が言いたかったかというと、実際に速くなったのかを確認するために、まずは計測。
そして高速化のために可読性が犠牲になっていないか。
今回の質問のコードであれば処理範囲をオブジェクトとしているのでわかりやすいですが、なんでもかんでもオブジェクトで処理してしまうと処理がわかりづらくなってしまうかもしれませんので注意が必要です。
今回のテストコードのように1000x1000と比較的大きな範囲で処理して差が出てくるので、小規模な範囲であれば、高速化よりも可読性を重視した方が良いと思います。

投稿2017/01/11 00:26

ttyp03

総合スコア16996

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問