导入中断单元格格式

时间:2015-06-24 06:54:29

标签: excel-vba import format cell vba

我的问题与输入数据有关,当我通过链接到按钮的宏执行此操作时,来自另一个文件的数据进入目标工作簿并破坏那里的所有先前单元格格式。它就像是从数据来源的源表中传输相同的格式。

我会发布我的代码,如果不够,我会发布工作簿。

Sub ImportData()
Application.ScreenUpdating = False
Dim Path As String, Lstrw As Long
Dim SourceWb As Workbook
Dim TargetWb As Workbook

Path = "C:\Users\DZPH8SH\Desktop\Status 496 800 semana 12 2015.xls" 'Para modificar ter acesso a pasta onde irá ficar o ficheiro

Set SourceWb = Workbooks.Open(Path)
Set TargetWb = ThisWorkbook

Dim n As Integer, targetRow As Long
targetRow = 3

'Para importar os sheets que o utilizador quiser, modifique o n "="

For n = 1 To 2

   With SourceWb.Sheets(n)
        Lstrw = .Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row
        .Application.Union(.Range("D2:D" & Lstrw), .Range("F2:F" & Lstrw), .Range("I2:I" & Lstrw), .Range("M2:M" & Lstrw)).Copy Destination:=TargetWb.Sheets(7).Range("A" & targetRow)
        'move the targetRow to the first empty row after pasting the source data
        targetRow = targetRow + Lstrw
   End With

Next
SourceWb.Close savechanges:=False
Application.ScreenUpdating = True

End Sub

感谢您提前回复。

1 个答案:

答案 0 :(得分:2)

您只是直接复制/粘贴,它将复制格式和值。只有两种选择才能带来价值(我认为这就是你想要的)。

第一种方法是使用Range.Copy将单元格复制到剪贴板,然后Range.PasteSpecial(xlPasteValues)只粘贴值:

.Application.Union(.Range("D2:D" & Lstrw), .Range("F2:F" & Lstrw), .Range("I2:I" & Lstrw), .Range("M2:M" & Lstrw)).Copy
TargetWb.Sheets(7).Range("A" & targetRow).PasteSpecial(xlPasteValues)

第二个选项是使用Value属性来获取和设置单元格值,而不会影响格式。在这种情况下,您必须修改循环,因为您无法从一个语句中的非连续范围中获取所有值(Value属性只返回数组中第一个区域的值)。你可以这样做:

targetColumn = 1
For Each sourceArea In .Application.Union(.Range("D2:D" & Lstrw), .Range("F2:F" & Lstrw), .Range("I2:I" & Lstrw), .Range("M2:M" & Lstrw)).Areas
    TargetWb.Sheets(7).Range(TargetWb.Sheets(7).Range.Cells(targetRow, targetColumn), TargetWb.Sheets(7).Range.Cells(targetRow, targetColumn + Lstrw - 1)).Value = sourceArea.Value
    targetColumn = targetColumn + 1
Next sourceArea

这在概念上很简单(targetRange.Value = sourceRange.Value),但由于必须遍历区域,并使用正确数量的单元格构建等效目标范围,因此看起来很丑陋。但它比第一种选择更灵活,并且可能有更简洁的方法来获得正确的目标范围。