在 VBA 中复制和粘贴存在格式问题的多个范围
copying and pasting multiple ranges with formatting issue in VBA
大家好:我在VBA写了一段代码。虽然它有效,但我在复制粘贴和格式化方面遇到了一些问题,希望对其进行更优化。
我有 3 张纸:“Launchpad”、“Member_check”、“打印机”
成员检查 A 到 J 列,每列 300 行
**'Launchpad' 的单元格值为 G83 **。 可以是3个选项之一:偏姐妹、全姐妹、不对称姐妹
我想做的是:
如果 用户将 Launchpad 上的单元格 'G83' 指定为 'Full sister':
宏从检查器[=48]复制一系列行A7:J27、A78:J107和A127:J137 =]并粘贴到打印机。
我的问题是:
如何让这段代码一次处理多个范围,而不是重复复制和粘贴三次。
某些单元格区域的公式不会复制并给出“#REF”符号,除非我使用 带值的特殊粘贴,但是它们会丢失它们通过这样做格式化和字体。他们是否有解决此问题的方法来复制带有格式和字体的值?
Sub PrintMembers()
If Sheets("LAUNCHPAD").Cells(82, "G").Value = "NO" And Sheets("LAUNCHPAD").Cells(83, "G").Value = "" Then
Sheets("MEMBER_CHECK").Range("A7:J74").Copy
Sheets("PRINTER").Range("A7").PasteSpecial xlPasteFormats
Sheets("PRINTER").Range("A7").PasteSpecial xlPasteValues
ElseIf Sheets("LAUNCHPAD").Cells(83, "G").Value = "PARTIAL SISTER" Then
Sheets("MEMBER_CHECK").Range("A7:J27").Copy
Sheets("PRINTER").Range("A7").PasteSpecial xlPasteAllUsingSourceTheme
Sheets("MEMBER_CHECK").Range("A78:J107").Copy
Sheets("PRINTER").Range("A28").PasteSpecial xlPasteFormats
Sheets("PRINTER").Range("A28").PasteSpecial xlPasteValuesAndNumberFormats
Sheets("MEMBER_CHECK").Range("A112:H124").Copy
Sheets("PRINTER").Range("A59").PasteSpecial xlPasteFormats
Sheets("PRINTER").Range("A59").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
ElseIf Sheets("LAUNCHPAD").Cells(82, "G").Value = "YES" And Sheets("LAUNCHPAD").Cells(83, "G").Value = "FULL SISTER" Then
Sheets("MEMBER_CHECK").Range("A7:J27").Copy
Sheets("PRINTER").Range("A7").PasteSpecial Paste:=xlPasteAllUsingSourceTheme
Sheets("MEMBER_CHECK").Range("A78:J107").Copy
Sheets("PRINTER").Range("A28").PasteSpecial Paste:=xlPasteFormats
Sheets("PRINTER").Range("A28").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Sheets("MEMBER_CHECK").Range("A127:H137").Copy
Sheets("PRINTER").Range("A59").PasteSpecial Paste:=xlPasteFormats
Sheets("PRINTER").Range("A59").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
ElseIf Sheets("LAUNCHPAD").Cells(82, "G").Value = "YES" And Sheets("LAUNCHPAD").Cells(83, "G").Value = "ASYMMETRIC FULL SISTER" Then
Sheets("MEMBER_CHECK").Range("A141:J256").Copy
Sheets("PRINTER").Range("A8").PasteSpecial xlPasteFormats
Sheets("PRINTER").Range("A8").PasteSpecial xlPasteValuesAndNumberFormats
Application.CutCopyMode = False
End If
End Sub
请记住,您不需要Select任何东西。 Excel 如果您按名称和地址提及单元格、工作表和工作簿,则非常清楚它们的位置。您代码中的最后一个 ElseIf 可以替换为以下代码。
Dim Rng As Range
With Worksheets("MEMBER_CHECK")
Set Rng = .Range("A7:J27,A78:J107,A127:H137")
End With
Rng.Copy Destination:=Worksheets("PRINTER").Range("A7")
Application.CutCopyMode = False
这将在一次操作中复制 3 个范围,并避免 PasteSpecial(xlPasteValues) 留下格式。在 Excel 365 中有一个常量 xlPasteAll,我认为它也可以粘贴所有内容。
但是,循环 For i = 80 To 80
是多余的,您的代码真正做的就是检查 G82 的值并计算结果。这给您留下了一个经典案例来演示 Select 语句。无论在单元格中找到什么,都可以复制和粘贴。唯一的区别在于它将是什么。因此我在下面建议替换您的整个代码。
Dim Rng As String
Select Case Worksheets("LAUNCHPAD").Cells(83, "G").Value
Case "PARTIAL SISTER"
Rng = "A7:J27,A78:J107,A112:H124"
Case "FULL SISTER"
Rng = "A7:J27,A78:J107,A127:H137"
Case Else
Rng = "A7:J74"
End Select
Worksheets("MEMBER_CHECK").Range(Rng).Copy Destination:=Worksheets("PRINTER").Range("A7")
Application.CutCopyMode = False
大家好:我在VBA写了一段代码。虽然它有效,但我在复制粘贴和格式化方面遇到了一些问题,希望对其进行更优化。
我有 3 张纸:“Launchpad”、“Member_check”、“打印机”
成员检查 A 到 J 列,每列 300 行
**'Launchpad' 的单元格值为 G83 **。 可以是3个选项之一:偏姐妹、全姐妹、不对称姐妹
我想做的是: 如果 用户将 Launchpad 上的单元格 'G83' 指定为 'Full sister':
宏从检查器[=48]复制一系列行A7:J27、A78:J107和A127:J137 =]并粘贴到打印机。
我的问题是:
如何让这段代码一次处理多个范围,而不是重复复制和粘贴三次。
某些单元格区域的公式不会复制并给出“#REF”符号,除非我使用 带值的特殊粘贴,但是它们会丢失它们通过这样做格式化和字体。他们是否有解决此问题的方法来复制带有格式和字体的值?
Sub PrintMembers() If Sheets("LAUNCHPAD").Cells(82, "G").Value = "NO" And Sheets("LAUNCHPAD").Cells(83, "G").Value = "" Then Sheets("MEMBER_CHECK").Range("A7:J74").Copy Sheets("PRINTER").Range("A7").PasteSpecial xlPasteFormats Sheets("PRINTER").Range("A7").PasteSpecial xlPasteValues ElseIf Sheets("LAUNCHPAD").Cells(83, "G").Value = "PARTIAL SISTER" Then Sheets("MEMBER_CHECK").Range("A7:J27").Copy Sheets("PRINTER").Range("A7").PasteSpecial xlPasteAllUsingSourceTheme Sheets("MEMBER_CHECK").Range("A78:J107").Copy Sheets("PRINTER").Range("A28").PasteSpecial xlPasteFormats Sheets("PRINTER").Range("A28").PasteSpecial xlPasteValuesAndNumberFormats Sheets("MEMBER_CHECK").Range("A112:H124").Copy Sheets("PRINTER").Range("A59").PasteSpecial xlPasteFormats Sheets("PRINTER").Range("A59").PasteSpecial xlPasteValuesAndNumberFormats Application.CutCopyMode = False ElseIf Sheets("LAUNCHPAD").Cells(82, "G").Value = "YES" And Sheets("LAUNCHPAD").Cells(83, "G").Value = "FULL SISTER" Then Sheets("MEMBER_CHECK").Range("A7:J27").Copy Sheets("PRINTER").Range("A7").PasteSpecial Paste:=xlPasteAllUsingSourceTheme Sheets("MEMBER_CHECK").Range("A78:J107").Copy Sheets("PRINTER").Range("A28").PasteSpecial Paste:=xlPasteFormats Sheets("PRINTER").Range("A28").PasteSpecial Paste:=xlPasteValuesAndNumberFormats Sheets("MEMBER_CHECK").Range("A127:H137").Copy Sheets("PRINTER").Range("A59").PasteSpecial Paste:=xlPasteFormats Sheets("PRINTER").Range("A59").PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False ElseIf Sheets("LAUNCHPAD").Cells(82, "G").Value = "YES" And Sheets("LAUNCHPAD").Cells(83, "G").Value = "ASYMMETRIC FULL SISTER" Then Sheets("MEMBER_CHECK").Range("A141:J256").Copy Sheets("PRINTER").Range("A8").PasteSpecial xlPasteFormats Sheets("PRINTER").Range("A8").PasteSpecial xlPasteValuesAndNumberFormats Application.CutCopyMode = False End If End Sub
请记住,您不需要Select任何东西。 Excel 如果您按名称和地址提及单元格、工作表和工作簿,则非常清楚它们的位置。您代码中的最后一个 ElseIf 可以替换为以下代码。
Dim Rng As Range
With Worksheets("MEMBER_CHECK")
Set Rng = .Range("A7:J27,A78:J107,A127:H137")
End With
Rng.Copy Destination:=Worksheets("PRINTER").Range("A7")
Application.CutCopyMode = False
这将在一次操作中复制 3 个范围,并避免 PasteSpecial(xlPasteValues) 留下格式。在 Excel 365 中有一个常量 xlPasteAll,我认为它也可以粘贴所有内容。
但是,循环 For i = 80 To 80
是多余的,您的代码真正做的就是检查 G82 的值并计算结果。这给您留下了一个经典案例来演示 Select 语句。无论在单元格中找到什么,都可以复制和粘贴。唯一的区别在于它将是什么。因此我在下面建议替换您的整个代码。
Dim Rng As String
Select Case Worksheets("LAUNCHPAD").Cells(83, "G").Value
Case "PARTIAL SISTER"
Rng = "A7:J27,A78:J107,A112:H124"
Case "FULL SISTER"
Rng = "A7:J27,A78:J107,A127:H137"
Case Else
Rng = "A7:J74"
End Select
Worksheets("MEMBER_CHECK").Range(Rng).Copy Destination:=Worksheets("PRINTER").Range("A7")
Application.CutCopyMode = False