Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用VBA比较两个单独的文档_Vba_Loops_Excel - Fatal编程技术网

用VBA比较两个单独的文档

用VBA比较两个单独的文档,vba,loops,excel,Vba,Loops,Excel,所以我要做的是在工作簿a中有一个宏,打开工作簿B和C。然后它通过工作簿B和C的a列,当这两个值相等时,它从工作簿C中获取值并粘贴到工作簿a的a列 我已经写了下面的代码,但是如果你认为用另一种方法更容易,请随意编写你自己的代码。谢谢你,请帮帮我:) 子报告CompareAlta() ' 'ReportCompareAlta宏 '添加列D为“ALTA”的实例 Dim varSheetA作为变体 变光板B作为变型 变光变光板C作为变型 作为变体的Dim StrValue Dim STRANGETOCH

所以我要做的是在工作簿a中有一个宏,打开工作簿B和C。然后它通过工作簿B和C的a列,当这两个值相等时,它从工作簿C中获取值并粘贴到工作簿a的a列

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

子报告CompareAlta()
'
'ReportCompareAlta宏
'添加列D为“ALTA”的实例
Dim varSheetA作为变体
变光板B作为变型
变光变光板C作为变型
作为变体的Dim StrValue
Dim STRANGETOCHECK As字符串
暗淡无光
如长
将WbkA作为工作簿
将WbkB设置为工作簿
将WbkC设置为工作簿
昏暗的柜台一样长
设置WbkA=Workbooks.Open(文件名:=“G:\Reporting\AH\u MISSE\u FEB2013.xls”)
设置WbkB=Workbooks.Open(文件名:=“G:\Reporting\AH\u MISSE\u MAR2013.xls”)
设置WbkC=Workbooks.Open(文件名:=“G:\Reporting\ReportCompare.xls”)
设置varSheetA=WbkA.Worksheets(“localesmallcontatos”)
设置varSheetB=wkb.Worksheets(“localesmallcontatos”)
设置varSheetC=WbkC.工作表(“表1”)
strRangeToCheck=“A1:IV65536”
调试,现在打印
varSheetA=WbkC.Worksheets(“Sheet2”).Range(strRangeToCheck)”可能会在这里混淆代码
varSheetB=WbkC.Worksheets(“Sheet3”).Range(strRangeToCheck)”可能会在这里混淆代码
调试,现在打印
计数器=0
对于iRow=LBound(varSheetA,1)到UBound(varSheetA,1)
如果varSheetB(iRow,“B”)=varSheetA(iRow,“B”)&varSheetB(iRow,“B”)“GERENCIA”和varSheetB(iRow,“B”).值“”&varSheetB(iRow,“D”)=ALTA,则
StrValue=“”
varSheetB.Range(“iRow:B”)。选择
选择=标准值
ActiveSheet=varSheetC
范围(“A1”)。选择
Selection.Offset(计数器,0).Value=StrValue
计数器=计数器-1
其他的
MsgBox(“完成”)
如果结束
下一步
端接头

您需要在代码中使用“AND”一词,而不是“&”符号。使用“&”只会连接值,这将导致if语句失败。

我看到一些明显的错误,正如Mat Richardson指出的,使用
&
并不是
运算符的缩写,它是一个连接符,当你说:

这就引出了另一个错误:

varSheetB
(以及A和C)是变量/数组变量。您不能通过
iRow,“B”
对它们进行索引,因为您不能使用非数字索引。也许你的意思是(
iRow,2

在相关注释中:
varSheetB.Range(“iRow:B”)。选择
这也将失败,因为您无法
。选择一个变量。这不是一个范围变量。此外,
iRow:B对于变量数组或范围变量都不正确。此外,此时,
varSheetB
不再是
工作表
对象变量

这可能是最大的错误:您使用变量
varSheetA
varSheetB
varSheetC
来表示(在此代码中的不同时间)工作表对象和变量值数组。这是令人困惑的,并可能导致您出现上述错误。一个变量不能同时是这两个变量,因此当变量是变量时,您需要将其视为变量,当变量是工作表时,您需要将其视为工作表,或者更好:将工作表变量用于工作表,将变量用于数组,不要将同一变量用于多种用途

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

那么你的代码是做什么的呢?它有用吗?如果没有,什么不起作用?有错误信息吗?我在这里没有看到任何问题。@OlleSjögren嘿,很抱歉打扰你,但当我发布此问题时,我是这个网站的新手,因此不知道协议,我试图删除此问题,并在发现有编辑之前重新开始,因为我的编辑在另一个线程中得到了回答,我从未编辑或关闭此线程。我想知道你是否可以取消我的反对票,这样我就可以回到成为一个正直和有贡献的成员的道路上。对不起,否决票不是我投的,所以我对此无能为力。不过,我可以投你一票,感谢你努力做得更好。:)非常感谢。我将“&”改为“and”,但那一行(if语句)仍然给出了“错误类型不匹配”。。。然后我在每个“(iRow,“B”)之前添加了.range来修复这个问题,现在我在同一行(if语句)上得到了“error object required”…有什么想法@Mat吗Richardson@SeanConnecticut是的,您得到这个错误是因为(正如我在下面指出的)
varSheetB
等不是范围对象和/或您没有正确索引数组。@DavidZemens谢谢您的帮助。我对它的收尾工作有点小问题。我希望它忽略cell.offset(0,3)处的值。值“ALTA”和cell.value=”“但是我不知道该把它放在哪里……非常感谢。我有什么办法可以给你推荐或类似的东西吗?因为我非常感激,但对这个网站来说是新的,不知道它是如何工作的。@SeanConnectioncut我对下面的答案做了修改,添加了另一个
如果不是cl.Offset(0,3)。Value=“ALTA”或者不是cl.Value=vbNullString然后。。。结束If
,将发生比较的块括起来。这应该跳过
.Offset(0,3).Value=“ALTA”
.Value=”“
的单元格。如果我的答案有用,你可以给它一个“向上投票”:)如果你要向下投票,至少解释一下
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