【问题标题】:VBA copy UsedRange of a column based on column header name基于列标题名称的列的 VBA 复制 UsedRange
【发布时间】:2020-10-30 20:11:07
【问题描述】:

我正在尝试根据列名将数据从一个工作表复制到另一个工作表。在源工作表中,数据从 A1 开始。在目标工作表中,数据应粘贴在 A11 行而不是 A1 行。如果我使用 EntireColumn.Copy,我会收到关于源和目标复制区域不同的错误。我遇到了 UsedRange 属性,但我无法将它应用到我的场景中

    For Each columnName In allColumns
    'call a function to get the column to copy 
    If columnToCopy > 0 Then
        columnName.Offset(1, 0).EntireColumn.Copy Destination:=ws2.Cells(11, columnToCopy)
    End If
Next

在上面的 sn-p 中,不想使用 'EntireColumn'。我只想要有数据的列。变量 columnName 例如是“Person ID”

最好的方法是什么?

谢谢。

【问题讨论】:

  • 可能最好的方法是find the last row
  • 谢谢。我确实尝试过,但我无法将它与我的 columnName 变量集成。我怎么能做到这一点?
  • 您可能会使用Range.Resize

标签: excel vba copy-paste worksheet columnname


【解决方案1】:

这将是一种典型的方法:

    For Each ColumnName In allColumns
        If columnToCopy > 0 Then
            With ColumnName.Parent
                .Range(ColumnName.Offset(1, 0), .Cells(.Rows.Count, ColumnName.Column).End(xlUp)).Copy _
                              Destination:=ws2.Cells(11, columnToCopy)
            End With
        End If
    Next

假设allColumns 是单单元格范围/列标题的集合。

【讨论】:

  • 谢谢。效果很好。我不知道 .Parent 属性。
【解决方案2】:

复制/粘贴列

没有足够的信息来给出准确的答案,所以这里有一个你可以考虑研究的场景。

守则

Option Explicit

Sub TESTdetermineColumnNumber()
    
    ' Define constants. Should be more.

    ' Define Criteria.
    Const Criteria As String = "Total"
    ' Define Header Row.
    Const hRow As Long = 1

    ' Define Copy Range (Column Range)

    ' Define Source Worksheet.
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    ' Define Header Row Range.
    Dim RowRange As Range
    Set RowRange = ws.Rows(hRow)
    ' Determine Column Number.
    Dim ColumnNumber As Long
    ColumnNumber = determineColumnNumber(RowRange, Criteria)
    ' Validate Column Number.
    If ColumnNumber = 0 Then
        Exit Sub
    End If
    ' Determine Last Row.
    Dim LastRow As Long
    LastRow = ws.Cells(ws.Rows.Count, ColumnNumber).End(xlUp).Row
    ' Define First Data Row Number.
    Dim FirstRow As Long
    FirstRow = hRow + 1
    ' Define Column Range.
    Dim ColumnRange As Range
    Set ColumnRange = ws.Cells(FirstRow, ColumnNumber) _
                        .Resize(LastRow - FirstRow + 1)

    ' Define Paste Range.

    ' Define Destination Worksheet.
    Dim ws2 As Worksheet
    Set ws2 = ThisWorkbook.Worksheets("Sheet2")
    ' Define Destination Column.
    Dim columnToCopy As Long
    columnToCopy = 2
    ' Define Paste Range.
    Dim PasteRange As Range
    Set PasteRange = ws2.Cells(11, columnToCopy)

    ' Copy/Paste.

    ' Copy values, formulas and formats.
    ColumnRange.Copy Destination:=PasteRange
    ' It is more efficient if you need only values to use the following:
    PasteRange.Resize(ColumnRange.Rows.Count).Value = ColumnRange.Value
    
End Sub

Function determineColumnNumber(RowRange As Range, _
                               Criteria As String) _
         As Long
    Dim Temp As Variant
    Temp = Application.Match(Criteria, RowRange, 0)
    If Not IsError(Temp) Then
        determineColumnNumber = Temp
    End If
End Function

【讨论】:

    猜你喜欢
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-30
    • 1970-01-01
    • 2015-11-07
    相关资源
    最近更新 更多