- 締切済み
エクセルでマクロを使って絶対参照を相対参照に戻す方法
エクセルにおいて絶対参照に変更する方法はわかったのですが、それを相対参照に戻す方法がわかりません。 Sub tes1() Dim c As Range For Each c In Selection With c If .HasFormula Then .Formula = Application.ConvertFormula(.Formula, xlA1, , xlAbsolute) End If End With Next ですべての範囲を絶対参照にすることができました。 しかし、逆にその絶対参照を全てはずす方法がわかりません。 わかりましたら教えて頂けたらと思います。よろしくお願いします End Sub
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #2の回答者です。 #3さんのおっしゃることで分かりました。 実際、こんなマクロを作ったことはありませんでしたからね。 ただ、私が、#2で考えていることをそのままにしておくと、間が抜けたことを書いているようにしかみえてこないと思いますので、それをコードで表現してみました。主旨が変わるわけではありません。 まず、A1 方式だけの問題に限定しておきます。R1C1方式でも可能だとは思いますが、必要はないだろうと思います。次に、本来、相対座標と絶対座標の融通性がないのではないでしょうか?実用性はありませんが、以下のように文字列として扱うというのが、私の主旨です。別に、そういうマクロコードに、大した実用性があるとは思えません。ただ、Replace やFind メソッドでは、$を抜くのは出来ても、入れるほうがしにくいだろうと思うだけです。 '------------------------------------------- Sub Test1() Static x As Integer 'トグルになっています。 Dim c As Variant Dim rng As Variant Dim ar() As Variant Dim i As Long If Application.ReferenceStyle = xlR1C1 Then MsgBox "R1C1方式では、このマクロは実行できません。", vbExclamation Exit Sub End If x = IIf(x < 2, 4, 1) '4--xlRelatiive; 1 -- xlAbsolute Application.Calculation = xlCalculationManual With ActiveSheet '* A列に対して Set rng = .Range("A1", .Cells(Rows.Count, 1).End(xlUp)) ReDim ar(rng.Count) For Each c In rng If c.HasFormula Then ar(i) = Application.ConvertFormula(c.Formula, xlA1, xlA1, x) Else ar(i) = c.Value End If i = i + 1 Next '最後のindex は、Empty の場合もあるけれど、そのままにします rng.Value = WorksheetFunction.Transpose(ar()) End With Set rng = Nothing Application.Calculation = xlCalculationAutomatic End Sub
- myRange
- ベストアンサー率71% (339/472)
回答1、myRangeです。 ちょと安易な回答をしてしまったようです。(^^;;; 相対から絶対への変換は問題になるところはないのですが、 質問のように、絶対から相対への変換はちょと頭に入れておかなければいけないことがあります。 それは、相対参照は式の入っているセルが基準になる、ということです。 ですから、変換の時は基準になるセルを明示する必要があるということです。 その方法としては、 変換の直前で式のあるセルをselectしておく c.Select か 以下のように第5引数RelativeToを式のあるセルに設定します。 .Formula = Application.ConvertFormula(.Formula, xlA1, , xlRelative, c) これで上手くいくはずです。 以上です。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 xlAbsolute から xlRelative に換えることぐらいはヘルプを見ても分かることなので、質問がヘンだと思いました。 コードを良く見ていただければ分かると思いますが、 ConvertFormula(.Formula, xlA1, , xlAbsolute) .Formula は、文字列ですから、それは単に、'$'を取っているに過ぎません。だから、数式としては、参照箇所がずれるようなことはありえません。 >しかしそれでは参照箇所がずれて戻ってしまったりとうまくできませんでした 実際に、そのようなことが起こりうるのか、言葉だけでは分かりませんから、どのような現象なのか、実際のところを教えていただいたほうが回答が付きやすいかと思います。 絶対座標・相対座標という言葉は、A1方式では中身が見えませんからありませんが、$A$1 とA1 とは、本来は、意味としてはまったく違います。実務上では、ConverFormula というのはめったに使われないのは、絶対参照と相対参照は交換してしまってはいけないことが多いのです。ですから、実務的には使用できるかは、何ともいえないのです。
- myRange
- ベストアンサー率71% (339/472)
第4引数ToAbsolute の定数を、xlAbsoluteからxlRelativeに変えてやればできませんか? .Formula = Application.ConvertFormula(.Formula, xlA1, , xlRelative) 以上です。
お礼
ありがとうございます。しかしそれでは参照箇所がずれて戻ってしまったりとうまくできませんでした