関数からの返り値を、1~X回取得したいと考えています。
Msgboxで表示させると以下のソースでRetに返り値が入ってきます。
それを配列に入れることってできないのでしょうか?
*****部分に Array()=Ret とやっても、コンパイルエラーで
「配列には当てはまりません」と出てきます。

for i = 1 to X
   ID = ID & i
  Ret =Kansu(hiki1,ID)
   ********************
next i


返り値を個別に変数として使いたい→配列に入れればいいや ・・・という発想が
間違っているのでしょうか?

文字列を分割してその結果を配列に入れて行く、ということはできるのに
もっと単純そうなこれが何故できないのでしょう・・・(涙)。

わかりにくい説明ですみませんが、
どなたかわかる方、教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

質問に『1~X』とあり、Xがどのような性質の変数か分からないので、事前に固定されている場合と変動する場合を書いてみました。

(VBがないのでExcel2000VBEを使っています)

○固定(配列を10個に特定)
  Dim myArray(10) As Long   '配列
  Dim i As Integer      'カウンタ

  Const x = 10

  For i = 1 To x
    myArray(i) = myArray(i - 1) + i  '処理例
  Next
  MsgBox UBound(myArray) & " , " & myArray(x)  '確認


○変動1(配列が何個必要か分からないが実行の途中で決まる場合)
  Dim myArray() As Long   '配列
  Dim i As Integer      'カウンタ
  Dim x As Integer      'カウンタ

  x = 20           '途中で配列の要素数が決まる
  ReDim myArray(x)      '再度定義する

  For i = 1 To x
    myArray(i) = myArray(i - 1) + i  '処理例
  Next
  MsgBox UBound(myArray) & " , " & myArray(x)  '確認


○変動2(最初に配列の要素数(この場合は15)を決めておき、必要なら増やす。)
  Dim myArray() As Long   '配列
  Const intX = 15      '15にしておく
  ReDim myArray(intX)    '再定義
  Dim i As Integer      'カウンタ
  Dim x As Integer      'カウンタ

  x = intX - 5 + Int(Rnd() * 10)  '途中で配列の要素数が決まる

  For i = 1 To x
    If i > intX Then
      'intX=15を超えたら再定義。Preserveで15までは変更なし。
      ReDim Preserve myArray(i)
    End If
    myArray(i) = myArray(i - 1) + i  '処理例
  Next
  ReDim Preserve myArray(x)  '要素数がintXより少なかったら小さくする(必要なら)
  MsgBox UBound(myArray) & " , " & myArray(x)  '確認
    • good
    • 0
この回答へのお礼

大変丁寧な回答、ありがとうございます。
Xは関数の返り値で、その都度変わってしまいます。(0~?までの間)
変動2のパターンを使わせていただきました。

動きました~(←当たり前だ)。ありがとうございます。
ReDim Array(X)のタイミングが悪かったみたいです。

また機会がありましたらよろしくお願いします(ペコリ)。

お礼日時:2002/02/04 10:13

Array()=Ret ではなく、Array(i)=Ret です。


何番目(0~)に入れるかを指定します。

あらかじめ、配列を
Dim Array(配列の大きさ) As Integer
のように宣言しておく必要があります。

文法の解説をしている本や、リファレンスを読んでみてください。

参考URL:http://www.microsoft.com/japan/developer/library …
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
いろいろ調べてみて、Array(i)=Retも試したんですが、
エラーが出てしまいまして・・・。

配列の大きさはその都度変化するので
Dim Array()としておいて
あとからReDim Array(x)と宣言しております。

もう少しいろいろ調べてみます。

お礼日時:2002/02/04 09:30

このQ&Aに関連する人気のQ&A

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

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

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

Q配列を返り値、でエラー

Excelで、ボタンが押されるとファンクションを呼び出し、
指定した文字列を文字列型の配列に格納して返す、
というマクロを作成したいのですが

―Sheet1――――――――――――
Private Sub btn_Click()
Dim inpt(3) As String
inpt = Module1.getArg()
End Sub
――――――――――――――――

―Module1―――――――――――
Function getArg() As String()
Dim ret(3) As String
ret(0) = "1番目"
ret(1) = "2番目"
ret(2) = "3番目"
getArg = ret
End Function
――――――――――――――――

inpt = Module1.getArg()
の部分で「配列には割り当てできません」とエラーが出てしまいます。
色々試してはみたのですが、どうも解決できません。

ヒントだけでも構いませんのでご助力お願いします。

Excelで、ボタンが押されるとファンクションを呼び出し、
指定した文字列を文字列型の配列に格納して返す、
というマクロを作成したいのですが

―Sheet1――――――――――――
Private Sub btn_Click()
Dim inpt(3) As String
inpt = Module1.getArg()
End Sub
――――――――――――――――

―Module1―――――――――――
Function getArg() As String()
Dim ret(3) As String
ret(0) = "1番目"
ret(1) = "2番目"
ret(2) = "3番目"
getArg = ret
End Function
――――――――――――――――

inpt = Module1.getArg(...続きを読む

Aベストアンサー

「配列には割り当てできません」というエラーは
Dim inpt(3) As String
ReDim inpt(4)
とするのと同じエラーですから、
「宣言時に要素数を定義した配列は要素数を変更することができない」
ということですね。
Excel などの VBA では関係ないかもしれませんが、
CやC++では Static 変数や要素数が決まっている配列が割り当てられるメモリ領域と、動的に( VB の ReDim のような方法で)割り当てられるメモリ領域は異なっていて、別々に管理されています。おそらく開発ツールの VB ( VBA ではない)もC/C++と同じメモリ管理手法を取っていると思われるのですが、この仕様はそのあたりから来たものではないかと思います。
( 「VBA では VB とは違って宣言時に要素数を定義した配列を ReDim できる」ようにできなくもないような気もするのですが・・・)

何にしろ、そういう仕様だから、ということには間違いないと思います。

QFor Next 途中で任意の値の時にstopする

任意の値の時にstopするにはどうすればいいでしょう?
Sub test()
Dim i As Long

For i = 1 To 10
'iが3の時にストップさせたい
Next

End Sub

ご教授よろしくお願いします。

Aベストアンサー

If i=3 then stop
を書くか、
ウオッチ式でiの値が3になったら、という条件を書く

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。

QVBA 配列計算について 配列の入力に配列の使用

配列に複数のセル値の合計値を設定したいと思っています。
求める合計値は複数あるため、出力も配列となります。
そこで下記のようにプログラムを考えたのですが、全て同じ値の配列として出力されてしまいます。
VBAではC言語のように配列の古い値に足していくことはできないのでしょうか?

(sum()は0で初期化) (10個飛ばしのデータの合計値を算出)
For i = 0 To 10
For j = 0 To 5
sum(i)= sum(i) + Worksheets(sheetname).Cells(10, 3).Offset(j * 10, 0).Value
Next i
Next j

出力配列例 全て同じ値になってしまいます・・・
1.254
1.254
1.254
・・・

回避方法もしくはうまい計算方法などありませんでしょうか

Aベストアンサー

なにを計算したいんでしょうか?

このコードでは、どのSum(i)にも、
Cells(10,3).Value + Cells(20,3).Value + ・・・・ + Cells(60,3).Value
の値が入るから、同じになるのは当然です。

i ごとにSum(i)を変えたいのなら、
Worksheets(sheetname).Cells(10, 3).Offset(j * 10, 0).Value
の中のどこかに i が入ってないと・・・・

QExcelVBAでClassの返り値について

ExcelVBAにおいて
Set SheetObj = Workbooks("ブック名").Sheets("シート名")
のようにメソッドチェーンで書くことができますがこれをクラスで
真似る場合


Public Function Workbooks(Optional ByVal BookName as Variant = "")
'処理
Set Workbooks = Me
End Function

とすればメソッドチェーンで書けるようになりますが・・・


Set BookObj = Workbooks("ブック名")
のように後ろにメソッドが来なければブックのオブジェクトを返すといったような
挙動をすることはできますでしょうか?


まとめ。
クラスでメソッドチェーンとして使いたい時(後ろにメソッドが控えている時は)
自分自身(Me)を返し、メソッドとして使いたい時は、別の値を返したいなんてことは
可能でしょうか?

Aベストアンサー

イメージだけですが、参考になりますか。

Class1

Private m_Items As Collection

Private Class_Initialize()
Set m_Items = New Collection
End Sub

Public Sub Add(ByVal obj As Class2)
m_Items.Add obj, CStr(obj.Name)
End Sub

Public Property Get Item(Byval vValue As Variant) As Class2
Set Item = m_Items(vVlaue)
End Property

Public Sub Method()
MsgBox "これはClass1のメソッドです"
End Sub

Class2
Private m_Name As String

Public Function Init(Byval strName As String) As Class2
m_Name = strName
Set Init = Me
End Function

Public Property Get Name() As String
Name = m_Name
End Property

Public Sub Method()
MsgBox "これはClass2(" & Name & ")のメソッドです"
End Sub

Sub Try()
Dim o As Class1
Dim oo As Class2

Set o = New Class1

Set oo = New Class2
o.Add oo.Init("1")

Set oo = New Class2
o.Add oo.Init("2")

o.Method

o.Item("1").Method
'上の行は Class1のItemプロパティを既定のプロパティに設定すれば
o("1").Method 'とメソッドチェーンが記述出来ます
'WorkBooks("hoge").WorkSheets・・・・と同じですね

End Sub

oだけならClass1への参照
o. ならClass1のメンバへアクセス
o.Item("1") はClass1が持つItemプロパティ(型はClass2型)によりClass2の参照を得る
Itemを省略可能なプロパティに設定すれば
o("1")だけでClass2への参照が得られる
o("1"). でClass2が持つメンバへアクセス可能になる


コンパイルしてませんので、適宜修正願いますm(_ _)m

イメージだけですが、参考になりますか。

Class1

Private m_Items As Collection

Private Class_Initialize()
Set m_Items = New Collection
End Sub

Public Sub Add(ByVal obj As Class2)
m_Items.Add obj, CStr(obj.Name)
End Sub

Public Property Get Item(Byval vValue As Variant) As Class2
Set Item = m_Items(vVlaue)
End Property

Public Sub Method()
MsgBox "これはClass1のメソッドです"
End Sub

Class2
Private m_Name As String

Public Function Init(Byval strName As Str...続きを読む


人気Q&Aランキング

おすすめ情報