2013-05-02 155 views
-1

因此,我想要做的是在工作簿A中有一个打开工作簿B和C的宏。之后它会经过工作簿B和C的A列,并且两个值相等的地方需要并将其粘贴到工作簿A的列A中。比较两个单独的文档VBA

我已经编写了下面的代码,但是您认为使用另一种方式更容易,请随时编写自己的代码。谢谢你,请帮我:)

Sub ReportCompareAlta() 
' 
' ReportCompareAlta Macro 
' Adds instances where column D is "ALTA" 

    Dim varSheetA As Variant 
    Dim varSheetB As Variant 
    Dim varSheetC As Variant 
    Dim StrValue As Variant 
    Dim strRangeToCheck As String 
    Dim iRow As Long 
    Dim iCol As Long 
    Dim WbkA As Workbook 
    Dim WbkB As Workbook 
    Dim WbkC As Workbook 
    Dim counter As Long 

    Set WbkA = Workbooks.Open(Filename:="G:\Reporting\AH_MISSE_FEB2013.xls") 
    Set WbkB = Workbooks.Open(Filename:="G:\Reporting\AH_MISSE_MAR2013.xls") 
    Set WbkC = Workbooks.Open(Filename:="G:\Reporting\ReportCompare.xls") 
    Set varSheetA = WbkA.Worksheets("LocalesMallContratos") 
    Set varSheetB = WbkB.Worksheets("LocalesMallContratos") 
    Set varSheetC = WbkC.Worksheets("Sheet1") 


    strRangeToCheck = "A1:IV65536" 

    Debug.Print Now 
    varSheetA = WbkC.Worksheets("Sheet2").Range(strRangeToCheck) 'may be confusing code here 
    varSheetB = WbkC.Worksheets("Sheet3").Range(strRangeToCheck) 'may be confusing code here 
    Debug.Print Now 

    counter = 0 

    For iRow = LBound(varSheetA, 1) To UBound(varSheetA, 1)   
      If varSheetB(iRow, "B") = varSheetA(iRow, "B") & varSheetB(iRow, "B") <> "GERENCIA" & varSheetB(iRow, "B").Value <> "" & varSheetB(iRow, "D") = "ALTA" Then 
       StrValue = "" 
       varSheetB.Range("iRow:B").Select 
       Selection = StrValue 
       ActiveSheet = varSheetC 
       Range("A1").Select 
       Selection.Offset(counter, 0).Value = StrValue 
       counter = counter - 1 

      Else 
       MsgBox ("Done") 
      End If   
    Next iRow 

End Sub 
+2

那么你的代码是做什么的?它工作吗?如果没有,什么不起作用?任何错误消息?我在这里没有看到问题。 – 2013-05-02 10:47:06

+0

@OlleSjögren嘿抱歉打扰你,但当我发布这个问题时,我对这个网站是新手,因此我不知道这些协议,我试图删除这个问题,然后重新开始,之后我发现有编辑,所以我的编辑在我从未编辑或关闭过的另一个线程中得到了回答。我想知道你是否可以取消我的投票权,这样我就可以回到成为一名直率和有贡献的成员的道路上。请和谢谢 – 2013-05-30 21:18:30

+0

对不起,downvote不是从我这里,所以我不能做任何事情。我可以给你一个upvote,但为了努力做得更好。 :) – 2013-05-30 22:15:11

回答

1

我看到一些明显的错误,垫理查德森指出,使用&不是为AND操作等同的简写,它是一个连接符,这是不太可能你想要的东西时,你说:

If varSheetB(iRow, "B") = varSheetA(iRow, "B") & varSheetB(iRow, "B") <> "GERENCIA" & varSheetB(iRow, "B").Value <> "" & varSheetB(iRow, "D") = "ALTA" Then

这给我带来了另一个错误:

varSheetB(以及A和C就此而言)是Variant/Array变量。您无法使用iRow, "B"索引这些索引,因为您无法使用非数字索引。也许你的意思是(iRow, 2)。

在相关说明:varSheetB.Range("iRow:B").Select这也将失败,因为你不能.Select一个变种。这是而不是一个Range变量。此外,iRow:B对于Variant数组或Range变量的不正确。此外,在这一点上,varSheetB不再是Worksheet对象变量。

这使我想到可能是最大的错误:您正在使用的变量varSheetAvarSheetB,并且varSheetC代表(在不同的时间在这个代码)兼具Worksheet Object和值的Variant数组。这是令人困惑的,并可能导致您上述的错误。一个变量不能同时出现这两种情况,所以你需要将变体看作变体时的变体,并且当工作表是工作表时,或者更好一些时,需要将变体看作变体:将工作表变量用于数组的工作表和变体,不要将多个用途的变量用于同一个变量。

Sub ReportCompareAlta() 
' 
' ReportCompareAlta Macro 

Dim varSheetA As Worksheet 
Dim varSheetB As Worksheet 
Dim varSheetC As Worksheet 
Dim RangeToCheck As Range 
Dim cl as Range 
Dim iRow As Long 
Dim iCol As Long 
Dim WbkA As Workbook 
Dim WbkB As Workbook 
Dim WbkC As Workbook 
Dim counter As Long 

Set WbkA = Workbooks.Open(Filename:="G:\Reporting\AH_MISSE_FEB2013.xls") 
Set WbkB = Workbooks.Open(Filename:="G:\Reporting\AH_MISSE_MAR2013.xls") 
Set WbkC = Workbooks.Open(Filename:="G:\Reporting\ReportCompare.xls") 
Set varSheetA = WbkA.Worksheets("LocalesMallContratos") 
Set varSheetB = WbkB.Worksheets("LocalesMallContratos") 
Set varSheetC = WbkC.Worksheets("Sheet1") 


Set RangeToCheck = varSheetA.Range("A1:A65536") '## I change this because you only indicate you want to compare column A ##' 

counter = 0 

'## just loop over the cells in the range. ##' 
'## This is not the most efficient, but it is the easiest ##' 
For each cl in RangeToCheck 

    '## Do your comparison here, e.g: ##' 
    '## Ignore cells where .Offset(0,3).Value = "ALTA" Or cl.Value = "" ##' 
    If not cl.Offset(0,3).Value = "ALTA" Or Not cl.Value = vbNullString Then 
     If Not cl.Value = varSheetB.Range(cl.Address).Value Then 
      '## The values are not equal, so do something: 
       varSheetC.Range(cl.Address) = "not equal" 
      counter = counter+1 
     Else: 
      '## The values are equal, so do something else: 
      varSheetC.Range(cl.Address) = "equal" 
     End If 
    End If 
Next 


MsgBox "Done! There were " & counter & " mismatch values", vbInformation 
End Sub 
+0

如果你打算倒下,至少解释一下自己。无论如何,祝你好运。 – 2013-05-02 12:20:36

+0

我不确定downvote,看起来像对我有用的答案。 – Chris 2013-05-02 12:57:54

+0

我没有downvote或至少不是故意的?如果我这样做,我怎样才能取消投票?另外它说我不能投票,直到我的“名声”更好,以至于我想补偿帮助我的人,看来我不能@DavidZemens – 2013-05-02 15:57:38

2

您需要使用单词“AND”,而不是在你的代码中的“&”的象征。使用'&'只是连接这些值,这会导致if语句失败。

+0

谢谢......我改变了“&”为“and”,但该行(if语句)仍然给我“错误类型不匹配”...然后我在每个之前添加了.range“(iRow, “B”)来解决这个问题,现在我在同一行(if语句)得到了“需要的错误对象”......任何想法@Mat Richardson – 2013-05-02 11:49:03

+0

@SeanConnecticut是的,你得到这个错误是因为我在下面指出)varSheetB等不是范围对象和/或你没有正确地索引数组。 – 2013-05-02 12:23:58

+0

@DavidZemens谢谢你的帮助。我在完成最后一步时遇到了一些小问题。我希望它可以省略cell.offset(0,3).value <>“ALTA”和cell.value =“”,但不知道放哪里的值...非常感谢你有什么方法可以给你一个建议或类似的东西,因为我非常感谢,但新的网站,并不确定它是如何工作的。 – 2013-05-02 13:23:14