過去ログ

                                Page     496
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼引数について  かっくん 03/1/1(水) 19:10
   ┣Re:引数について  JuJu 03/1/1(水) 19:20
   ┣Re:引数について  Jカーター 03/1/1(水) 20:08
   ┃  ┗Re:引数について(さらに追加)  りん 03/1/3(金) 0:01
   ┃     ┣Re:引数について(さらに追加)  Jカーター 03/1/3(金) 6:30
   ┃     ┗Re:引数について(さらに追加)  ごんぼほり 03/1/4(土) 9:39
   ┗Re:引数について  かっくん 03/1/1(水) 20:31

 ───────────────────────────────────────
 ■題名 : 引数について
 ■名前 : かっくん
 ■日付 : 03/1/1(水) 19:10
 -------------------------------------------------------------------------
   下記のような関数を作りましたが
    fMaru (365,250)
のように書いて呼び出そうとするとエラーになってしまいます。
いろいろ、試したのですが、引数をひとつにすると動きます。
何が問題なのでしょうか?
よろしくお願いいたします。

Public Sub fMaru(vX As Integer, vY As Integer)
'希望位置に丸をつける関数

  ActiveSheet.Shapes.AddShape(msoShapeOval, vX, vY, 24.75, 16.5).Select
  Selection.ShapeRange.Fill.Visible = msoFalse

End Sub
 ───────────────────────────────────────  ■題名 : Re:引数について  ■名前 : JuJu <juju-bbs@su-u.com>  ■日付 : 03/1/1(水) 19:20  -------------------------------------------------------------------------
   かっくんさん、あけましておめでとう^^;

>下記のような関数を作りましたが
>    fMaru (365,250)

 fMaru 365, 250
と呼び出してください。
それか、
 Call fMaru (365, 250)
でも良いと思います。

ではではぁ
 ───────────────────────────────────────  ■題名 : Re:引数について  ■名前 : Jカーター  ■日付 : 03/1/1(水) 20:08  -------------------------------------------------------------------------
   >いろいろ、試したのですが、引数をひとつにすると動きます。
横からすいません。
使い方によっては
Callのあるなしで結果が違うので注意が必要です。


Option Explicit

Public Sub XXX(n As Long)
  n = 100
End Sub

Sub test1()
  Dim i As Long
  i = 50
  
  XXX (i)
  MsgBox i
End Sub

Sub test2()
  Dim i As Long
  i = 50
  
  Call XXX(i)
  MsgBox i
End Sub

test1とtest2はどちらもXXXを実行していますが結果が違います。
Callなしで引数を括弧で囲むと値渡しになってしまうためです。
引数ひとつでもCallの使用をおすすめします。
おじゃましました。
 ───────────────────────────────────────  ■題名 : Re:引数について(さらに追加)  ■名前 : りん <rin_doggie@hotmail.com>  ■日付 : 03/1/3(金) 0:01  -------------------------------------------------------------------------
   Jカーターさん、こんばんわ。

>>いろいろ、試したのですが、引数をひとつにすると動きます。
>横からすいません。
>使い方によっては
>Callのあるなしで結果が違うので注意が必要です。

>Public Sub XXX(n As Long)
>  n = 100
>End Sub
>
>Sub test1()
 略
>End Sub
>
>Sub test2()
 略
>End Sub
>
Sub test3()
  Dim i As Long
  i = 50
  'JuJuさんのやり方としてはこんな感じ(Callも括弧も省略)
  XXX i
  MsgBox i
End Sub

Callのヘルプより
引用開始===========
プロシージャを呼び出すとき、キーワード Call は省略できます。
キーワード Call を使って、引数が必要なプロシージャを呼び出す場合は、引数リスト (引数 argumentlist) をかっこで囲む必要があります。
キーワードCallを省略するときは、引数リストを囲むかっこも省略しなければなりません。
引用終了===========

>Callなしで引数を括弧で囲むと値渡しになってしまうためです。
 引数が2つ以上だと起こらないエラーですね(その前に構文エラーが発生)。
 Callを省略して括弧を省略し忘れると結果が変わるというのは、バグかな?
それとも仕様かな?
 ───────────────────────────────────────  ■題名 : Re:引数について(さらに追加)  ■名前 : Jカーター  ■日付 : 03/1/3(金) 6:30  -------------------------------------------------------------------------
   > Callを省略して括弧を省略し忘れると結果が変わるというのは、バグかな?
>それとも仕様かな?
おはようございます。
たぶん仕様と思われます。(理由はわかりませんが)
 ───────────────────────────────────────  ■題名 : Re:引数について(さらに追加)  ■名前 : ごんぼほり  ■日付 : 03/1/4(土) 9:39  -------------------------------------------------------------------------
   こんにちわ

>>Callなしで引数を括弧で囲むと値渡しになってしまうためです。
> 引数が2つ以上だと起こらないエラーですね(その前に構文エラーが発生)。
> Callを省略して括弧を省略し忘れると結果が変わるというのは、バグかな?
>それとも仕様かな?

私見ですが

Call をつける場合は、引数リスト全体を()で囲わなくてはなりませんから、
XXX (i)
と書いたらば、これは
Call XXX ((i))
とおなじであると解釈すべきではないかと思います。

この時、内側の()は、式の一部とみなされてしまうので、
サブプロシジャには、変数iが参照渡しでわたるのではなくて、
(i)という式の演算結果が値渡しでわたっていると考えられます。
すなわち、
Call XXX ( i*1 )
としたときと同様に、変数iには値が返ってこないです。

ということで、至極まっとうな仕様であると私は理解しています。
 ───────────────────────────────────────  ■題名 : Re:引数について  ■名前 : かっくん  ■日付 : 03/1/1(水) 20:31  -------------------------------------------------------------------------
   jujuさん
早速の回答ありがとうございました。

Jカーターさん
詳しい説明ありがとうございました。

お二人のレスにてこの件解決できました。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 496