我的问题与输入数据有关,当我通过链接到按钮的宏执行此操作时,来自另一个文件的数据进入目标工作簿并破坏那里的所有先前单元格格式。它就像是从数据来源的源表中传输相同的格式。
我会发布我的代码,如果不够,我会发布工作簿。
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
感谢您提前回复。
答案 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
),但由于必须遍历区域,并使用正确数量的单元格构建等效目标范围,因此看起来很丑陋。但它比第一种选择更灵活,并且可能有更简洁的方法来获得正确的目标范围。