tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルSplit関数
記事No12911
投稿日: 2008/08/19(Tue) 13:06
投稿者ダース
あるストリングに文字列が代入されています。

イミディエイト
?st
AAA
BBBB
CC
DDDDD
TTTT
上記のような値が入っています。
この文字列を分割したくsplit関数を使って分割しようかと思ったのですが
dim rtn() as string
rtn = split(st,   )
                ↑ここに何を指定すれば上記の文字列を分割出来るでしょうか?
解答、宜しくお願いします。<(_ _)>

[ツリー表示へ]
タイトルRe: Split関数
記事No12912
投稿日: 2008/08/19(Tue) 13:57
投稿者ダース
> 例
> イミディエイト
> ?st
> AAA
> BBBB
> CC
> DDDDD
> TTTT

詳しく書きます。
なぜ上記のような値が入っているかと言うと
外部コマンドの標準出力表示を取得してそれを代入しているのですが。
上記のように名前を1つずつ行を改行させて表示させているからです。
改行ごとにEnterキーが入っているのかと思い
StatusData = Split(rtn, vbKeyReturn)
このようなプログラムを書いてみましたがダメでした。

[ツリー表示へ]
タイトルRe^2: Split関数
記事No12913
投稿日: 2008/08/19(Tue) 14:03
投稿者魔界の仮面弁士
> StatusData = Split(rtn, vbKeyReturn)
vbKeyReturn というのは、列挙型ですよ。
いわば
 Const vbKeyReturn As Long = 13
として宣言された値のようなもの。中身は 数値の「13」です。
(しかも、「文字」を意味する値ではなく、キーボード上の「キー」を表す値です)


Split の第二引数に指定するべきは、Long では String となります。この場合は
 vbNewLine  … 一般的な「改行」を意味する。
 vbCrLf     … Windows で良く使われる改行コード。
 vbCr       … Chr(13) に相当。キャリッジリターン(Carriage Return:行頭への復帰)。
 vbLf       … Chr(10) に相当。ラインフィード(Line Feed:行送り)。
などの定数を指定してみてください。

[ツリー表示へ]
タイトルRe^3: Split関数
記事No12915
投稿日: 2008/08/19(Tue) 14:45
投稿者ダース
> Split の第二引数に指定するべきは、Long では String となります。この場合は
>  vbNewLine  … 一般的な「改行」を意味する。
>  vbCrLf     … Windows で良く使われる改行コード。
>  vbCr       … Chr(13) に相当。キャリッジリターン(Carriage Return:行頭への復帰)。
>  vbLf       … Chr(10) に相当。ラインフィード(Line Feed:行送り)。
> などの定数を指定してみてください。

解答ありがとうございます。
StatusData = Split(rtn, vbNewLine)
とすることで値の取得が出来ました。
そこで新たな問題なのですが。
StatusDataの配列の中にいくつか値が入ってきたのですが、
何個その値が入ってきたか分かるプログラムってありますでしょうか?
と言うのも入ってきた値を
For i = 0 To 256(←256はある規定でその値にしていますので気にしないでください)
    If StatusData(i) <> "" Then
        Set colL = StsData.ListItems.Add(i + 1)
        colL.Text = StatusData(i)
    End If
Next
このようにしてリストビューに列挙していこうと思ったのですが
『If StatusData(i) <> "" Then』のところで配列にないインデックス部分になると
エラーになってしまいます。
何か良い方法はありますでしょうか?

[ツリー表示へ]
タイトルRe^4: Split関数
記事No12916
投稿日: 2008/08/19(Tue) 15:14
投稿者くま
> StatusDataの配列の中にいくつか値が入ってきたのですが、

通常は配列の要素数を調べる関数
Ubound、Lbound関数を使います。

[ツリー表示へ]
タイトル解決
記事No12917
投稿日: 2008/08/19(Tue) 15:20
投稿者ダース
> > Split の第二引数に指定するべきは、Long では String となります。この場合は
> >  vbNewLine  … 一般的な「改行」を意味する。
> >  vbCrLf     … Windows で良く使われる改行コード。
> >  vbCr       … Chr(13) に相当。キャリッジリターン(Carriage Return:行頭への復帰)。
> >  vbLf       … Chr(10) に相当。ラインフィード(Line Feed:行送り)。
> > などの定数を指定してみてください。
>
> 解答ありがとうございます。
> StatusData = Split(rtn, vbNewLine)
> とすることで値の取得が出来ました。
> そこで新たな問題なのですが。
> StatusDataの配列の中にいくつか値が入ってきたのですが、
> 何個その値が入ってきたか分かるプログラムってありますでしょうか?
> と言うのも入ってきた値を
> For i = 0 To 256(←256はある規定でその値にしていますので気にしないでください)
>     If StatusData(i) <> "" Then
>         Set colL = StsData.ListItems.Add(i + 1)
>         colL.Text = StatusData(i)
>     End If
> Next
> このようにしてリストビューに列挙していこうと思ったのですが
> 『If StatusData(i) <> "" Then』のところで配列にないインデックス部分になると
> エラーになってしまいます。
> 何か良い方法はありますでしょうか?
dim t as integer
t = UBound(StatusData)
で何個値が入ってきたか分かるようでした。
お騒がせしました。

[ツリー表示へ]
タイトルRe^2: Split関数
記事No12914
投稿日: 2008/08/19(Tue) 14:37
投稿者いな
> StatusData = Split(rtn, vbKeyReturn)
> このようなプログラムを書いてみましたがダメでした。

先ほどは意地悪な回答をしてしまったので、、、

例えば手当たり次第にこんな方法で
if instr(rtn,vbCrLf) > 0 then
StatusData = Split(rtn, vbCrLf)
Elseif instr(rtn,vbCr) > 0 Then
StatusData = Split(rtn, vbCr)
Elseif instr(rtn,vbLf) > 0 then
StatusData = Split(rtn, vbLf)
End if

美しく無いけれど、改行コードを意識しないやり方です。

[ツリー表示へ]
タイトルRe^3: Split関数
記事No12918
投稿日: 2008/08/19(Tue) 15:56
投稿者ダース
> 先ほどは意地悪な回答をしてしまったので、、、
いえいえ、気にしておりません。。
これから注意していきますので。。

> 例えば手当たり次第にこんな方法で
> if instr(rtn,vbCrLf) > 0 then
> StatusData = Split(rtn, vbCrLf)
> Elseif instr(rtn,vbCr) > 0 Then
> StatusData = Split(rtn, vbCr)
> Elseif instr(rtn,vbLf) > 0 then
> StatusData = Split(rtn, vbLf)
> End if
> 美しく無いけれど、改行コードを意識しないやり方です。
なるほどというプログラムでした。。
自分は、まだ初心者なのでこういう分かりやすいプログラムは助かります。
ありがとうございました。

[ツリー表示へ]
タイトルRe^3: Split関数
記事No12919
投稿日: 2008/08/19(Tue) 15:59
投稿者魔界の仮面弁士
> 改行コードを意識しないやり方です。
意識させない方法として、改行コードを統一するために
 s = rawData
 s = Replace(s, vbCrLf, vbLf)
 s = Replace(s, vbCr, vbLf)
 s = Replace(s, vbLf, 改行コード)
 result = s
というコードを書くことができます。

最後の『改行コード』は任意ですが、通常は vbNewLine (または vbCrLf)でしょう。

# ちなみに vbNewLine は、Windows版では vbCrLf。Macintosh版では vbCr です。


> 美しく無いけれど、
同じく…。

[ツリー表示へ]
タイトルRe^4: Split関数
記事No12920
投稿日: 2008/08/19(Tue) 16:35
投稿者ダース
> > 改行コードを意識しないやり方です。
> 意識させない方法として、改行コードを統一するために
>  s = rawData
>  s = Replace(s, vbCrLf, vbLf)
>  s = Replace(s, vbCr, vbLf)
>  s = Replace(s, vbLf, 改行コード)
>  result = s
> というコードを書くことができます。
> 最後の『改行コード』は任意ですが、通常は vbNewLine (または vbCrLf)でしょう。
> # ちなみに vbNewLine は、Windows版では vbCrLf。Macintosh版では vbCr です。
このやり方のほうが必ず
StatusData = Split(rtn, vbNewLine)
を実行出来るので良いですね。
いなさんの場合だと、もし何もデータが入っていなかった場合
split関数を実行することが出来ず、
その後に、件数を取得する
t = UBound(StatusData)でエラーが起こってしまうし。
参考になりました。ありがとうございます。

> > 美しく無いけれど、
> 同じく…。
僕には、その美しくないと思えるレベルではないので全然OKなのですけどw

[ツリー表示へ]
タイトルRe^5: Split関数
記事No12922
投稿日: 2008/08/19(Tue) 20:26
投稿者いな
> いなさんの場合だと、もし何もデータが入っていなかった場合
> split関数を実行することが出来ず、
> その後に、件数を取得する
> t = UBound(StatusData)でエラーが起こってしまうし。
> 参考になりました。ありがとうございます。

毒を食らわば皿まで・・・。
ということで動的配列が初期化されていない場合などのチェックとしては
ありきたりですが・・・。

'*********************************************************************
' 機    能  : 配列の要素数を返す
' 引 き 数  : strArray  配列
'*********************************************************************
Public Function cmnUBound(strAry() As String) As Long
    On Error GoTo cmnUBound_ERR
    
    cmnUBound = UBound(strAry)
    Exit Function

cmnUBound_ERR:
    If Err.Number = 9 Then
        cmnUBound = -1
    End If
End Function

などの関数を自作しておき・・・。

t = cmnUBound(StatusData)とすると良いかと・・・。
-1が帰ってきたときには初期化されていないことを示します。

#自分は結構、いろんなところでこの関数、使いまわしてたりします。

[ツリー表示へ]
タイトルRe^6: Split関数
記事No12926
投稿日: 2008/08/20(Wed) 09:10
投稿者ダース
> > いなさんの場合だと、もし何もデータが入っていなかった場合
> > split関数を実行することが出来ず、
> > その後に、件数を取得する
> > t = UBound(StatusData)でエラーが起こってしまうし。
> > 参考になりました。ありがとうございます。
>
> 毒を食らわば皿まで・・・。
> ということで動的配列が初期化されていない場合などのチェックとしては
> ありきたりですが・・・。
>
> '*********************************************************************
> ' 機    能  : 配列の要素数を返す
> ' 引 き 数  : strArray  配列
> '*********************************************************************
> Public Function cmnUBound(strAry() As String) As Long
>     On Error GoTo cmnUBound_ERR
>    
>     cmnUBound = UBound(strAry)
>     Exit Function
>
> cmnUBound_ERR:
>     If Err.Number = 9 Then
>         cmnUBound = -1
>     End If
> End Function
>
> などの関数を自作しておき・・・。
>
> t = cmnUBound(StatusData)とすると良いかと・・・。
> -1が帰ってきたときには初期化されていないことを示します。
>
> #自分は結構、いろんなところでこの関数、使いまわしてたりします。

全然毒を食らわば皿までじゃないですよ。。
最後まで善をしているじゃないですか。。
勉強になりました。
ありがとうございます。

[ツリー表示へ]
タイトルRe^6: Split関数
記事No12927
投稿日: 2008/08/20(Wed) 09:54
投稿者くま
>#自分は結構、いろんなところでこの関数、使いまわしてたりします。

関数名でググッテ見たら、いなさんの投稿発見、
4年前からずっと使われているんですね。

http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200404/04040042.txt

[ツリー表示へ]