如何将VBA数组的一部分粘贴到excel范围

如何将VBA数组的一部分粘贴到excel范围,excel,vba,Excel,Vba,是否有可能将vba数组的一部分转换为excel范围 我需要这样做: dim testday() as Variant testday = Sheets("raw").Range("E745:BN745").Value Sheets("raw").Range("E745:BN745").Value = "" Sheets("Interface").Range("B4:E4") = testday(3, 4, 5, 6).Value 但这不起作用。。。有办法解决这个问题吗?谢谢 您可以: 使用循

是否有可能将vba数组的一部分转换为excel范围

我需要这样做:

dim testday() as Variant
testday = Sheets("raw").Range("E745:BN745").Value
Sheets("raw").Range("E745:BN745").Value = ""
Sheets("Interface").Range("B4:E4") = testday(3, 4, 5, 6).Value
但这不起作用。。。有办法解决这个问题吗?谢谢

您可以:

  • 使用循环将需要的值复制到新数组,并将其写入范围。如果要经常这样做,可以编写一个可重用的函数来实现这一点。或者

  • “原始”
    工作表中只读取您需要的内容,并将其写入您的范围,如下图所示。在您的特定情况下,这可能是最简单的解决方案



如果要复制的数组是一维的,并且需要复制连续单元格,则可以使用以下函数:

Option Explicit
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" _
    Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


Sub test()
  Dim vArr(), vArr2()
  Dim lCnt As Long
  Dim lStartIndex As Long, lFinishIndex As Long, lLength As Long


  With Application
    vArr = .Transpose(.Transpose(Range("A1:R1").Value2))
  End With

  lStartIndex = 3
  lFinishIndex = 6
  lLength = lFinishIndex - lStartIndex + 1

  ReDim vArr2(1 To lLength)

  CopyMemory vArr2(1), vArr(lStartIndex), lLength * 16

  For lCnt = LBound(vArr2) To UBound(vArr2)
    Debug.Print vArr2(lCnt)
  Next lCnt

  Range("A2").Resize(1, UBound(vArr2)).Value2 = vArr2

End Sub
测试时第一行为

67.2    9   57.2    boo 52  64  76  39  48  50  28  54  96  29  98  25  68  19
返回

57.2    boo 52  64
在第二排。 因此,您的代码片段将更改为

dim testday(), testday2()
With Application  ' Value2 is faster than Value
  testday = .Transpose(.Transpose(Sheets("raw").Range("E745:BN745").Value2))
End With
Sheets("raw").Range("E745:BN745").ClearContents   ' Good suggestion by JFC
CopyMemory testday2(1), testday(3), 4 * 16        ' Variant = 16 Bytes
Sheets("Interface").Range("B4:E4").Value2 = testday2  ' I would do Resize instead
我希望这有帮助

您可以使用
索引
功能切片
数组

Sub Slicer()
 Dim testday() As Variant
 testday = Sheets("raw").Range("E745:BN745").Value
 Sheets("raw").Range("E745:BN745").Value = ""
 Sheets("Interface").Range("B4:E4")= Application.Index(testday, 1, Array(3, 4, 5, 6))
End Sub

我更喜欢
Sheets(“raw”).Range(“E745:BN745”).ClearContents
是的,我通常这样做,但我有条件格式化,我想保留它,但是thx
ClearContents
不会删除条件格式。嗯,好吧,这与。clear不同?谢谢!这是一个很酷的方法,它在简单性方面胜过了我的(+1)。我将使用
Evaluate(“转置(行(“&lStartIndex&“:“&lFinishIndex&”)来代替
数组(3,4,5)
,它生成一个从
lStartIndex
一直到
lFinishIndex
的一维数字数组,并可用于分配任意长的(连续的)动态数组。我不理解您对索引的使用。最后一个值应该是列号,但您有一个数组吗?如何工作?是的,thx,但我需要测试日(7,8,9,10)到C4:E4等,所以第一种方法会更好
Sub Slicer()
 Dim testday() As Variant
 testday = Sheets("raw").Range("E745:BN745").Value
 Sheets("raw").Range("E745:BN745").Value = ""
 Sheets("Interface").Range("B4:E4")= Application.Index(testday, 1, Array(3, 4, 5, 6))
End Sub