Excel 在行和列之间循环以在vba中搜索值
我在从第7列开始的数据循环到最后一列(搜索范围),根据第3列和第4列查找三(3)件事情(即等位基因调用) 首先,我在以“等位基因”为标题的列中查找该行第3列和第4列中任何值的精确匹配,即第7、10、13列等,一旦找到,我的代码将用颜色索引填充该单元格,再加上右侧的下两个单元格(即等位基因、大小、高度列,因为所有这些仍然属于同一等位基因调用) 其次,我想要第3列和第4列中的值减去1,例如,如果单元格(I,3)=11,那么我想要在标题“等位基因”下搜索10(注意,该值要么出现一次,要么没有出现),最后我要查找第3列或第4列中的值加1的值,例如单元格(I,4)那么我想搜索18 然后是第二种方法,用于查找等位基因调用两侧的值(第3列和第4列值)。我需要使用与等位基因相邻的列,即大小,而不是该值的负1或正1(在搜索范围的等位基因标题下)。准确地说,根据大小,等位基因呼叫和下一个等位基因的变异是4。因此,如果等位基因11的大小为100,那么我正在寻找大小为96的等位基因作为反向等位基因,大小为104的等位基因作为正向等位基因 因为这些值是小数,所以我的范围是3-5。Excel 在行和列之间循环以在vba中搜索值,excel,vba,Excel,Vba,我在从第7列开始的数据循环到最后一列(搜索范围),根据第3列和第4列查找三(3)件事情(即等位基因调用) 首先,我在以“等位基因”为标题的列中查找该行第3列和第4列中任何值的精确匹配,即第7、10、13列等,一旦找到,我的代码将用颜色索引填充该单元格,再加上右侧的下两个单元格(即等位基因、大小、高度列,因为所有这些仍然属于同一等位基因调用) 其次,我想要第3列和第4列中的值减去1,例如,如果单元格(I,3)=11,那么我想要在标题“等位基因”下搜索10(注意,该值要么出现一次,要么没有出现),最
颜色:实际匹配=蓝色;反向等位基因=绿色;正向等位基因=黄色。
下面是我的代码,为了清晰起见,我还附上了一张图片
ArrFS = Split("3 - 5", "-")
mnFS = CDbl(ArrFS(0))
mxFS = CDbl(ArrFS(1))
'loop through rows in first column
For i = 2 To totN
'loop through columns
For j = 7 To lastCol Step 3
On Error Resume Next
If shN.Cells(i, 3) = shN.Cells(i, j) Then
Size = shN.Cells(i, j).Offset(0, 1)
ElseIf shN.Cells(i, 4) = shN.Cells(i, j) Then
Size = shN.Cells(i, j).Offset(0, 1)
End If
If shN.Cells(i, 2) = ("N/A") Then
Resume Next
'True Alleles=Blue (exact value in column 3 or 4)
ElseIf shN.Cells(i, 3).Value = shN.Cells(i, j).Value Then
shN.Range(Cells(i, j), Cells(i, j + 2)).Interior.ColorIndex = 41 '6
ElseIf shN.Cells(i, 4) = "" Then
shN.Range(Cells(i, j), Cells(i, j + 2)).Interior.ColorIndex = xlNone
ElseIf shN.Cells(i, 4) = shN.Cells(i, j) Then
shN.Range(Cells(i, j), Cells(i, j + 2)).Interior.ColorIndex = 41
End If
For K = 8 To lastCol Step 3
'Reverse Allele-Green (value in columns 3 or 4 minus 1 or within minus 3-5 size range)
If shN.Cells(i, 3) = ("X") Or _
shN.Cells(i, 4) = ("Y") Then
Resume Next
'search based on size range (minus 3-5)
ElseIf ((shN.Cells(i, K) + mnFS) <= Size) And ((shN.Cells(i, K) + mxFS) >= Size) Or _
shN.Cells(i, 3) - 1 = shN.Cells(i, j).Value Then
shN.Range(Cells(i, K - 1), Cells(i, K + 1)).Interior.ColorIndex = 35 Or _
shN.Range(Cells(i, j), Cells(i, j + 2)).Interior.ColorIndex = 35
ElseIf shN.Cells(i, 4) - 1 = shN.Cells(i, j).Value Then
shN.Range(Cells(i, j), Cells(i, j + 2)).Interior.ColorIndex = 35
End If
Next
'Forward Allele=Yellow (value in columns 3 or 4 plus 1)
If shN.Cells(i, 3) = ("X") Or _
shN.Cells(i, 4) = ("Y") Then
Resume Next
ElseIf shN.Cells(i, 3) + 1 = shN.Cells(i, j) Then
shN.Range(Cells(i, j), Cells(i, j + 2)).Interior.ColorIndex = 6 '6
ElseIf shN.Cells(i, 4).Value + 1 = shN.Cells(i, j).Value Then
shN.Range(Cells(i, j), Cells(i, j + 2)).Interior.ColorIndex = 6 '4
End If
Next
Next
ArrFS=Split(“3-5”和“-”)
mnFS=CDbl(ArrFS(0))
mxFS=CDbl(ArrFS(1))
'循环第一列中的行
对于i=2到totN
'循环通过列
对于j=7至步骤3
出错时继续下一步
如果shN.Cells(i,3)=shN.Cells(i,j),则
尺寸=shN.单元(i,j).偏移量(0,1)
ElseIf shN.Cells(i,4)=shN.Cells(i,j)然后
尺寸=shN.单元(i,j).偏移量(0,1)
如果结束
如果单元格(i,2)=(“N/A”),则
下一步继续
'真等位基因=蓝色(第3列或第4列中的精确值)
ElseIf shN.Cells(i,3).Value=shN.Cells(i,j).Value然后
shN.范围(单元格(i,j),单元格(i,j+2)).Interior.ColorIndex=41'6
ElseIf shN.Cells(i,4)=“那么
shN.范围(单元格(i,j),单元格(i,j+2)).Interior.ColorIndex=xlNone
ElseIf shN.Cells(i,4)=shN.Cells(i,j)然后
shN.范围(单元格(i,j),单元格(i,j+2)).Interior.ColorIndex=41
如果结束
对于K=8至第3步
'反向等位基因绿色(第3列或第4列中的值减去1或在-3-5大小范围内)
如果单元(i,3)=(“X”)或_
单元(i,4)=(“Y”)则
下一步继续
'基于大小范围的搜索(减3-5)
ElseIf((单细胞(i,K)+mnFS)=大小)或_
shN.Cells(i,3)-1=shN.Cells(i,j)。然后取
shN.范围(单元格(i,K-1),单元格(i,K+1)).Interior.ColorIndex=35或_
shN.范围(单元格(i,j),单元格(i,j+2)).Interior.ColorIndex=35
ElseIf shN.Cells(i,4)-1=shN.Cells(i,j).值然后
shN.范围(单元格(i,j),单元格(i,j+2)).Interior.ColorIndex=35
如果结束
下一个
'正向等位基因=黄色(第3列或第4列中的值加上1)
如果单元(i,3)=(“X”)或_
单元(i,4)=(“Y”)则
下一步继续
ElseIf shN.Cells(i,3)+1=shN.Cells(i,j)然后
shN.范围(单元格(i,j),单元格(i,j+2)).Interior.ColorIndex=6'6
ElseIf shN.Cells(i,4).Value+1=shN.Cells(i,j).Value然后
shN.范围(单元格(i,j),单元格(i,j+2)).Interior.ColorIndex=6'4
如果结束
下一个
下一个
那么您面临什么问题?你被困在哪里了?任务可能太复杂,无法包含在单个过程中。因此,我可能会将结构分为半个dozern子函数和函数,以及一个Main
,它只确定要调用哪些函数。由于每个功能都有自己的、有限的功能范围,所以您可以确定问题所在。这使得维护变得更容易,因此,花费的时间更少,这反过来又使它有资格在这里获得帮助。我认为您误解了代码中“Resume Next”的行为。它用于错误处理,并且仅在错误处理过程中有效。您将其放置在代码示例中的方式使我认为您的意图是它跳转到相应“For”循环的“Next”语句。如果我理解正确,我希望那些“Resume Next”语句会给你一个错误。@Siddharth,代码运行要花很长时间,我正在努力使用大小来查找前向等位基因。@Variatus,我还是vba新手,所以我不太熟悉调用子过程,因此我倾向于填充代码。为了节省时间,您不应该在工作表上工作。尝试使用内存结构来使用堆栈/堆。将要处理的范围粘贴到变体/词汇表中,并在变体中循环,而不是在每个单元格上搜索。你需要调整你的代码,但速度会快十倍