2015-10-17 100 views
0

所以我的问题是,如何在列中查找值并获取该行另一列的值并在Excel中格式化该行?

我有4列(A,B,C,D),我需要找出列C中的值是否存在列A,如果它需要寻找(在我的初始值的行上)值并检查它是否与列B中的值相同(在我找到匹配的行上),然后对C列中的每个值执行此操作。

我从来没有在Visual Basic中编写代码,并且几乎没有Excel体验。我认为代码应该是这样的:(当然在VB)

for(int i=0;i<numOfRecordsInC;i++){ 
    for(int m=0;m<numOfRecordsInA;m++){ 
     if(C[i]==A[m] && D[i]==B[m]){//ith,mth element of the columns 
     //Highlight mth row 
     //or just print "1" to any column on mth row if that's easier 
     } 
    } 
} 

我怎么能写这样的事情在里面VBA Excel或我能做到这一点使用Excel等工具?重复项的条件格式是没有用的,因为没有保证列内不会有重复的值。

好了,所以我想出了这样一个公式经过一番研究:

=IF(COUNTIF(E$5:E$1605;P5);IF(VLOOKUP(P5;E$5:J$1605;2;0)=R5;"Matched";"Not Matched");"Not Found") 

但我得到错误的结果或有什么问题我的公式。

根据我在开始时给出的例子, A是E,B是J,C是P,D是R A is E, B is J, C is P, D is R

回答

1

你想要类似的东西吗?

Sub highlightCells() 

With Worksheets("sheet1") 
    'calculate last row for colA & colB 
    lastRowLeft = WorksheetFunction.Max(_ 
     .Cells(.Rows.Count, "A").End(xlUp).Row, _ 
     .Cells(.Rows.Count, "B").End(xlUp).Row) 
    'calculate last row for colC & colD 
    lastRowRight = WorksheetFunction.Max(_ 
     .Cells(.Rows.Count, "C").End(xlUp).Row, _ 
     .Cells(.Rows.Count, "D").End(xlUp).Row) 

    'match 
    For i = 1 To lastRowRight 
     For m = 1 To lastRowLeft 
      If .Cells(i, "C").Value = .Cells(m, "A").Value _ 
      And .Cells(i, "D").Value = .Cells(m, "B").Value Then 
       'do sth 
       Debug.Print "(m,i)=(" & m & "," & i & ")" 
      End If 
     Next 
    Next 
End With 

End Sub 

实例数据

| A B C D 
-------------- 
1|  1 A 
2| 5  2 B 
3| 2 B 3 C 
4|  4 D 
5|  5 E 
6| 4 D 

结果示例

(m,i)=(3,2) 
(m,i)=(6,4) 
+0

这给出了下标超出范围的错误。 – gadria

+0

我在运行脚本时没有发生此错误。您是否使用过“HPageBreaks”或“VPageBreaks.Location”? [Microsoft支持:运行时错误'9': 下标超出范围](https://support.microsoft.com/en-us/kb/210663) –

+0

它为我工作,如果我添加行像.Cells (i,“C”).Delete.ColorIndex = 3在Debug语句之后给单元格着色。 –

1

这被标记为VBA,但你提到 '其他工具' 也是如此。

您也可以使用索引和匹配这个样子(如果数据在第2行开始): -

=INDEX($B$2:$B$7,MATCH($C2,$A$2:$A$7,0))=$D2 

然后把它在条件格式|新规则|使用公式

enter image description here

如果有可能在A列重复的值,任何一个可能有B列,列d原始值之间的匹配,那么你就需要一个这样的数组公式: -

=MATCH($D2,IF($A$2:$A$7=$C2,$B$2:$B$7),0) 

enter image description here

+0

优雅的解决方案:) –

+0

它说公式包含一个错误,但不显示什么部分或什么是错的 – gadria

+1

谢谢,但我刚刚意识到它有一个可能的缺点,它只在列A中寻找_first_匹配。在列A中有重复的值,其中一列在列B中具有与列D中的值相匹配的对应值,所以它们不会找到它们,并且您可能确实需要VBA。 –

1

发现,在我的情况下工作的公式(依然给人即使列有重复正确的结果)

=IF(COUNTIF(E$5:E$1605;P5);IF(COUNTIFS(E$5:E$1605;P5;J$5:J$1605;R5);"Matched";"Not Matched");"Not Found") 

Excel不会让我用,到单独的参数和建议;。也许这是因为我的Windows的语言设置,所以如果你最终使用这个公式,请记住这一点。

+1

你的第一个公式很好,除了你应该在你的VLOOKUP中放置6个列即= IF(COUNTIF(E $ 5:E $ 1605,P5),IF(VLOOKUP(P5,E $ 5:J $ 1605,6,0)= R5,“匹配”,“未匹配”),“未找到”) –

+0

啊,现在我明白了......当你不完全理解你在做什么时,会发生什么:)感谢你指出我的错误! – gadria

+0

顺便说一句COUNTIF是最好的方法:-)原来的问题只是让我们把它当作查找问题。 –

相关问题