お世話になっています。
.NETでのコーディングを行っています。

標記の件ですが、初めてなので
.NETからなのか、もともとそうなのかは不明なのですが、
プロシージャの引数をOptionalで宣言すると、
省略された時の値を設定する必要がありますよね。

省略可能の引数を配列変数にしたい場合、どのように宣言したら良いのでしょうか?

初期値って言っても、今回省略可能にしたい変数は、
検索結果を格納するための変数ですので、
省略されたときには何の値も入っていなくて良いんです。


宣言部分は以下のとおりです。

Public Function CM_fun_b_Get_WeekdayNm(ByRef Wstr_WeekKb() As String, _
ByRef Wstr_WeekNm() As String, _
ByRef Wstr_WeekNmR() As String) As Boolean

この、Wstr_WeekNmR()を省略可能にしたいのです。

このような場合、どうやって宣言するべきなのでしょうか?
ヘルプを見たのですが、よくわからなくて・・・(;_;)

念のため、省略された時に、何らかの値を設定する方法も知りたいです。
よろしくお願いいたします。

A 回答 (5件)

>ByRefは、呼び出された関数内で値を変えるための変数という認識でよいのでしょうか?


そうですね、呼び出し元のコピー(ByVal)でなく、呼び出し元で渡した変数自身を直接変更するということです。

>取得したい検索結果が3個あり、2つだけ取得したい場合と、3つ全部取得したい場合があります。
そういう場合は、
引数が3つある関数と2つある関数と2つ作っておけば、いいような気がします。
あるいは、
#3の方の言われる様に(註:ByRefでいいです)
Optional ByRef Wstr_WeekNmR() As String = Nothing
optional指定をした場合は、配列の場合nothingしか指定できません。
(なので、質問文で言われるような「省略された時に、何らかの値を設定する方法」(定数の配列?)はありません)
そして、Wstr_WeekNmR is Nothingで省略されたかどうか調べればいいですね。
    • good
    • 0
この回答へのお礼

>(なので、質問文で言われるような「省略された時に、何らかの値を設定する方法」(定数の配列?)はありません)

なるほどです(笑)
今回はNothingでOKですので、希望どおりのことが出来ました。

とても勉強になりました。ありがとうございました。

お礼日時:2005/01/26 14:33

#1です



下記の方法ではいけないのですか?
コーディング上でインテリセンスも出てきますのでスマートだと思いますが...

<既存のメソッドに「Overloads」を加える>
Public Overloads Function CM_fun_b_Get_WeekdayNm(ByRef Wstr_WeekKb() As String, _
ByRef Wstr_WeekNm() As String, _
ByRef Wstr_WeekNmR() As String) As Boolean


<新規メソッドを追加する。既存のメソッドにスルーするように作成する>
Public Overloads Function CM_fun_b_Get_WeekdayNm(ByRef Wstr_WeekKb() As String, _
ByRef Wstr_WeekNm() As String) As Boolean

  Return CM_fun_b_Get_WeekdayNm(Wstr_WeekKb, Wstr_WeekNm, Nothing)

End Function
    • good
    • 0
この回答へのお礼

すみません!!
お礼をしたつもりがすっかり抜けてしまっていました(T.T)

Overloadsをヘルプで読んだのですが、あんまりよくわからなくて・・・_(^^;)ゞ

教えてもらったソースを読んで、しっかり理解したいと思います。ありがとうございました。

お礼日時:2005/01/26 14:35

省略したい引数のところだけ


Optional ByVal 引数() As String = Nothing

> 検索結果を格納するための変数ですので、
> 省略されたときには何の値も入っていなくて良いんです。
結果を返す必要がないときがあるというなら、上記の方法でOK。
配列のdefaultvalueはnothingしか指定できない


ただし、配列の要素に値が入っていなくてもかまわないという理由で「省略可能」といっているなら、それは不可です
    • good
    • 0
この回答へのお礼

有り難うございました。
おかげさまでエラーが出なくなりました。

なるほど。Nothingを指定するのですね。
一生懸命Nullを指定しようとしてました(^_^;)
エラーになりますが・・・。

>配列のdefaultvalueはnothingしか指定できない

なるほど。
・・・まだまだVBの常識というものが
覚えきれていないことを認識しました。

とても勉強になりました。
有り難うございました。

お礼日時:2005/01/25 13:20

>初期値って言っても、今回省略可能にしたい変数は、


>検索結果を格納するための変数ですので、
>省略されたときには何の値も入っていなくて良いんです。
配列変数は、参照型(ByRef)でないといけなくて、
しかも、それが、省略されることがある?
そんなことありえないのでは?(<勘違いだったらすみません)
参照されるべきものが、省略されているとしたら、その参照されるべき実体は、どこにあるのか?
仮に、実体を呼び出された側で作ったとして
省略されているのに、呼び出し元では、どうやって格納される検索結果を呼び出すのか?
とか、納得いきません。
少なくとも検索結果を格納すべき変数なら、省略できないと思います。
    • good
    • 0
この回答へのお礼

説明不足で申し訳ありません。

ByRef、ByValの違いがあんまり理解できていませんので、もしかしたらこれは逆かもしれないです。(ByRefは、呼び出された関数内で値を変えるための変数という認識でよいのでしょうか?)

そして検索結果を格納する変数についてですが、取得したい検索結果が3個あり、2つだけ取得したい場合と、3つ全部取得したい場合があります。

なので、最後の1個だけ省略可能にしたいのです。

お礼日時:2005/01/25 13:05

Public Overloads Function

    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました。
勉強してみます。

お礼日時:2005/01/26 14:35

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QString だと「 ByRef引数の型が一致しません 」というエラーが出ます。なぜ?

ここで「Kaplan-Meyer 生存分析に便利なソフトを教えて」と質問した shuu_01 です。ここで VisualBasic のソースのありかを教えて頂き、自分に使いやすいようソースを書き換えようと奮闘中です(それまで VisualBasic の経験がなく 無謀!と実感中です)。

元々のソースはグラフが1本だけだったので、肺癌だと「腺癌」「扁平上皮癌」「小細胞癌」、、といろんな癌の種類別にグラフを数本 書くのが目標です。そこで、

Sub km_test()
Dim nc As Integer, gr() As String
nc = 2
ReDim gr(nc)
gr(0) = "腺癌"
gr(1) = "扁平上皮癌"
gr(2) = "小細胞癌"
km_group_test nc, gr
End Sub

Sub km_group_test(nc As Integer, gr As String)

End Sub

というソースを書くと:

String の変数 gr の色が変わり、「 ByRef引数の型が一致しません 」というエラーが出ます。
Integer の変数 nc ではエラーが出ません。
きちんと型を一致させているつもりなのに、なぜ???

ここで「Kaplan-Meyer 生存分析に便利なソフトを教えて」と質問した shuu_01 です。ここで VisualBasic のソースのありかを教えて頂き、自分に使いやすいようソースを書き換えようと奮闘中です(それまで VisualBasic の経験がなく 無謀!と実感中です)。

元々のソースはグラフが1本だけだったので、肺癌だと「腺癌」「扁平上皮癌」「小細胞癌」、、といろんな癌の種類別にグラフを数本 書くのが目標です。そこで、

Sub km_test()
Dim nc As Integer, gr() As String
nc = 2
ReDim gr(nc)
...続きを読む

Aベストアンサー

関数の第2変数が文字列なのに、呼び出し側が文字列の配列を渡しているようです。

関数の呼び出し側を
km_group_test nc, gr(1)
とかにするか、関数を
Sub km_group_test(nc As Integer, gr() As String)
とかにしないと、型が違うと思います。

Q配列をループでたくさん宣言したいのですが、配列名や変数名を変数で宣言することはできませんか?

お世話になっております。
タイトル通りの質問です。

日付がファイル名になっているCSVファイルが複数あるのですが、
それをそのまま「array20071020」などという名前の配列に、それぞれ入れて行きたいと思います。ループ処理でなければ出来ないと思うのですが、ループ処理内で配列を宣言していく方法はあるでしょうか。

Aベストアンサー

dim array20071020 as string
dim array20071021 as string
dim array20071022 as string
...
みたいな事をプログラムでと言う事だと思うのですが、多分できないと思います。

で、excelにはcollectionと言う、名前も変数も文字にできるオブジェクトがあるので、
dim csv as new collection
csv.Add loadCsv("20071020"),"20071020"
csv.Add loadCsv("20071021"),"20071021"
csv.Add loadCsv("20071022"),"20071022"
(loadCsvはたとえばの関数です)
と追加しておけば、
str=csv("20071020")
で読み出せます。

collectionのアイテムは、文字とか変数だけではなく、配列やオブジェクトとかを、個々に指定できる点が便利です。
Dim hoge(1, 2) As Integer
hoge(1, 1) = 11
hoge(1, 2) = 12
Dim fumu As New Collection
fumu.Add 123, "20071020"
fumu.Add "abc", "20071021"
fumu.Add hoge, "20071022"
fumu.Add Range("A1:C5"), "20071023"
MsgBox fumu("20071020")
MsgBox fumu("20071021")
MsgBox fumu("20071022")(1, 1)
MsgBox fumu("20071022")(1, 2)
MsgBox fumu("20071023").Rows.Count
MsgBox fumu("20071023").Columns.Count

dim array20071020 as string
dim array20071021 as string
dim array20071022 as string
...
みたいな事をプログラムでと言う事だと思うのですが、多分できないと思います。

で、excelにはcollectionと言う、名前も変数も文字にできるオブジェクトがあるので、
dim csv as new collection
csv.Add loadCsv("20071020"),"20071020"
csv.Add loadCsv("20071021"),"20071021"
csv.Add loadCsv("20071022"),"20071022"
(loadCsvはたとえばの関数です)
と追加しておけば、
str=csv("20071020")
で読み...続きを読む

QVb.netのグローバル変数の宣言の仕方の質問

こんばんわ!
VB6.0からの移行でVB.net2012に挑戦中なんですが、グローバル変数の宣言の仕方で分からないことがあり質問しに着ました!

内容
モジュール内で
public hoge as string="aaa"
と宣言するのと

モジュール内で
public hoge as string
と宣言しておいて
フォーム起動時に
hoge="aaa"
と宣言するのにどのような違いがあるのでしょうか?

hogeの変数を変更したいのですが、上記の方法だと動いて、下記の方法だと動かないのですが・・・
まだ良く分かっていないので、程度の低い質問で申し訳ないのですが、アドバイスのほどよろしくお願いいたします。

Aベストアンサー

> グローバルで変数として一箇所のみで宣言しているのですが、それで別の変数になることはあるのでしょうか?
hoge が本当は text とかなら有り得ます。この場合、フォームの Text プロパティが変更されます。
別のクラスなどを Imports していて、そちらに同名の変数がある場合も有り得るかも知れません。
ただし、スコープが同じ変数が複数あると↓文法エラーが出るはず。
http://msdn.microsoft.com/ja-jp/library/856b0w3t(v=vs.110).aspx
http://msdn.microsoft.com/ja-jp/library/03x63w1z(v=vs.110).aspx

上記の現象の確認には、変数を使用している場所で右クリックメニューから「定義へ移動」で
その変数がどこで宣言されたものを参照しているか分かります。
変数のスコープが狭いものが優先して使用されるため、ローカル宣言や、自分が定義していなくとも
既に VB.NET で宣言されているものとかぶってはだめです。


>意味合い自体は同じであると認識しているのですが、あっていますか?
変数宣言は同じで、初期値が違います。…見たまんまだと思いますが。


>「 public hoge as string」と宣言したhoge
>動かないのは配列の項目数(例えば、hoge_arra(hoge)のように)使用しているのですが
配列の添字を文字列型にするなど話になりません。問題外です。
数値型にして下さい。

> グローバルで変数として一箇所のみで宣言しているのですが、それで別の変数になることはあるのでしょうか?
hoge が本当は text とかなら有り得ます。この場合、フォームの Text プロパティが変更されます。
別のクラスなどを Imports していて、そちらに同名の変数がある場合も有り得るかも知れません。
ただし、スコープが同じ変数が複数あると↓文法エラーが出るはず。
http://msdn.microsoft.com/ja-jp/library/856b0w3t(v=vs.110).aspx
http://msdn.microsoft.com/ja-jp/library/03x63w1z(v=vs.110).aspx
...続きを読む

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

Q変数宣言(Dim)と定数宣言(Const)のメモリ使用量

VS2005で開発しています。
Constで定数宣言したものはソース上でカーソルを当てるとその場で内容を確認できますが、変数で宣言しておくことでメモリ使用量が少なくなると言われました。
そうするといちいち定義まで飛ばないと定数の中身が見れず不便に思っているのですが、本当にメモリ使用量が少なくなるのでしょうか?

Aベストアンサー

・Constはコンパイルしたときに消えるので、そもそもメモリを使っていない。

  Const A As Integer = 1
  Dim B As Integer = A

  コンパイルすると

  Dim B as Interger = 1

変数にするとメモリを使うので、むしろメモリ使用量が増える。

だだし、文字列を複数回使う場合は、Constより変数がいいかな。

  Const C As String = "***************************************************************"
  Dim D As String = C
  Dim E As String = D

  コンパイルすると

Dim D As String = "***************************************************************"
Dim E As String = "***************************************************************"

・Constはコンパイルしたときに消えるので、そもそもメモリを使っていない。

  Const A As Integer = 1
  Dim B As Integer = A

  コンパイルすると

  Dim B as Interger = 1

変数にするとメモリを使うので、むしろメモリ使用量が増える。

だだし、文字列を複数回使う場合は、Constより変数がいいかな。

  Const C As String = "***************************************************************"
  Dim D As String = C
  Dim E As String = D

  コンパイルすると

...続きを読む


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

人気Q&Aランキング

おすすめ情報