我目前有一个电子表格,其中包含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
看起来像一些资格问题,可能只是过于复杂。我认为你可以通过使用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