投稿者 るきお  (社会人) 投稿日時 2020/9/25 08:18:28
>いろいろやってみましたが指定の数値で対応ができなくて。。(百の位を四捨五入するとか)
>なにかいい方法がありませんでしょうか
近い倍数を算出するプログラムについて聞きたいということであっていますか?

置き換えると次のような問題を解くプログラムを作ればよいのですね。

問 248 にもっと近い 60 の倍数を求めよ。

248 ÷ 60 = 4.13333… なので、答えは 60 × 4 = 240 か 60 × 5 = 300 のどちらかです。
240 と 300 のどちらが 248 に近いかは引き算するとわかります。
248 - 240 = 8
300 - 248 = 52
なので、 8 対 52 で 240 の方が 248 に近いです。
以上の通りで、答えは 248 です。


これをVBのプログラムとして計算する RoundMultiple 関数を作ってみました。呼び出し例もつけて紹介します。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    '248に一番近い60の倍数を算出します。newXは240になります。 
    Dim newX As Integer = RoundMultiple(248, 60)

    '85に一番近い40の倍数を算出します。newYは80になります。 
    Dim newY As Integer = RoundMultiple(85, 40)

    MsgBox(newX & "," & newY & " の位置にマウスカーソルを移動します。")
    
End Sub

''' <summary> 
''' value に一番近い factor の倍数を算出します。 
''' </summary> 
''' <param name="value"></param> 
''' <param name="factor"></param> 
''' <returns></returns> 
Private Function RoundMultiple(value As Integer, factor As IntegerAs Integer

    '例 248 ÷ 60 = 4.13… 
    Dim rate As Double = value / factor

    '例 4.13 を切り捨てて 4 にして、factor(=60) の4倍を求めます。結果は 240 です。 
    Dim value以下で最も大きい倍数 As Integer = CInt(Math.Floor(rate) * factor)

    '例 4.13 を切り挙げて 5 にして、factor(=60) の5倍を求めます。結果は 300 です。 
    Dim value以上で最も小さい倍数 As Integer = CInt(Math.Ceiling(rate) * factor)

    '求める結果はこのどちらかのはずです。 
    'valueと近いほうがどちらから比べて、答えを出します。 

    Dim 差1 As Integer = value - value以下で最も大きい倍数
    Dim 差2 As Integer = value以上で最も小さい倍数 - value

    If 差1 < 差2 Then
        Return value以下で最も大きい倍数
    Else
        Return value以上で最も小さい倍数
    End If

End Function