Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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
Excel Vba从2个单元格值创建数组步长为1_Excel_Vba_Cell_Step - Fatal编程技术网

Excel Vba从2个单元格值创建数组步长为1

Excel Vba从2个单元格值创建数组步长为1,excel,vba,cell,step,Excel,Vba,Cell,Step,我试图创建一个数组,它根据2个单元格值改变大小。 然后,该数组将在For循环中使用 例如: B3 = 1 C3 = 4 我希望数组的下限为1,上限为4,步长或间隔为1 当我像下面那样键入数组时,代码可以工作,但我希望它是动态的,或者根据单元格值B3和C3进行更改 SheetList = Array("1", "2", "3", "4") 只需使用for循环: Sub workForFree() Dim

我试图创建一个数组,它根据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
只需使用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

如果您处置了MS 365版本,则可以使用新版本(默认情况下为1):

导致VB编辑器的即时窗口:

~~> 1,2,3,4   
Boundaries: 1 To 4
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
编辑#1:其他版本的替代方法:

~~> 1,2,3,4   
Boundaries: 1 To 4
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

如果您处置了MS 365版本,则可以使用新版本(默认情况下为1):

导致VB编辑器的即时窗口:

~~> 1,2,3,4   
Boundaries: 1 To 4
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
编辑#1:其他版本的替代方法:

~~> 1,2,3,4   
Boundaries: 1 To 4
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

LBound(sheetlist)=解决方案中的0,而不是所需的1。它应该是:ReDim sheetlist(ActiveSheet.Range(“C3”)、ActiveSheet.Range(“B3”))No它等于1。使用b3中的1和c3中的4运行该数组。该数组在代码中仅使用一个数字重新定义,这将设置UBound=3(4-1=3);默认情况下,Lbound=0:在那里放一个减号,而不是逗号:)这是正确的,OP想要一个1D数组作为输出。在OP的给定示例中,数字从B3中的值到C3中的值的1D数组so
{1,2,3,4}
。因此,
sheetlist(0)=1
sheetlist(1)=2
sheetlist(2)=3
sheetlist(3)=4
OP在引用下限和上限时讨论的是数组中的值,而不是数组项。LBound(sheetlist)=0在您的解决方案中,而不是需要的1。它应该是:ReDim sheetlist(ActiveSheet.Range(“C3”)、ActiveSheet.Range(“B3”))No它等于1。使用b3中的1和c3中的4运行该数组。该数组在代码中仅使用一个数字重新定义,这将设置UBound=3(4-1=3);默认情况下,Lbound=0:在那里放一个减号,而不是逗号:)这是正确的,OP想要一个1D数组作为输出。在OP的给定示例中,数字从B3中的值到C3中的值的1D数组so
{1,2,3,4}
。因此
图纸列表(0)=1
图纸列表(1)=2
图纸列表(2)=3
,以及
图纸列表(3)=4
OP在引用下限和上限时谈论的是数组中的值,而不是数组项。当我尝试逐行遍历For循环时,代码总是打开工作簿上的最后一个工作表,而不管工作表名称如何。这就像它没有打断上下限,而是跳到最后一页。我可以指定一个范围,比如LB=18 UB=22,但代码仅从工作簿上位置的最后一页开始。但是,当使用已定义的数组函数(如sheetlist=array(“18”、“19”、“20”、“21”、“22”)时,循环工作正常。有什么建议吗?@Ross.P-上面的代码中没有For循环-您在哪一行代码中遇到问题?-当然,您可以完全限定范围引用(例如
Sheet1.range(“…”)
此工作簿。工作表(“Sheet1”)
)而不是引用
ActiveSheet
代码卡在这里
工作表(sheetlist(X))。如果使用
sheetlist=Array(“18”、“19”、“20”),请激活
无问题,但当尝试切换到
Dim lo As Long:lo=ActiveSheet.Range(“B3”)
Dim hi As Long:hi=ActiveSheet.Range(“C3”)
时,对于X=LBound(sheetlist)到UBound(sheetlist)窗口(“卡车日志东门1月.xlsx”),代码被卡住,并且不会从下限
开始。激活工作表(sheetlist(十) )。激活范围(“A4:R4”)。选择范围(选择,选择。结束(xlDown))。选择选择。复制窗口(“Truck Racks RawData.xlsm”)。激活工作表(“RawDataMacro”)。选择范围(“A”&行数)。结束(xlUp)。选择ActiveCell.Offset(1)选择“光标向下移动一个单元格Selection.PasteSpecial Paste:= xLPASTEDATION,操作:=XLNOR,SkipBlanks =:false,转置:= false xx< /代码>我不知道发生错误消息,引用的代码远远超出了原来的帖子。IMO所有答案都解决了您创建一个定义序列的请求,所以您可以考虑问一个新的Q。uestion带有精确的描述和一些示例数据。@Ross.p当我试图逐行遍历For循环时,代码总是打开工作簿上的最后一个工作表,而不管工作表的名称。这就像它没有中断下限和上限,而是ra他们只跳到最后一张工作表。我可以指定一个范围,比如LB=18 UB=22,但代码只从工作簿上位置的最后一张工作表开始。但是,当使用已定义的数组函数,如sheetlist=array(“18”、“19”、“20”、“21”、“22”)时循环工作正常。有什么建议吗?@Ross.P-上面的代码中没有For循环-您在哪一行代码中遇到问题?-当然,您可以完全限定范围引用(例如
Sheet1.range(“…”)
ThisWorkbook.Worksheets(“Sheet1”)
)如果我使用
sheetlist=Array(“18”、“19”、“20”)
没有问题,但在尝试切换到
Dim lo时,lo=ActiveSheet.Range(“B3”)
Dim hi As Long:hi=ActiveSheet.Range(“C3”)时,代码会被卡在这里,而不是引用
ActiveSheet
代码
对于X=LBound(sheetlist)到UBound(sheetlist)窗口(“卡车日志东门1月.xlsx”)。代码被卡住,不会从下限开始。激活工作表(sheetlist(X))。激活范围(“A4:R4”)。选择范围(选择,选择。结束(xlDown))。选择选择。复制窗口(“卡车机架RawData.xlsm”)。激活工作表(“RawDataMacro”)。选择范围(“A”&行数)。结束(xlUp)。选择ActiveCell.Offset(1)。S