[[20260214165507]] 『Application.関数名とWorksheetFunction.関数名の』(訓練中) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『Application.関数名とWorksheetFunction.関数名の違い』(訓練中)

以下は別のWorkbookからシート名を列挙してstrName()に入れているコードの一部です。
プログラム自体は正常に動作している状態です。

With wb.Worksheets(strWorksheetName)

    lngLastRow = .Cells(Rows.Count, "A").End(xlUp).Row
    If lngLastRow >= 2 Then .Range(.Cells(2, "A"), .Cells(lngLastRow, "A")).ClearContents
    .Range("A2").Resize(UBound(strName())).Value = WorksheetFunction.Transpose(strName())
    .Range("A2").Resize(UBound(strName())).Value = Application.Transpose(strName())
End With

自分は、WorksheetFunction.Transposeしか知らなかったのですが、
この掲示板で勉強しているうちに、
Application.Transposeという様に書いている人がいました。
(実際にはTranspose関数ではなく、SumIfsだったと記憶していますが…)

1、WorksheetFunction.Transpose(strName())
2、Application.Transpose(strName())

1でも2でも動作自体に問題はありませんが、
皆様のお時間のある時で良いですので、
「WorksheetFunction.Transpose」と
「Application.Transpose」では、
何か違いがあるかどうか、
また、皆様が普段どちらを利用しているか、
その理由を教えていただけると幸いです。

よろしくお願いいたします。

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


 知っていましたが、記述の手間を省くためにAIを使いました。(Google検索)

 Q:
 ExcelVBAでApplication.MatchとWorksheetfunction.Matchの違いはなんですか?  

 A:
 Excel VBAのApplication.MatchとWorksheetFunction.Matchの主な違いは、検索値が見つからなかった時の動作です。
 Application.Matchはエラー値(CVErr)を返してプログラムを停止させず、
 WorksheetFunction.Matchは実行時エラーを発生させます。通常は前者が便利です。 

 ■主な違いの比較
 特徴                Application.Match               WorksheetFunction.Match
 -----------------   ------------------------------  ---------------------------------
 見つからない時      エラー値 (#N/A) を返す          実行時エラー (1004) が発生する
 エラー処理          If IsError(...) で判定可能      On Error Resume Next 等が必要
 返り値の型          バリアント型 (Double or Error)  Double (数値)
 推奨用途            存在しない可能性がある時        必ず存在すると見込む時

 ■動作詳細と使用例
 1. Application.Match (推奨)
     値が見つからない場合に Error 2042 (#N/A) を返します。

     (vba)
     Dim res As Variant
     res = Application.Match("A", Range("A1:A10"), 0)
     If IsError(res) Then
         MsgBox "見つかりません"
     Else
         MsgBox res & "行目にあります"
     End If
 2. WorksheetFunction.Match 

     値が見つからない場合にVBAの実行時エラーが発生し、プログラムが停止します。 
     (vba)
     On Error Resume Next    'エラーを無視するための処理が必要
     Dim res As Double
     res = WorksheetFunction.Match("A", Range("A1:A10"), 0)
     If Err.Number <> 0 Then
         MsgBox "見つかりません"
         Err.Clear
     Else
         MsgBox res & "行目にあります"
     End If
     On Error GoTo 0

 ■結論
     検索結果が存在しない可能性が高い(不確定な)データに対しては、
     エラー処理が容易な Application.Match を使用するのが効率的です。 

 -------------------------------------------
 AIによる回答ですので、ご承知おきください。特に間違いはなさそうに思いました。

 なお、歴史的には、WorksheetFunctionのほうが後発です。    
 両者の違いを何故設けたのかは、公開されているのでしょうか。私は深く調べたことはありません。
 Application.Matchに明確に軍配を上げているのはMSの立場からは別意見があるかもしれません。

(xyz) 2026/02/14(土) 17:19:40


xyz様
丁寧なご回答ありがとうございます。

AIへの聞き方も参考になりました。
そこでTransposeについても違いをAIに聞いてみました。

項目 Application.Transpose WorksheetFunction.Transpose
返り値の型 Variant(柔軟) Variant(Excel関数の仕様に準拠)
1次元配列の扱い 行⇄列に変換される 行⇄列に変換されるが、時にエラーや意図しない結果
2次元配列の扱い 安定している 要素数が多いとエラー(65536要素制限)
空白の扱い 空白もそのまま扱う 空白があると挙動が不安定になることがある
速度 速い(VBAネイティブ) 遅い(Excel関数呼び出し)
大きな配列 問題なく扱える 65536要素を超えるとエラー

という事なので、今回の自分のプログラムでは、1次元且つ空白もないけれど、
「時にエラーや意図しない結果」が出るらしいので、
Application.Transposeに変更しました。

関数によって違う事が判明しました。
本当にありがとうございました。

(訓練中) 2026/02/14(土) 17:48:31


 私は差異はエラーの扱いだけだと思っていました。
 なので代表的なMatchを例に挙げて回答しました。

 どの生成AIに聞いたのでしょうか。
 個人的に気になる点がありますので、参照した生成AIを教えて下さい。

(xyz) 2026/02/14(土) 18:32:07


参照したのはCopilotです
(訓練中) 2026/02/14(土) 19:27:57

 >大きな配列    問題なく扱える       65536要素を超えるとエラー
 というのは本当ですかねえ。私は聞いたことが無いです。
 Application.transposeだって個数制限はあると思います。
 どちらも同じだと思います。

 実験してみてください。
 65600行10列を転置すると、どちらも10行64列にカットされた配列が返りました。

 対象となる配列の大きさに関して、Application.Transposeのほうに優位性があるということはありません。
 どちらも同じです。
 間違っています。生成AIがいつも正しいとは限りません。
(もしWorksheetfunctionの導入でそのような機能劣化があれば問題になっているはずです。)

 いずれにしても、
 シート名の配列ならば、上限は気にすることはないでしょう。
 エラーの扱いで比較的問題になるのはMatch関数であることがもっぱらです。
 少数データでも差異が明確にあります。

(xyz) 2026/02/14(土) 20:20:15


 上記の発言は、Copilotにアクセスする前のものでした。

 その後、Copilotと話をしてきました。
 実験結果も示して、Copilotも納得したようです。(以下はCopilotの発言)

 > あなたの観察はすべて正しく、現行 Excel の TRANSPOSE の仕様は次の通りです。
 > ・65536 要素までは正常に転置される
 > ・65537 要素以上になると 64 に切り詰められる
 > ・Application.Transpose と WorksheetFunction.Transpose の制限は同一
 > ・古い資料にある「WorksheetFunction の方が緩い」は現在は誤り

 生成AIも常に正しいとは限らないのでチェックが必要です。
(xyz) 2026/02/14(土) 20:24:53

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.