
ちょっと気になったので質問します。
セルにA1形式で文字列として参照が記述されていると、
ワークシートではIndirectなど、VBAではRangeなどでその文字列を受け取って参照できますが、
R1C1形式の相対参照の文字列として記述されていた場合には参照を受け取れるのでしょうか。
Mid関数を使うにしてもR[2]C[2]、RC[1]などと文字数が変わりますから[]内の数値や省略された0を簡単に(条件分岐とかを用いない程度に)抽出することはできないということでしょうか。
Range("R[2]C[2]")あたりも無理なようですし。
No.3ベストアンサー
- 回答日時:
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

ありがとうございます。
A1形式のシート上に =R[2]C[2] と入力してエラーが出ることは確認していましたが、
VBA上で=を付して変換する発想がありませんでした。
ご提示いただいたコード内に他の発見もあり勉強になりました。
No.4
- 回答日時:
No.2 の回答者です。
> 文字列なので = RC[1] ではなくて RC[1] とあるわけです。
> RC[1]
> R[2]C[2]
残念ですが、文字列として、R1C1方式で、相対参照方式で存在するものは、基準点を設けないとA1方式には直りません。相対参照方式は、距離を表しても、位置を表すものではありません。絶対参照でないとできません。
簡単な例を示すと、
ActiveCell が、R2C1 にあるとして、=R[-2]C は、=A1048576
のことです。
ありがとうございました。
一応、盤面の左上が基準とされたものがVBAによって書き込まれたらしいので
(RC[1]という文字列がいま、シート上のどこに存在するかはもはや意味を持たない)、
RC[1] の省略された0を補えば、左上からの0,1という相対位置が再現できそうです。
基準点が左上でなくとも、どうやら同一の基準点らしいので、相対的にはすべての棋譜が再現できると考えています。
明らかに説明不足でした。お手数おかけしました。
No.2
- 回答日時:
> セルに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)
こういう使い方もあります。
もし、具体的な内容がありましたら、ご披露ください。
質問の書き方にわかりづらさがあり、誤解を生じてしまったようです。すみません。
やりたいことは、棋譜の読み取りのようなものです。
A1形式のワークシート上のセルに文字列として RC[1] などと1行に記されています。
文字列なので = RC[1] ではなくて RC[1] とあるわけです。
RC[1]
R[2]C[2]
・
・
と続きます。
これを今A1形式であるところの当環境でVBAを使ってもいいので読み取って、座標を再現したいと思います。
R1C1形式に切り替えるとかVBA上で複雑な式を組み立てて読み取る前に、より簡潔な方法がないかとお知恵を拝借したかった次第でした。
No.1
- 回答日時:
こんにちは
>R1C1形式の相対参照の文字列として記述されていた場合~
関数の設定の入力のことでしょうか?
仮に表示上はA1形式であっても、表示方法を変えればR1C1で表示されますよね?
VBAから参照する場合は、Range.FormulaLocal、Range.FormulaR1C1 として求めたい形式で取得できますので、どちらの形式なのかわからないものを扱うことはまずないと言えるでしょう。
INDIRECTなどの内容を扱おうとするような場合は、元々が文字列ですので、どちらの形式になっているのかを注意する必要が出てきそうですが、それほど多い事ではなさそうな気がします。
>Mid関数を使うにしてもR[2]C[2]、RC[1]などと文字数が変わりますから~
文字数で固定的に扱おうとするのは危険だと思いますよ。
(というか、多分、失敗する可能性が高いと思います)
表示形式に関わらずとも、A8とB125で文字数がかわりますし、$C$20となっていても文字数は変わりますから。
質問の書き方にわかりづらさがあり、誤解を生じてしまったようです。すみません。
やりたいことは、棋譜の読み取りのようなものです。
A1形式のワークシート上のセルに文字列として RC[1] などと1行に記されています。
文字列なので = RC[1] ではなくて RC[1] とあるわけです。
RC[1]
R[2]C[2]
・
・
と続きます。
これを今A1形式であるところの当環境でVBAを使ってもいいので読み取って、座標を再現したいと思います。
R1C1形式に切り替えるとかVBA上で複雑な式を組み立てて読み取る前に、より簡潔な方法がないかとお知恵を拝借したかった次第でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Excel(エクセル) エクセルの数式について ブック内の別シートの値の含まれたセルの個数を集計したい 全シート一覧のシート 1 2022/07/21 19:28
- Excel(エクセル) countif関数について質問 4 2022/06/14 12:11
- Excel(エクセル) エクセルVBAでセルに表示されているとおりの数値を取得したい(時間の計算結果) 1 2022/03/30 17:52
- Excel(エクセル) 列の最終行に新たに入力されたらその値を自動参照 1 2023/01/21 09:59
- Excel(エクセル) エクセルで重複データから重複を削除して指定の列に抽出したい 11 2022/05/11 11:26
- Excel(エクセル) Excel 表の作成について 3 2022/06/16 12:15
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Excel(エクセル) エクセルの書式設定の表示形式で設定した文字を文字列としてコピーしたい 1 2022/12/21 10:41
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】並び替えの範囲が、...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
2つのマクロでチェックボックス...
-
【ExcelVBA】5万行以上のデー...
-
VBAでCOPYを繰り返すと、処理が...
-
エクセルの改行について
-
【ExcelVBA】値を変更しながら...
-
Excel 範囲指定スクショについ...
-
【マクロ】開いているブックの...
-
VBAでセルの書式を変えずに文字...
-
[VB.net] ボタン(Flat)のEnable...
-
vb.net(vs2022)のtextboxのデザ...
-
【マクロ】変数を使った、文字...
-
(EXCEL超初心者)EXCELの関数(ま...
-
VBA レジストリの値の読み方に...
-
エクセルのマクロについて教え...
-
エクセルのVBAコードと数式につ...
-
VBAの「To」という語句について
-
算術演算子「¥」の意味について
-
Vba 型が一致しません(エラー1...
マンスリーランキングこのカテゴリの人気マンスリー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」という語句について
-
【マクロ】値を渡されたプロシ...
おすすめ情報