カーソルのトラッキングについて への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 るきお  (社会人) 投稿日時 2020/9/28 20:16:43
解決してよかったです。

>RoundMultiple関数って初めて聞きました
私が作った関数なので無理もありません。

Private Function RoundMultiple のところで名前を定義しています。
たとえば、ここを Private Function xxxxx に修正すると、関数名は xxxxx になります。
投稿者 イヨ  (社会人) 投稿日時 2020/9/28 08:47:11
るきお様
お世話になっております。

やりたかったことができました!
RoundMultiple関数って初めて聞きました
とっても勉強になりました。mom
ありがとうございました
投稿者 るきお  (社会人) 投稿日時 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
投稿者 イヨ  (社会人) 投稿日時 2020/9/24 09:19:15
こんにちは
お世話になっております。

カーソルのトラッキングについて
x600 y400 のフォームがありましてxを60ずつ yを40ずつ
クリックした値に対し近しい座標までもっていき取得したいです。

例えば x:248 y 85 ですと
x:248は60の4倍が近しいのでx:240に移動
y:85は40の2倍が近しいのでy:80に移動

いろいろやってみましたが指定の数値で対応ができなくて。。(百の位を四捨五入するとか)
なにかいい方法がありませんでしょうか

宜しくお願いします。