【发布时间】:2021-02-05 17:15:09
【问题描述】:
我正在尝试创建一个基于 2 个单元格值更改大小的数组。 然后这个数组将在 For 循环中使用。
例如:
B3 = 1 C3 = 4
我希望数组的下界为 1,上界为 4,步长或间隔为 1
当我像下面这样键入数组时,代码可以工作,但我希望它是动态的或根据单元格值 B3 和 C3 进行更改。
SheetList = Array("1", "2", "3", "4")
【问题讨论】:
我正在尝试创建一个基于 2 个单元格值更改大小的数组。 然后这个数组将在 For 循环中使用。
例如:
B3 = 1 C3 = 4
我希望数组的下界为 1,上界为 4,步长或间隔为 1
当我像下面这样键入数组时,代码可以工作,但我希望它是动态的或根据单元格值 B3 和 C3 进行更改。
SheetList = Array("1", "2", "3", "4")
【问题讨论】:
只需使用 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
【讨论】:
{1,2,3,4}。所以sheetlist(0) = 1,sheetlist(1)=2,sheetlist(2)=3, 和sheetlist(3)=4
如果您废弃了 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
【讨论】:
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