我有一个csv文件(这是从打印机导出的),它不是很好读,而且还有很多不需要的信息。 所以我写了一个VBA宏来将相关数据复制到第二张表。
使用vba代码,我在工作表1中查找将复制到工作表2的特定文本短语。 这些文本短语不在工作表1的特定列中,因此我必须查看完整的工作表1。 我的代码正在运行,但我有一个问题,这对我来说很棘手,这就是我需要你帮助的原因。
在我的情况下,我正在寻找短语“Druckbeginn =”(这是德语,意思是Printstart),后面跟着一个unix时间码。 在大多数行中,短语“Druckbeginn =”存在,但在某些行中却不存在。
因此,在第1,2和4行中,这句话是存在的,但在第3行却没有。 问题是,我的vba代码将单元格从工作表1复制到工作表2,但它复制到第1,2和3行而不是第1,2和4行。
如果您需要我的csv文件和/或我的完整vba代码,请告知我们。
这是我的代码:
w1.Activate
For Each r In Intersect(Range("A:AS"), ActiveSheet.UsedRange)
v = r.Value
If InStr(v, "Druckbeginn =") > 0 Then
r.Copy w2.Cells(B, 3)
B = B + 1
End If
Next r
答案 0 :(得分:0)
解决方案:此代码对我有用:
' Insert variable declarations etc.
Set w1 = ThisWorkbook.Sheets("Sheet1")
Set w2 = ThisWorkbook.Sheets("Sheet2")
For Each r In Intersect(w1.Range("A:AS"), w1.UsedRange)
If InStr(r.Value, "Druckbeginn =") > 0 Then
' The important change is in the next line
w2.Cells(r.Row, 3).Value = r.Value
End If
Next r
结果:(在获取样本数据之前看起来更简单一点)
表1:
表2(运行宏之后):
解决方案说明:在您的代码中,只有在找到字符串时,您才会增加B
,从而导致所有复制的单元格被复制到您的列的顶部结果表而不是源数据中的相应行。相反,我们可以简单地引用源数据的.Row
属性。 r.Row
是r
循环的当前For Each
元素的行号,因为您希望单元格位于ws2
中的相同行号,您可以使用相同的行号。
代码改进说明:
(1)For Each r In Intersect(w1.Range("A:AS"), w1.UsedRange)
:为避免混淆.Range
所指的工作表,我添加了w1.
说明符。
(2)If InStr(r.Value, "Druckbeginn =") > 0 Then
:您可以直接在v = r.Value
子句中使用r.Value
,而不是分配If
,因为您以后不再使用它。
(3)w2.Cells(r.Row, 3).Value = r.Value
:复制和粘贴操作需要在工作表之间跳转,这在性能方面比通过其.Value
属性直接为单元格指定值更糟糕,尤其是在您通过时大文件。