関数からの返り値を、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&Aを見た人が検索しているワード

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

Qフォームのラベルのプロパティを自動で設定したい

Access2013 vba です。

フォームの全てのラベル、テキストボックス、ボタン類をそれぞれの背景色や、テーマ、背景スタイルなどを設定したいのですが、どうやれば、全てのラベル、テキストボックス、ボタンなどを自動でループ処理で取得出来ますでしょうか。

よろしくお願いします。

Aベストアンサー

フォームをデザインビューで開く必要があります。で、保存。
windowmode は適当に。
標準モジュールで
docmd.OpenForm "formName",view:=acDesign,windowmode:=acHidden
forms!formName!ラベル2.backcolor = vbred
docmd.Close acForm ,"formName",save:=acSaveYes

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 できる」ようにできなくもないような気もするのですが・・・)

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

QVBA:ユーザフォームのラベルの指定の仕方教えてください。

 今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。
 Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?
 やはり、UserForm1.Label3などのように番号をきちんと書かないとダメでしょうか?本当は、ラベルが82個ありその一つ一つにコードを割り当てるのが大変です。また、きれいなコードで書きたいと思うからです。宜しければ、ご教授願います。
--------------------------------------------
Sub セルの値をラベル表示する()
For i = 1 To 20
With UserForm1.Label(i)
.Caption = Cells(1, i)
End With
Next i
End Sub

 今、ユーザフォームに20個のラベルがあります。それぞれのラベルは、条件によりラベルの表示内容が変更します。そこで、ラベルの表示変更が必要なときにすぐに変更できるようにしたいと考えています。しかし、例えば以下のようなコードを作成するとエラーになり困っています。
 Label(i)で、iの番号によりラベルが呼び出されないだろうかと自分なりに作りましたがダメでした。以下のようなループ文中で特定のラベルを呼び出し処理することは不可能でしょうか?
 やはり、UserForm1.Label3などのように番号...続きを読む

Aベストアンサー

 Excel VBAではコントロール配列はサポートされていませんが、ラベルの名前をLabel1, Label2,・・・ Label20とすると、以下のコードでほぼ同じことを実現できます。

Sub セルの値をラベル表示する()
 For i = 1 To 20
  With UserForm1.Controls("Label" & i)
   .Caption = Cells(1, i)
  End With
 Next i
End Sub

QVBA array()関数 配列の使い方について

VBAを学習しており、最近配列という仕組みを知り勉強中です。

array関数の使い方をいくつかサイトを見て回っているのですが、
実務として理解するのに躓いております。

要素の追加は直接指定しかないのでしょうか?
要素が多数ある場合などの使用例がわかりません。
ループやリスト参照等で格納することは可能なのでしょうか?
それとも他の関数を使用するのでしょうか?

Dim A As Variant
A = Array(10,20,30) ’・・・・100までなど多数の場合は?
B = A(2)

Aベストアンサー

No2です。
Array関数を使うのは、配列を作るときに、同時に初期値(配列の内容)も生成したい場合です。
従って、100個のデータを全て指定するのは、余り実用的ではありません。
従って、配列の要素の数が少なく、しかも、配列生成時に、同時に初期値も格納したい場合のみ、Array関数を使うべきです。
そうでないなら
Dim A(100) as String
Dim B(1000) as Long
のように配列を宣言すべきです。
尚、配列の要素数が事前に決められない場合は、
(例えば、テキストファイルを読み込み1行を1つの要素に格納したい場合、それが何行あるかは、ファイルを読み込んでみないと判らない)
Dim C() as Stringのように()内に数値を記入しないで宣言します。
(この使い方はテクニックが多少必要なので自分で調べてください。それでも判らない場合は質問してください)

Qエクセルグラフの軸ラベルを一括変換出来なくて困っています。

お世話になります。
初めて投稿いたします。

VBA初心者です。エクセルグラフの軸ラベルを一括変換したいのですが、分からなくて困っています。

過去ログ、個人HPなどを参考にして、一つのグラフを選択、下記マクロを実行すれば、一つのグラフのみなら軸ラベルを変更する事が出来たのですが、ワークシート内の複数の埋め込みグラフを一発でラベル変更する場合のマクロが作成できません。

当方会社員、データをまとめる為、今回100ヶほどのグラフを一括変換したいため、どうしてもマクロ処理したいと考えています。
For Each・・・Next でループさせたいのですが、何分初心者勉強中の為、エラー多発、何方かお分かりの方、お助け下さい。


Sub 軸ラベル一括変換()
With ActiveChart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
End Sub

お世話になります。
初めて投稿いたします。

VBA初心者です。エクセルグラフの軸ラベルを一括変換したいのですが、分からなくて困っています。

過去ログ、個人HPなどを参考にして、一つのグラフを選択、下記マクロを実行すれば、一つのグラフのみなら軸ラベルを変更する事が出来たのですが、ワークシート内の複数の埋め込みグラフを一発でラベル変更する場合のマクロが作成できません。

当方会社員、データをまとめる為、今回100ヶほどのグラフを一括変換したいため、どうしてもマクロ処理したいと考え...続きを読む

Aベストアンサー

こんなのではどうでしょうか?

ActiveSheetの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim co As ChartObject
For Each co In ActiveSheet.ChartObjects
With co.Chart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
Next
End Sub

全シートの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim ws As Worksheet
Dim co As ChartObject
For Each ws In ThisWorkbook.Worksheets
For Each co In ws.ChartObjects
With co.Chart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
Next
Next
End Sub

こんなのではどうでしょうか?

ActiveSheetの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim co As ChartObject
For Each co In ActiveSheet.ChartObjects
With co.Chart
With .Axes(xlCategory, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "X"
End With
With .Axes(xlValue, xlPrimary)
.HasTitle = True
.AxisTitle.Text = "y"
End With
End With
Next
End Sub

全シートの全グラフを変更する場合
Sub 軸ラベル一括変換()
Dim ws As Worksheet
Dim co As ChartObject
For Eac...続きを読む

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ループ中にlabel_clickの読み込みを認識する

開発環境はMicrofoft visual stdio 2005 で開発言語はC#を使い、Windousアプリケーションでプログラミングしているのですが
ループ中に、ラベルがクリックされたことを認識したいのです。ソースで説明すると
private void Form1_Load(object sender, EventArgs e)
{
  while(1)
  {
    if(label1がクリックされたら・・・)
    {
    }
    else if(label2がクリックされたら・・・)
    {
    }
  }
}
このようなif文を書きたいのですが、よい方法はないでしょうか?
よければ御知恵を貸してください。よろしくおねがいしますm(__)m

Aベストアンサー

あるプロシージャの中でループしているときに他のコントロールでのイベントを認識させるなら Application.DoEventsなどを呼び出してWindowsのメッセージポンプを機能させましょう

LabelのClickイベント自体は別途記述して そのフォームクラスのフィールドにクリックされたのかどうかを記憶しておきます

そのループ処理中でフィールドをチェックするようにすればいいと思います

boolean lbl1Click= false, lbl2Click = false;
などと宣言しておいて

void lblClick( s as object, e as Eventargs )
{
  Label lbl = (Label)s;
  if ( lbl.Name == "label1 )
  {
    lbl1Click = true;
  }
  esle if ( lbl.Name == "label2" )
  {
    lbl2Click = true;
  }
}
といった具合でクリックイベントを処理します

ループ処理側では
while( 1 )
{
  Application.DoEvents();
  if ( lbl1Click )
  {
    // Label1がクリックされた場合の処理
  }
  else if( lbl2Click )
  {
    // Label2がクリックされた場合の処理
  }
}
といった具合でしょう …

あるプロシージャの中でループしているときに他のコントロールでのイベントを認識させるなら Application.DoEventsなどを呼び出してWindowsのメッセージポンプを機能させましょう

LabelのClickイベント自体は別途記述して そのフォームクラスのフィールドにクリックされたのかどうかを記憶しておきます

そのループ処理中でフィールドをチェックするようにすればいいと思います

boolean lbl1Click= false, lbl2Click = false;
などと宣言しておいて

void lblClick( s as object, e as Eventargs )
{
...続きを読む

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
などとすることで、動作するのではないかと推測します。

Qワードの連番のラベル名が消える

ワード2003+XPです。
連番機能で、三種類のラベルA,B,Cに対して連番を作成しました。
保存後に開くといつの間にか、ラベルAが全てラベルBに変わり、元のAとBが区別なく連番がつきました。

フィールドコードを見ると元は
ラベルA・・・・・ SEQ ラベルA・・・・
ラベルB・・・・・ SEQ ラベルB・・・・
ラベルC・・・・・ SEQ ラベルC・・・・
だったものが、何故か、

ラベルA・・・・・ SEQ ラベルA・・・・
が全て
ラベルB・・・・・ SEQ ラベルB・・・・
に変わっています。
オフィスと自宅で文書作成をしておりどこで変わったのかわからないのです。
どなたか原因について心当たりあれば教えてください。
手動で、もとに戻しましたが、再発を防止したいので。

Aベストアンサー

図表番号がおかしい動作をするのですね。
もしかしたらWord2000を使っていませんか?

例えば、変更履歴を使っていませんか?
[WD2000] クロスリファレンス、図表番号の番号が異なる
http://support.microsoft.com/kb/252619/ja

それ以外の原因だとこちら↓とか。
http://support.microsoft.com/kb/252619/ja
http://support.microsoft.com/kb/211707/ja

どれもWord2000の不具合のようなのですが、私はWord2000を触る程度に
扱ったことがありますが、現時点での対処方法はサポートページにある
ものを紹介する以外にアドバイスはできません。他のバージョンの場合
ならWordのバージョンを補足されてはいかが。

Word2007を使っている場合だと、私はまったく門外漢ですので補足への
追加回答はほとんどできないと思います。
(他のバージョンでも専門家ではないので門外漢は不適切な使い方かも)

とりあえず変更履歴を使わないとか、[ SEQ ]フィールドを[図表番号]
からではなく直接フィールドコードから入力するとかの手動で対応する
とかで対応ことになるようですが。
(確実な対処方法ではないし、適切なアドバイスでもありませんが)

図表番号がおかしい動作をするのですね。
もしかしたらWord2000を使っていませんか?

例えば、変更履歴を使っていませんか?
[WD2000] クロスリファレンス、図表番号の番号が異なる
http://support.microsoft.com/kb/252619/ja

それ以外の原因だとこちら↓とか。
http://support.microsoft.com/kb/252619/ja
http://support.microsoft.com/kb/211707/ja

どれもWord2000の不具合のようなのですが、私はWord2000を触る程度に
扱ったことがありますが、現時点での対処方法はサポートページにある
もの...続きを読む

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 が入ってないと・・・・


人気Q&Aランキング