[[20250722082247]] 『期待した値と違うのはなぜ?』(田中) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『期待した値と違うのはなぜ?』(田中)

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:16:40

すみません。
Private Function Get(rng as range) はエラーになるので
Private Function GetRange(rng as range)に変更していました。

(田中) 2025/07/22(火) 09:20:53


コールする側、される側の両方のコードを改めて提示してください。

事象が再現できる、できるだけ短い(つまり別の作業は除いて下さいということです。)ものを
提示してください。
また、テスト用に新しくブックを作成後実施したものを示して下さい。(前回のエラーの影響を排除する目的です)

(xyz) 2025/07/22(火) 09:26:31


 対象としているセル範囲のセル結合の有無もきちんと説明してください。

(xyz) 2025/07/22(火) 09:38:38


D16:G16が結合されていませんか?
上記のセルを結合した状態で呼び出したら
  $D$16:$G$16, $N$16, $N$16
となります。
デバッグ用で正しい結果が出たのはマクロがその時参照しているシートでは結合されていない状態だったのでは。
(abec) 2025/07/22(火) 10:23:39

abecさん
ありがとうございます。
結合されていました。

結合されている場合は offset は使用することができないんですね。
その場合はどうすればいいのでしょうか?

(田中) 2025/07/22(火) 10:48:31


一度cellにしてからoffsetを使わずにするとできました。

    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

すみません。
気を付けます。
(田中) 2025/07/22(火) 12:58:32

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.