2017-03-02 49 views
0

昨天我收到了有关此代码的帮助,但我对VBA完全陌生,所以遇到困难。解释我的代码:基于图纸名称的工作簿中的单元格复制范围

我试图从一个工作簿中将单元格范围复制到另一个工作簿中单元格的相同范围,但工作表的名称必须相同。所以代码应该测试工作表是否存在,然后它会在两个工作簿中找到相应的工作表。如果名称相同,则会显示该值,但如果不是,则会继续浏览工作簿1中的所有工作表以找到正确的工作表。代码运行通过,但它不是复制单元格。

我认为这个问题可能源于第一个循环中的sheetexists行。我被告知我需要确保在运行循环之前检查表单是否存在,但我不确定如何执行该操作。

谢谢!

Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean 
    Dim sht As Worksheet 

    If wb Is Nothing Then Set wb = ThisWorkbook 
    On Error Resume Next 
    Set sht = wb.Sheets(shtName) 
    On Error GoTo 0 
    SheetExists = Not sht Is Nothing 

End Function 
Sub foo() 

Dim wbk1 As Workbook 
Dim wbk2 As Workbook 
Dim shtName1 As String 
Dim shtName2 As String 
Dim i As Integer 
Dim p As Integer 


Set wkb1 = Workbooks.Open("C:\Users\lliao\Documents\Trad Reconciliation.xlsx") 
Set wkb2 = Workbooks.Open("C:\Users\lliao\Documents\TradReconciliation.xlsx") 


i = 2 
p = 2 
shtName2 = wkb2.Sheets(i).Name 
shtName1 = wkb1.Sheets(p).Name 

For i = 2 To wkb2.Worksheets.Count 
    If (SheetExists(shtName2) = True) And (SheetExists(shtName1) = True) Then 
     For p = 2 To wkb1.Worksheets.Count 
      If shtName2 = shtName1 Then 
       wkb2.Sheets(shtName2).Range("D2:G2").Value = wkb1.Sheets(shtName1).Range("D2:G2").Value 
      End If 
     Next p 
    End If 
Next i 

End Sub 

回答

0

您设置了shtName2 = wkb2.Sheets(i).Name但是之后再也不会改变它。所以它总是只看一张。

foo子程序应改为:

Sub foo() 
    Dim wbk1 As Workbook 
    Dim wbk2 As Workbook 
    Dim i As Integer 

    Set wbk1 = Workbooks.Open("C:\Users\lliao\Documents\Trad Reconciliation.xlsx") 
    Set wbk2 = Workbooks.Open("C:\Users\lliao\Documents\TradReconciliation.xlsx") 

    For i = 2 To wbk2.Worksheets.Count 
     If SheetExists(wbk2.Worksheets(i).Name, wbk1) Then 
      wbk2.Worksheets(i).Range("D2:G2").Value = wbk1.Worksheets(wbk2.Worksheets(i).Name).Range("D2:G2").Value 
     End If 
    Next i 

End Sub 

这也是一个好主意,包括Option Explicit为您的代码模块的第一线。我的答案中有拼写错误,因为我复制/粘贴了原始代码,但是您已经定义变量wbk1wbk2,然后使用wkb1wkb2代替。由于wkb1wkb2未明确声明,因此它们被隐式创建为Variant,然后导致代码中出现问题,该代码预期为Workbook

Option Explicit指示编译器强制您显式声明所有变量,从而捡起这样的拼写错误。

+0

我明白你在做什么。它给我一个ByRef参数不匹配错误的线: SheetExists(wkb2.worksheets(i).Name,wkb1),它突出显示wkb1 我注意到shtname在该循环内没有改变。这使得更有意义 – leetontea

+0

对不起 - 错字(“wkb”而不是“wbk”) - 将修复答案 – YowE3K

+0

@leetontea - 我制定了**为什么**我有错别字。请参阅我在答案末尾添加的评论。 – YowE3K

相关问题