我知道在代码中使用activesheet作为参考是不好的做法,但我不能在不破坏代码的情况下摆脱它。
这是我的代码:
For Each HeaderMatch In SrchRange
If HeaderMatch Like HeaderKeyWord Then
HeaderCount = HeaderCount + 1
HeaderRows(HeaderCount) = HeaderMatch.Row
Sheets("Data").Cells(HeaderMatch.Row, 1).Resize(3, 7).Copy
Sheets("Critical Components").Select
NextRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 3
ActiveSheet.Cells(NextRow, 1).Select
ActiveSheet.Paste
End If
Next
我的代码在按钮中运行,该按钮位于" Main"片。有关数据的数据"数据"我在第一行收集包含HeaderKeyWord的所有3个行标题的工作表。那么这3行就是来自" Data"到"关键组件"片材。
此代码基本上是从找到的样本中复制的
here.
代码很大程度上依赖于ActiveSheet
和Select
,我认为这不是很好的做法,而且我一直在努力解决这些问题,因为它似乎经常会产生误导。
当前的代码可以正常运行,但是我想用Sheets("Data")
等绝对的引用来实现它。
.Select
替换为.Paste
, ActiveSheet
和Sheets("Critical Components")
就无法工作。
我不明白为什么这些方法(?)适用于ActiveSheet但不适用于使用表格指定的工作表?
答案 0 :(得分:0)
尝试这样:
Sub TestMe()
For Each HeaderMatch In SrchRange
If HeaderMatch Like HeaderKeyWord Then
HeaderCount = HeaderCount + 1
HeaderRows(HeaderCount) = HeaderMatch.Row
NextRow = Worksheets("WriteTheName").Cells(Rows.Count, 1).End(xlUp).Row + 3
Sheets("Data").Cells(HeaderMatch.Row, 1).Resize(3, 7).Copy _
Destination:=Sheets("Critical Components").Cells(NextRow, 1)
End If
Next
End Sub
在这里查看一些想法: https://stackoverflow.com/a/35864330/5448626
此外,每当您使用Cells()
和Range()
时,请务必始终参考代码中的工作表。
答案 1 :(得分:0)
您可以使用要考虑的工作表的名称替换活动工作表,以便您的代码看起来像这样
For Each HeaderMatch In SrchRange
If HeaderMatch Like HeaderKeyWord Then
HeaderCount = HeaderCount + 1
HeaderRows(HeaderCount) = HeaderMatch.Row
NextRow = Sheets("Critical Components").Cells(Rows.Count, 1).End(xlUp).Row + 3
Sheets("Data").Cells(HeaderMatch.Row, 1).Resize(3, 7).Copy Sheets("Critical Components").Cells(NextRow, 1)
End If
Next
答案 2 :(得分:0)
我试图对您当前的代码进行最低限度的修改,请尝试以下版本(代码注释中的解释):
$loglocation = "C:\folder"
Get-ChildItem -Path $loglocation -Filter *.csv | foreach {
Export-XLSX -InputObject $_ -Path "$loglocation\$($_.BaseName).xlsx"
}