tagCANDY CGI VBレスキュー(花ちゃん) - 動的配列を返すプロシージャ(VB6.0) - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
動的配列を返すプロシージャ(VB6.0)
元に戻る スレッド一覧へ 記事閲覧
このページ内の検索ができます。(AND 検索や OR 検索のような複数のキーワードによる検索はできません。)

動的配列を返すプロシージャ(VB6.0) [No.44の個別表示]
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2009/12/27 15:15
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                                    *
* キーワード:関数,プロシージャ,戻り値,,,                                         *
***********************************************************************************

元質問:動的配列を返すプロシージャについて - 秋風  2003/01/24-18:51  No.2410
        (VB5.0を使用)
----------------------------------------------------------------------------
Re: 動的配列を返すプロシージャについて - 花ちゃん 2003/01/24-20:28 No.2415
----------------------------------------------------------------------------

http://www001.upp.so-net.ne.jp/shige-3peace/ さんのところの

下記のサンプルを使わせてもらったらどうですか?
http://www001.upp.so-net.ne.jp/shige-3peace/VB_Freak/lzh/VB6toVB5.zip

とりあえず、ちょっといじって見ました。

Private Sub Command1_Click()
    Dim i As Integer
    Dim MyVar As Variant
    MyVar = split("abc,defgh,ijklm")
    For i = LBound(MyVar) To UBound(MyVar)
        Debug.Print MyVar(i)
    Next i
End Sub

Function split(Time As String) As Variant      '←ここでエラー
    Dim intcheck As Integer
    Dim strtime() As String          '←30個以内には、データは収まる
    Dim i As Long
    Dim intlen As Long
    i = 0
    Do
        intlen = Len(Time)
        intcheck = InStr(Time, ",")
        ReDim Preserve strtime(i) As String
        If intcheck <> 0 Then
            strtime(i) = Mid(Time, 1, intcheck - 1)
            Time = Mid(Time, intcheck + 1, intlen - intcheck)
            i = i + 1
        End If
        If intcheck = 0 And Len(Time) > 0 Then
            strtime(i) = Time
        End If
    Loop Until (intcheck = 0)
    split = strtime
End Function
メンテ

Page: 1 |

動的配列を返すプロシージャ(VB6.0)_1  (No.1の個別表示) [スレッド一覧へ]
日時: 2011/04/05 11:34
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                                    *
* キーワード:関数,プロシージャ,戻り値,,,                                         *
***********************************************************************************

--------------------------------------------------------------------------
Re: 動的配列を返すプロシージャについて - takk 2003/01/25-14:39 No.2425
--------------------------------------------------------------------------

手元にVB5.0がないんですが……。
下記のソースで試してみてください。
秋風さんのソースではエラーが多く、また汎用性に欠けるので手直ししました。
ちなみに戻り値をString()にするとエラー出る、とのことですがVB6.0では問題なく動いています。
もしダメそうならnanashiさんの意見通り、戻り値をVariant型で指定してみてください。


'使う時はこんな感じで
strTimeList() = split(TimeList, ",")

'ファンクション
Private Function Split(ByVal Data As String, Optional ByRef Demiliter As String = " ") As String()
    Dim lCnt&, lPos&, lLen As Long
    Dim sBuff() As String
    
    '文字列が指定されていない時は要素なしの配列を返す
    If Len(Data) = 0 Then
        Split = Array()
        Exit Function
    End If
    
    'デミリタの長さを取得
    lLen = Len(Demiliter)
    
    Do
        '次のデミリタの位置を取得
        lPos = InStr(Data, Demiliter)
        
        '配列に追加
        If lPos > 0 Then
            ReDim Preserve sBuff(lCnt)
            
            sBuff(lCnt) = Left$(Data, lPos - 1)
            Data = Mid$(Data, lPos + lLen)
            
            lCnt = lCnt + 1
        Else
            ReDim Preserve sBuff(lCnt)
            
            sBuff(lCnt) = Data
            Data = vbNullString
        End If
    Loop While Len(Data) > 0
    
    '結果を返す
    Split = sBuff
End Function
メンテ
動的配列を返すプロシージャ(VB6.0)_2  (No.2の個別表示) [スレッド一覧へ]
日時: 2011/04/05 11:34
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[基本コード][][]                                                    *
* キーワード:関数,プロシージャ,戻り値,,,                                         *
***********************************************************************************

-----------------------------------------------------------------------------------
Re^2: 動的配列を返すプロシージャについて - 魔界の仮面弁士 2003/01/25-16:20 No.2426
-----------------------------------------------------------------------------------

> ちなみに戻り値をString()にするとエラー出る、とのことですがVB6.0では問題なく動いています。
配列を戻り値として返せるようになったのは、VB6からなのです。(^^;
http://www.asia.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/vbcon98/vbmscwhatsnewinlanguagefeaturesvb98.htm


> もしダメそうならnanashiさんの意見通り、戻り値をVariant型で指定してみてください。
そうですね。VB5では、戻り値をVariantにして対処する方法が、一般的だと思います。
Variant型には、配列を格納する事ができますので、今回のような「String配列」を
返すような目的には充分でしょう。

ただし、この方法で返せる配列は、「Variantに格納できるデータ型の配列」に限られます。

StringやLongなどの配列であれば問題はないのですが、VB5のユーザー定義型の場合は、
Variantに格納することができませんので、VB6でいうところの

  Option Explicit
  Public Type TEST
    aa As Long
  End Type
  Public Function Proc() As TEST()
    Dim a(1) As TEST
    a(0).aa = 123
    a(1).aa = 456
    Proc = a
  End Function
  Private Sub Main()
    Dim T() As TEST
    T = Proc()
    Debug.Print T(0).aa + T(1).aa
  End Sub

というコードを、
  Public Function Proc() As Variant
    Dim a(1) As TEST
    a(0).aa = 123
    a(1).aa = 456
    Proc = a
  End Function
のようにして対処する事は、残念ながらできません。


このような場合は、戻り値のかわりに引数を使って
渡すようにする事で、一応は対処する事ができます。

  Public Sub Proc(ByRef a() As TEST)
    ReDim a(1)
    a(0).aa = 123
    a(1).aa = 456
  End Sub
  Private Sub Main()
    Dim T() As TEST
    Call Proc(T)
    Debug.Print T(0).aa + T(1).aa
  End Sub

メンテ

Page: 1 |

 投稿フォーム               スレッド一覧へ
題  名 スレッドをトップへソート
名  前
パスワード (記事メンテ時に使用)
投稿キー (投稿時 投稿キー を入力してください)
コメント

   クッキー保存   
スレッド一覧へ