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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1071閲覧

VBA 参照について

Hayashi_Jelly

総合スコア26

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2019/05/09 09:21

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

vb

1Sub test() 2 Dim ws As Worksheet 3 Dim rng1 As Range 4 Set ws = Workbooks("hoge.xls").ActiveSheet 5 6 '処理データ 7 Set rng1 = ws.Range(ws.cells(9, 1), ws.cells(9, 7)) 8 9 'get_meisai() では、rng1に合致するデータを 10 'fuga.csv から検索して、検索一致したRangeオブジェクトを取得する 11 'fuga.csv は、マスターから出力された、一次情報に近いデータ 12 Dim rng2 As Range 13 Set rng2 = get_meisai(rng1) 14 15 'fmt_meisai() では、rng2の内容を元とした 16 'rng1のフォーマットのRangeオブジェクトを取得したい。。。 17 Dim rng3 As Range 18 Set rng3 = fmt_meisai(rng1, rng2) 19 20End Sub 21 22 23Function fmt_meisai(ByVal in_rng As Range, ByRef in_rng2 As Range) 24 25 Dim rng As Range 26 Set rng = in_rng 27 28 rng(1, 1) = in_rng2(1, 12) 29 rng(1, 2) = in_rng2(1, 13) 30 rng(1, 3) = in_rng2(1, 14) 31 rng(1, 4) = in_rng2(1, 16) 32 rng(1, 5) = in_rng2(1, 33) 33 rng(1, 6) = in_rng2(1, 2) 34 rng(1, 7) = in_rng2(1, 7) 35 36 set fmt_meisai = rng 37 38End Function 39

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

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

##知りたいこと

  • fmt_meisai()内のrngが値で渡るにはどうすればいいでしょうか?
  • 何故こうなってしまうでしょうか?

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

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

投稿2019/05/09 23:54

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hayashi_Jelly

2019/05/10 00:04

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

0

ベストアンサー

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

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

ExcelVBA

1Sub test() 2 Dim vnt As Variant 3 Dim rng As Range 4 Dim rng3 As Range 5 6 Set rng3 = Sheets("Sheet3").Range("A1").Resize(, 7) 7 With Sheets("Sheet1").Rows(1) 8 rng3.Value = pTest(.Value, .Cells) 9 End With 10End Sub 11 12Function pTest(ByVal v As Variant, ByRef r As Range) As Variant 13 v(1, 1) = r(1, 12).Value 14 v(1, 2) = r(1, 13).Value 15 v(1, 3) = r(1, 14).Value 16 v(1, 4) = r(1, 16).Value 17 v(1, 5) = r(1, 33).Value 18 v(1, 6) = r(1, 2).Value 19 v(1, 7) = r(1, 7).Value & "テスト" 20 21 pTest = v 22End Function

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

投稿2019/05/09 11:17

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hayashi_Jelly

2019/05/10 00:05

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問