ツイッター出題回答
Rangeオブジェクトを受け取り"行数,列数"で埋める

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

Rangeオブジェクトを受け取り"行数,列数"で埋める


ツイッターで出したエクセルVBAのお題です。


Rangeオブジェクトを受け取り、"行数,列数"の値(数式ではなく値)で埋めるVBAを書く問題です。


問題を出したツイート

【VBAお題】
Rangeオブジェクトを受け取り、
添付のように"行数,列数"の値(数式ではなく値)で埋めてください。
例.
Call setRowCol(Range("A1:C5"))
このプロシージャーの作成です。
※裏お題
より少ないステートメント数に挑戦。
もちろん最小は1ステートメント。

VBA マクロ Rangeを受け取り行数,列数で埋める
https://twitter.com/yamaoka_ss/status/1316964040531378177


行・列は絶対位置で指定してください。
Call setRowCol(Range("B3:D5"))
これで添付のようにします。

VBA マクロ Rangeを受け取り行数,列数で埋める
https://twitter.com/yamaoka_ss/status/1316991128571269121


お寄せいただいた回答

以下はツイッターの検索で、元のツイートが引用されているツイートを検索したものです。
頂いた回答は、こちらの検索結果からご覧ください。

https://twitter.com/search?lang=ja&q=https%3A%2F%2Ftwitter.com%2Fyamaoka_ss%2Fstatus%2F1316964040531378177&src=typed_query

大別すると

・For EachでRangeオブジェクトを順に処理
・セルに数式を入れてから値をコピーし直す
・Evaluateで一括処理

以下でも3通りの解答を掲載しておきます。


用意した解答

For EachでRangeオブジェクトを順に処理

まずは普通にFar Eachで、

Sub setRowCol(rng)
  Dim r As Range
  For Each r In rng
    r = r.Row & "," & r.Column
  Next
End Sub 

VBAを始めたばかりの人は、まずはこれがさっと書けるようになりましょう。
ここで注意したいのは、データ型とデフォルトプロパティです。
Dim r As Range
このようにRangeで型指定しているので、代入時点では.Valueは省略できます。
もし、
Dim r
このように型を指定せずにVariantにするなら、
r.Valueが必要になります。
もちろん、Range型で指定した上で.Valueを指定すれば一番良いです。

この方法は基本ですので、まずはこれが書けるようになっておく必要はあります。
ただし、このように1つずつセル値を入れる方法はセル数が増えると処理時間がかかってしまいます。
扱う表が大きい場合は、以下のように一括で処理する方法を考えましょう。

セルに数式を入れてから値をコピーし直す

セルに数式を入れてからValueを入れ直します。

Sub setRowCol(rng As Range)
  rng = "=ROW()&"",""&COLUMN()"
  rng.Value = rng.Value
End Sub

シートで、
=ROW()&","&COLUMN()
このように入れれば、当該セルに行,列が出力されます。
この数式をセル範囲に一括で入れています。
そして、その範囲を
.Value= .Value
これで値だけにしています。

上の1つずつセルを入れる処理に比べて格段に高速に動作します。

Evaluateで一括処理

Evaluateで一括で入れます。

Sub setRowCo3(rng As Range)
  rng = Evaluate("ROW(" & rng.Address & ")&"",""&COLUMN(" & rng.Address & ")")
End Sub

Evaluateの詳細については以下を参照してください。
Evaluateメソッド(文字列の数式を実行します)|VBA技術解説
Evaluateメソッドは、Excelで使用する名前をオブジェクトまたは値に変換します。簡単に説明すれば、セルに入れる数式を文字列としてVBAで実行できます。Evaluateメソッドの構文 式.Evaluate(name) 式には以下が指定できます。
ROWもCOLUMNも引数を省略すると、入力した当該セルの行・列になりますが、
引数にセル範囲を指定すれば、指定されたセル範囲の情報を返します。
=ROW(A1:C5)&","&COLUMN(A1:C5)
スピルするエクセルなら、これで当該範囲に出力されます。

VBA マクロ Rangeを受け取り行数,列数で埋める

Evaluateでこの数式を処理すると配列が返されます。
配列は、そのまま同じ大きさのセル範囲のValueに入れることができます。
それが上のVBAになります。

1,000列以上の時のカンマズレ対応

さて、以上で良いはずなのですが、列数が100を超えるとカンマ付き数字となってしまいます。
VBA マクロ Rangeを受け取り行数,列数で埋める

それでも、見た目は正しくカンマが付いていますし、Textプロパティでカンマ付きで取得できますので、ぎりぎりセーフでしょうか。
しかし、列数が1,000を超えてくると、カンマの位置がずれてしまいます。
VBA マクロ Rangeを受け取り行数,列数で埋める

このように本来の仕様を満たさなくなってしまいます。
まあ、1,000列以上なんて滅多にありませんが、このような場合を想定した対処方法になります。
これには、先頭に'(シングルクォート)を付けて文字列として出力します。

Sub setRowCol(rng As Range)
  rng = Evaluate("""'""&ROW(" & rng.Address & ")&"",""&COLUMN(" & rng.Address & ")")
End Sub
VBA マクロ Rangeを受け取り行数,列数で埋める

出力セル範囲を文字列書式にしておくという方法でもよいです。




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

コレクションの要素を削除する場合
greeenはgreenに、greeeeeNをGReeeeNに変換
数値変数の値を別の変数を使わずに入れ替える
Rangeオブジェクトを受け取り"行数,列数"で埋める
数式の関数の使用回数、関数名を配列で返す
日付型と通貨型のValueとValue2について
小文字"abc"を大文字"ABC"に変換する方法
オブジェクトのByRef、ByVal、Variant
「マクロの登録」で登録できないプロシージャーは?
ジャグ配列から順列を作成する
シート内の全テーブルを1つに統合


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

生成AIが暴いた「VBAオワコン説」の盲点|問われるのは言語ではなく評価軸|エクセル雑感(2026-07-04)
【ITとは何か】Excel・VBAを学ぶ前に知っておきたい「4つの本質」|エクセル雑感(2026-06-24)
2つのシート名を交換するVBAをGeminiに作らせてみた。|VBA技術解説(2026-05-22)
ヘッダーに合わせて列をソートして値貼り付けするスマートな方法|VBAサンプル集(2026-05-20)
4大分岐関数の使い分け(IF/IFS/SWITCH/CHOOSE)|エクセル入門(2026-05-19)
Excel主要関数 習得難易度 10段階(文字列・日付除く)|エクセル雑感(2026-04-27)
Excelのシート5分類|エクセル雑感(2026-03-27)
グループ別に全員共通の重複期間を算出|エクセル練習問題(2026-03-12)
ハイフン区切り文字列の『最初』と『最後』を抽出・結合|エクセル練習問題(2026-02-23)
AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.変数宣言のDimとデータ型|VBA入門
3.日本の祝日一覧|Excelリファレンス
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.Excelショートカットキー一覧|Excelリファレンス
6.繰り返し処理(For Next)|VBA入門
7.RangeとCellsの使い方|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




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


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



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