Excel VBA質問箱 IV

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

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


4232 / 13646 ツリー ←次へ | 前へ→

【57770】数字を検索するには よう 08/9/12(金) 20:50 質問[未読]
【57772】Re:数字を検索するには かみちゃん 08/9/12(金) 21:15 発言[未読]
【57773】Re:数字を検索するには よう 08/9/12(金) 21:17 発言[未読]
【57774】Re:数字を検索するには かみちゃん 08/9/12(金) 21:30 発言[未読]
【57775】Re:数字を検索するには kanabun 08/9/12(金) 21:45 発言[未読]
【57776】Re:数字を検索するには かみちゃん 08/9/12(金) 21:51 質問[未読]
【57777】Re:数字を検索するには かみちゃん 08/9/12(金) 22:57 発言[未読]
【57778】Re:数字を検索するには よう 08/9/12(金) 23:31 発言[未読]
【57779】Re:数字を検索するには kanabun 08/9/12(金) 23:56 発言[未読]
【57780】Re:数字を検索するには kanabun 08/9/13(土) 0:00 発言[未読]
【57781】Re:数字を検索するには よう 08/9/13(土) 0:32 お礼[未読]

【57770】数字を検索するには
質問  よう  - 08/9/12(金) 20:50 -

引用なし
パスワード
   例えば1〜5の数字があります。

AとBの関係から数式を作りたいのですが、その前に・・・

823を入力すると、A列の765と834が表示されるようにしたいのです。

どうすればよいでしょうか? 宜しくお願いします。

  A  B
1 560 2500円
2 593 3500円
3 765 4500円
4 834 6200円
5 965 8400円

【57772】Re:数字を検索するには
発言  かみちゃん  - 08/9/12(金) 21:15 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>823を入力すると、A列の765と834が表示されるようにしたい

A列は、昇順に並んでいるという前提でしょうか?

【57773】Re:数字を検索するには
発言  よう  - 08/9/12(金) 21:17 -

引用なし
パスワード
   こんばんは、かみちゃんさん。

そうです。昇順に並んでいるという前提です。

【57774】Re:数字を検索するには
発言  かみちゃん  - 08/9/12(金) 21:30 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> 昇順に並んでいるという前提です。

ワークシート関数のMATCH関数をVBAから利用することで対処する方法があります。

MATCH関数のヘルプを確認していただくと、
>> 照合の型に 1 を指定すると、検査値以下の最大の値が検索されます。
>> このとき検査範囲のデータは、昇順に並べ替えておく必要があります
とあるので、これを利用して、以下のようなコードでできると思います。

Sub Sample()
 Dim m As Variant '←必ずVariantで宣言
 
 With Range("A1:A5")
  m = Application.Match(823, .Cells, 1)
  If Not IsError(m) Then
   MsgBox .Cells(m).Value & vbCrLf & .Cells(m + 1).Value
  End If
 End With
End Sub

【57775】Re:数字を検索するには
発言  kanabun  - 08/9/12(金) 21:45 -

引用なし
パスワード
   横からスミマセン。


>そうです。昇順に並んでいるという前提です。


ぼくも Match 関数がおすすめだと思いますけど、
見つかったときは数値が返りますから、
  If IsNumeric(m) Then
と判定することもできますね.
(not 演算子を使わない)

あと、
ちょうど 834 とか 検索値とぴったり一致するときの
分岐が必要ではないでしょうか?

【57776】Re:数字を検索するには
質問  かみちゃん  - 08/9/12(金) 21:51 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>見つかったときは数値が返りますから、
>  If IsNumeric(m) Then
>と判定することもできますね.
>(not 演算子を使わない)

あーそうですね。いろいろと方法があるものですね。どれが標準なのでしょうか?
個人の好みは、置いておいて、何が一般的なのかを知りたいですね。
いつも悩むところです。

>ちょうど 834 とか 検索値とぴったり一致するときの
>分岐が必要ではないでしょうか?

それはそうなのですが、ぴったりのものと、もうひとつは、大きい方を取るのか
小さい方を取るのか仕様がわからないですね。

【57777】Re:数字を検索するには
発言  かみちゃん  - 08/9/12(金) 22:57 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>>見つかったときは数値が返りますから、
>>  If IsNumeric(m) Then
>>と判定することもできますね.
>>(not 演算子を使わない)
>
>あーそうですね。いろいろと方法があるものですね。どれが標準なのでしょうか?
>個人の好みは、置いておいて、何が一般的なのかを知りたいですね。

わざわざ、Not IsError(m) で判断しなくても、IsNumeric(m) で十分ですね。
標準云々は、あまり関係ありませんでした。

kanabunさん、失礼しました。また、ご指摘ありがとうございます。

【57778】Re:数字を検索するには
発言  よう  - 08/9/12(金) 23:31 -

引用なし
パスワード
   皆さん、有難うございます。

自動でできるのですね!


それと、

823を入力すると、A列の765と834の比例配分、3と4の配分で、3.65とか
可能でしょうか?

その結果をC10に書き込みたいのですが。。。

すみません、難しい追加で。


  A  B   C
1 560 2500円
2 593 3500円
3 765 4500円
4 834 6200円
5 965 8400円

10       結果

【57779】Re:数字を検索するには
発言  kanabun  - 08/9/12(金) 23:56 -

引用なし
パスワード
   ▼よう さん:
また、おじゃまします


>それと、
>
>823を入力すると、A列の765と834の比例配分、3と4の配分で、3.65とか
>可能でしょうか?

ぴったりな値でなかったら、両側の値で 案分するということですね?
(関数でありそうですけど、詳しくないので, VBAで地道に求めてみました ^^)

Sub Try2()
 Dim m
 Dim x1#, x2#, y1#, y2#
 Dim y#, a#, b#
 Dim myVal As Double
 
 myVal = 823
 With Range("A1:A5")
   m = Application.Match(myVal, .Cells, 1)
   If IsNumeric(m) Then
     If .Item(m) = myVal Then
       y = .Item(m, 2)
     Else
       x1 = .Item(m)     '(x1,y1)-(x2,y2) の値から
       x2 = .Item(m + 1)
       y1 = .Item(m, 2)
       y2 = .Item(m + 1, 2)
       a = (y2 - y1) / (x2 - x1)
       b = y2 - a * x2     '直線式 y = ax + b を作成
       y = myVal * a + b
     End If
   End If
 End With
 Range("C10").Value = y
End Sub

【57780】Re:数字を検索するには
発言  kanabun  - 08/9/13(土) 0:00 -

引用なし
パスワード
   すみません。

> Range("C10").Value = y

の位置がよくないですね。

If IsNumeric(m) Then
  :
  :
  Range("C10").Value = y
End If

に移動しておいてくださいマセ。 m(__)m

【57781】Re:数字を検索するには
お礼  よう  - 08/9/13(土) 0:32 -

引用なし
パスワード
   kanabun さん、どうも有難うございます!!

両側の値で 案分するということで、よかったです。


自分では無理でしたので、大変、有難いです。

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