Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 使用For…Next循环写入依赖于计数器的值_Vba_Excel - Fatal编程技术网

Vba 使用For…Next循环写入依赖于计数器的值

Vba 使用For…Next循环写入依赖于计数器的值,vba,excel,Vba,Excel,我想在列E中指定数量的单元格中写入“1”,然后在单元格正下方的相同数量的单元格中写入“2”,然后写入“3”,依此类推,直到我在单元格中写入的值达到用户定义的变量。我想我应该使用For…下一个循环,但我不确定。我现在的代码是: Dim k As Long For k = 0 To observations Range(Cells(2 + (k * patientprofiles), 5), Cells(1 + p * (k + 1), 5)).Value = k +

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

    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,在单元格E162:E201中写入5,在单元格E202:E241中写入6

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

关于这一点,我有三个问题:

  • 我认为应该使用For…Next循环来实现这一点,对吗?如果没有,我应该使用什么

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

  • 为什么单元格的起点太高,终点太低

  • 感谢您的帮助,如果这是一个非常简单的问题,或者其他地方已经回答了,我深表歉意。

    另一种方式如下

    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
    
    您需要将
    .Resize()
    方法与循环的
    步骤
    参数结合使用:

    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")
    
    “公式”方法

    选项显式
    副标题()
    模糊的观察像长,病人的轮廓像长
    观察值=6
    patientprofiles=10
    
    ActiveSheet.Range(“e2”).Resize(observations*patientprofiles)。公式1c1=“=IF(ROWS(R2C:RC)=1,1,IF(COUNTIF(R2C:R[-1]C,R[-1]C)
    从e2开始,因为
    单元格(2+(k*patientprofiles)
    告诉它在
    k=0时从第2行开始(循环的开始).Edit:哦,等等,你确实希望它从
    E2
    开始。你在第二个
    单元格中有
    p
    ,这应该是
    patientprofiles
    @ScottCraner哦,这是一个令人尴尬的错误!谢谢你,这很有帮助;它现在几乎可以工作了。唯一的问题是它在接下来的40个单元格中写入k+1(在本例中为7)(即E242:E281)。有没有办法让它在E241停止写入?
    对于k=0到观察值-1
    如果它满意,请您将其标记为解决方案,尽管它仍然存在为接下来的40个单元格写入额外值的问题。我在上面的Scott Craner帮助下解决了这个问题;我有一个打字错误,而且我必须将其更改为
    观察值-1
    .谢谢你抽出时间!
    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