Excel VBA中在一列上生成一定范围内的连续数字

3

我完全不懂VBA,一直在尝试制作基础问题练习。我只想用顺序数字从1到N填充一列。N号将是特定单元格上的一个值。

所以例如N值在C4单元格上为5,我想输出从B2到BN = 1,2,3,4,5的数字。我有这段代码,基于类似问题和我的循环知识,但我无法使其工作...



Sub ejemplo()

Dim total() As Variant


maximo = Range("C4").Value

For i = 1 To maximo
total(i) = i
Next i

total = Application.WorksheetFunction.Transpose(total)
Range("B7:B").Value = total





End Sub


有时候会弹出错误信息"out of range",出现在total(i) = i这一行上,我真的不知道发生了什么...

1
首先,这是一个不错的练习问题!我在工作机器上没有安装Excel,但我认为你正在创建的数组可能默认为零基础。因此,第一个数组索引是0,而不是1-这意味着在你的例子中,它试图将5分配给Total(5),实际上应该是Total(4) - Samuel Everson
1
在你的 total(i) = i 行上加一个换行符(将光标放在该行并按 F9),然后逐步执行循环(键盘上的 F8),观察局部窗口中的 total() - 查看第一个索引和它在循环中抛出错误的位置。 - Samuel Everson
4个回答

5

将数组转换为工作表

  • 在所有三种情况下,您都可以使用以下语句替代For i = ...:
    For i = LBound(total) To UBound(total)
  • Transpose 的最大限制为65536个项目,因此请查看第三个解决方案。

代码

Option Explicit

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Purpose:      Writes the numbers from 1 to "maximo" to the column range
'               starting with cell "B7".
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 1D array (0-based, 'one-row')
Sub ejemplo1()

    Dim total() As Variant
    Dim maximo As Long
    Dim i As Long

    maximo = Range("C4").Value
    ReDim total(maximo - 1)

    For i = 0 To maximo - 1
        total(i) = i + 1
    Next i

    total = Application.Transpose(total)

    Range("B7").Resize(UBound(total)).Value = total

End Sub

' 1D array (1-based, 'one row')
Sub ejemplo2()

    Dim total() As Variant
    Dim maximo As Long
    Dim i As Long

    maximo = Range("C4").Value
    ReDim total(1 To maximo)

    For i = 1 To maximo
        total(i) = i
    Next i

    total = Application.Transpose(total)

    Range("B7").Resize(UBound(total)).Value = total

End Sub

' 2D array (1-based, 'one column')
Sub ejemplo3()

    Dim total() As Variant
    Dim maximo As Long
    Dim i As Long

    maximo = Range("C4").Value
    ReDim total(1 To maximo, 1 To 1)

    For i = 1 To maximo
        total(i, 1) = i
    Next i

    Range("B7").Resize(UBound(total)).Value = total

End Sub

谢谢您不仅提供了一个解决方案,而是三个解决方案。我会尝试应用它们,并练习每种方法! - Gabriela Reyes

4

相当接近:

Sub ejemplo()
    Dim total As Variant
    maximo = Range("C4").Value
    ReDim total(1 To maximo) As Long

    For i = 1 To maximo
        total(i) = i
    Next i

    total = Application.WorksheetFunction.Transpose(total)
    Range("B7").Resize(maximo, 1).Value = total
End Sub

注意:

  • ReDim语句
  • 带有Resize语句的声明

enter image description here

编辑#1:

如果您使用的是Excel 365,则可以将代码简化为一行:

Sub NoLoops()
    Range("B7").Formula2 = "=SEQUENCE(" & Range("C4").Value & ",1,1,1)"
End Sub

哇!太有用了,谢谢你 :3 我不知道 =SEQUENCE 属性。 - Gabriela Reyes
1
编辑#1:您甚至可以使用:“Sheet1.Range(“B7”).Formula2 =“=ROW($ A $ 1:INDEX($ A:$ A,$ C $ 4))” ”来添加动态公式集:+) - T.M.
1
@T.M. ...........................好主意..................... - Gary's Student

3

我始终建议至少要明确你的Worksheet引用。 我会使用一个With语句,并利用工作表的CodeName

此外,我想添加另一个答案,通过Evaluate()创建数组。 虽然这个函数有255个字符的限制,但在这个练习中永远不会有风险。

Sub Test()

Dim total As Variant

With Sheet1
    total = .Evaluate("ROW(1:" & .[C4] & ")")
    .Range("B7").Resize(UBound(total)).Value = total
End With

End Sub

一旦您熟悉了这里所看到的内容,您可以在一次操作中完成,而不会破坏可读性(依我之见):

With Sheet1
    .Range("B7").Resize(.[C4]).Value = .Evaluate("ROW(1:" & .[C4] & ")")
End With

我会错过你的方法:在排序中,ROW评估是我喜欢的一种;例如,在通过Application.Index()函数进行数组重构时,我喜欢使用它。 - T.M.

3
计数的标准方法是:
i = i + 1

当你反复调用这个函数时,i会递增。应用于您的问题,循环For i = 1 To maximo将计算循环次数,但它并没有给出起始数字i。因此,您需要这样做:-
Dim MyNumber As Integer
Dim i As Integer

MyNumber = 0
For i = 1 To maximo
    MyNumber = MyNumber + 1
Next i

下一步任务是定义要写入的单元格。基本上它与逻辑相同。您需要一个起始点,比如B2。
Dim StartCell As Range
Set StartCell = Range("B2")

现在,您可以将所有内容整合在一起。

Dim Maximo As Integer
Dim StartCell As Range
Dim MyNumber As Integer
Dim i As Integer

Maximo = Range("C4").Value
MyNumber = 0
Set StartCell = Range("B2")
For i = 1 To maximo
    MyNumber = MyNumber + 1
    StartCell.Offset(0, i - 1).Value = MyNumber
Next i

好答案。我注意到了那个不被赞赏的踩票。真遗憾。我只会设置起始数字 MyNumber = 1 并将“计数器行”放在 StartCell... 行下面,从而模拟一个 For Next 循环,并能够最终更改起始数字,而不是将起始数字减少 1 - VBasic2008
你好,感谢回答我的问题!虽然你的方法有些不同,但是你解释得非常清楚。我希望我能够标记多个正确答案,但是我先看到了另一个评论,它也起作用了。;_;谢谢,我之前也不知道StartCell这个东西,所以这非常有用。祝你有愉快的一天:3 - Gabriela Reyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接