Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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
Excel 在行和列之间循环以在vba中搜索值_Excel_Vba - Fatal编程技术网

Excel 在行和列之间循环以在vba中搜索值

Excel 在行和列之间循环以在vba中搜索值,excel,vba,Excel,Vba,我在从第7列开始的数据循环到最后一列(搜索范围),根据第3列和第4列查找三(3)件事情(即等位基因调用) 首先,我在以“等位基因”为标题的列中查找该行第3列和第4列中任何值的精确匹配,即第7、10、13列等,一旦找到,我的代码将用颜色索引填充该单元格,再加上右侧的下两个单元格(即等位基因、大小、高度列,因为所有这些仍然属于同一等位基因调用) 其次,我想要第3列和第4列中的值减去1,例如,如果单元格(I,3)=11,那么我想要在标题“等位基因”下搜索10(注意,该值要么出现一次,要么没有出现),最

我在从第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。
颜色:实际匹配=蓝色;反向等位基因=绿色;正向等位基因=黄色。
下面是我的代码,为了清晰起见,我还附上了一张图片

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新手,所以我不太熟悉调用子过程,因此我倾向于填充代码。为了节省时间,您不应该在工作表上工作。尝试使用内存结构来使用堆栈/堆。将要处理的范围粘贴到变体/词汇表中,并在变体中循环,而不是在每个单元格上搜索。你需要调整你的代码,但速度会快十倍