http://oshiete.goo.ne.jp/qa/1341789.html
ここに同じような質問があるのですが
ワークシート関数をVBAで使いたい場合
Application.WorksheetFunction.xxxxx
WorksheetFunction.xxxxx
Application.xxxxx
の三つの方法があります、
これらはどのような違いがあるか教えてください。
上記のページによれば
97以上の書法
Application.WorksheetFunction.xxxxx
WorksheetFunction.xxxxx
古いVersionの書法
Application.xxxxx
らしいですが、
実際に計算速度を自作プログラムを使って比較したところ
Application.WorksheetFunction.Round
WorksheetFunction.Round
の速度がが同じで
Application.Round
がこれらと比べて3倍強遅い
という結果が得られました。
なぜApplication.xxxxxの方が遅いのでしょうか?
Application.xxxxx
を使うメリットはないでしょうか?
それでも他人が書かれたVBAコードを見ると
たまにApplication.xxxxxを見かけることがありますがなぜでしょうか?
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
#2の回答者です。
単に古い書き方だけではありませんね。
この実際その違いを知って使っているわけですから、それを闇雲に、古いという理由だけで、
没にしてしまうという理屈は成り立ちません。実際のエラーの違いを認識すべきでしょうね。
#2の Sub TestMacro()が、なぜ、正しい結果を出さないか分かるなら、この問題は解決しているはずです。
エラーが出ないものならともかく、ワークシート関数の多くは、いろんな理由でエラーを返します。
それを単なるOn Error Resume Nextだけでは、失敗します。
WorksheetFunction で完全移行しているなら、誰もApplication.XXXX(関数) などはしません。実際のVBAをやっていない人には、分からない話だと思います。
No.3
- 回答日時:
Application.WorksheetFunction.xxxxx
WorksheetFunction.xxxxx
のどちらも完全に同じ内容。
コーディングの手間を考えれば
WorksheetFunction.xxxxx
でよいと思う。
本来のオブジェクト ツリーでいえば xxxxx の位置は Application の下の WorksheetFunction の下にあるため、Application.WorksheetFunction.xxxxx の書き方となる。
しかし Application の部分はデフォルトで VBA によって読み込まれているため省略が可能である。
Dim mySheet As Excel.Worksheet
Set mySheet = Application.ThisWorkbook.Worksheets(1)
と書かず
Dim mySheet As Worksheet
Set mySheet = ThisWorkbook.Worksheets(1)
と書くのと同じ。
質問者自ら調査もし、
Application.xxxxx
という書き方が 「古い」 との情報を得ているはず。
しかも 「Excel 97 よりも前の書き方」 という事も十分に推測できているはず。
さらに実効速度も 3倍遅いという情報まで仕入れてある。
上記のことから、そもそも候補に入れるものではないことは考えられませんかね。
> それでも他人が書かれたVBAコードを見ると
> たまにApplication.xxxxxを見かけることがありますがなぜでしょうか?
未だに、そしてこれからも Application.xxxxx と書かれたコードが生産され続けているのであれば、その作者が勉強した当時の古い情報のまま進化していないってだけ。
過去に作って掲載したコードであれば、掲載し続けているコードが時代とともに自動的に最新の状態になるはずない。単なる 「当時書かれたコード」 ってだけ。
No.2
- 回答日時:
こんにちは。
リンク先にか書かれていた通りだと思いますが、あまり、細かい仕様末節についての疑問は、自分のプログラミングの方向性を変えてしまいかねませんから、ほどほどにしておいたほうが良いかもしれませんね。
ret = Application.xxxxx
とした時に、エラー値として返るので、IsError で、それを捉えることができるのが、最大のメリットです。
実行時エラーにはなりません。
buf1 = Application.Match(buf, ar(), 0)
If IsError(bufar1) Then '←エラー処理として、これだけで済みます。
ar(n) = buf1
n = n + 1
End If
掲示板以外の実際の現場では、WorksheetFunction を省略しないほうがよいと言われますが、エラー処理を含めたコードは、必然的に長くなります。以前は、古い書き方をすると、いつ、変更になるか分からないから、と言われましたが、あれから15年近くなりますがの一向に変わりませんね。
On Error トラップを設けるというのは、それ自体は当然ですが、エラー処理として、goto ErrorHandler などとすれば、コードが上下しますので、読みにくさもあります。基本的に、エラートラップは、絞り込めたほうがよいと思うのです。
VBAユーザーでOn Error トラップを本当に理解して使っている人がどのぐらいいるのか、疑問に思えることがあります。安易に、On Error Resume Next を使ってしまうのです。
セルのA1:A10 まで、このような、文字と数字の混在のデータがあるとします。
a
1
b
2
c
3
d
4
e
5
'//
Sub TestMacro()
Dim mTotal As Long
Dim i As Long, j As Long
i = 1
On Error Resume Next
Do
j = WorksheetFunction.Match(i, Range("A1:A10"), 0)
If j > 0 Then
mTotal = mTotal + Cells(j, 1).Value
End If
i = i + 1
Loop While i <= 10
On Error GoTo 0
Debug.Print mTotal
End Sub
'//
このマクロの答えは、いくつでしょうか?
「40」
このぐらいのミスは、ひと目で見つけてほしいものですが、掲示板で書いている人の中には、さっぱり分っていない人もいるのです。
>Application.WorksheetFunction.xxxxx
>WorksheetFunction.xxxxx
これは、基本的に同じだと思います。
Excelを使っていれば、WorksheetFunction の親オブジェクトにApplicationがあります。
>なぜApplication.xxxxxの方が遅いのでしょうか?
ともかく、こちらでも論より証拠で測ってみました。
Declare Function timeGetTime Lib "winmm.dll" () As Long
を使い、計算内容は、B列全体、ランダムな3桁または4桁の数字で、合計のSUM関数を用いました。
32948674- 32948643 = 31 ...WorksheetFunction.Sum(Range("B:B"))
32988516- 32988469 = 47 ... Application.Sum(Range("B:B"))
同じ数値を、.Round(Cells(i, 2).Value / 10, 0)
でやってみると、
32280198 - 32266907 = 13291 ...Application.Round( x / 10,0)
32327201 - 32317747 = 9454 ...WorksheetFunction.Round( x / 10,0)
想像の範囲ですが、Excel側からインターフェースを通して利用しているせいだと考えます。
ただ、エラートラップという一つのオブジェクトを通すことになれば、それは、また別の時間が掛かる原因になると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 和訳の手伝いをお願いします 2 2023/02/27 11:42
- 英語 Because growth factors regulate abundance of micro 1 2022/03/28 10:12
- Visual Basic(VBA) ExcelVBAで、型が一致しませんのエラーについて 3 2023/06/20 09:51
- PHP PHPSpreadsheetを使って関数を繰り返し埋め込みたい 1 2023/05/24 11:33
- X(旧Twitter) Twitterについて質問です。 他人のTwitterネーム(表示名ではなく、リプライに使う@xxx 2 2023/07/17 09:52
- Visual Basic(VBA) エクセルで、1つのセルで上書き足し算して セルの範囲を指定できますか? パソコン初心者です。 お時間 3 2023/07/05 06:13
- 英語 Because growth factors regulate abundance of micro 1 2022/03/31 09:32
- その他(開発・運用・管理) WindowsからSSHでサーバーにあるファイルをダウンロードできない…。 3 2022/04/24 11:08
- 英語 However, studies that investigate the biologic fun 1 2022/03/27 10:46
- Ruby Ruby / passenger のインストールについて 1 2023/01/30 18:31
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
忘れられない激○○料理
これまでに食べたもののなかで、もっとも「激○○」だった料理を教えて下さい。 激辛、でも激甘でも。 激ウマ、でも激マズでも。
-
2024年のうちにやっておきたいこと、ここで宣言しませんか?
2024年も残すところ50日を切りましたね。 ことしはどんな1年でしたか? 2024年のうちにやっておきたいこと、 よかったらここで宣言していってください!
-
うちのカレーにはこれが入ってる!って食材ありますか?
カレーって同じルーから作っても、家庭によって入っているものや味が微妙に違っていて面白いですよね! 「我が家のカレーにはこれが入ってるよ!」 という食材や調味料はありますか?
-
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
エクセルVBAでApplication.SumとWorksheetFunction.Sum
PowerPoint(パワーポイント)
-
-
4
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
5
Application.Matchで特定行の検索
Visual Basic(VBA)
-
6
VBAの配列サイズとメモリに関して
Visual Basic(VBA)
-
7
vbaでworksheetfunctionでの複数関数がエラーになります
Visual Basic(VBA)
-
8
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
9
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
10
Application.Matchについて
Excel(エクセル)
-
11
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
12
もしセルが#N/A"なら~をする・・・には?"
Excel(エクセル)
-
13
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
14
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
15
エクセル関数で日付かどうかの確認?
Excel(エクセル)
-
16
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
17
VBAでループ内で使う変数名を可変にできないか。
Visual Basic(VBA)
-
18
matchプロパティを取得できません…と出ます。
PowerPoint(パワーポイント)
-
19
変数を動的に作るには?
Visual Basic(VBA)
-
20
UserForm1.Showでエラーになります。
工学
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
ACCESSで値を代入できないとは?
-
On ErrorでエラーNoが0
-
VBA データ(特定値)のある最...
-
「実行時エラー '3167' レコー...
-
実行時エラー 438 の解決策をお...
-
VB.net 重複チェックがしたいです
-
文字列内で括弧を使うには
-
ExecuteNonQueryメソッドの戻り値
-
マクロで"#N/A"のエラー行を削...
-
pythonのopenpyxlについて
-
ASPでこんなエラーが出たんです...
-
オブジェクト型の変数にフォー...
-
ADO 「認証に失敗しました」
-
【VBA】ワークブックを開く時に...
-
フランスの生年月日(jj/mm/aaaa)
-
ApplicationとWorksheetFunctio...
-
Filter関数を用いた結果、何も...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
VBA データ(特定値)のある最...
-
お助けください!VBAのファイル...
-
文字列内で括弧を使うには
-
On ErrorでエラーNoが0
-
「実行時エラー '3167' レコー...
-
【Access】Excelインポート時に...
-
インポート時のエラー「データ...
-
Excel vbaについての質問
-
ACCESSで値を代入できないとは?
-
実行時エラー 438 の解決策をお...
-
【VBAエラー】Nextに対するFor...
-
Filter関数を用いた結果、何も...
-
ApplicationとWorksheetFunctio...
-
エクセルVBAで埋め込みグラフ(C...
-
VBでSQL文のUPDATE構文を使った...
おすすめ情報