在一张纸上创建唯一值列表并在工作纸上输出时遇到问题

时间:2019-04-03 18:09:21

标签: excel vba

目前,我有一个电子表格,其中有一个不错的大小数据集,包含5.5万行,说15列未全部满。我想做的是在另一个标签上设置一个宏,您可以在其中从下拉菜单中选择产品代码。一旦选择,将单击按钮,程序将遍历数据集,将所有单元格值添加到数组,然后吐出结果。

数据集看起来像这样:

 prod1    code    garbage   info1   info2 ... info10    

1     23       1       k         a        b    ...      j  

2     27       1       k         a2       b    

3     57       2       k         a        b      c  

4     ...  

5  

6  

7  

8  

9  

10  

我正在尝试将condition的值设置为Claim_report工作表中的下拉列表的值,并遍历ing代码匹配的F列,如果找到匹配项,则水平遍历info#列,直到其为空一。此时,它将再次开始垂直向下移动,直到达到表中的最后一个值或找到另一个匹配项并记录新的信息值。

理想情况下,每个信息值都将发送到一个数组,并在电子表格的C5:CX单元中打印出来。如果这样做可以删除重复项,那就更好了,但恐怕我对VBA的了解还不足以使其正常工作。

到目前为止,我已经尝试过更改值,更改类,更改顺序,但无法弄清楚我在做什么。我能够找到的所有内容都是特定的,我无法使其正常工作。

    Sub refresh()
    Let ing = ThisWorkbook.Sheets("claim_report").Range("B2").Value
    Dim Claims
    Dim i As Integer, j As Integer
    j = 0
    For Each cell In ThisWorkbook.Sheets("fulldb").Range("F2:F56000")
        If cell.Value = ing Then
            For i = 6 To 15
                While cell.Offset(columnOffset:=i) <> ""
                    Claims(j) = cell.Value
                    i = i + 1
                    Wend
            Next
        End If
    Next
    Range("C4:C100") = Claims
End Sub

我拥有i 6-> 15的原因是因为行从F列偏移了6列,所以我以为它是遍历单元格M2,N2,O2 ... V2直到找到空白细胞。

在某些行中,某些信息列为空白,因此您可以在1,2,3,4处填充其余的空白,或在其中填充1-10,这就是为什么我选择使用空白单元格来打破功能。

以我的数据集为例,我想要输入代码1,让宏创建Claims数组,在代码与另一个电子表格[a,b]中的输入代码相匹配的地方附加列的值。 ,...,j,a2]。然后将其作为转置列表输入到单元格C4的另一张纸中。

例如

C4 : a
C5 : b
C6 : ...
C14 : j
C15 : a2

1 个答案:

答案 0 :(得分:0)

看起来像一些关于资格的问题,可能只是过于复杂。我认为,只要符合条件,就可以通过使用row.value = row.value(或查找每行的最后一列,这是您尝试使用的更为复杂的方式)来简化操作。确保您正在使用Option Explicit。

使用row.value = row.value:

dim i as long, lrs as long, lrd as long
with sheets("source") 
    lrs = .cells(.rows.count,6).end(xlup).row 'find last row on source sheet
end with
with sheets("destination") 'claim_report?
    for i = 1 to lrs 'loop through source sheet
        if sheets("source").cells(i,6).value = .cells(2,2).value then
            lrd = .cells(.rows.count,6).end(xlup).row+1  'find last row +1 on destination sheet, where you will add output
            .rows(lrd).value = sheets("source").rows(i).value
        end if
    next i
end with

使用定义的范围,仍为value = value:

dim i as long, lrs as long, lcs as long, lrd as long
with sheets("source") 
    lrs = .cells(.rows.count,6).end(xlup).row
end with
with sheets("destination") 'claim_report?
    for i = 1 to lrs
        if sheets("source").cells(i,6).value = .cells(2,2).value then
            lcs = sheets("source").cells(i,sheets("source").columns.count).end(xltoleft).column
            lrd = .cells(.rows.count,6).end(xlup).row+1
            .range(.cells(lrd,1).cells(lrd,lcs)).value = sheets("source").range(sheets("source").cells(i,1)sheets("source").cells(i,lcs)).value
        end if
    next i
end with