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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
「お昼の放送」の思い出
小学校から中学校、ところによっては高校まで お昼休みに校内放送で、放送委員が音楽とかおしゃべりとか流してましたよね。 最近は自分でもラジオができるようになって、そのクオリティもすごいことになっていると聞きます。
-
VBA ユーザーフォームのChangeイベントを停止したい
Access(アクセス)
-
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
-
4
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
5
エクセルVBAでシートモジュールでのパブリック変数
Excel(エクセル)
-
6
EXCEL2013 VBA ListBox 未選択
Excel(エクセル)
-
7
exeファイルの中身を見ることは可能ですか?
フリーソフト
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JAVA 入れ子MAPの取得時の書き...
-
VB.NETで DataRow()を利用して...
-
エクセルVBAで複数選択できるよ...
-
like演算子内に変数って使えな...
-
既存のアプリのsyslistview32か...
-
ディスプレイの表示可能な解像...
-
apacheのrequest_recについてで...
-
VBでFTPサーバ側のファイルの更...
-
ListView 項目の選択/選択解除...
-
ListViewで複数選択された項目...
-
VBAでActiveDirectoryのユーザ...
-
郵便番号検索APIにてget Elemen...
-
VBA:小数点以下の数字を取得で...
-
描画完了のタイミング
-
ExcelVBAを使って、値...
-
i=cells(Rows.Count, 1)とi=cel...
-
【Excel】指定したセルの名前で...
-
Excel VBA、 別ブックの最終行...
-
Excelのマクロについて
-
ユーザーフォームのテキストボ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
ListView 項目の選択/選択解除...
-
VBA:小数点以下の数字を取得で...
-
VBAでActiveDirectoryのユーザ...
-
count(*)で取得した値をJAVAの...
-
JavaScriptにおいてコンピュー...
-
Flexgridで選択行の列の値を取...
-
データ数をカウントしたいのですが
-
like演算子内に変数って使えな...
-
利用者側のMACアドレスを取得し...
-
時間を分に変換するプログラム
-
現在時刻をミリ秒まで取得
-
エクセルVBAで複数選択できるよ...
-
Spreadの選択行の取得について
-
JavaScriptでWindowsログオンID...
-
コンボボックス表示文字列を取...
-
VB .netにて現在時刻+1時間後...
-
NTPサーバから時刻を取得する
-
VBA リストボックス内の値を複...
-
VBA Shapesの座標からセル位置...
おすすめ情報