【问题标题】:How can I write the following lines of code in one line with an array?如何在一行中用数组编写以下代码行?
【发布时间】:2021-11-20 08:41:40
【问题描述】:

我想尝试将 Range(K-AT) 和 PasteRange(1-6) 写成两行代码,以缩短我的代码。如何使用数组做到这一点?

Set RangeK = .Range("K2", "K" & LastRow)
Set RangeD = .Range("D2", "D" & LastRow)
Set RangeW = .Range("W2", "W" & LastRow)
Set RangeX = .Range("X2", "X" & LastRow)
Set RangeZ = .Range("Z2", "Z" & LastRow)
Set RangeAT = .Range("AT2", "AT" & LastRow)

Set PasteRange1 = .Range("A3", "A" & LastRow)
Set PasteRange2 = .Range("B3", "B" & LastRow)
Set PasteRange3 = .Range("C3", "C" & LastRow)
Set PasteRange4 = .Range("D3", "D" & LastRow)
Set PasteRange5 = .Range("E3", "E" & LastRow)
Set PasteRange6 = .Range("F3", "F" & LastRow)

RangeK.Copy
PasteRange1.PasteSpecial xlPasteValues

RangeD.Copy
PasteRange2.PasteSpecial xlPasteValues

RangeW.Copy
PasteRange3.PasteSpecial xlPasteValues

RangeX.Copy
PasteRange4.PasteSpecial xlPasteValues

RangeZ.Copy
PasteRange5.PasteSpecial xlPasteValues

RangeAT.Copy
PasteRange6.PasteSpecial xlPasteValues

【问题讨论】:

  • 为什么需要 6 个单独的变量?
  • @Rory,因为我需要从不同工作表的不同列粘贴。为了您更好地理解,我在上面包含了更多我的代码。
  • 您只需要第一个目标单元格进行粘贴,您可以使用一个变量:Set PasteRange = .Range("A3:F3") 然后使用PasteRange.Cells(1) 作为第一个粘贴目标。您也可以使用变量并在循环中执行。

标签: arrays excel vba


【解决方案1】:

使用循环并动态执行:

Option Explicit

Public Sub CopyExample()
    
    Dim ColumnsToCopy As Variant  ' define your columns to copy
    ColumnsToCopy = Array("K", "D", "W", "X", "Z", "AT")
    
    Dim iCol As Long  ' for each of that columns …
    For iCol = LBound(ColumnsToCopy) To UBound(ColumnsToCopy)
        
        ' copy column
        Worksheets("source").Range(ColumnsToCopy(iCol) & "2", ColumnsToCopy(iCol) & LastRow).Copy
        
        ' paste column
        With Worksheets("destination")
            .Range(.Cells(3, iCol + 1), .Cells(LastRow + 1, iCol + 1)).PasteSpecial xlPasteValues
        End With
    Next iCol

End Sub

请注意,如果您从第 2 行复制并从第 3 行粘贴,则需要粘贴到 LastRow + 1,然后在粘贴时 LastRow 需要为 +1,否则您会丢失复制的最后一行。

【讨论】:

  • 嗨@Pᴇʜ,为什么您需要为目标列指定 iCol +1 而不仅仅是 iCol?
  • @OliverTheseira 您不需要这样做,如果您希望从第 1 列开始粘贴,只需删除 + 1。这只是为了展示如何将其移动到任何其他列。
【解决方案2】:

您不需要复制值

Option Explicit

Private Const startRowSource As Long = 2
Private Const startRowTarget As Long = 3

Sub copyRanges()


Dim wsSource As Worksheet, wsTarget As Worksheet
Dim LastRow As Long

'set wsSource and wsTarget and lastRow here
'....


Dim arrRanges(5, 1) As Range    'mapping via two-dimensional array: first = source, second = target

With ws
    Set arrRanges(0, 0) = "K": Set arrRanges(0, 1) = "A"

    '... add missing mappings
    
    Set arrRanges(5, 0) = "AT": Set arrRanges(5, 1) = "F"
End With

Dim i As Long, rgSource As Range, rgTarget As Range

For i = 0 To UBound(arrRanges, 1)
    Set rgSource = wsSource.Range(arrRanges(i, 0) & startRowSource, arrRanges(i, 0) & LastRow)
    Set rgTarget = wsTarget.Range(arrRanges(i, 1) & startRowTarget, arrRanges(i, 1) & LastRow)
    rgSource.Value = rgTarget.Value
Next

End Sub
``

【讨论】:

    【解决方案3】:

    请尝试下一个代码。它将在sh2 工作表中返回。在我的代码示例中,下一张表。您可以使用您需要的表格:

    Sub testPasteDiscRArrays()
     Dim sh As Worksheet, sh1 As Worksheet, lastR As Long, arr, arrFin
    
     Set sh = ActiveSheet  'use here the necessary sheet to copy from
     Set sh1 = sh.Next     'use here the necessary sheet to paste
     lastR = sh.Range("D" & sh.rows.count).End(xlUp).row 'use the correct reference column
     arr = sh.Range("D2:AT" & lastR).Value 'place all involved range in an array
     'slice the array by necessary columns (n#) in the whished order:
     arrFin = Application.Index(arr, Evaluate("row(1:" & UBound(arr) & ")"), Array(8, 1, 20, 23, 43))
     'drop the processed array content, at once:
     sh1.Range("A3").Resize(UBound(arrFin, 1), UBound(arrFin, 2)).Value = arrFin
    End Sub
    

    甚至更紧凑的版本,使用相同的数组,来完成“单行数组”:):

    Sub testPasteDiscRArrays()
     Dim sh As Worksheet, sh1 As Worksheet, lastR As Long, arr
    
     Set sh = ActiveSheet
     Set sh1 = sh.Next
     lastR = sh.Range("D" & sh.rows.count).End(xlUp).row
     arr = sh.Range("D2:AT" & lastR).Value
    
    sh1.Range("A3").Resize(UBound(arr), 5).Value = _
          Application.Index(arr, Evaluate("row(1:" & UBound(arr) & ")"), Array(8, 1, 20, 23, 43))
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多