首页 > 解决方案 > 循环遍历行和列以在 vba 中搜索值

问题描述

我正在遍历从第 7 列开始到最后一列(搜索范围)的数据,以查找基于第 3 列和第 4 列(即等位基因调用)的三 (3) 个事物。

首先,我正在寻找第 3 列和第 4 列中以“等位基因”为标题的列中的任何值的完全匹配,即第 7、10、13 列等,一旦找到,我的代码会用颜色索引加上右边的下两个单元格(即等位基因、大小、高度列,因为所有这些仍然属于同一个等位基因调用)。

其次,我想要的值是第 3 列和第 4 列中的值的负 1,例如如果单元格(i,3)=11,那么我想在标题“等位基因”下搜索 10(注意有一个或没有出现这个值),最后我正在寻找第 3 列或第 4 列中的值加 1 的值,例如单元格(i,4)=17,然后我想搜索 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

标签: excelvba

解决方案


推荐阅读