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

问题描述 投票:0回答:1

我目前有一个电子表格,其中包含55k行的大小合适的数据集,并说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  

我正在尝试将条件的值设置为claim_report表中下拉列表的值,并迭代通过F代码匹配的列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
excel vba
1个回答
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

使用定义的范围,仍然值=值:

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
© www.soinside.com 2019 - 2024. All rights reserved.