2014-01-16 58 views
1

我已经试过这段代码来映射列标题,它的工作原理没有任何错误。问题是,虽然它运行没有错误,我没有得到任何输出。任何人都可以帮我修复提前类型不匹配错误,同时映射列标题

Dim Sh1 As Worksheet, Sh2 As Worksheet, Sh3 As Worksheet 
Dim tmp1, tmp2, tmp3 
Dim HeadersOne As Range, HeadersTwo As Range 
Dim Wb1 As Workbook, Wb2 As Workbook, Wb3 As Workbook 
Dim hCell As Range 

    With ThisWorkbook 
     tmp1 = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", 1, "Choose file #1", , False) 
     If tmp1 = False Then Exit Sub 
     Workbooks.Open Filename:=tmp1, ReadOnly:=True 
     Set Wb1 = ActiveWorkbook 
     Set Sh1 = Wb1.Sheets("Sheet1") 
     tmp2 = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", 1, "Choose file #2", , False) 
     If tmp2 = False Then Exit Sub 
     Workbooks.Open Filename:=tmp2, ReadOnly:=True 
     Set Wb2 = ActiveWorkbook 
     Set Sh2 = Wb2.Sheets("Sheet1") 

     tmp3 = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", 1, "Choose file #3", , False) 
     If tmp3 = False Then Exit Sub 
     Workbooks.Open Filename:=tmp3, ReadOnly:=True 
     Set Wb3 = ActiveWorkbook 
     Set Sh3 = Wb3.Sheets("Sheet3") 
    End With 

Set HeadersOne = Sh3.Range("A1:A" & Sh3.Range("A" & Rows.Count).End(xlUp).Row) 

Application.ScreenUpdating = False 

For Each hCell In HeadersOne 

    SCol = GetColMatched(Sh1, hCell.Value) 
    TCol = GetColMatched(Sh2, hCell.Offset(0, 1).Value) 
    LRow = GetLastRowMatched(Sh1, hCell.Value) 

    For Iter = 2 To LRow 
     Sh2.Cells(Iter, TCol).Value = Sh1.Cells(Iter, SCol).Value 
    Next Iter 

Next hCell 
     Wb1.Close 
     Wb2.Close 
     Wb3.Close 
Application.ScreenUpdating = True 

End Sub 

Function GetLastRowMatched(Sh As Worksheet, Header As String) As Long 
ColIndex = Application.Match(Header, Sh.Rows(1), 0) 
GetLastRowMatched = Sh.Cells(Rows.Count, ColIndex).End(xlUp).Row 
End Function 

Function GetColMatched(Sh As Worksheet, Header As String) As Long 
ColIndex = Application.Match(Header, Sh.Rows(1), 0) 
GetColMatched = ColIndex 
End Function 
+0

'GetOpenFileName'返回一个字符串。 'Set'不需要那个。 :)见下面L42的答案。它应该至少解决那个错误。 :) – Manhattan

+1

是的,BK201是正确的。删除'Set'将删除'类型不匹配',因为您使用'Set'将'Objects'(例如Range,Sheet,Application,Chart等)赋值给正确声明的变量。当您分配诸如“字符串”的值时,不需要使用set。 – L42

+0

谢谢你L42和BK201你清楚的答复..现在我得到错误“对象变量未设置”和设置Sh1 = tmp1越来越突出...因为我是一个新鲜的我没有线索关于此..请让我知道我怎么能修复它..再次感谢 – user3172566

回答

0

显然,这是我昨天做的相同的代码。我曾希望你能够一口气解释所有事情,以便在一篇文章中解决这个问题。无论如何...尝试下面的代码。请在下次与您的请求时更清楚地避免多余的修复。

Sub ModdedMap() 

    Dim Wbk1 As Workbook, Wbk2 As Workbook, Wbk3 As Workbook 
    Dim Sh1 As Worksheet, Sh2 As Worksheet, Sh3 As Worksheet 
    Dim tmp1 As String, tmp2 As String, tmp3 As String 
    Dim HeadersOne As Range 
    Dim hCell As Range 

    'Set up all the strings involved. 
    tmp1 = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", 1, "Choose file #1", , False) 
    If tmp1 = "False" Then Exit Sub 
    tmp2 = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", 1, "Choose file #2", , False) 
    If tmp2 = "False" Then Exit Sub 
    tmp3 = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", 1, "Choose file #3", , False) 
    If tmp3 = "False" Then Exit Sub 

    'Open all the workbooks using the previous strings. 
    Set Wbk1 = Workbooks.Open(tmp1) 
    Set Wbk2 = Workbooks.Open(tmp2) 
    Set Wbk3 = Workbooks.Open(tmp3) 

    'Set the target sheets. MODIFY ACCORDINGLY. 
    Set Sh1 = Wbk1.Sheets("Sheet1") 
    Set Sh2 = Wbk2.Sheets("Sheet1") 
    Set Sh3 = Wbk3.Sheets("Sheet3") 

    Set HeadersOne = Sh3.Range("A1:A" & Sh3.Range("A" & Rows.Count).End(xlUp).Row) 

    Application.ScreenUpdating = False 

    For Each hCell In HeadersOne 

     SCol = GetColMatched(Sh1, hCell.Value) 
     TCol = GetColMatched(Sh2, hCell.Offset(0, 1).Value) 
     LRow = GetLastRowMatched(Sh1, hCell.Value) 

     For Iter = 2 To LRow 
      Sh2.Cells(Iter, TCol).Value = Sh1.Cells(Iter, SCol).Value 
     Next Iter 

    Next hCell 

    Wbk1.Close 
    Wbk2.Close 
    Wbk3.Close 

    Application.ScreenUpdating = True 

End Sub 

Function GetLastRowMatched(Sh As Worksheet, Header As String) As Long 
ColIndex = Application.Match(Header, Sh.Rows(1), 0) 
GetLastRowMatched = Sh.Cells(Rows.Count, ColIndex).End(xlUp).Row 
End Function 

Function GetColMatched(Sh As Worksheet, Header As String) As Long 
ColIndex = Application.Match(Header, Sh.Rows(1), 0) 
GetColMatched = ColIndex 
End Function 

让我们知道这是否能解决任何问题。如果失败,请详细描述您的问题详细信息。显然,这些数据在三张单独的工作簿中分成三张。测试以上内容,更改需要输入的部分,并在此处报告结果。

+0

谢谢BK201和抱歉不清楚...我测试了代码,我得到了类型不匹配的错误,并且“如果tmp1 = False Then Exit Sub”变得突出显示... – user3172566

+0

@ user3172566:将'False'更改为'“False “'。现在就试试。 :) – Manhattan

+0

感谢一吨:) – user3172566

2

it..thanks试试这个:

tmp1 = Application.GetOpenFilename("Excel Files (*.xls*),*.xls*", 1, "Choose file #1", , False) 

添加逗号,因为你没有指定参数名称。
Aslo this returns String所以不需要使用set。

另一种方法是:

tmp1 = Application.GetOpenFilename(filefilter:="Excel Files (*.xls*),*.xls*", FilterIndex:=1, Title:="Choose file #1") 

在这里,你指定的参数。
再次不需要Set

相关问题