Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7649 / 13645 ツリー ←次へ | 前へ→

【37734】配列と配列の要素数を受け取りたい sin 06/5/17(水) 12:56 質問[未読]
【37735】Re:配列と配列の要素数を受け取りたい Jaka 06/5/17(水) 13:30 発言[未読]
【37737】Re:配列と配列の要素数を受け取りたい ハチ 06/5/17(水) 13:32 発言[未読]
【37739】Re:配列と配列の要素数を受け取りたい sin 06/5/17(水) 14:01 お礼[未読]
【37736】Re:配列と配列の要素数を受け取りたい ハチ 06/5/17(水) 13:30 回答[未読]
【37744】Re:配列と配列の要素数を受け取りたい sin 06/5/17(水) 17:26 質問[未読]
【37745】Re:配列と配列の要素数を受け取りたい ハチ 06/5/17(水) 17:50 発言[未読]
【37763】Re:配列と配列の要素数を受け取りたい sin 06/5/18(木) 11:06 お礼[未読]
【37738】Re:配列と配列の要素数を受け取りたい ハト 06/5/17(水) 13:42 回答[未読]
【37740】Re:配列と配列の要素数を受け取りたい sin 06/5/17(水) 15:56 お礼[未読]

【37734】配列と配列の要素数を受け取りたい
質問  sin  - 06/5/17(水) 12:56 -

引用なし
パスワード
   宜しくお願いします。

下記のテストでは、 testf で文字列をカンマで分解して、
その配列の「要素数」と「配列本体」を tests 受け取りたいと考えています。
Functionプロシージャ や 配列 について色々調べてみましたが、
解決方法が見つかりませんでした。
なにか良い方法があればご教授下さい。

※下記では文字列は"aaa,bb,cccc,ddd"でカンマによって4つに分けられますが、
実際に使用するときは不定です。

―――――――――――――――――――――――――――――――――――――

Sub tests()
  
  Dim get_res As Integer

  get_res = testf("aaa,bb,cccc,ddd")    '要素数を受け取る
  
'※※※ここで Function testf の配列 res_str() も受け取りたい※※※

End Sub

Function testf(str As String) As Integer '←ここで何か出来そうな気が・・・
  
  Dim stp As Integer         'ストップ位置
  Dim stt As Integer         'スタート位置
  Dim cnt As Integer         '配列の要素数
  Dim res_str() As String       '結果保存用配列

  stt = 0
  cnt = 0
  stp = 1

  Do Until stp = 0
    ReDim Preserve res_str(cnt)

    stp = InStr(stt + 1, str, ",")     'カンマ位置の取得

    If stp <> 0 Then        'カンマが検出された場合の処理
      res_str(cnt) = Mid(str, stt + 1, stp - stt - 1)
      cnt = cnt + 1
      stt = stp
    Else              'カンマが検出されかった場合の処理
      res_str(cnt) = Mid(str, stt + 1, Len(str) - stt)
    End If
  Loop

  testf = cnt   '←要素数を戻り値として返す
  ' res_str()   '←この配列も戻り値として返したい

End Function

―――――――――――――――――――――――――――――――――――――

【37735】Re:配列と配列の要素数を受け取りたい
発言  Jaka  - 06/5/17(水) 13:30 -

引用なし
パスワード
   2000以上だったら、Split関数?だかで、Variant型の変数に配列として分けられたと思います。
それを UBound(Variant型の変数) とすれば、要素数が解ると思います。

【37736】Re:配列と配列の要素数を受け取りたい
回答  ハチ  - 06/5/17(水) 13:30 -

引用なし
パスワード
   Variantにすればできると思います。

Sub test2()
 
  Dim get_res As Variant
  Dim i As Integer
  get_res = testf2("aaa,bb,cccc,ddd")
 
For i = LBound(get_res) To UBound(get_res)
  MsgBox get_res(i)
Next i
  MsgBox UBound(get_res)
End Sub

Function testf2(str As String) As Variant
 
  Dim stp As Integer         'ストップ位置
  Dim stt As Integer         'スタート位置
  Dim cnt As Integer         '配列の要素数
  Dim res_str() As String       '結果保存用配列

  stt = 0
  cnt = 0
  stp = 1

  Do Until stp = 0
    ReDim Preserve res_str(cnt)

    stp = InStr(stt + 1, str, ",")     'カンマ位置の取得

    If stp <> 0 Then        'カンマが検出された場合の処理
      res_str(cnt) = Mid(str, stt + 1, stp - stt - 1)
      cnt = cnt + 1
      stt = stp
    Else              'カンマが検出されかった場合の処理
      res_str(cnt) = Mid(str, stt + 1, Len(str) - stt)
    End If
  Loop

  testf2 = res_str

End Function


'この処理だけなら関数Splitで出来そうですけど。

Sub Test3()

  Dim get_res As Variant
  Dim i As Integer
  get_res = Split("aaa,bb,cccc,ddd", ",")
 
For i = LBound(get_res) To UBound(get_res)
  MsgBox get_res(i)
Next i
  MsgBox UBound(get_res)
End Sub

【37737】Re:配列と配列の要素数を受け取りたい
発言  ハチ  - 06/5/17(水) 13:32 -

引用なし
パスワード
   ▼Jaka さん:
>2000以上だったら、Split関数?だかで、Variant型の変数に配列として分けられたと思います。
>それを UBound(Variant型の変数) とすれば、要素数が解ると思います。

カブリました^^

【37738】Re:配列と配列の要素数を受け取りたい
回答  ハト  - 06/5/17(水) 13:42 -

引用なし
パスワード
   既に回答は出ていますが、こんな感じに修正しても可能です
例としてのケースで要素数は4としたいのか、3にしたいのかで少し修正が必要です

▼sin さん:
>宜しくお願いします。
>
>下記のテストでは、 testf で文字列をカンマで分解して、
>その配列の「要素数」と「配列本体」を tests 受け取りたいと考えています。
>Functionプロシージャ や 配列 について色々調べてみましたが、
>解決方法が見つかりませんでした。
>なにか良い方法があればご教授下さい。
>
>※下記では文字列は"aaa,bb,cccc,ddd"でカンマによって4つに分けられますが、
>実際に使用するときは不定です。
>
>―――――――――――――――――――――――――――――――――――――
>
>Sub tests()
>  
>  Dim get_res As Integer
  dim res_str() As String
>
>  get_res = testf("aaa,bb,cccc,ddd")    '要素数を受け取る
>'※※※ここで Function testf の配列 res_str() も受け取りたい※※※

  get_res = testf("aaa,bb,cccc,ddd", res_str())    '要素数を受け取る

>  
>
>End Sub
>
>Function testf(str As String) As Integer '←ここで何か出来そうな気が・・・
Function testf(str As String, res_str() As String) As Integer

>  
>  Dim stp As Integer         'ストップ位置
>  Dim stt As Integer         'スタート位置
>  Dim cnt As Integer         '配列の要素数

>  Dim res_str() As String       '結果保存用配列
↑削除

>
>  stt = 0
>  cnt = 0
>  stp = 1
>
>  Do Until stp = 0
>    ReDim Preserve res_str(cnt)
>
>    stp = InStr(stt + 1, str, ",")     'カンマ位置の取得
>
>    If stp <> 0 Then        'カンマが検出された場合の処理
>      res_str(cnt) = Mid(str, stt + 1, stp - stt - 1)
>      cnt = cnt + 1
>      stt = stp
>    Else              'カンマが検出されかった場合の処理
>      res_str(cnt) = Mid(str, stt + 1, Len(str) - stt)
→この場合の要素数が4にしたいなら
      cnt =cnt + 1

>    End If
>  Loop
>
>  testf = cnt   '←要素数を戻り値として返す
>  ' res_str()   '←この配列も戻り値として返したい
>
>End Function
>
>―――――――――――――――――――――――――――――――――――――

【37739】Re:配列と配列の要素数を受け取りたい
お礼  sin  - 06/5/17(水) 14:01 -

引用なし
パスワード
   Jaka さん、ハチさん
早速の返信ありがとうございます。

Split関数、UBound関数・・・
勉強不足でした。

解決できました、ありがとうございました。

【37740】Re:配列と配列の要素数を受け取りたい
お礼  sin  - 06/5/17(水) 15:56 -

引用なし
パスワード
   ▼ハト さん:
ご返信ありがとうございます。

>既に回答は出ていますが、こんな感じに修正しても可能です
>例としてのケースで要素数は4としたいのか、3にしたいのかで少し修正が必要です
>
>▼sin さん:
>>宜しくお願いします。
>>
>>下記のテストでは、 testf で文字列をカンマで分解して、
>>その配列の「要素数」と「配列本体」を tests 受け取りたいと考えています。
>>Functionプロシージャ や 配列 について色々調べてみましたが、
>>解決方法が見つかりませんでした。
>>なにか良い方法があればご教授下さい。
>>
>>※下記では文字列は"aaa,bb,cccc,ddd"でカンマによって4つに分けられますが、
>>実際に使用するときは不定です。
>>
>>―――――――――――――――――――――――――――――――――――――
>>
>>Sub tests()
>>  
>>  Dim get_res As Integer
>  dim res_str() As String
>>
>>  get_res = testf("aaa,bb,cccc,ddd")    '要素数を受け取る
>>'※※※ここで Function testf の配列 res_str() も受け取りたい※※※
>
>  get_res = testf("aaa,bb,cccc,ddd", res_str())    '要素数を受け取る
配列を渡して、処理してもらえばよかったんですね・・・。
勉強になりました。

>
>>  
>>
>>End Sub
>>
>>Function testf(str As String) As Integer '←ここで何か出来そうな気が・・・
>Function testf(str As String, res_str() As String) As Integer
>
>>  
>>  Dim stp As Integer         'ストップ位置
>>  Dim stt As Integer         'スタート位置
>>  Dim cnt As Integer         '配列の要素数
>
>>  Dim res_str() As String       '結果保存用配列
>↑削除
>
>>
>>  stt = 0
>>  cnt = 0
>>  stp = 1
>>
>>  Do Until stp = 0
>>    ReDim Preserve res_str(cnt)
>>
>>    stp = InStr(stt + 1, str, ",")     'カンマ位置の取得
>>
>>    If stp <> 0 Then        'カンマが検出された場合の処理
>>      res_str(cnt) = Mid(str, stt + 1, stp - stt - 1)
>>      cnt = cnt + 1
>>      stt = stp
>>    Else              'カンマが検出されかった場合の処理
>>      res_str(cnt) = Mid(str, stt + 1, Len(str) - stt)
>→この場合の要素数が4にしたいなら
>      cnt =cnt + 1
すいません、「要素数」という表現が間違ってました。
「配列の最後のインデックス番号」と言いたかったので、
今回の場合3で問題ないです。
(これも UBound であっさり解決しました)

>
>>    End If
>>  Loop
>>
>>  testf = cnt   '←要素数を戻り値として返す
>>  ' res_str()   '←この配列も戻り値として返したい
>>
>>End Function
>>
>>―――――――――――――――――――――――――――――――――――――


今回の質問に関しては、Jaka さん、ハチさんに教えていただいた
Split関数、UBound関数、LBound関数
で簡単に出来ることが分かりました。
本当に勉強不足でした。

ただ、「カンマが続いた場合」や「カンマの間が空白スペースだった場合」などは
無視するといった処理も織り込むので今回は、ハチさんとハトさんに教えて
いただいたやり方を合わせて取り入れたいと思います。
ありがとうございました。

【37744】Re:配列と配列の要素数を受け取りたい
質問  sin  - 06/5/17(水) 17:26 -

引用なし
パスワード
   ▼ハチ さん:
大変参考になりました、ありがとうございます。

ただ、
>Variantにすればできると思います。
確かに出来たので問題ないのですが、
「Variant」というのが少し引っかかりました。
素人考えなのですが、
Variant型で宣言して配列型に変換できるのであれば、
始めから配列型で宣言できるのでは?
と思ってしまうのですが・・・。
出来ないのでしょうか?

【37745】Re:配列と配列の要素数を受け取りたい
発言  ハチ  - 06/5/17(水) 17:50 -

引用なし
パスワード
   ▼sin さん:
出来るようです。
自分も初めて知りました。
勉強になります^^

なんだか二次元配列みたいになってますが、
あってるのかな??

Sub test4()

  Dim get_res() As String
  Dim i As Integer
  get_res = testf2("aaa,bb,cccc,ddd")

For i = LBound(get_res) To UBound(get_res)
  MsgBox get_res(i)
  MsgBox TypeName(get_res(i))
Next i
  MsgBox UBound(get_res)
  
  MsgBox testf2("aaa,bb,cccc,ddd")(0)
  MsgBox TypeName(testf2("aaa,bb,cccc,ddd")(0))
  
End Sub

Function testf2(str As String) As String()

  Dim stp As Integer         'ストップ位置
  Dim stt As Integer         'スタート位置
  Dim cnt As Integer         '配列の要素数
  Dim res_str() As String       '結果保存用配列

  stt = 0
  cnt = 0
  stp = 1

  Do Until stp = 0
    ReDim Preserve res_str(cnt)

    stp = InStr(stt + 1, str, ",")     'カンマ位置の取得

    If stp <> 0 Then        'カンマが検出された場合の処理
      res_str(cnt) = Mid(str, stt + 1, stp - stt - 1)
      cnt = cnt + 1
      stt = stp
    Else              'カンマが検出されかった場合の処理
      res_str(cnt) = Mid(str, stt + 1, Len(str) - stt)
    End If
  Loop

  testf2 = res_str

End Function

【37763】Re:配列と配列の要素数を受け取りたい
お礼  sin  - 06/5/18(木) 11:06 -

引用なし
パスワード
   ▼ハチ さん:
確認しました、これでスッキリしました。
ありがとうございました。

>▼sin さん:
>出来るようです。
>自分も初めて知りました。
>勉強になります^^
>
>なんだか二次元配列みたいになってますが、
>あってるのかな??
>
>Sub test4()
>
>  Dim get_res() As String
>  Dim i As Integer
>  get_res = testf2("aaa,bb,cccc,ddd")
>
>For i = LBound(get_res) To UBound(get_res)
>  MsgBox get_res(i)
>  MsgBox TypeName(get_res(i))
>Next i
>  MsgBox UBound(get_res)
>  
>  MsgBox testf2("aaa,bb,cccc,ddd")(0)
>  MsgBox TypeName(testf2("aaa,bb,cccc,ddd")(0))
>  
>End Sub
>
>Function testf2(str As String) As String()
>
>  Dim stp As Integer         'ストップ位置
>  Dim stt As Integer         'スタート位置
>  Dim cnt As Integer         '配列の要素数
>  Dim res_str() As String       '結果保存用配列

ここに、MsgBox VarType(testf2) を入れたところ
ちゃんと8200が表示されました!

>
>  stt = 0
>  cnt = 0
>  stp = 1
>
>  Do Until stp = 0
>    ReDim Preserve res_str(cnt)
>
>    stp = InStr(stt + 1, str, ",")     'カンマ位置の取得
>
>    If stp <> 0 Then        'カンマが検出された場合の処理
>      res_str(cnt) = Mid(str, stt + 1, stp - stt - 1)
>      cnt = cnt + 1
>      stt = stp
>    Else              'カンマが検出されかった場合の処理
>      res_str(cnt) = Mid(str, stt + 1, Len(str) - stt)
>    End If
>  Loop
>
>  testf2 = res_str
>
>End Function

7649 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free