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と関連する良く見られている質問

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 エラーが発生するのではないかと思うのですが……。

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

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

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...続きを読む

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

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

Aベストアンサー

""""です


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

このカテゴリの人気Q&Aランキング

おすすめ情報