Split関数のように動的配列に値を返す関数を作成しようとしているのですが、
作り方が全くわからず途方に暮れています。

Function 関数名()(引数1,引数2)

などと関数名の後に()を付けたりしてみたのですが、
コーディング時にエラーとなってしまいます。

何か良い方法はないでしょうか?

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

A 回答 (1件)

動的配列を戻り値とする関数の形式は以下のような形です。



Function 関数名(引数1,引数2) As 戻り値型()

例)文字列を1文字ずつに分解して配列にして返す
Function ExFunc(DatBuf As String) As String()
Dim ii As Integer
ReDim RetBuf(Len(DatBuf) - 1) As String
For ii = 1 To Len(DatBuf)
RetBuf(ii - 1) = Mid(DatBuf, ii, 1)
Next
ExFunc = RetBuf
End Function
    • good
    • 0
この回答へのお礼

早速回答いただきありがとうございます。

>Function ExFunc(DatBuf As String) As String()

戻り値型の後ろに付けるのですね(惜しかった…?)
助かりました

お礼日時:2001/04/29 19:03

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

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

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

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

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

QVBScripの2次元動的配列

下記VBScripサンプルで2次元動的配列をつかっているのですが
redim preserveでエラになります。
(インデックスが有効範囲にありません)
原因をご伝授ください。
環境 IIS 5.0
Windows XP

index.asp

<%@ LANGUAGE="VBScript" %>
<% 'option explicit %>
<!-- #include file="test.asp" -->
<%
Dim Order()
Dim dat()
call test(Order,dat)
response.write("dat=" & dat(1,2))

%>

test.asp

<%'Option Explicit%>
<%
function test(Order_info,dat)

Dim i
redim dat(0,7)
for i=0 to 1 <- iが0の時はOK,iが1になるとエラー
redim preserve dat(i,7)
dat(i,1)="1"
dat(i,2)="2"
dat(i,3)="3"
dat(i,4)="4"
dat(i,5)="5"
dat(i,6)="6"
next

End function

下記VBScripサンプルで2次元動的配列をつかっているのですが
redim preserveでエラになります。
(インデックスが有効範囲にありません)
原因をご伝授ください。
環境 IIS 5.0
Windows XP

index.asp

<%@ LANGUAGE="VBScript" %>
<% 'option explicit %>
<!-- #include file="test.asp" -->
<%
Dim Order()
Dim dat()
call test(Order,dat)
response.write("dat=" & dat(1,2))

%>

test.asp

<%'Option Explicit%>
<%
function test(Order_info,dat)

Dim i
redim dat(0,7)
for...続きを読む

Aベストアンサー

ReDimで変更できるのは最終次元の添え字です

dim dat(0,7)
と宣言した場合 変更できるのは 2次元目の7側の次元です
つまり ReDim dat( 0, 8 )や ReDim dat( 0, 3 ) は許されますが
ReDim dat(1,7) など 1次元目の変更は出来ません

直感的ではないかもしれませんが添え字が固定のものを1次元目にして対処してみてはいかがでしょう

redim dat(7,0)
for i=0 to 1
  redim preserve dat(7,i)
  dat(1,i)="1"
  dat(2,i)="2"
  dat(3,i)="3"
  dat(4,i)="4"
  dat(5,i)="5"
  dat(6,i)="6"
next
といった具合で ...

QVBのfunctionの引数について

2の Double型と 3の Single型のように送る側と受け取る側の変数の型が
違ってもよいのでしょうか?プログラムはそのまま実行できたのですが・・・・。

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim koku As Integer
Dim san As Integer
Dim rika As Integer
Dim ave As Double------------------------------------1

koku = Val(TextBox1.Text)
san = Val(TextBox2.Text)
rika = Val(TextBox3.Text)

ave = (koku + san + rika) / 3

Label5.Text = Round(ave)-------------------------------2
End Sub

Private Function Round(ByVal sngvalue As Single-----3) As Integer
Dim intvalue As Integer
intvalue = Int(sngvalue + 0.5)
Return intvalue
End Function
End Class

2の Double型と 3の Single型のように送る側と受け取る側の変数の型が
違ってもよいのでしょうか?プログラムはそのまま実行できたのですが・・・・。

Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim koku As Integer
Dim san As Integer
Dim rika As Integer
Dim ave As Double------------------------------------1

koku = Val(TextBox1.Text)
san = Val(TextBox2.T...続きを読む

Aベストアンサー

VB のことはよくわからないのですが、暗黙のうちに型変換関数が呼ばれているのではないかと思われます。
テキストボックスに合計が Single 型の範囲を超えるような値を入力したらどうなりますか? 自分の予想では System.OverflowException エラーが発生するのではないかと思うのですが……。

Q2次元動的配列の第一引数のみを可変にする

ReDim Preserve aStrSKU(x, 2)
aStrSKU(x, 0) = strPre
aStrSKU(x, 1) = サブ2
aStrSKU(x, 2) = サブ3

x = x + 1

上記のソースをDo Untilでまわしているのですが、
2週目以降にxに1を足して行数だけ増やしたいのですが、
2週目でエラーが発生します。
行数だけ要素数を増やす方法はありますか?

Aベストアンサー

こんな感じで

Structure column
Dim col1 As String
Dim col2 As String
Dim col3 As String
End Structure

Private Sub test()

Dim aStrSKU() As column
Dim x As Integer

Do Until x = 3
ReDim Preserve aStrSKU(x)
aStrSKU(x).col1 = "strPre"
aStrSKU(x).col2 = "サブ2"
aStrSKU(x).col3 = "サブ3"

x = x + 1
Loop

End Sub

QVBのFunctionで、配列を引数や返却値にできますか?

配列の要素をソートするFunction を作成しようとしているのですが、
ソート対象配列を引数にして、返却値がソートされた配列になるように
したいと思ったのですが、その方法がわかりません。
それとも、引数に配列を入れることは不可能なのでしょうか。

Aベストアンサー

こんな感じです。配列をクイックソートしています。
配列を引数にするには、
Function hoge( Array()) As Long

End Function
のようにします

VBでは通常は「参照渡し」で引数を渡しますので、hoge()中でArray()の内容を書き換えると、呼び出しもとの関数中でも書き換え後の値を使用することが出来ます。

下記で、「ByRef Values()」としているのは、明示的に参照渡しである事を指定することにより、これを読むプログラマに対して「呼び出すとココの値を変更するねんで」ってことを伝えているわけです。



Option Explicit

Sub Main()
  Dim i As Long
  Dim Values() As Long
  
  '配列を初期化する
  ReDim Values(255) As Long
  For i = 0 To 255
    Values(i) = Rnd * 256
  Next i
  
  '配列をソートする
  Call QuickSortLong(Values())
End Sub

Public Sub QuickSortLong(ByRef Values() As Long, Optional StPos As Long, Optional EdPos As Long)

  Dim Ct As Long    'カウンタ
  Dim LastPos As Long  '配列最終番号
  Dim Buffer As Long   'バッファ
  
  '引数省略時の初期値
  If IsMissing(StPos) Then
    StPos = LBound(Values, 1)
  End If
  If IsMissing(EdPos) Then
    StPos = UBound(Values, 1)
  End If

  '終了番号が開始番号以下のときは処理を行わない
  If StPos >= EdPos Then
    Exit Sub
  End If

  '最初の値をバッファに格納
  Buffer = Values(StPos)
  '各バッファの値をスワップする
  '真ん中にある配列の値を最初の配列に代入する
  Values(StPos) = Values((StPos + EdPos) / 2)
  'バッファに格納された値を真ん中の配列に代入する
  Values((StPos + EdPos) / 2) = Buffer

  LastPos = StPos

  For Ct = StPos + 1 To EdPos
    If Values(Ct) < Values(StPos) Then
      LastPos = LastPos + 1
      '各バッファの値をスワップ
      Buffer = Values(LastPos)
      Values(LastPos) = Values(Ct)
      Values(Ct) = Buffer
    End If
  Next Ct

  '各バッファの値をスワップ
  Buffer = Values(StPos)
  Values(StPos) = Values(LastPos)
  Values(LastPos) = Buffer
  
  '再起呼び出し
  Call QuickSortLong(Values, StPos, LastPos - 1)
  Call QuickSortLong(Values, LastPos + 1, EdPos)
End Sub

こんな感じです。配列をクイックソートしています。
配列を引数にするには、
Function hoge( Array()) As Long

End Function
のようにします

VBでは通常は「参照渡し」で引数を渡しますので、hoge()中でArray()の内容を書き換えると、呼び出しもとの関数中でも書き換え後の値を使用することが出来ます。

下記で、「ByRef Values()」としているのは、明示的に参照渡しである事を指定することにより、これを読むプログラマに対して「呼び出すとココの値を変更するねんで」ってことを伝えているわけです...続きを読む

Q動的配列を宣言するためにnew演算子とdelete演算子を用いる方法が

動的配列を宣言するためにnew演算子とdelete演算子を用いる方法があります。
2次元配列は以下のように宣言して作れるのは分かったのですが、
(実際に使って動かしてみました。)
int **pp;
pp = new int*[ROW]; // 行を作る
for(int i = 0; i < ROW; i++) // 列を作る
pp[i] = new int[COL];

http://www.asahi-net.or.jp/~uc3k-ymd/Lesson/Section02/section02_07.html(引用)

3次元配列をどのように作ったらいいか分かりません。
教えてください。宜しくお願いします。

Aベストアンサー

「ポインタのポインタ」で二次配列を表現している訳ですから、三次配列は「ポインタのポインタのポインタ」で表現すればいい訳です。

int ***pp;
int i, j;

pp = new (int**)[DEP];

for(int i = 0; i < DEP; i ++)
{
pp[i] = new (int*)[ROW];
for(int j = 0; j < ROW; j ++)
{
pp[i][j] = new int[COL];
}
}

QVBAでテーブル名とカラム名を動的に取得したい。

お世話になります。

VBAでMySQLに接続をし、DB操作をするものを作成しています。

・Windows7
・エクセル2007
・MySQL 5.1
・ODBC

そこで、以下のことをしたいと思っています。
(1)ある特定のデータベースの中にあるテーブル名を全取得
(2)そのテーブル名を変数または配列に格納
(3)そのテーブル名をキーに、今度はフィールド名を全取得

私が組んでみた該当のソースの部分は、
  Dim aaa As New ADODB.Recordset

  strSql = "show tables from testdb;"
  Set aaa = con.Execute(strSql) 'conはADODB.connection

Dim j As Integer

For j = 1 To aaa.Fields.Count
MsgBox aaa.Fields(j -1).name
Next

・・・とここまで来ました。
show tables from databaseで、データベースにあるテーブルを取得して、
aaa.Fields(j -1).nameには「Tables_in_testdb」が入ります。
その次に、もう消してしまったので無いのですが、
msgbox aaa.Fields("Tables_in_testdb")?とやってみたところ、
データベースに入っている一つのテーブル名だけしか取得できませんでした。

ソースが回りくどい気がする+テーブル名が取得出来ず、
大分煮詰まっています。。。

何かもっとうまい書き方や構文(サンプル)ありましたら教えてください!!!

お世話になります。

VBAでMySQLに接続をし、DB操作をするものを作成しています。

・Windows7
・エクセル2007
・MySQL 5.1
・ODBC

そこで、以下のことをしたいと思っています。
(1)ある特定のデータベースの中にあるテーブル名を全取得
(2)そのテーブル名を変数または配列に格納
(3)そのテーブル名をキーに、今度はフィールド名を全取得

私が組んでみた該当のソースの部分は、
  Dim aaa As New ADODB.Recordset

  strSql = "show tables from testdb;"
  Set aaa = con.Execute(strSql) 'conはA...続きを読む

Aベストアンサー

XL2000のコードですけれど、ご参考まで。
SELECT * とかでテーブルからレコードセットを取得して、Fields(i).nameを取得してみたけれど、
重たそうなので更に調べてみると、ADOでもDESCRIBEが使える様です。
(DESCでも良いけれど、降順と紛らわしいので)
ADOの参照設定要です。
Sub test()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim strSQL As String

'XAMPPのMYSQLのデータベースにODBC接続してみた
cn.ConnectionString = "Driver={MySQL ODBC 5.1 Driver};DATABASE=*****;" _
& "PWD=******;PORT=3306;SERVER=localhost;" _
& "STMT=SET NAMES utf8;UID=******"
cn.Open
strSQL = "SHOW TABLES;"
rs.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly
Do Until rs.EOF
Debug.Print rs.Fields(0)
strSQL = "DESCRIBE " & rs.Fields(0) & ";"
rs2.Open strSQL, cn, adOpenForwardOnly, adLockReadOnly
Do Until rs2.EOF
'最後に余分な,がつくのは手抜きです
Debug.Print rs2.Fields(0) & ",";
rs2.MoveNext
Loop
Debug.Print
rs2.Close
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set rs2 = Nothing
cn.Close
Set cn = Nothing
End Sub

参考URL:http://support.microsoft.com/kb/193332/ja

XL2000のコードですけれど、ご参考まで。
SELECT * とかでテーブルからレコードセットを取得して、Fields(i).nameを取得してみたけれど、
重たそうなので更に調べてみると、ADOでもDESCRIBEが使える様です。
(DESCでも良いけれど、降順と紛らわしいので)
ADOの参照設定要です。
Sub test()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim strSQL As String

'XAMPPのMYSQLのデータベースにODBC接続してみた
cn.ConnectionString = "Driver={MyS...続きを読む

Q2次元配列のnew

4x4行列のデータがいくらか書いてあるファイルから、読み込んでvector配列へ保存するプログラムを考えています。
vector配列は、float[4][4]の先頭ポインタの配列です。
宣言はこんな感じで、コンパイルエラーは出ませんでした。

vector<float[4][4]> matrix;


つぎに読み込み部分で、下のような感じです。
4x4行列が見つかるたびにこれが実行されます。
GetFloatToken()は、ファイルから要素をひとつ取り出す関数です。

float m[4][4] = new float[4][4];
for(int g=0; g<4; g++)
for(int r=0; r<4; r++)
m[g][r]=GetFloatToken();
matrix.push_back(m);

newの行とpush_backしてる行でエラーが出ました。

自分が思うに、m[4][4]のとこの、newからの受け取りの仕方が悪い気がしました。
そこで、*m[4] や **m とかにして試してみましたがうまくいきませんでした。
どうすればいいんでしょうか。
もしかして、c++では多次元配列のnewは無理なんでしょうか。
わかる方がいましたら、どうか教えてください。

補足:
あとで行列の計算をするのが楽なので、float[4][4]の形は変えたくないです。
もし、多次元配列のnewが無理ということなら別の策を考えます。

4x4行列のデータがいくらか書いてあるファイルから、読み込んでvector配列へ保存するプログラムを考えています。
vector配列は、float[4][4]の先頭ポインタの配列です。
宣言はこんな感じで、コンパイルエラーは出ませんでした。

vector<float[4][4]> matrix;


つぎに読み込み部分で、下のような感じです。
4x4行列が見つかるたびにこれが実行されます。
GetFloatToken()は、ファイルから要素をひとつ取り出す関数です。

float m[4][4] = new float[4][4];
for(int g=0; g<4; g++)
for(int r=0; r<4; r++)
m[g]...続きを読む

Aベストアンサー

> 配列型は代入可能ではないんですか。

たとえば、

float m1[4][4], m2[4][4];

とあった場合、

m1 = m2;

とはできませんよね。

ちなみに、newで生成する場合は次のようにします。

float (*m)[4] = new float[4][4];

Qsplit関数のデリミタに「"」を使用する方法

split関数のデリミタに「"」を使う方法を教えてください。
SplitedData = Split(Data, """)
だと当然エラーになってしまうのです。

Aベストアンサー

""""です

Q2次元配列の動的確保&配列の添え字の書式について

(1)2次元配列の動的確保について
1次元配列の動的確保は理解できたのですが、次のプログラムの
文(ⅰ)~(ⅱ)の意味を理解できていないので教えてください。

int **a, j, k, nrows=3, ncolumns=4 ;
a = (int **)malloc(nrows * sizeof(int *));
a[0] = (int *)malloc(nrows * ncolumns * sizeof(int)); …(ⅰ)
//先頭アドレスに…

for(j = 1; j < nrows; j++)
a[j] = a[0] + j * ncolumns; …(ⅱ)
  //この行が特にわかりません。

(2)配列の添え字について
この書き方はどういう意味になりますか?
out[X_SIZE * (i) + (j)]

分かる方、回答お願いします。

Aベストアンサー

(1)について
二次元配列のように見えて、実のところポインタの1次元配列を使って2次元配列のようにソース上で書き表す方法と思われます。

a = (int **)malloc(nrows * sizeof(int *))で、
intのポインタを入れる領域を行の分(3つ)準備し、その領域の先頭ポインタを a に入れます。
これで
int *a[3];
としたのと同じものができました。

次に
(int *)malloc(nrows * ncolumns * sizeof(int)) で、
[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10][11]
の様に int の領域を取ります。
これは1次元配列と同じなのですが、
[ 0][ 1][ 2][ 3]
[ 4][ 5][ 6][ 7]
[ 8][ 9][10][11]
の様に2次元配列に見立てて、
for(j = 1; j < nrows; j++)
  a[j] = a[0] + j * ncolumns; …()
で0,4,8を指すポインタをa[0],a[1]、a[2]に入れます。
(a[0]はすでに入っていますけどね)

すると、
a[1][2]で[6]の場所を、
a[0][3]で[3]の場所を指すことができます。

なぜこうなるのかはK&Rにバッチリ書いてあるので、調べてください。

必要であれば、明日追加の解説を書きます。

(2)について
1次元配列を2次元配列のように使う書き方です。
out[n][X_SIZE];
の様に宣言した配列を、
out[i][j]のようにアクセスするのと同じ効果があります。
もちろん、i<n,j<X_SIZEの範囲です。
これを応用すると、1次元配列を何次元のものにも見立てることができます。
その逆も可能です。

(1)について
二次元配列のように見えて、実のところポインタの1次元配列を使って2次元配列のようにソース上で書き表す方法と思われます。

a = (int **)malloc(nrows * sizeof(int *))で、
intのポインタを入れる領域を行の分(3つ)準備し、その領域の先頭ポインタを a に入れます。
これで
int *a[3];
としたのと同じものができました。

次に
(int *)malloc(nrows * ncolumns * sizeof(int)) で、
[ 0][ 1][ 2][ 3][ 4][ 5][ 6][ 7][ 8][ 9][10]...続きを読む

Qsplit関数の挙動について

 お世話になります。
 WindowsXP+VB6.0上で、下記コードを含むツールを開発しています。

Dim buf As String
Dim k As String
dim youso() as string
Line Input #1, buf
youso = Split(buf, k)
/* kの中身は、適宜設定する */

 ここで、buf = "てすと(その1)"、k = "("として、コンパイルして作成したexeファイルをWindowsXP上で動作させた場合、yousoの中身は
youso(0)->"てすと" youso(1)->"その1)"
となり、期待どおりの動作をします。
 ところが、このexeファイルをWindows2000上で動作させた場合、yousoの中身は
youso(0)->"てすと(その1)" youso(1)->未作成
となり、思わしくありません。

 開発環境と実行環境のOSを、整合させないとだめなのでしょうか。

Aベストアンサー

所詮標準のVB関数(しかも6.0)なのでそこまで求めるのは酷かもしれません。
API関数とかで代用してみてはいかがでしょうか?
API関数もOSの影響度強いですけど。。。

参考URL:http://www.winapi-database.com/category.html


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

人気Q&Aランキング

おすすめ情報