如何摆脱代码中的活动表?

时间:2017-11-23 14:31:16

标签: vba excel-vba select copy-paste worksheet

我知道在代码中使用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. 代码很大程度上依赖于ActiveSheetSelect,我认为这不是很好的做法,而且我一直在努力解决这些问题,因为它似乎经常会产生误导。

当前的代码可以正常运行,但是我想用Sheets("Data")等绝对的引用来实现它。

如果将.Select替换为.Paste

ActiveSheetSheets("Critical Components")就无法工作。

我不明白为什么这些方法(?)适用于ActiveSheet但不适用于使用表格指定的工作表?

3 个答案:

答案 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"
}