Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Vba 是否可以循环浏览数据工作表?_Vba_Excel - Fatal编程技术网

Vba 是否可以循环浏览数据工作表?

Vba 是否可以循环浏览数据工作表?,vba,excel,Vba,Excel,我想知道是否有一种方法可以循环使用我的数据工作表,而不是将其从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 W

我想知道是否有一种方法可以循环使用我的数据工作表,而不是将其从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

对。下面的代码可能不是最好的,但似乎您的源单元格不是连续循环的

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

对。下面的代码可能不是最好的,但似乎您的源单元格不是连续循环的

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

将值加载到数组中并为数组赋值。有序加载数组后,立即将其全部转储回数据工作表

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

这将使编写代码更容易,同时保持代码的条理性并使其更快。

将值加载到数组中并为数组赋值。有序加载数组后,立即将其全部转储回数据工作表

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

这将使编写代码变得更容易,同时保持代码的条理性并使其更快。

正如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

正如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

在处理无法自动确定的随机值集时,我喜欢使用的一种方法是从常量创建数组。在您的情况下,类似于:

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

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

当处理无法自动确定的随机值集时,我喜欢使用的一种方法是从常量创建数组。在您的情况下,类似于:

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

  • 创建一个数组来保存数据
  • 调整数组大小以匹配范围中的单元格数
  • 循环区域中的单元格
  • 递增计数器
  • 将当前单元格的值添加到数组中
  • 调整目标范围的大小以适合数据,并将阵列分配给此范围

  • 创建一个数组来保存数据
  • 调整数组大小以匹配范围中的单元格数
  • 循环区域中的单元格
  • 递增计数器
  • 将当前单元格的值添加到数组中
  • 调整目标范围的大小以适合数据,并将阵列分配给此范围


虽然您的目标是连续的(
A2:AQ2
),但您的源不是连续的,并且从您所展示的一点来看,似乎没有数学模式。您可以尝试
工作表(“数据”).Range(“XFD2”).End(xlToLeft).Offset(0,1).PasteSpecial xlPasteValues
,但只有在将第一个值粘贴到A2中之后才可以尝试;有很多cli[board action.您是否考虑过将其放入数组并将值数组大容量转储到数据工作表中?虽然您的目标是连续的(
A2:AQ2
),但您的源不是连续的,并且从您所显示的一点来看,似乎没有数学模式。您可以尝试
工作表(“数据”).Range(“XFD2”).End(xlToLeft).Offset(0,1).paste特殊的xlPasteValues
但仅在第一个值粘贴到A2中之后。这需要大量cli[董事会行动。您是否考虑过将其放入数组并将值数组批量转储到数据工作表中?我建议在启动循环之前获取源表和目标表的引用,以提高效率。为什么不使用
SomeArray
中的单元格地址将值写入
SomeArray
,然后转储
 使用转置将SomeArray
返回到工作表?我建议在开始循环之前获取对源和目标工作表的引用以提高效率。为什么不使用
SomeArray
中的单元格地址将值写入
SomeArray
中,然后使用转置将
SomeArray
转储回工作表使用工作表(“数据”)查看这两个
块并不能真正为您购买任何东西;引用会被获取并取消引用两次-IMO更好的解决方案是使用
块嵌套
,或者为“数据”保留一个本地
工作表
变量sheet;一个更好的解决方案是使用我们免费获得的现有全局对象(例如,
DataSheet.Range(…)
),通过它们的代码名引用工作表。这很公平。我尽可能多地尝试改变和工作表属性,但我承认偶尔会过火。似乎工作表(“数据”)中的两个
块并不能真正为您购买任何东西;引用会被获取并取消引用两次-IMO更好的解决方案是用
块嵌套
,或者为“数据”保留一个本地
工作表
变量工作表;更好的解决方案是使用我们免费获得的现有全局对象(例如,
DataSheet.Range(…)按代码名引用工作表
。这很公平。我尽可能多地尝试改变和工作表属性,但我承认偶尔会过火。
Option Base 1
会在这里引入错误。最佳做法是永远不要假设动态数组的下限是什么;
对于I=lbund(varSource)到ubund(varSource)
。此外,您可以跳过字符串变量和
拆分
处理,只需将数组声明内联到
varSource=array(“D9”、“D10”、“J9”、“J10”、“J11”)
,最后在循环中调用
工作表(“SheetName”)
,几乎没有理由会产生大量开销(在开始循环之前获取sheet对象)…我认为,
.Offset
会使维护和推理变得更加困难。实际上,
Set rngSource=rn到底是什么