ツイッター出題回答
Variant仮引数にRange.Valueを配列で渡す方法

ExcelマクロVBAとエクセル関数についての私的雑感
公開日:2020-07-05 最終更新日:2020-07-05

Variant仮引数にRange.Valueを配列で渡す方法


ツイッターで出したVBAのお題です。
Variant型は、どんなデータ型も受け入れることができます。
RangeオブジェクトのValueを配列で受け取るにはVariant変数が必要です。
ただし、実引数にRangeオブジェクトを直接指定する場合には注意が必要です。


お題のツイート

https://twitter.com/yamaoka_ss/status/1279311729231462400

【VBA問題】
Sub Q1()
 Range("A1:A6") = 1
 MsgBox fnc(Range("A1:A2"), (Range("A5:A6")), Range("A3:A4").Value)
End Sub
Function fnc(v1, v2, v3)
 Range("B1:B2") = v1
 Range("B3:B4") = v2
 Range("B5:B6") = v3
 fnc = WorksheetFunction.Sum(Range("B1:B6"))
End Function
Q1実行結果は?
・0
・2
・4
・6

VBA マクロ Variant Range.Value 配列

解説のツイート

以下で一連の解説ツイートをしています。

https://twitter.com/yamaoka_ss/status/1279771918011252738


複数セルのValueを配列にするにはVariant変数に代入します。
Variant変数 = Rangeオブジェクト.Value
※.Valueは省略可
※単一セルの場合は配列になりません。
Rangeを配列としてFunctionの引数に渡す場合はどうしたら良いでしょうか。
いったんVariant変数に入れてから渡せば問題ありません。


では直接引数にRangeを記述したらどうなるでしょうか。
実引数にRangeを指定し仮引数がVariantの場合、
関数側ではRangeオブジェクトのまま受け取ります。
今回の場合の変数v1がこれになります。
Variant変数v1はRangeオブジェクトです。
Range = Range
この代入ではValueはコピーされません。


左辺のRangeのValueがクリアされてしまいます。
これがエラーにならないのは要注意です。
この代入結果を期待してVBAを書くことはありえないと思います。
複数セルのRangeオブジェクトのValueをコピーするには、
右辺のRangeにValueを指定する必要があります。


通常は左辺右辺の両方にValueを指定して、
Range.Value = Range.Value
これでValueだけが一括でコピーされます。
では、実引数にRangeを指定し仮引数のVariantに配列を入れるにはどうしたら良いでしょうか。
実引数のRangeを配列にしてから渡すようにします。
次のような方法があります。


・Valueを指定する
・()で囲む
Valueプロパティを指定することで配列になります。
これが最も一般的な方法でしょう。
他の方法として、()で囲むことでRange既定のValueが取得されるので配列になります。
※CVar(Range(…))としても配列になりません。


今回の問題では、関数fncが受け取った時点では、
v1はRangeオブジェクト → 代入で左辺のValueがクリアされる
v2はValueの配列 → 代入で右辺の配列が左辺の.Valueに入る
v3はValueの配列 → 代入で右辺の配列が左辺の.Valueに入る
結果は、
B1:B2は空欄。
B3:B4は1が入ります。
B5:B6は1が入ります。


従って、答えは4です。
Sum(Range("B1:B6")) → 4
6の回答が圧倒的に多かったですが、
v1はRangeオブジェクトであり、
Range = Range
これではValueが入らないところが要点です。

Variant変数の一般的な説明は、
「VBAのVariant型について」
https://excel-ubara.com/excelvba4/EXCEL_VBA_441.html
Variantデータ型は、他の何らかのデータ型として明示的に宣言されていない変数で、全てのデータ型を入れることができます。Variantデータ型には型宣言文字はありません。Variant型は、特別な値Empty、Error、Nothing、Nullを格納することもできます。




同じテーマ「ツイッター出題回答 」の記事

マクロ記録での色のマイナス数値について

ツイッターで出したVBAのお題です。マクロの記録で文字色などの色を指定するとマイナス数値で記録される場合がありますが、このマイナス数値は何かを問う問題です。お題のツイート https://twitter.com/yamaoka_ss/status/1272119270026051587 【エクセル問題】 マクロの記…
VBAのString型の最大文字数について
ツイッターで出したVBAのお題です。String型はVBAリファレンスでは、「可変長文字列は、最大で約20億(2^31)文字を格納できます。」と書かれています。これについて、本当は何文字まではいるのかについての問題です。
Variantの数値型と文字列型の比較
ツイッターで出したVBAのお題です。Variant型は、どんなデータ型も入れることができます。具体的なデータ型の代わりに使用することで、より柔軟にVBA記述ができるようになります。ただしその一方で、少々特殊な挙動もあり、使いこなすにはそれなりの知識が必要になる場合もあります。
Variant仮引数にRange.Valueを配列で渡す方法
Variant仮引数のByRefとByValの挙動違い
ツイッターで出したVBAのお題です。Variant型は、どんなデータ型も入れることができてしまいます。具体的なデータ型の代わりに使用することで、より柔軟にVBA記述ができるようになります。ただしこの便利さゆえに、逆に注意しなければならない挙動もあります。
100桁の正の整数値の足し算
ツイッターで出したVBAのお題です。数の単位に「無量大数」というものがあります。VBAでこの無量大数の足し算をするにはどうしたら良いでしょうか。そこで、100桁の正の整数の足し算をVBAで実現してみましょう。
「VBA Match関数の限界」についての誤解
ツイッターで出したVBAのお題です。発端はエゴサーチからです。(笑) 「教えて!goo」で引用されていたのを見つけました。あちこちで引用されているのは見かけることはあるのですが、以下ではよく言うディスられているような文章を見かけました。
VBAで数値を漢数字に変換する方法
ツイッターで出したVBAのお題です。算用数字を漢数字に変換するVBAです。滅多に必要になるものではないのに、なぜこんな問題を出したかと言うと、最近シリーズで書き始めた「Excel将棋」で必要になったからです。
囲碁で相手の石を囲んで取るアルゴリズム
ツイッターで出したVBAのお題です。Excel囲碁を作っていて、相手の石を囲んで取れるかどうかの判定、相手の石を取るにはどうしたら良いかというもの。囲碁で相手の石をとる ここで、8二に黒を打てば、このように囲まれている白が取られます。
VBAで「3Lと5Lのバケツで4Lの水を作る」を解く
ツイッターでVBAのお題として出したものです。昔からよくある問題です。「3Lと5Lのバケツで4Lの水を作る」これをVBAを使って自動で求めてみようという事です。VBA問題:ツイートの記録 【VBA問題】 「3Lと5Lのバケツで4Lの水を作る」・2つの容器サイズは変えられるように引数で受け取る (3,5,
言語依存の関数を使用できるFormulaLocal
ツイッターでVBAのお題として出したものです。複数セルに一括で数式を入れるバ宇井の記述と、言語環境に依存する関数をセルに設定する場合のFormulaプロパティの使い方についての問題です。問題を出したツイート A1:A10セルに半角の英数文字が入っているので、これを全角で表示するためにB1:B10セルに数式をVBAで…


新着記事NEW ・・・新着記事一覧を見る

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ