Excel VBA質問箱 IV

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

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


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

【76125】Do Whileの使い方について スパニングツリー 14/10/2(木) 16:55 質問[未読]
【76126】Re:Do Whileの使い方について 独覚 14/10/2(木) 17:18 回答[未読]
【76127】Re:Do Whileの使い方について スパニングツリー 14/10/2(木) 17:25 お礼[未読]
【76128】Re:Do Whileの使い方について kanabun 14/10/2(木) 17:29 発言[未読]
【76133】Re:Do Whileの使い方について kanabun 14/10/3(金) 11:31 発言[未読]
【76134】Re:Do Whileの使い方について スパニングツリー 14/10/3(金) 11:49 お礼[未読]

【76125】Do Whileの使い方について
質問  スパニングツリー  - 14/10/2(木) 16:55 -

引用なし
パスワード
   下記プログラムを作りました。
私の想定ではjは4になるのですが、jは1のままです。

tData = 15
sData = "2,4,6,10,20,50,51,52,53,100"
tOne = Split(tData, ",")

For i = 0 To UBound(tOne)
sOne = Split(sData, ",")
j = 1
Do While CInt(sOne(j - 1)) < CInt(tOne(i)) And CInt(tOne(i)) < CInt(sOne(j))
j = j + 1
Loop
Next i
MsgBox j

下記の1行がおかしいからというのは分かるのですが、
2 < 15 And 15 < 4 で条件式を満たしていないからjに1加算されていくと思っているのですが、
いかがでしょうか。考えても詰まってしまいました…。
教えていただけると幸いです。
Do While CInt(sOne(j - 1)) < CInt(tOne(i)) And CInt(tOne(i)) < CInt(sOne(j))

【76126】Re:Do Whileの使い方について
回答  独覚  - 14/10/2(木) 17:18 -

引用なし
パスワード
   ▼スパニングツリー さん:
Do While
は条件が真の間繰り返す、ですよ。

条件が真になるまで(偽の間)繰り返すは
Do Until
です。

【76127】Re:Do Whileの使い方について
お礼  スパニングツリー  - 14/10/2(木) 17:25 -

引用なし
パスワード
   ▼独覚 さん:
>▼スパニングツリー さん:
>Do While
>は条件が真の間繰り返す、ですよ。
>
>条件が真になるまで(偽の間)繰り返すは
>Do Until
>です。

なるほど、道理で…。すみません勘違いしていました。
ありがとうございました。

【76128】Re:Do Whileの使い方について
発言  kanabun  - 14/10/2(木) 17:29 -

引用なし
パスワード
   ▼スパニングツリー さん:

> 私の想定ではjは4になるのですが

蛇足ながら、
sDataが 数値データの配列と考えると、昇順で要素が並んでいるから、
j は Loopしなくとも、以下のようでも求めることができます。

Sub Try1()
  Dim j As Long
  Dim sData
  sData = Array(2, 4, 6, 10, 20, 50, 51, 52, 53, 100)
  
  j = Application.Match(15, sData, 1)
  MsgBox j
End Sub

【76133】Re:Do Whileの使い方について
発言  kanabun  - 14/10/3(金) 11:31 -

引用なし
パスワード
   ▼スパニングツリー さん:

あと、

>tData = 15
>sData = "2,4,6,10,20,50,51,52,53,100"

のばあいなら

>Do Until CInt(sOne(j - 1)) < CInt(tOne(i)) And CInt(tOne(i)) < CInt(sOne(j))

でいいでしょうが、
たとえば、

tData = 10
>sData = "2,4,6,10,20,50,51,52,53,100"

のように検索値が 対象配列の要素のどれかにぴったり一致するケースも考えられる
ときは、

Do Until CInt(sOne(j - 1)) <= CInt(tOne(i)) And CInt(tOne(i)) <= CInt(sOne(j))

と手入れをしておいたほうがいいでしょうね

# 後の祭りコメントばかりですが...

【76134】Re:Do Whileの使い方について
お礼  スパニングツリー  - 14/10/3(金) 11:49 -

引用なし
パスワード
   kanabunさん
ありがとうございます。
教えていただいた方法で改良できそうです。試してみます。

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