是否有可能通过数据工作表进行循环?

我想知道是否有一种方法来循环我的数据工作表,而不是从A2到AQ2编码?

Worksheets("FORM TEMPLATE").Range("D9").Copy Worksheets("Data").Range("A2").PasteSpecial xlPasteValues Worksheets("FORM TEMPLATE").Range("D10").Copy Worksheets("Data").Range("B2").PasteSpecial xlPasteValues Worksheets("FORM TEMPLATE").Range("J9").Copy Worksheets("Data").Range("C2").PasteSpecial xlPasteValues Worksheets("FORM TEMPLATE").Range("J10").Copy Worksheets("Data").Range("D2").PasteSpecial xlPasteValues Worksheets("FORM TEMPLATE").Range("J11").Copy Worksheets("Data").Range("E2").PasteSpecial xlPasteValues 

将值加载到数组中并将值分配给数组。 在以有序的方式加载数组之后,将其全部转储回数据工作表。

 Sub wqewtry() Dim a As Long, arr As Variant 'preload and shape the array With Worksheets("Data") arr = .Range("A2:AQ2").Value2 End With With Worksheets("FORM TEMPLATE") 'use .Value2 for text or numbers; .Value for dates a = a + 1: arr(1, a) = .Range("D9").Value2 a = a + 1: arr(1, a) = .Range("D10").Value2 a = a + 1: arr(1, a) = .Range("J9").Value2 a = a + 1: arr(1, a) = .Range("J10").Value2 a = a + 1: arr(1, a) = .Range("J11").Value2 End With 'dump back into the data worksheet With Worksheets("Data") .Range("A2:AQ2") = arr End With End Sub 

这应该使编写代码变得更容易,同时保持它的组织和使其更快。

是。 以下可能不是最好的代码,但似乎你的源单元格不连续循环…

 Dim SomeArray(X) As String 'Define "X" suitably for your input cells SomeArray(0) = "D9" SomeArray(1) = "D10" SomeArray(2) = "J9" SomeArray(3) = "J10" etc... 

然后你循环的源单元格数组,并复制每一个:

 curOffset=0 For i = LBound(SomeArray) To UBound(SomeArray) Worksheets("FORM TEMPLATE").Range(SomeArray(i)).Copy Worksheets("Data").Range("A2").Offset(0,curOffset).PasteSpecial xlPasteValues curOffset = curOffset + 1 Next i 

正如JetSetJim所说 – 你的源单元不容易识别。

 Sub Test() Dim rToCopy As Range Dim rCell As Range Dim lColNum As Long lColNum = 1 With ThisWorkbook Set rToCopy = .Worksheets("FORM TEMPLATE").Range("D9:D10,J9:J11") With .Worksheets("Data") For Each rCell In rToCopy .Cells(2, lColNum) = rCell.Value lColNum = lColNum + 1 Next rCell End With End With End Sub 

处理一组不能自动确定的随机值时,我喜欢使用的方法是从常量创build一个数组。 在你的情况下,像这样的:

 Const csSource as string = "D9|D10|J9|J10|J11" Dim varSource as Variant, i as integer Dim rngTarget as range varsource = split(cssource,"|") set rngTarget = worksheets("Data").range("A2") for i = 0 to ubound(varSource) rngtarget.value = worksheets("Form Template").range(varsource(i)).value set rngTarget = rngTarget.offset(0, 1) next i 

您可以根据需要在顶部的常量中添加新的源值。 这是比其他方法更多的内存,因为它使用变体,但是编码和维护要容易得多。

  • 创build一个数组来保存数据
  • 调整数组大小以匹配范围内的单元格数量
  • 循环范围内的单元格
  • 增加计数器
  • 将当前单元格的值添加到数组中
  • 调整目标范围以适合数据并将数组分配到此范围

 Sub LoopData() Dim Data() Dim x As Long Dim c As Range With Worksheets("FORM TEMPLATE").Range("D9,D10,J9:J11") ReDim Data(1 To .Cells.Count) For Each c In .Cells x = x + 1 Data(x) = c.Value Next Worksheets("Data").Range("B2").Resize(1, UBound(Data)) = Data End With End Sub