『期待した値と違うのはなぜ?』(田中)
Private Function Get(rng as range)
Debug.Print rng.Address & ", " & rng.Offset(0, 7).Address & ", " & rng.Item(1).Offset(0, 7).Address End Function
上の関数で "$K$16" を期待していたのですが
結果が以下のようになりました。
$D$16:$G$16, $N$16, $N$16
デバッグするのにこの関数の中身を以下のようにしました。
Private Function Get(rng as range)
Dim r As Range Set r = Range("D16:G16")
Debug.Print r.Address & ", " & r.Offset(0, 7).Address & ", " & r.Item(1).Offset(0, 7).Address Debug.Print rng.Address & ", " & rng.Offset(0, 7).Address & ", " & rng.Item(1).Offset(0, 7).Address End Function
そうすると結果は以下のようになり、
$D$16:$G$16, $K$16:$N$16, $K$16
$D$16:$G$16, $N$16, $N$16
期待した"$N$16"がでてきます。
rng が期待した値にならないのはどうしてですか?
< 使用 Excel:Excel2016、使用 OS:Windows11 >
ファンクションの名前をGetでなく、例えばtestGetとかにしてみてください。 (xyz) 2025/07/22(火) 08:57:08
(田中) 2025/07/22(火) 09:20:53
事象が再現できる、できるだけ短い(つまり別の作業は除いて下さいということです。)ものを
提示してください。
また、テスト用に新しくブックを作成後実施したものを示して下さい。(前回のエラーの影響を排除する目的です)
(xyz) 2025/07/22(火) 09:26:31
対象としているセル範囲のセル結合の有無もきちんと説明してください。
(xyz) 2025/07/22(火) 09:38:38
結合されている場合は offset は使用することができないんですね。
その場合はどうすればいいのでしょうか?
(田中) 2025/07/22(火) 10:48:31
irow = inum Mod val(txbRowNum.Value): icol = Int(inum / val(txbRowNum.Value)) Set GetOffsetRange = rng.Offset(irow * groupsize.row, icol * groupsize.col).Resize(rng.Rows.Count, rng.Columns.Count) ↓ irow = inum Mod val(txbRowNum.Value): icol = Int(inum / val(txbRowNum.Value)) Set GetOffsetRange = rng.Parent.Cells(rng.row + irow * groupsize.row, rng.Column + icol * groupsize.col).Resize(rng.Rows.Count, rng.Columns.Count) (田中) 2025/07/22(火) 11:18:36
解決されたようです。 書いておいたメモを載せておきます。無駄にはしたくないので。
| Private Function Get(rng as range) | | Dim r As Range | Set r = Range("D16:G16") | | Debug.Print r.Address & ", " & r.Offset(0, 7).Address & ", " & r.Item(1).Offset(0, 7).Address | Debug.Print rng.Address & ", " & rng.Offset(0, 7).Address & ", " & rng.Item(1).Offset(0, 7).Address | End Function | そうすると結果は以下のようになり、 | $D$16:$G$16, $K$16:$N$16, $K$16 | $D$16:$G$16, $N$16, $N$16
同じ Range("D16:G16")なのに何故?という疑問なら、そのセルのシートが違う可能性があります。 例えば、 ・呼び出し元はシートモジュールで、 ・呼ばれるほうが標準モジュールに書かれている ような場合、 コードが書かれたシートがアクティブになっていなければ、両者は別のシートのRange("D16:G16")と解釈されます。 つまり、 ・標準モジュールでシートを省略すると、アクティブシートが前提となり、 ・シートモジュールでシートを省略したセルは、アクティブシートと無関係にコードが書かれたシートと見なされる からです。
疑問を解明しようとするなら、きちんと情報を提供しなければなりません。 エラーになるのを承知でコードを載せるなどは、もってのほかですよ。 (xyz) 2025/07/22(火) 11:36:49
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.