【问题标题】:Excel VBA: copying ranges, single cells to another workbookExcel VBA:将范围,单个单元格复制到另一个工作簿
【发布时间】:2021-02-16 15:09:02
【问题描述】:

我正在为几个具有相同结构的模板编写一个简单的 VBA 代码。从这些模板(名称:“Workbook1”例如),从“Profile”工作表中,我想复制几个单元格:F6-F11、D15、F15、H15 和 K30-38 到另一个工作簿(“Tracker”、“Sheet1”)到从 C2 开始的第一个空闲行,然后是 C3 等等。你能帮我吗?我有打开给定文件的代码:

Option Explicit

Public Sub CopyData()

    Dim wb As Workbook
    Dim FileName As String

    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = False
        If .Show Then
            FileName = .SelectedItems(1)
            Set wb = Workbooks.Open(FileName:=FileName)
            Workbooks("Workbook1").Worksheets("Profile").Range("F6:F11").Copy
            Workbooks("Tracker.xlsx").Worksheets("Sheet1").Range("C2").PasteSpecial Transpose:=True
            wb.Close SaveChanges:=False
            Set wb = Nothing
        End If
    End With

End Sub

【问题讨论】:

  • 工作簿非常多。 wb 工作簿的名称是什么?包含此代码的工作簿的名称是什么?你需要复制什么?值、公式和/或格式?
  • 数据源(我要从中复制):Workbook1(workbook), Profile, F6-F11, D15, F15, H15 and K30-38 to Tracker(workbook), Sheet1,从 C 列开始的第一个可用行
  • 但是工作簿wb 呢?是Workbook1 还是...?代码是否在第三个工作簿中?
  • 1.是的,它是 Workbook1 2。是的

标签: excel vba


【解决方案1】:

复制非连续范围

Option Explicit

Sub copyData()

    ' Constants
    Const sRangesList As String = "F6:F11,D15,F15,H15,K30:K38"
    
    ' Source
    Dim FilePath As String
    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = False
        If .Show Then
            FilePath = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    Dim swb As Workbook: Set swb = Workbooks.Open(FileName:=FilePath)
    Dim sws As Worksheet: Set sws = swb.Worksheets("Profile")
    Dim sRanges() As String: sRanges = Split(sRangesList, ",")
    
    ' Destination
    Dim dwb As Workbook: Set dwb = Workbooks("Tracker.xlsx")
    Dim dws As Worksheet: Set dws = dwb.Worksheets("Sheet1")
    Dim dInit As Range
    Set dInit = dws.Cells(dws.Rows.Count, "C").End(xlUp).Offset(1)
    Dim dCell As Range: Set dCell = dInit
    
    ' Copy/Paste
    Dim sRange As Range
    Dim n As Long
    Application.ScreenUpdating = False
    For n = 0 To UBound(sRanges)
        Set sRange = sws.Range(sRanges(n))
        sRange.Copy
        dCell.PasteSpecial Transpose:=True
        Set dCell = dCell.Offset(, sRange.Rows.Count)
    Next n
    
    ' Close/Save
    Application.CutCopyMode = False
    swb.Close SaveChanges:=False
    dws.Activate
    dInit.Offset(1).Activate
    'dwb.Save
    
End Sub

【讨论】:

  • 感谢您的帮助,它成功了!如果我将常量更改为 Const sRangesList As String = "F6:F11,D15,F15,H15,K15,D16,F16,H16,K16,D17,F17,H17,K17,D18,F18,H18,K18,D19 ,F19,H19,K19,D21,F21,H21,J21,H23,D25,F25,H25,D26,H26,F26,D27,F27,H27,K30:K38,F40:F44" 比我应该改变目的地也是?目的地在 C:BE 之间
  • 它应该按原样工作。请注意范围地址指的是列,而不是行。唯一的其他限制是工作表中的列数 (16384)。
  • 感谢您的帮助,它运行良好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2019-07-29
相关资源
最近更新 更多