【问题标题】:Increment value within range until corresponding cell value increases by specified amount在范围内增加值,直到相应的单元格值增加指定量
【发布时间】:2017-12-06 14:43:56
【问题描述】:

我有这个问题需要解决。也就是说,我需要将相同值放在范围内的代码,直到相应的单元格值增加一。一旦完成,该值需要增加 0.2 并放置递增的数字,直到相应的单元格值再次高出 1

Sub Button4_Click()


  range1 = Sheets(3).Range("g2").End(xlDown).Row
  range2 = "g2:g" & range1





   For i = 2 To range1

   If Cells(i, 7).Value <= 360 Then

   Cells(i, 8) = 60

   range3_n = Cells(i, 8).Row

   End If
   Next





  j = 0.2
  k = 1
  For i = range3_n To range1



  If Cells(i, 7) > 360 And Cells(i, 7) <= (360 + k) And Cells(i, 7) <= (360 + 
  100) Then

  Cells(i, 8) = 60 + (k * j)
  k = k + 1
  End If
  Next

   MsgBox ("END")    


   End Sub

【问题讨论】:

  • 根据您的代码,我不完全了解您要完成的工作。所以也许你可以帮助我理解:1)你有一个范围G2:G[lastrow],带有随机值。您能解释一下这些值是什么吗 2)然后检查所有这些值,如果它们符合您的条件,则将 H 列设置为等于 60(每个单元格)。你在这里没有做任何递增1,你只是设置一个60的固定值。你试图设置为+1的范围是什么,之前的值是多少。一旦它们为 +1,您就需要将 .2 添加到这些相同的值?所以现在是 60.2?
  • 1) G2:G[lastrow] 包含以分钟为单位的时间。 2) 代码的第一部分填充值为 60(温度)的单元格,直到达到 360 分钟的时间。然后我需要代码每分钟将值 60 增加 0.2,直到第 460 分钟。因此,对于包含 360-361 之间的所有值的范围,代码应填写 60.2 的值。对于 361-362,值为 60.4,依此类推。
  • 我在单元格 G2 到 G461 中输入了 1 到 460 的数字,它似乎完全按照您的要求工作。我运行了宏,它一直向下放置 60。然后从 G361(值 361)到 G460(值 460),每个单元格的值增加 0.2,直到 80。i.stack.imgur.com/sijWG.pngi.stack.imgur.com/LlfbC.png 链接是我拍摄的两个屏幕截图。这些是你想要达到的结果吗?如果没有,您能否解释一下您已经实现的 .2 增量有什么不正确之处?
  • 问题在于,只有当分钟数是每行加一的整数时才有效。我的数据是小数:ibb.co/bwN42v
  • 好吧,再问一个问题:360.0360.1360.2360.3etc.,值应该保持在 60。然后在361.0361.1361.2etc.,值应该保持60.2?所以您希望在G2:G[lastrow] 中的值增加一个整数时发生 .2 增量?

标签: excel increment vba


【解决方案1】:

基于 cmets,并保持代码结构与其完全相同,一个简单的解决方案是在最后一个 IF 语句之后添加一个新的 IF 语句:

IF (Cells(i, 7) - Int(Cells(i, 7)) = 0) Then

代码应如下所示:

Sub Button4_Click()

range1 = Sheets(1).Range("g2").End(xlDown).Row
range2 = "g2:g" & range1

For i = 2 To range1
    If Cells(i, 7).Value <= 360 Then
        Cells(i, 8) = 60
        range3_n = Cells(i, 8).Row
    End If
Next

range3_n = range3_n + 1 'start at cell 361 instead
j = 0.2
k = 1

For i = range3_n To range1
  If Cells(i, 7) > 360 And Cells(i, 7) <= (361 + k) And Cells(i, 7) <= (360 + 100) Then
    If Int(Cells(i - 1, 7)) - Int(Cells(i, 7)) <> 0 Then
        Cells(i, 8) = 60 + (k * j)
        k = k + 1
    Else
        Cells(i, 8) = Cells(i - 1, 8)
        End If
  End If
Next i

MsgBox ("END")

End Sub

它的作用是获取单元格的值,减去该值的整数版本(360.1 = 360、365.4 = 365 等)并确保等于零。任何 > .0 的十进制值都将失败,并且不符合标准。

Example:
360.0 - 360 = 0 PASS
360.1 - 360 = .1 FAIL
360.4 - 360 = .4 FAIL
360.7 - 360 = .7 FAIL
361.0 - 361 = 0 PASS

试试看,然后告诉我。

【讨论】:

  • 对不起,它不起作用。没有错误但没有执行它应该执行的操作,(我猜它不符合IF 语句中的标准)因此任何大于 361 的东西都没有价值......
  • 您能否给我看一张电子表格的屏幕截图,其中 G 列在 360 度左右?在我的工作表上,它是360.0 through 360.9,右边的单元格是 60.0。当它达到 361 时,该值变为 60.2,然后变为 361.1,并保持为 60.2。这是它如何在我的设备上运行的屏幕截图:(i.stack.imgur.com/SERIo.png)
  • 在我对 columnG 值进行四舍五入后,发生了这样的事情:ibb.co/iq8rFF,仍然不对
  • 我更新了我的回复,并改变了两件事。我将您最初的大型 IF 语句更改为:And Cells(i, 7) &lt;= (361 + k) 而不是 360,它似乎效果更好。我也采取了不同的方法,因为我没有意识到你的小数有多远。帮我一个忙,先不四舍五入地运行它,然后在必要时进行四舍五入。我将我的 IF 语句更改为 If Int(Cells(i - 1, 7)) - Int(Cells(i, 7)) &lt;&gt; 0 Then。它的作用是,它取前一个单元格的整数,并减去当前单元格,如果它不等于 0,则增加 0.2
  • 干得好!它现在按预期工作。代表你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多