プロが教える店舗&オフィスのセキュリティ対策術

ちょっと気になったので質問します。

セルにA1形式で文字列として参照が記述されていると、
ワークシートではIndirectなど、VBAではRangeなどでその文字列を受け取って参照できますが、
R1C1形式の相対参照の文字列として記述されていた場合には参照を受け取れるのでしょうか。

Mid関数を使うにしてもR[2]C[2]、RC[1]などと文字数が変わりますから[]内の数値や省略された0を簡単に(条件分岐とかを用いない程度に)抽出することはできないということでしょうか。
Range("R[2]C[2]")あたりも無理なようですし。

A 回答 (4件)

No1です



>これを今A1形式であるところの当環境でVBAを使ってもいいので読み取って、座標を再現したいと思います。
どの程度のバリエーションがあるのか(絶対参照、相対参照など)不明ですが、簡単そうなのは、エクセルに解釈させて変換してもらう方法でしょうか。
勿論、R1C1形式を解釈してA1形式に変換するプログラムを作成しても良いのですが、エクセルにやらせる方が簡単そうでしたので・・・

以下は、そんな一例です。
簡略化のため、元のテキスト(=参照アドレス)が正しいR1C1形式になっているかなどのチェックは行っていません。
そのままエクセルに解釈させて結果を求めているだけのものです。

サンプル(=添付図)では、A列に元のアドレスが存在すると仮定して、それが「A列に設定されていた場合に参照先となるはずのアドレス」をA1形式に変換してB列に表示するものです。
ご参考にでもなれば。

Sub Sample()
Dim c As Range, s As String, f As String

For Each c In Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
 If c.Value <> "" Then
  s = c.Text
  On Error Resume Next
  c.FormulaR1C1 = "=" & s
  f = c.FormulaLocal
  If Err.Number > 0 Then f = "##ERROR!"
  If IsError(c.Value) Then f = c.Text Else f = Mid(f, 2)
  c.Value = s
  c.Offset(0, 1).Value = f
 End If
Next c
End Sub
「ExcelVBAでセルにあるR1C1形式」の回答画像3
    • good
    • 0
この回答へのお礼

ありがとうございます。

A1形式のシート上に =R[2]C[2] と入力してエラーが出ることは確認していましたが、
VBA上で=を付して変換する発想がありませんでした。

ご提示いただいたコード内に他の発見もあり勉強になりました。

お礼日時:2019/12/18 12:29

No.2 の回答者です。


> 文字列なので = RC[1] ではなくて RC[1] とあるわけです。
> RC[1]
> R[2]C[2]

残念ですが、文字列として、R1C1方式で、相対参照方式で存在するものは、基準点を設けないとA1方式には直りません。相対参照方式は、距離を表しても、位置を表すものではありません。絶対参照でないとできません。

簡単な例を示すと、

ActiveCell が、R2C1 にあるとして、=R[-2]C は、=A1048576
のことです。
    • good
    • 0
この回答へのお礼

ありがとうございました。

一応、盤面の左上が基準とされたものがVBAによって書き込まれたらしいので
(RC[1]という文字列がいま、シート上のどこに存在するかはもはや意味を持たない)、
RC[1] の省略された0を補えば、左上からの0,1という相対位置が再現できそうです。

基準点が左上でなくとも、どうやら同一の基準点らしいので、相対的にはすべての棋譜が再現できると考えています。

明らかに説明不足でした。お手数おかけしました。

お礼日時:2019/12/18 12:36

> セルにA1形式で文字列として参照が記述されていると、


> ワークシートではIndirectなど、VBAではRangeなどでその文字列を受け取って参照できますが、
> R1C1形式の相対参照の文字列として記述されていた場合には参照を受け取れるのでしょうか。

具体的にどういうことなのでしょうか。
> Range("R[2]C[2]")あたりも無理なようですし。
ここから想像できるのは、A1方式の"C3" を取り出すのは、簡単なことです。
そういう使い方という事自体、まれですが。

R1C1方式のシート上で、A1に相当する位置に
=R[2]C[2]

Sub Test1()
Dim fml As String
If Range("A1").HasFormula Then
  fml = Range("A1").FormulaLocal 'シートの表示はどちらでも構わない
End If
MsgBox Mid(fml, 2)
End Sub

C3 と取り出せます。

adr = Range("A1").DirectPrecedents.Address(0, 0)
こういう使い方もあります。

もし、具体的な内容がありましたら、ご披露ください。
    • good
    • 0
この回答へのお礼

質問の書き方にわかりづらさがあり、誤解を生じてしまったようです。すみません。

やりたいことは、棋譜の読み取りのようなものです。
A1形式のワークシート上のセルに文字列として RC[1] などと1行に記されています。
文字列なので = RC[1] ではなくて RC[1] とあるわけです。
RC[1]
R[2]C[2]


と続きます。

これを今A1形式であるところの当環境でVBAを使ってもいいので読み取って、座標を再現したいと思います。
R1C1形式に切り替えるとかVBA上で複雑な式を組み立てて読み取る前に、より簡潔な方法がないかとお知恵を拝借したかった次第でした。

お礼日時:2019/12/18 01:21

こんにちは



>R1C1形式の相対参照の文字列として記述されていた場合~
関数の設定の入力のことでしょうか?
仮に表示上はA1形式であっても、表示方法を変えればR1C1で表示されますよね?

VBAから参照する場合は、Range.FormulaLocal、Range.FormulaR1C1 として求めたい形式で取得できますので、どちらの形式なのかわからないものを扱うことはまずないと言えるでしょう。
INDIRECTなどの内容を扱おうとするような場合は、元々が文字列ですので、どちらの形式になっているのかを注意する必要が出てきそうですが、それほど多い事ではなさそうな気がします。

>Mid関数を使うにしてもR[2]C[2]、RC[1]などと文字数が変わりますから~
文字数で固定的に扱おうとするのは危険だと思いますよ。
(というか、多分、失敗する可能性が高いと思います)
表示形式に関わらずとも、A8とB125で文字数がかわりますし、$C$20となっていても文字数は変わりますから。
    • good
    • 0
この回答へのお礼

質問の書き方にわかりづらさがあり、誤解を生じてしまったようです。すみません。

やりたいことは、棋譜の読み取りのようなものです。
A1形式のワークシート上のセルに文字列として RC[1] などと1行に記されています。
文字列なので = RC[1] ではなくて RC[1] とあるわけです。
RC[1]
R[2]C[2]


と続きます。

これを今A1形式であるところの当環境でVBAを使ってもいいので読み取って、座標を再現したいと思います。
R1C1形式に切り替えるとかVBA上で複雑な式を組み立てて読み取る前に、より簡潔な方法がないかとお知恵を拝借したかった次第でした。

お礼日時:2019/12/18 01:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!