ちょっと気になったので質問します。
セルに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ランキング
-
Excelのマクロについて教えてく...
-
Vba 実数および実数タイプの変...
-
ユーザーフォームに別シートか...
-
VBA レジストリの値の読み方に...
-
エクセルVBAについて
-
VBA listBoxから
-
ExcelのVBAコードについて教え...
-
VBA 複数条件の分岐処理の上手...
-
ExcelのVBAです。フォルダ内の...
-
VBAの計算で@が出てしまう件
-
VB.net(VB)で、フォームにExcel...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
VBAの質問になります Userform内で
-
VBAの質問になります メッセー...
-
Excel マクロについての相談
-
Vba SelStart、SelLen教えてく...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBA 定義されたプロージ...
-
Excel-VBAのmsgBox()の不思議
-
【VBA】マクロの入ったファイル...
-
VBA 複数条件の分岐処理の上手...
-
現在のブックを閉じないで、マ...
-
VBAで各列の"+"と"o"の合計数を...
-
VBAに詳しい方教えてください。
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ユーザーフォームに別シートか...
-
エクセルのマクロについて教え...
-
ExcelVBA シート名を複数セルか...
-
エクセルのマクロについて教え...
-
VBA listBoxから
-
Excelのマクロについて教えてく...
-
エクセルのマクロについて教え...
おすすめ情報