【发布时间】:2017-10-03 01:16:52
【问题描述】:
我有一个电子表格,其中包含与食品成分有关的大量原始数据表。然后必须针对新成分对数据进行分类,清除旧数据并填充新数据。
电子表格最初的设置是,用户必须手动点击“清除数据”按钮,然后点击每个标签上的“提取新数据”按钮。这本工作手册有几十个标签,并且随着新成分的添加而不断增长。
我已经设置了一个宏,它通过一次运行就可以遍历并清除所有数据,但是我无法让工作表动态排序并将数据提取到每个单独的工作表。我可以通过硬编码每个单独选项卡的名称来暴力破解它,但这需要在每次必须添加新成分时更新宏。我希望让它尽可能动态化,并感觉我很接近。
每张配料表在“A1”中都有该配料对应的物料编号,在搜索时用作标识符。
我需要电子表格的整体行为是这样的: 1.) 将活动工作表的 A1 范围内的材料编号与“原始数据”工作表上的第一个材料编号进行比较。
2.) 如果活动表的物料编号与当前行中的物料号匹配,则将原始数据表上的整行复制到活动表。
3.)如果这些单元格不匹配,则移动到列中的下一行并重复直到列的末尾。
4.) 激活工作簿中的下一张工作表并重复该过程,直到所有工作表都循环完成。
以下是我目前拥有的代码:
Sub PullNewData()
Dim wks As Worksheet
Set i = Sheets("Raw Data")
Set e = ActiveSheet
Dim d
Dim j
d = 20
j = 2
For Each wks In ActiveWorkbook.Worksheets
If wks.Name <> "Ingredient List" Then
If wks.Name <> "Raw Data" Then
If wks.Name <> "Instructions" Then
wks.Activate
For Each Cell In i.Range("B2:B10000")
If i.Range("B" & j) = e.Range("A1") Then
d = d + 1
e.Rows(d).Value = i.Rows(j).Value
End If
j = j + 1
Next Cell
d = 20
j = 2
End If
End If
End If
Next wks
End Sub
此代码适用于激活的任何工作表(提取正确的数据),然后循环浏览其余工作表,而不复制任何这些工作表的数据。谁能告诉我为什么这段代码没有复制到最初未激活的工作表中?
PS 开头附近的三重 IF 语句用于排除三张工作表的数据排序。
【问题讨论】:
-
问题在于
Set e = ActiveSheet这个语句,因为e需要为每个活动工作表更新。将该语句移到wks.Activate之后,就在内部 For 循环之前 -
更好 - 你根本不需要
e- 只需使用wks代替它。 -
感谢保罗和蒂姆!你的两个建议都很好用!