
Excel VBAで以下の処理を行う関数を作成したいと思っていますが、
実装方法がわかりません。
<要求>
次の数式と同様の結果をもたらす関数を自作したい。
=ADDRESS(ROW(),COLUMN())
<作成しようとしている関数のイメージ>
Function getCurrentAddress() As String
~~~ 処理 ~~~
End Function
<期待する結果>
セル番地:C4のセルに関数を入力した場合
=getCurrentAddress()
-結果-
C4
どなたか、解決方法をご存知の方
ご教示いただけますか?
No.5ベストアンサー
- 回答日時:
ThisCellというプロパティを使えばいけます。
Function getCellwidth() As Double
With Application
.Volatile
getCellwidth = .ThisCell.ColumnWidth
End With
End Function
ただ、手動で列幅を変更しただけだと値が変わらないので、
イベントで再計算させなくてはならないですね。
Function getCurrentAddress() As Range
↑は循環参照になってしまい、うまくいかなかった。
↓なら簡単。
Function getCurrentAddress() As String
getCurrentAddress = Application.ThisCell.Address
End Function
うおおおお!!!
すばらしい!
まさに、私の求めていた結果です。
ありがとうございます。
やはりセルを返すと循環参照になってしまいましたか……
ですが、大変満足です。
No.4
- 回答日時:
(1)シートのイベントで捉えられるなら
Selection.ChangeやChangeイベントで
引数targetを渡してくれるので
Target.Address
(2)セルの選択をした後であれば
Moduleの中なら
ActiveCell.Address
Selection.Address
Addressが使い道が、コントロールのプロパティ指定などの際ぐらいしか役立ったことが無い。
(3)関数Functionで使うなら
(2)と同じと思うが、使い途はあるのかな。
ーーー
使用目的を少し広範囲に質問に書いてくれてないので、適切な回答がしにくいのでは。
質問者は相当熟練者のようだが、聞いていることだけ答えろ式に受け取れるが、聞いていることが、ああいうケースもあり、こういうケースかなと想像できるのだがいかが。
小生の経験から、自分自身のセルをアドレス化しても利用価値はあるのかなと思う。
関数は自分のセルの値を式に使えないのだから。
例外はRow()などだが、これは大変利用価値はあるが。
ご指摘、ご回答ありがとうございます。
そうですね。質問の仕方がだいぶまずかった気がします。
申し訳ありませんでした。
#1さんの回答欄に意図を書きましたが、
このような関数があると、条件付書式の指定や
セルの値を検証する作業の時などに使えます。
毎回 「INDIRECT(ADDRESS(ROW(),COLUMN()))」を入力すれば
良いのですが、関数の中で利用できれば良いと思い質問させていただきました。
No.3
- 回答日時:
下記で、adrに自分のセルを参照する。
循環にはならないみたい。これで、セルの移動や追加、削除などしてSheetが変わっても大丈夫。
Function getCurrentAddress(adr)
getCurrentAddress = adr.Address(False, False)
End Function
ご回答ありがとうございます。
おお!!できますね。
しかし、adrが曲者なのです。
adrを入れないようにしたいのです……。
わがままで申し訳ありません。
No.2
- 回答日時:
・セル関数
=SUBSTITUTE(ADDRESS(ROW(),COLUMN()),"$","")
・マクロ
Dim C As Long
Dim R As String
C = ActiveCell.Column - 1
If C >= 26 Then
R = Chr(&H40 + (C \ 26))
End If
R = R & Chr(&H41 + (C Mod 26))
getCurrentAddress = R & CStr(ActiveCell.Row)
ご丁寧にありがとうございます。
ご教示いただいた関数を作成し、
=getCurrentAddress() と入力すると
自身のセルアドレスが表示されました。
しかし、ActiveCellだとアクティブじゃないと駄目かな?
と思いながらも、数式を入力したセルをコピー&ペースト。
すると、私の実現したかった結果になりました!
……と、喜んだのですが再計算をした瞬間に全てのセルが同一の結果に。
すみません、質問の仕方が不適切でした。
#1さんの回答に、意図を載せております。
大変お手数おかけし、恐れ入ります。

No.1
- 回答日時:
Selectした状態のセル番地を取得する関数なら出来たんですけどこれで質問者さんがイメージする内容と同じですか?一応、載せておきます。
Dim Str As String
'セル番地を取得(この時点ではF4番地の場合$F$4という感じで$が付いている)
Str = Selection.Address
'先頭の$を削除
Str = Right(Str, Len(Str) - 1)
'2つ目の$の削除
Str = Left(Str, InStr(Str, "$") - 1) & Trim(Right(Str, Len(Str) - InStr(Str, "$")))
上記のプログラムでちゃんと変数Strに番地が入っているのを確認しました。IV10000というほとんど使うことが無いほど大きな番地でも大丈夫なので問題ないと思います。もう少しスマートな書き方があるかもしれませんけどね。
この回答への補足
ポイントは、正解を下さった#5NNAQさんと、
先着の#1tonton-triboさんにつけさせていただきます。
みなさま、ありがとうございました。
お返事遅くなりました。
丁寧なご回答ありがとうございます。
すみません、質問の仕方が不適切でした。
選択中のセル番地取得ではなく、シートの構造が変わっても
関数が入力されているセル番地を取得する関数を作成したいのです。
例えば、※1(下部に記述)のような指定したセルの列幅を取得する関数があります。
数式で使用する際、引数に「INDIRECT(ADDRESS(ROW(),COLUMN()))」を入れれば
自身のセル参照が渡るので、わざわざ自身のセル番地を返す関数を作らなくても
やりたいことは実現できる(※2)のですが、
もう少しスマートにしたいと思ったのが今回の質問でした。
※1
======================================================
Function getColumnwidth(対象範囲 As range) As Double
Application.Volatile
Dim result As Double ' 結果格納用
Dim target As range ' 範囲
For Each target In 対象範囲
result = result + target.ColumnWidth
Next
getColumnwidth = result
End Function
======================================================
※2
実際に数式で使用する際の話ですが
=getColumnwidth( INDIRECT(ADDRESS(ROW(),COLUMN())) )
だと長いため、
=getColumnwidth( INDIRECT(getCurrentAddress()) )
としたいのです。
……と、いま上の文を書いていて思ったことですが、
indirect(~~)も長いので現在のセルが返せたら
もっといいなあ、と夢だけが膨らみつつあります。
=getColumnwidth( getCurrentAddress() )
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) Excelでなぜこのような式をつかっているのでしょうか、行に1,2,3と連番を振るだけなのに 5 2023/04/08 20:00
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
質問58753 このコードでうまく...
-
【マクロ】並び替えの範囲が、...
-
以下のプログラムの実行結果は...
-
vbs ブック共有を解除
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
エクセルのマクロについて教え...
-
エクセルの改行について
-
Excelのマクロについて教えてく...
-
VBAでユーザーフォームを指定回...
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
-
[VB.net] ボタン(Flat)のEnable...
-
Excel 範囲指定スクショについ...
-
【マクロ】値を渡されたプロシ...
-
Excelのマクロについて教えてく...
-
Excel VBA 選択範囲の罫線色の...
-
エクセルのVBAコードと数式につ...
-
【マクロ】変数を使った、文字...
-
エクセルのVBAコードについて教...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
testファイル内にある複数のpng...
-
改行文字「vbCrLf」とは
-
エクセルVBA 検索結果を隣のシ...
-
vb.net(vs2022)のtextboxのデザ...
-
エクセルのVBAコードと数式につ...
-
【マクロ】切取りの場合、形式...
-
【ExcelVBA】5万行以上のデー...
-
ExcelVBAでパワポを操作したい
-
(EXCEL超初心者)EXCELの関数(ま...
-
エクセルの改行について
-
Excelマクロで使うVBAコードを...
-
ワードの図形にマクロを登録で...
-
【マクロ】変数を使った、文字...
-
VBAでFOR NEXT分を Application...
-
VBAの質問(Msgboxについて)です
-
エクセルのVBAコードについて教...
-
Excelマクロで使うVBAコードを...
-
Excelのマクロについて教えてく...
-
VBAの「To」という語句について
-
【マクロ】値を渡されたプロシ...
おすすめ情報