電子書籍の厳選無料作品が豊富!

以下コードは動くのですが、受けとりで動きます

【受取】
Sub あいうえお(wb1 As Workbook, ws1 As Worksheet)
【実行】
ws1.Cells(1, 1) = "あいうえお"

しかし
受取の変数をa、bに変えると、動かなくなります

参照渡しについて、ネットで調べると、ほとんどの事例が
受取時には変数の名前を変えています

ゆえに、受取時の変数の名前を変更しても動くとは思います
なぜ、受取時の変数の名前を変えて動かなくなるのでしょうか?


【参考、リンク】
http://officetanaka.net/excel/vba/tips/tips94.htm

【受取】
Sub あいうえお(a As Workbook, b As Worksheet)




【変数】
Workbook(マクロブック以外の別のブックが変数として格納)
Worksheet)(別シートが格納)



【コード】
Sub 別ブックへ転記()


Dim filepath1 As String

Dim wb1 As Workbook

Dim ws1 As Worksheet


filepath1 = ThisWorkbook.Worksheets("Sheet1").Cells(141, 1)

Set wb1 = Workbooks.Open(filepath1)

Set ws1 = wb1.Worksheets("Sheet1")

Dim buf As String

Call あいうえお(wb1, ws1)

End Sub
Sub あいうえお(wb1 As Workbook, ws1 As Worksheet)



ws1.Cells(1, 1) = "あいうえお"


End Sub

A 回答 (2件)

> ちなみに、変数の名前を変更しないで、同じ変数名にて


> 受け取ってもいいのですか???

参照の話は置いといて。
関数の引数として受け取った変数は、関数の中のみ有効です。
関数の外に影響を与えないので、同じ変数でもOKです。


変数のスコープ、有効な範囲とかって考え方です。
webとかで
「vba 変数 スコープ」
「vb 変数 スコープ」
とかで解説記事探して読んでみるとか。
VBAより、プログラミングに突っ込んだ話なので、VBのキーワードで調べるのが良いかも。

ちゃんとした解説はMicrosoft Learnだけど、基本英文からの自動翻訳だし、用語とかも含めて分かりにくい。自分もよう読まん。
ぱっと見分かりやすそうな記事は探せなかった。

--
差し当たりの問題は、
Option Explicit
で解決すると思う。

というか、これ書いてないソースは信頼できないし、これ追記してエラーが出るようになるならそもそもダメだ。
    • good
    • 0

> しかし


> 受取の変数をa、bに変えると、動かなくなります

Sub あいうえお(wb1 As Workbook, ws1 As Worksheet)
 ws1.Cells(1, 1) = "あいうえお"
End Sub

Sub あいうえお(a As Workbook, b As Worksheet)
 ws1.Cells(1, 1) = "あいうえお"
End Sub

こうするってこと?
そりゃ、a, bを受け取った後、a, bに対して何もしないんだから、a, bや参照先の内容変わらないのが正しい動作。


関数の引数を変更したいのなら、

Sub あいうえお(a As Workbook, b As Worksheet)
 a.Cells(1, 1) = "あいうえお" ' ←ws1でなくてaを処理する
End Sub

とすべき。
関数外部でグローバル変数としてaを使ってるとかだとややこしいけど。

--
VB、VBAではデフォルトだと変数を宣言しなくても使えるから、上の場合関数に渡されていないws1も「ああ、新しい変数のws1ね」って解釈されて、エラーにならずに処理される。
お気軽な仕様。


モジュールの先頭に、

Option Explicit

書くと、変数の宣言を強制してくれて、そういうのはエラー扱いしてくれる。
まさに、↓の記事で言う所の「間違い」してる。

Excel VBA 環境によるグラフィックス機能を活用したプログラミング入門 - 変数の宣言を強制する
https://katakago.sakura.ne.jp/pgm/vba/pgm01/expl …

| VBAでは、変数は宣言せずに使用することができます。しかし、変数名を宣言せずに使用すると間違いに気づきにくくなります。
    • good
    • 0
この回答へのお礼

以下、理解しました。ありがとうございます
ちなみに、変数の名前を変更しないで、同じ変数名にて
受け取ってもいいのですか???

NETで調べる、変数、受け渡しは全て違う名前に変数をしているので
変数を渡す 受け取る時は あえて、違う名前にするのが

お作法なのかなぁと思ってしまいます


【同じ変数の名前にて受け取る】
Sub あいうえお(wb1 As Workbook, ws1 As Worksheet)

>お返事ありがとうございますそりゃ、a, bを受け取った後、a, bに対して何>もしないんだから、a, bや参照先の内容変わらないのが正しい動作。

お礼日時:2025/02/16 10:06

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A