『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
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
>大きな配列 問題なく扱える 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.