【发布时间】:2016-12-20 23:14:12
【问题描述】:
有没有人有一段代码可以根据列标题从一个 excel WB 复制到另一个?
更新: 对不起,我是这个网站的新手,希望你能原谅我的无知。
这是我根据其他人的帖子尝试过的代码(谢谢你,Simon!)。
Sub copy_cols()
Set SourceWS = Workbooks("Source.xlsx").Worksheets(1)
Set TargetWS = Workbooks("Business Loader V7.1.xlsx").Worksheets(2)
For Each rgCell In SourceWS.Range("A1:AX1")
TargetWS.Columns(GetColumn(TargetWS, rgCell.Value)) = _
SourceWS.Columns(GetColumn(SourceWS, rgCell.Value))
' I Have also tried this with no success:
' TargetWS.Columns(GetColumn(TargetWS, rgCell.Value)) = _
SourceWS.Columns(GetColumn(SourceWS, rgCell.Column))
End Sub
Function GetColumn(GCSheet As Worksheet, ColumnName As String) As Integer
Dim intCol As Integer
On Error Resume Next
intCol = Application.WorksheetFunction.Match(ColumnName, GCSheet.Rows(1), 0)
If Err.Number <> 0 Then
GetColumn = 0
Else
GetColumn = intCol
End If
End Function
我在 TargetWS.Cells 的第一行和第 5 行(不包括计数时的空格)收到错误“ByRef 参数类型不匹配”......
我也有这个......它有效,但我必须添加一堆 .End(xlDown) 来解决丢失的信息,以便复制整个列(不仅仅是复制到下一个有值的单元格)。你有更好的系统来解决这个问题吗?
Sub CopyHeaders()
Dim header As Range, headers As Range
Set SourceWS = Workbooks("Source.xlsx").Worksheets(1)
Set TargetWS = Workbooks("Business Loader V7.1.xlsx").Worksheets(2)
Set headers = SourceWS.Range("A1:AX1")
For Each header In headers
If GetHeaderColumn(header.Value) > 0 Then
Range(header.Offset(1, 0), header.End(xlDown).End(xlDown).End(xlDown).End(xlDown).End(xlDown).End(xlDown).End(xlDown).End(xlDown).End(xlDown)).Copy Destination:=TargetWS.Cells(2, GetHeaderColumn(header.Value)) '.End(xlDown).Offset(1, 0)
End If
Next
如您所见,我必须为每个空白单元格添加 .End(xlDown)。提前感谢您提供的任何帮助。
【问题讨论】:
-
向我们提供更多信息以及您迄今为止所做的尝试
-
在该单元格分配下添加一个 .value 即 ....cells.value = ....cells.value 您还错误地使用了 GetColumn 函数:获取列标题,不要只是使用 rgcell.value,使用类似 sourcews.cells(1,rgcell.column).value ... 这将为您提供当前单元格的列标题
-
@Simon 谢谢,我完全糊涂了,但我会试着整理一下你所说的。您是指上面的代码还是下面列出的其他代码之一?
-
是的,指的是上面。抱歉,我想我错过了您的代码... rgCell.value 是我可以看到的列标题....所以您要复制整个列?使用 wsDestination.columns(GetColumn(...)) = wsSource.columns(GetColumn(...))
-
@Simon,Simon,我已经更新了代码,但在上面找到的第一个代码的第 9 行出现“ByRef 参数类型不匹配”错误。 intDestRow 和 intSourceRow 有什么作用?我尝试了几个不同版本的编辑 '(GetColumn(STUFF)) = ' 行,但我似乎无法做到这一点。