【问题标题】:Excel Vba create array from 2 cell values step size of 1Excel Vba从2个单元格值创建数组,步长为1
【发布时间】:2021-02-05 17:15:09
【问题描述】:

我正在尝试创建一个基于 2 个单元格值更改大小的数组。 然后这个数组将在 For 循环中使用。

例如:

B3 = 1 C3 = 4 

我希望数组的下界为 1,上界为 4,步长或间隔为 1

当我像下面这样键入数组时,代码可以工作,但我希望它是动态的或根据单元格值 B3 和 C3 进行更改。

SheetList = Array("1", "2", "3", "4")

【问题讨论】:

    标签: excel vba cell step


    【解决方案1】:

    只需使用 for 循环:

     Sub workForFree()
     
     Dim sheetlist() As Variant
     ReDim sheetlist(ActiveSheet.Range("C3") - ActiveSheet.Range("B3"))
     
     Dim k As Long
     k = 0
     
     Dim i As Long
     For i = ActiveSheet.Range("B3") To ActiveSheet.Range("C3") Step 1
        sheetlist(k) = i
        k = k + 1
     Next i
     
     Debug.Print Join(sheetlist, ",")
        
        
     End Sub
    

    【讨论】:

    • LBound(sheetlist)=0 在您的解决方案中,而不是 1 因为它是必需的。应该是:ReDim sheetlist(ActiveSheet.Range("C3"), ActiveSheet.Range("B3"))
    • 不等于 1。在 b3 中使用 1,在 c3 中使用 4。
    • 该数组是 ReDim'd,代码中只有一个数字,它设置 UBound = 3 (4-1=3); Lbound=0 默认情况下:你放一个减号,而不是逗号 :)
    • 没错,OP 想要一个一维数组作为输出。一个一维数组,其数字从 B3 中的值到 C3 中的值,因此在 OP 的给定示例中为 {1,2,3,4}。所以sheetlist(0) = 1,sheetlist(1)=2,sheetlist(2)=3, 和sheetlist(3)=4
    • OP 在引用下限和上限时谈论的是数组中的值,而不是数组项。
    【解决方案2】:

    如果您废弃了 MS 365 版本,您可以使用新的 Sequence() function(默认为从 1 开始):

    Sub CreateSequence365()
        Dim lo As Long: lo = ActiveSheet.Range("B3")    ' start of sequence
        Dim hi As Long: hi = ActiveSheet.Range("C3")    ' end   of sequence
        'create sequence via single code line
        Dim sheetlist: sheetlist = Application.Sequence(1, hi - lo + 1, lo, 1)
        'display results in VB Editor's immediate window
        Debug.Print "~~> " & Join(sheetlist, ","), _
              vbNewLine & "Boundaries: " & LBound(sheetlist) & " To " & UBound(sheetlist)
    End Sub
    

    结果在 VB 编辑器的即时窗口中:

    ~~> 1,2,3,4   
    Boundaries: 1 To 4
    

    编辑 #1:其他版本的替代方法:

    Sub CreateSequence()
        Dim lo As Long: lo = ActiveSheet.Range("B3")
        Dim hi As Long: hi = ActiveSheet.Range("C3")
        Dim sheetlist: sheetlist = Application.Transpose(Evaluate("row(" & lo & ":" & hi & ")"))
        Debug.Print "~~> " & Join(sheetlist, ","), _
              vbNewLine & "Boundaries: " & LBound(sheetlist) & " To " & UBound(sheetlist)
    End Sub
    

    【讨论】:

    • 当我尝试逐行遍历 For 循环时,代码总是打开工作簿上的最后一个工作表,无论工作表名称如何。就像它不会中断下限和上限,而只是跳到最后一张纸。我可以指定一个范围,例如 LB=18 UB=22,但代码只是从工作簿位置的最后一张纸开始。但是,当使用像 sheetlist = Array("18", "19", "20", "21", "22") 这样的定义数组函数时,循环可以正常工作。有什么建议吗?
    • @Ross.P - 上述代码中没有 For 循环 - 您在哪个代码行遇到问题? - 当然,您可以完全限定您的范围引用(例如 Sheet1.Range("...")ThisWorkbook.Worksheets("Sheet1")),而不是引用 ActiveSheet
    • 代码卡在这里Worksheets(sheetlist(X)).Activate 如果我使用sheetlist = Array("18", "19", "20") 没有问题,但是当尝试切换到Dim lo As Long: lo = ActiveSheet.Range("B3")Dim hi As Long: hi = ActiveSheet.Range("C3") 时代码卡住并且不会从下限开始
    • For X = LBound(sheetlist) To UBound(sheetlist) Windows("Truck Log-East Gate-January.xlsx").Activate Worksheets(sheetlist(X)).Activate Range("A4:R4").Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Windows("Truck Racks RawData.xlsm").Activate Sheets("RawDataMacro").Select Range("A" & Rows.Count).End(xlUp).Select ActiveCell.Offset(1).Select ' moves cursor down one cell Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Next X
    • 我不知道发生的错误消息,并且引用的代码远远超出了原始帖子。 IMO 所有答案都解决了您创建定义序列的请求,因此您可以考虑提出一个具有准确描述的新问题以及一些示例数据。 @Ross.P
    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多