Excel VBA質問箱 IV

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

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


8125 / 13644 ツリー ←次へ | 前へ→

【34939】近似値を求める。 ゼロイオン 06/2/16(木) 14:40 質問[未読]
【34943】Re:近似値を求める。 Kein 06/2/16(木) 15:50 回答[未読]
【34960】Re:近似値を求める。 ゼロイオン 06/2/16(木) 23:01 質問[未読]
【35004】Re:近似値を求める。 [名前なし] 06/2/18(土) 0:56 回答[未読]
【35043】Re:近似値を求める。 ゼロイオン 06/2/20(月) 2:54 お礼[未読]

【34939】近似値を求める。
質問  ゼロイオン  - 06/2/16(木) 14:40 -

引用なし
パスワード
   ある構造体があったとします。
配列(0).時間 配列(0).値
配列(1).時間 配列(1).値
配列(2).時間 配列(2).値
 
配列.時間の0〜2
の中には0から
13:00
12:00
9:00

もうひとつ、配列.値の0〜2
の中には0から
100
450
300

という場合。

ある計算で求めた数字の値が290だったとき、最も290に近い
配列は配列(2).値だということが頭では分かります。そして最も近い
配列が(2)だということで関連している時間は9:00というように
導きだしたいのですが、こんな風に近似値を元に時間を求めるには
どのようなマクロを具体的に書けばよろしいのでしょうか?

お願いします。

【34943】Re:近似値を求める。
回答  Kein  - 06/2/16(木) 15:50 -

引用なし
パスワード
   こんな感じでしょーか ?

Sub MyTime近似値()
  Dim Dic As Object
  Dim Myk As Variant, MyIt As Variant
  Dim i As Long, Ary(0 To 2) As Long
  Dim Mi As Long, Num As Long
  Dim GetTm As Date
 
  Set Dic = CreateObject("Scripting.Dictionary")
  With Dic
   .Add "13:00", "100"
   .Add "12:00", "450"
   .Add "9:00", "300"
   Myk = .Keys: MyIt = .Items
  End With
  For i = 0 To Dic.Count - 1
   Mi = Abs(Val(MyIt(i)) - 290)
   Ary(i) = Mi
  Next i
  With WorksheetFunction
   Num = .Match(.Min(Ary), Ary, 0) - 1
  End With
  GetTm = TimeValue(Myk(Num))
  MsgBox "近似値は " & GetTm
  Set Dic = Nothing: Erase Ary
End Sub

【34960】Re:近似値を求める。
質問  ゼロイオン  - 06/2/16(木) 23:01 -

引用なし
パスワード
   ▼Kein さん:
ご回答ありがとうございます。
申し訳ないですが、Scripting.Dictionary
はいまいち苦手なのでIF文でできないものでしょうか?
どなたかよろしくお願いします。。。

【35004】Re:近似値を求める。
回答  [名前なし]  - 06/2/18(土) 0:56 -

引用なし
パスワード
   以下のように、単純に1つずつ比較していくだけでいいのでは?

Type 項目
  時間 As Date
  値 As Long
End Type

Sub Macro1()
Const 計算結果 As Long = 280
Dim 配列() As 項目
Dim i As Long
Dim 検索結果 As Long

  ReDim 配列(2)
  配列(0).時間 = TimeValue("13:00"): 配列(0).値 = 100
  配列(1).時間 = TimeValue("12:00"): 配列(1).値 = 450
  配列(2).時間 = TimeValue("9:00"): 配列(2).値 = 300

'  ReDim 配列(2000)
'
'  Randomize
'
'  For i = 0 To UBound(配列)
'    配列(i).時間 = Rnd()
'    Do
'      配列(i).値 = Rnd() * 計算結果 * 2
'    Loop Until 配列(i).値 <> 計算結果
'  Next

  MsgBox "検索を開始します。", vbInformation

  For i = 0 To UBound(配列)
    If Abs(配列(i).値 - 計算結果) < Abs(配列(検索結果).値 - 計算結果) Then
      検索結果 = i
      If 配列(i).値 = 計算結果 Then Exit For
    End If
  Next
  
  MsgBox 計算結果 & " に最も近いのは配列(" & 検索結果 & ")の " & _
      配列(検索結果).値 & " で、時間は " & Format(配列(検索結果).時間, "h:mm") & " です。"
End Sub

【35043】Re:近似値を求める。
お礼  ゼロイオン  - 06/2/20(月) 2:54 -

引用なし
パスワード
   >名前なしさん
大変おくれましたが、教えてくださった方法を元にがんばって
いこうと思います。ありがとうございました!!

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