アプリ版:「スタンプのみでお礼する」機能のリリースについて

独学でVBAを学んだ者です。
専門用語などが分からない部分がありますが、質問させてください。

処理の流れ
Do~Loop中に変数を使ってROUNDDOWN関数を相対参照でセルにセットし、最後に$を置換して相対参照にして並べ替えます。
置換ができる時とできない時があり、並べ替えた時に絶対参照になっていて、セル参照がぐちゃぐちゃになってしまします。
下記どちらかで問題を解消したいです。
①相対参照で関数をセット
②置換コードが無視される原因

Do
 ’セルにROUNDDOWN関数をセット
 Cells(IY, 12).Formula = "=" & "ROUNDDOWN(" & Cells(IY, 8).Address & "*" & Cells(IY, 11). Address & ",0)"
Loop

’$を置換
Range("B4:P" & IY - 1).Replace What:="$", Replacement:="", LookAt:=xlPart, MatchCase:=True
’並び替え
Range("B4:P" & IY - 1).Sort key1:=Range("D4"), order1:=xlAscending, Header:=xlYes

知恵を貸していただければと存じます。
よろしくお願い申し上げます。

A 回答 (1件)

こんにちは



何をどうしたいのかよくわかりませんけれど・・・

>並べ替えた時に絶対参照になっていて、セル参照がぐちゃぐちゃになってしまします。
一般的に、相対参照の関数がセットされたセルを並び替えると、セル位置が移動することで参照先が変わってしまうため、並び替え結果が意図通りならないことが多いはずです。
(手動でいろいろテストしてみればわかると思います)

普通にイメージされる並び替えであるなら、相対参照関数の場合は値を固定化しておく必要があります。
簡単な方法として、
・絶対参照にする
・コピー → 値をペーストなどで値にする
などでしょうか・・・
対象セルの内容を変更したくない場合は、別に作業列を設けてそちらで値を固定化して、その列をkeyにして並べ替えた上で削除してしまえば、元の値は保持できます。(とは言え、相対参照だと値が変わる可能性は大ですが)


以下は、ご質問と関係あるか無いかも不明ですが・・・
>Do
> ’セルにROUNDDOWN関数をセット
なんとなく、「相対参照の式のセット」が目的のように思えるのですが、もしそうなら、ループや置き換えをしなくても、簡単に設定可能です。
例えば、B1:B10に同じ行のA列への参照式を設定したい場合、
 Range("B1:B10").FormulaLocal = "=A1"
とすることで、まとめて設定ができます。

また、ADDRESS属性は
 Range().Address() では絶対参照
 Range().Address(0, 0) では相対参照
のアドレスを返しますので、わざわざ置き換える必要も無いように思います。
https://docs.microsoft.com/ja-jp/office/vba/api/ …
    • good
    • 0
この回答へのお礼

質問が下手で申し訳ありませんでした。
はい、おっしゃる通り「相対参照の式のセット」が目的でした。
ADDRESS属性についてもありがとうございます!
使い方が分かりませんでしたが、.Addressの後ろに(0, 0)で相対参照になりました!
ありがとうございました。

お礼日時:2019/11/11 16:49

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