![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
No.4ベストアンサー
- 回答日時:
こんばんは。
端的に言うと、絶対参照を相対参照に戻すことですね。
Address メソッドの 「RelativeTo:=」に、入れてあげれば、相対的な位置を出します。
以下は、文字列の取得の仕方には問題があるけれども、左端上を基点として、相対参照に直しています。以下の文字列の取得は、正規表現なんて使うと、いかにも、それらしくはなるけれど、実際には、遅くなってしまいます。実際は、Ref までで取得は出来ています。
Sub TestSample()
Dim rng As Range
Dim Target As Range
Dim Ref As String
Dim i As Long, j As Long, n As Long, rw As Long, col As Long
Set rng = Range("B2:E5")
Set Target = Range("C4")
If Intersect(Target, rng) Is Nothing Then MsgBox "範囲には該当していません。": Exit Sub
Ref = Target.Address(0, 0, xlR1C1, , rng.Cells(1, 1))
'文字列から行数と列数を取得
i = InStr(Ref, "[")
j = InStr(Ref, "]")
n = InStrRev(Ref, "[")
rw = Mid$(Ref, i + 1, j - 1 - i) + 1
col = Mid$(Ref, n + 1, Len(Ref) - n - 1) + 1
MsgBox Target.Address(0, 0) & "は、『" & rng.Address(0, 0) & "』に対して" & vbCrLf _
& rw & "行目" & col & "列目"
Set Target = Nothing
Set rng = Nothing
End Sub
有難うございます。
Object.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo) という構文だったのですね。 とても勉強になりました。
文字列Refから行数と列数を取得するのはやはり大変ですねえ・・・。
No.8
- 回答日時:
エキスパートさん、Wendy02さん、こんばんは。
>こうやって見ました。
>Ref = Target.Address(0, 0, xlR1C1, , Rng.Cells(1, 1))
>Ref = Replace(Replace(Replace(Ref, "R", ""), "[", ""), "]", "")
>Dim myAdrs
>myAdrs = Split(Ref, "C")
>MsgBox Val(myAdrs(0)) + 1 & " 行 " & Val(myAdrs(1)) + 1 & " 列"
おお、さすがエキスパートさん。
これからも今回のようにひとつの解だけではなく少なくとも2つは考えるようにして
常に頭を柔らかく柔らかくふにゃふにゃにしておきませうねぃ。(^^;;;
そうすればきっと遥か遠くに微かではあるけれどWendy02さんの後姿が
目視できるようになる日が来ることでせう。
Wendy02さん、いつも勉強させていただいてます。
これからも実践的なコード、薀蓄のある解説、楽しみにしております。
No.7
- 回答日時:
こんにちは。
kobouzu_su さん、コメントありがとうございました。
前回書いたように、一応、正規表現では、以下のように一回で取得は出来ます。ただ、「いかにも」っていう感じになって、正規表現の自己主張が強くって、自然な流れではないような気がします。(意味不明かな?)
Sub TestSample2()
Dim rng As Range
Dim Target As Range
Dim Ref As String
Dim Matches As Object
Set rng = Range("B2:E5")
Set Target = Range("C3")
If Intersect(Target, rng) Is Nothing Then MsgBox "範囲には該当していません。": Exit Sub
Ref = Target.Address(0, 0, xlR1C1, , rng.Cells(1, 1))
With CreateObject("VBScript.RegExp")
.Pattern = "R(\[(\d+)\])*C(\[(\d+)\])*"
Set Matches = .Execute(Ref)
With Matches(0)
MsgBox Target.Address(0, 0) & "は、『" & rng.Address(0, 0) & "』に対して" & vbCrLf _
& Val(.submatches(1)) + 1 & "行目 " & Val(.submatches(3)) + 1 & "列目"
End With
End With
Set Target = Nothing
Set rng = Nothing
End Sub
「正規表現」ですか・・・・。
まだエクセルVBAでさえおぼつかないのに、わたくしめにはちと難しすぎまするぅ。
有難うございました。
No.6
- 回答日時:
エキスパートMerlionさん、こんにちは。
>文字列Refから行数と列数を取得するのはやはり大変ですねえ・・・。
頭の体操になって楽しいではありませぬか。。(^o^)。。
'------------------------------------------------
Sub TestSample()
Dim Rng As Range
Dim Target As Range
Dim Ref As String
Set Rng = Range("B2:E7")
Set Target = Range("B4")
Ref = Target.Address(0, 0, xlR1C1, , Rng.Cells(1, 1))
Dim myAdrs, myRow, myClm
myAdrs = Split(Ref, "C")
myRow = Replace(Replace(Replace(myAdrs(0), "R", ""), "[", ""), "]", "")
myClm = Replace(Replace(myAdrs(1), "[", ""), "]", "")
MsgBox Val(myRow) + 1 & " 行 " & Val(myClm) + 1 & " 列"
End Sub
'--------------------------------------------------
それから、こういう類のものをテストするときは、境目を重点的にチェックしなければいけません。
1列目(例えば、B2,B3,B4)だとか
1行目(例えば、C2,D2,E2)などを。
因みに当方は、No3のオーソドックスものしか浮かびませんでした。(^^;;;
Wendy02さんは、すごい!
以上です。
ありがとうございます。
> 頭の体操になって楽しいではありませぬか。。(^o^)。。
確かに。(*´∇`*)
配列が出てくるとは思いませんでした。
こうやって見ました。
Sub TestSample02()
Dim Rng As Range, Target As Range
Dim Ref As String
Set Rng = Range("B2:E7")
Set Target = Range("B2")
Ref = Target.Address(0, 0, xlR1C1, , Rng.Cells(1, 1))
Ref = Replace(Replace(Replace(Ref, "R", ""), "[", ""), "]", "")
Dim myAdrs
myAdrs = Split(Ref, "C")
MsgBox Val(myAdrs(0)) + 1 & " 行 " & Val(myAdrs(1)) + 1 & " 列"
End Sub
No.5
- 回答日時:
こんにちは。
>文字列Refから行数と列数を取得するのはやはり大変ですねえ・・・。
いえ、これが、なんとも言いようがないのでして……。
まだ、見当の余地は残っています。これで終わりではありません。
今回の書いたのは、最近の私のVBAの処理の仕方なのです。
正規表現なら一回で済むのですが、オートメーション・オブジェクトというのは、呼び出すのにタイムラグがあるので、結果的には、内部コマンドでしてしまったほうがよいと考えたのですが、しかし、どうも見栄えが悪いのです。
良いコードは見掛けも良いものだ、といわれますから、どうも、そこらあたりが正解に到達していないのかもしれませんね。最近、どうも雑になっていけませんね。(^^;
それに、Excel2003あたりですと、たぶん、List を使えるのではないか、と思いましたが、今回は、それはありませんからね。
No.3
- 回答日時:
こんな感じで如何でしょうか。
Sub test()
Dim Rng As Range
Set Rng = Range("C3")
With Range("B2:E7")
If Not Intersect(.Cells, Rng) Is Nothing Then
MsgBox Rng.Row - .Cells(1).Row + 1 & "行/" & Rng.Column - .Cells(1).Column + 1 & "列目"
Else
MsgBox "範囲外です。"
End If
End With
Set Rng = Nothing
End Sub
No.2
- 回答日時:
MsgBox (Rng.CurrentRegion.Row & "," & Rng.CurrentRegion.Column)
上記メッセージで2,2が返ってきます。
参考URL:http://t_shun.at.infoseek.co.jp/My_Page/Excel-VB …
Rng.CurrentRegion.RowやRng.CurrentRegion.ColumnではCurrentRegionの一番左上のセルの行と列を返すだけです。
No.1
- 回答日時:
期待されている回答はもっとスマートなものだと思いますが
Rng.Cells(2, 2).Row - Rng.Cells(1, 1).Row + 1
で取得はできると思います。
zap35さん、早速有難うございます。
Rng.Cells(2, 2).Row - Rng.Cells(1, 1).Row + 1でもちろん取得はできるのですが、これってRng.Cells(2, 2)と書いた時点で既に範囲内で2行2列目ってわかっている計算ですよね。
例えば検索等で特定のセルのアドレスがわかった場合、それが表中の何行/何列目であるかを取得したかったのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Visual Basic(VBA) VBAで教えて頂きたいのですが? 1 2022/04/29 02:36
- Excel(エクセル) VBA 1 2023/04/27 13:37
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) Excel VBA 空白行があるセル範囲に色を付ける 3 2022/06/13 15:58
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
- Excel(エクセル) エクセルVBAで次の二つを行いたいのですが思うように動きません。どう修正したらよいのでしょうか? 2 2023/04/22 14:55
- Visual Basic(VBA) エクセル365のVBAで困っています。どう修正したらよいか添削をお願いします 2 2023/05/03 17:35
- Visual Basic(VBA) 最終列の右へSUM関数を作成するため下記コードを実行しましたが、最終列「10月28日」が上書きされて 3 2022/12/05 20:32
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
一番好きなみそ汁の具材は?
みんなで大好きなみそ汁の具材について語り合おうよっ!
-
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
エクセルVBAでシートモジュールでのパブリック変数
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
-
4
subの配列引数をoptionalで使う方法
Visual Basic(VBA)
-
5
excelの列幅高さが勝手に変わる(特定のPCだけ)
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
利用者側のMACアドレスを取得し...
-
VBA:小数点以下の数字を取得で...
-
VB.NETで DataRow()を利用して...
-
ListView 項目の選択/選択解除...
-
VBAでActiveDirectoryのユーザ...
-
VBA リストボックス内の値を複...
-
VBA Shapesの座標からセル位置...
-
like演算子内に変数って使えな...
-
URIでのページの移動について
-
ActiveWorkbook.Path取得できない
-
VB .netにて現在時刻+1時間後...
-
PCインストール済みのアプリケ...
-
ListViewで複数選択された項目...
-
C# 仮想リストビュー
-
既存のアプリのsyslistview32か...
-
DataGridView 複数選択で行番...
-
現在時刻をミリ秒まで取得
-
Spreadの選択行の取得について
-
count(*)で取得した値をJAVAの...
-
エクセルVBAで複数選択できるよ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
ListView 項目の選択/選択解除...
-
VBAでActiveDirectoryのユーザ...
-
VBA:小数点以下の数字を取得で...
-
Flexgridで選択行の列の値を取...
-
利用者側のMACアドレスを取得し...
-
count(*)で取得した値をJAVAの...
-
JavaScriptにおいてコンピュー...
-
like演算子内に変数って使えな...
-
VBA リストボックス内の値を複...
-
データ数をカウントしたいのですが
-
VBA Shapesの座標からセル位置...
-
Spreadの選択行の取得について
-
JavaScriptでWindowsログオンID...
-
ドロップダウンリストの初期表...
-
「Excel VBA」 Webクエリ マク...
-
NTPサーバから時刻を取得する
-
DataGridView 複数選択で行番...
-
ListViewで複数選択された項目...
-
URIでのページの移動について
おすすめ情報