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

エクセルにおいて絶対参照に変更する方法はわかったのですが、それを相対参照に戻す方法がわかりません。

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

A 回答 (4件)

こんにちは。



#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
    • good
    • 0

回答1、myRangeです。


ちょと安易な回答をしてしまったようです。(^^;;;

相対から絶対への変換は問題になるところはないのですが、
質問のように、絶対から相対への変換はちょと頭に入れておかなければいけないことがあります。

それは、相対参照は式の入っているセルが基準になる、ということです。
ですから、変換の時は基準になるセルを明示する必要があるということです。
その方法としては、
変換の直前で式のあるセルをselectしておく
 c.Select 

以下のように第5引数RelativeToを式のあるセルに設定します。

.Formula = Application.ConvertFormula(.Formula, xlA1, , xlRelative, c)
 
これで上手くいくはずです。
以上です。
 
 
    • good
    • 0

こんにちは。



xlAbsolute から xlRelative に換えることぐらいはヘルプを見ても分かることなので、質問がヘンだと思いました。

コードを良く見ていただければ分かると思いますが、
 ConvertFormula(.Formula, xlA1, , xlAbsolute)
.Formula は、文字列ですから、それは単に、'$'を取っているに過ぎません。だから、数式としては、参照箇所がずれるようなことはありえません。

>しかしそれでは参照箇所がずれて戻ってしまったりとうまくできませんでした

実際に、そのようなことが起こりうるのか、言葉だけでは分かりませんから、どのような現象なのか、実際のところを教えていただいたほうが回答が付きやすいかと思います。

絶対座標・相対座標という言葉は、A1方式では中身が見えませんからありませんが、$A$1 とA1 とは、本来は、意味としてはまったく違います。実務上では、ConverFormula というのはめったに使われないのは、絶対参照と相対参照は交換してしまってはいけないことが多いのです。ですから、実務的には使用できるかは、何ともいえないのです。
    • good
    • 0

第4引数ToAbsolute の定数を、xlAbsoluteからxlRelativeに変えてやればできませんか?


 
.Formula = Application.ConvertFormula(.Formula, xlA1, , xlRelative)
 
以上です。
 
    • good
    • 0
この回答へのお礼

ありがとうございます。しかしそれでは参照箇所がずれて戻ってしまったりとうまくできませんでした

お礼日時:2009/07/30 00:33

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