質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.79%

VBA 参照について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 451

Hayashi_Jelly

score 21

長いですが、ソースを見て頂いた方が分かりやすいかと思います。

Sub test()
    Dim ws As Worksheet
    Dim rng1 As Range
    Set ws = Workbooks("hoge.xls").ActiveSheet

    '処理データ
    Set rng1 = ws.Range(ws.cells(9, 1), ws.cells(9, 7))

    'get_meisai() では、rng1に合致するデータを
    'fuga.csv から検索して、検索一致したRangeオブジェクトを取得する
    'fuga.csv は、マスターから出力された、一次情報に近いデータ
    Dim rng2 As Range
    Set rng2 = get_meisai(rng1)

    'fmt_meisai() では、rng2の内容を元とした
    'rng1のフォーマットのRangeオブジェクトを取得したい。。。
    Dim rng3 As Range
    Set rng3 = fmt_meisai(rng1, rng2)

End Sub


Function fmt_meisai(ByVal in_rng As Range, ByRef in_rng2 As Range)

    Dim rng As Range
    Set rng = in_rng

    rng(1, 1) = in_rng2(1, 12)
    rng(1, 2) = in_rng2(1, 13)
    rng(1, 3) = in_rng2(1, 14)
    rng(1, 4) = in_rng2(1, 16)
    rng(1, 5) = in_rng2(1, 33)
    rng(1, 6) = in_rng2(1, 2)
    rng(1, 7) = in_rng2(1, 7)

    set fmt_meisai = rng

End Function

fmt_meisai() で、rng1 に含まれるデータ内容を一次情報に近いデータに書き換えたいです。
ただし、rng1には手を加えず、rng3を作成したいです.

fmt_meisai()では、ByValキーワードで、rng1のコピーを渡しているつもりですが、test()fmt_meisai()が実行されると、rng1があるワークシートで値の書き換えが起こってしまいます(参照している)

知りたいこと

  • fmt_meisai()内のrngが値で渡るにはどうすればいいでしょうか?
  • 何故こうなってしまうでしょうか?
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

byvalで渡そうがbyrefで渡そうが、
オブジェクト型の変数には、オブジェクトへの参照が渡されます。
従って、Sheet1のA1セル等は、二つと存在しないし出来ないので、
指定したセルは上書きされます。

値のみを変数に渡すには、Valueプロパティで値だけだよと指示する必要があります。
当然、変数の型はRangeオブジェクトなどではなく、
今回の場合はVariant型の変数で受けることになります。

Sub test()
    Dim vnt As Variant
    Dim rng As Range
    Dim rng3 As Range

    Set rng3 = Sheets("Sheet3").Range("A1").Resize(, 7)
    With Sheets("Sheet1").Rows(1)
        rng3.Value = pTest(.Value, .Cells)
    End With
End Sub

Function pTest(ByVal v As Variant, ByRef r As Range) As Variant
    v(1, 1) = r(1, 12).Value
    v(1, 2) = r(1, 13).Value
    v(1, 3) = r(1, 14).Value
    v(1, 4) = r(1, 16).Value
    v(1, 5) = r(1, 33).Value
    v(1, 6) = r(1, 2).Value
    v(1, 7) = r(1, 7).Value & "テスト"

    pTest = v
End Function

変なサンプルコードですが、ステップ実行しながら、
ローカルウィンドウで、変数の中身を確認してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/10 09:05

    ありがとうございます。よく理解できました

    キャンセル

0

原因はmattuwanさんの回答通りですが、そもそもRangeオブジェクトはシート上のどこかに属している必要があります。
つまりNewで単なるオブジェクトとして作成することはできません。

rng1には手を加えず、rng3を作成したいです

これが出来ないという意味です。
rng3はrng1とは別の独立したオブジェクトを望んでいると思いますが、そういったことはできません。
これができると便利なシーンは数々あるのですがね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/10 09:04

    ありがとうございます。自分もmattuwanさんの回答を見て、ワークシートに属するオブジェクトをコピーするということがおかしいことに気づきました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る