【问题标题】:Using a For...Next Loop to Write Values which Depend Upon the Counter使用 For...Next 循环写入取决于计数器的值
【发布时间】:2016-04-07 00:32:58
【问题描述】:

我想在E列的指定数量的单元格中写“1”,然后在单元格正下方的相同数量的单元格中写“2”,其中有1,然后是“3”,依此类推,直到我在单元格中写入的值达到用户定义的变量。我认为我应该为此使用 For...Next 循环,但我不确定。我现在的代码是这样的:

    Dim k As Long
    For k = 0 To observations
        Range(Cells(2 + (k * patientprofiles), 5), Cells(1 + p * (k + 1), 5)).Value = k + 1
    Next

其中observations 是我要写入单元格的值,patientprofiles 是在移动到下一个值之前要填充的单元格数。例如,如果observations 为 6,patientprofiles 为 40,我想在单元格 E2:E41 中写入 1,在单元格 E42:E81 中写入 2,在单元格 E82:E121 中写入 3,在单元格 E122:E161 中写入 4,在单元格 E122:E161 中写入 5,单元格 E162:E201 和单元格 E202:E241 中的 6。

我上面的代码是在单元格 E1:E242 中写入 7,也就是说,它不会改变它在循环中移动时写入的值,它从 E1 开始并在 E242 结束,而不是从 E2 开始并在 E242 结束E241.

我对此有三个问题:

  1. 我认为我应该使用 For...Next 循环来执行此操作是否正确?如果没有,我应该使用什么?

  2. 如果 For...Next 是正确的方法,如何让 VBA 在每个单元格中写入不同的值,而不是在所有单元格中写入相同的值?

  3. 为什么开始单元格太高而结束单元格太低?

感谢您的帮助,如果这是一个非常简单的问题或已在其他地方得到解答,我深表歉意。

【问题讨论】:

  • starting in E2 因为Cells(2 + (k * patientprofiles) 告诉它在k=0(循环开始)时从第2行开始。编辑:哦,等等,你确实希望它从E2开始...
  • 你在第二个Cells中有p,应该是patientprofiles
  • @ScottCraner 嗯,这是一个令人尴尬的错误!不过,谢谢,这有帮助;现在几乎可以工作了。唯一的问题是它在接下来的 40 个单元格(即 E242:E281)中写入了 k+1(在示例中为 7)。有没有办法让它在 E241 停止写入?
  • For k = 0 To observations - 1

标签: vba excel


【解决方案1】:

您希望.Resize() 方法与Step 参数一起用于循环:

Sub Foo()

Dim k                 As Long
Dim incrementValue    As Long
Const observations    As Long = 6
Const patientProfiles As Long = 40

incrementValue = 1

For k = 2 To observations * patientProfiles Step patientProfiles
    Cells(k, 5).Resize(40, 1).Value = incrementValue
    incrementValue = incrementValue + 1
Next

End Sub

Step 参数告诉循环逐步递增,例如:

For i = 1 To 10           '// 1,2,3,4,5,6,7,8,9,10
For i = 1 To 10 Step 2    '// 1,3,5,7,9
For i = 1 To 10 Step 3    '// 1,4,7,10

Resize() 方法将范围对象的大小重新调整为给定参数:

Range("A1")                '// 1R x 1C
Range("A1:B5")             '// 5R x 2C
Range("A1").Resize(5, 2)   '// 5R x 2C (Now "A1:B5")
Range("B5").Resize(9, 1)   '// 9R x 1C (Now "B5:B13")

【讨论】:

    【解决方案2】:

    另一种方式如下

    Sub testttt()
        Dim k As Long
        observations = 6
        patientprofiles = 40
        For k = 0 To observations
            Range("E" & (Range("E" & Rows.Count).End(xlUp).Row + 1), "E" & patientprofiles + (Range("E" & Rows.Count).End(xlUp).Row)).Value = k
        Next
    End Sub
    

    【讨论】:

    • 如果满足,请您将其标记为解决方案
    • 它仍然存在为接下来的 40 个单元格写入额外值的问题。我在上面 Scott Craner 的帮助下弄清楚了;我有一个错字,而且我不得不把它改成observations - 1。感谢您抽出宝贵时间!
    【解决方案3】:

    “公式”方法

    Option Explicit
    
    Sub main()
    
    Dim observations As Long, patientprofiles As Long
    
    observations = 6
    patientprofiles = 10
    
    ActiveSheet.Range("e2").Resize(observations * patientprofiles).FormulaR1C1 = "=IF(ROWS(R2C:RC)=1,1,IF(COUNTIF(R2C:R[-1]C,R[-1]C)<" & observations & ",R[-1]C,R[-1]C+1))"
    
    End Sub
    

    也可以直接写在 excel 单元格中,只需要限制将其放入的单元格或在公式中添加外部“IF”条件来计算写入结果数字的行数

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 2023-01-31
      • 2012-11-01
      • 2015-01-20
      • 2018-01-19
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多