导入会破坏单元格格式
Importing Disrupts Format Of Cell
我的问题与数据导入有关,当我通过链接到按钮的宏执行此操作时,来自其他文件的数据进入目标工作簿并破坏那里以前的所有单元格格式。就像它从数据来源的来源 sheet 传输相同的格式一样。
我会 post 我的代码,如果还不够,我会 post 工作簿。
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
感谢您提前回复。
您只是在直接 copy/paste,这将复制格式和值。仅通过值(我假设这就是您想要的)有两种选择。
首先是使用 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
属性 只是 returns 来自数组中的第一个区域)。你会做这样的事情:
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
),但看起来很难看,因为必须循环遍历区域,并使用正确数量的单元格构建等效的目标范围。但它比第一个选项更灵活,并且可能有更简洁的方法来获得正确的目标范围。
我的问题与数据导入有关,当我通过链接到按钮的宏执行此操作时,来自其他文件的数据进入目标工作簿并破坏那里以前的所有单元格格式。就像它从数据来源的来源 sheet 传输相同的格式一样。
我会 post 我的代码,如果还不够,我会 post 工作簿。
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
感谢您提前回复。
您只是在直接 copy/paste,这将复制格式和值。仅通过值(我假设这就是您想要的)有两种选择。
首先是使用 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
属性 只是 returns 来自数组中的第一个区域)。你会做这样的事情:
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
),但看起来很难看,因为必须循环遍历区域,并使用正确数量的单元格构建等效的目标范围。但它比第一个选项更灵活,并且可能有更简洁的方法来获得正确的目标范围。