nn是100的随机数.
当nn<2 -- nn = 2  
4,5,10这些数道理同上,必须用Select case 方法
 
    nn = Int(100)
    Select Case nn
      Case Is <= 10
        nn = 10
      Case 10.1 To 15
        nn = 15
      Case 15.1 To 20
        nn = 20
      Case 20.1 To 25
        nn = 25
      Case Else      
    End Select
请问各位大侠的问题是.
当nn >10  且  nn<=30时
进位档有15,20,25,30档,不用Select case方法.
当nn > 30 进位档有40,50,60,70,80,90.100
      也就是没有45,55,65,75,85,95谢谢各位大侠

解决方案 »

  1.   

    5进位
    当nn = 10.1 时 nn = 15
    当nn = 17.2    nn =2010进位
    当nn = 35  时 nn = 40
    当nn = 51.35 时 nn = 60
      

  2.   


    Private Sub Command1_Click()
       Dim nn As Integer, i As Integer
       nn = 11
       If nn > 10 And nn <= 30 Then
          For i = 10 To 30 Step 5
              If nn = i Then
                 MsgBox nn
                 Exit For
              ElseIf nn < i Then
                 nn = i
                 MsgBox nn
                 Exit For
              End If
          Next
       End If
       
    '当nn >10 且 nn<=30时
    '进位档有15,20,25,30档,不用Select case方法.
    End Sub
      

  3.   


    Private Sub Command1_Click()
       Dim nn As Single, i As Integer
       nn = 51.35
       If nn > 10 And nn <= 30 Then
          For i = 10 To 30 Step 5
              If nn <= i Then
                 nn = i
                 MsgBox nn
                 Exit For
              End If
          Next
       ElseIf nn > 30 Then
          For i = 30 To 100 Step 10
              If nn <= i Then
                 nn = i
                 MsgBox nn
                 Exit For
              End If
          Next   End If
    '当nn >10 且 nn<=30时
    '进位档有15,20,25,30档,不用Select case方法.' 当nn > 30 进位档有40,50,60,70,80,90.100
    '也就是没有45 , 55, 65, 75, 85, 95End Sub
      

  4.   


    发此帖时,个人的思路是 
    int(15/10 ) 得到一个倍数 --- nn =1
    15.1- 10 * nn 判读其是否 > 5 还是 < 5 这种算法与Select case比 没有进行简单.
    '一点没想到大侠的
    For i = 10 To 30 Step 5
    Step 5 的解法.谢谢大侠的算法,简单明了,需要消化理解.
      

  5.   

    大概想了下,应该还可以优化:
    Function GetValue(n As Double, m As Long) As Long
        Dim x As Long
        Dim y As Double
        x = (n \ 10) * 10
        y = n - x
        If y > 0 And y <= m Then
            y = m
        ElseIf y > m Then
            y = 10
        End If
        GetValue = x + y
    End Function
    Private Sub Command1_Click()
        Dim n As Double
        Randomize
        n = Rnd * 100
        Debug.Print n
        n = Switch(n <= 10, 10, _
            n <= 30, GetValue(n, 5), _
            n <= 100, GetValue(n, 10))
        Debug.Print n
    End Sub
    也可以不用swith函数,用select case语句.....
      

  6.   

    switch 改作select case :
    Dim n As Double
        Randomize
        n = Rnd * 100
        Debug.Print n
        Select Case n
            Case Is <= 10
                n = 10
            Case 10 To 30
                n = GetValue(n, 5)
            Case 30 To 100
                n = GetValue(n, 10)
        End Select
        Debug.Print n
      

  7.   

    谢谢回复
    GetValue没有用过.For i = 10 To 30 Step 5用法比较常用,便于理解.
      

  8.   

    7楼代码中GetValue是按你要求写的一个自定义函数,这也是常用方法....学编程你不会只想学for语句吧?for可不是万能的.......
      

  9.   

    GetValue函数中传二个参数,参数n就是你顶楼代码中的随机值nn, 参数m是进位值(5进位或10进位)... 
      

  10.   


    谢谢,看错了,GetValue是自定义函数. 从这种写法以为是内置函数,在网上找了半天没找到,理解了半天没有理解到位,对不起了.谢谢指教.Function GetValue(n As Double, m As Long) As Long
        Dim x As Long
        Dim y As Double
        x = (n \ 10) * 10
        y = n - x
        If y > 0 And y <= m Then
            y = m
        ElseIf y > m Then
            y = 10
        End If
        GetValue = x + y
    End Function
      

  11.   

    Sub Main()
       Dim i&, j&
       Randomize
       For i = 1 To 20   '产生20个数进行测试
          j = Rnd() * 100
          Debug.Print j, ValueEx(j)
       Next
    End Sub' 参数变换函数
    Private Function ValueEx(ByVal num As Long) As Long
       num = (num + 4) \ 5
       If (num > 2) Then
          If (num > 6) Then
             ValueEx = ((num + 1) \ 2) * 10
          Else
             ValueEx = num * 5
          End If
       Else
          ValueEx = 10
       End If
    End Function
      

  12.   

    这样测试更简单:
    Sub Main()
       Dim i&
       For i = 1 To 100
          Debug.Print i, ValueEx(i)
       Next
    End Sub
      

  13.   

    借用Chen8013的思路,好象如下就可以了吧:    Dim nn As Double
        Dim x As Double
        Dim y As Long    nn = rnd * 100 
        x = n / 5
        Select Case x       'nn<=10
            Case Is <= 2
                nn = 10
            Case 2 To 6     'nn=10~30
                y = nn \ 5
                nn = y * 5 - (x <> y) * 5 '非5倍数,整除5后再加5
            Case Else:      'nn>30
                x = nn / 10
                y = nn \ 10
                nn = y * 10 - (x <> y) * 10 ''非10倍数,整除10后再加10
        End Select
      

  14.   

    [Quote=引用 14 楼 chen8013 的回复:]
    VB code
    Sub Main()
       Dim i&amp;, j&amp;
       Randomize
       For i = 1 To 20   '产生20个数进行测试
          j = Rnd() * 100
          Debug.Print j, ValueEx(j)
       Next
    End Sub谢谢回复,又学到一个知识点.Visual Basic 语言参考
    \ 运算符--------将两个数相除并返回以整数形式表示的结果。Mod 运算符 (Visual Basic)-------将两个数相除并只返回余数。请问\与mod 有何区别---在这里为什么要用\ 而不用Mod.