如何避免使用.Select和.Activate创build表?

我已经被告知使用.Select和.Workbooks.Activate并不是真正的写Vba的好方法。 下面的代码往往是完美的工作,似乎没有任何真正的问题。 由于Workbooks(“FUA.XLSM”),Activeworkbook不是问题。激活。 那么我的问题是,一个好的替代方法是什么? 如果这是浪费时间,这是一个愚蠢的问题,我很抱歉,但是我听说从长远来看,使用这些方法并不是一个好办法。 我担心这样做不会有效,或者将来会出现问题。 应该注意的是,没有工作簿(“FUA.XLSM”)。激活代码往往会产生错误,因为它会对应该select哪个工作簿感到困惑。 总之,我的问题是,我怎样才能避免使用Select和.Activate来缓解未来可能出现的错误?
代码如下

Dim wb1 As Excel.Workbook Dim wb2 As Excel.Workbook Set wb2 = Workbooks.Open("C:\Users\Ha.csv") Set wb1 = Workbooks("FUA") Dim sht1 As Worksheet Dim sht2 As Worksheet Dim copyRange As Range Set sht1 = wb1.Sheets("Sheet1") Set sht2 = wb2.Sheets("Ha") With wb1.Sheets("Sheet1") Range("AA3").Select If Application.WorksheetFunction.CountA(.Cells) <> 0 Then lastRow = .Cells.Find(What:="*", _ After:=.Range("AA3"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).row Else lastRow = 1 End If End With Workbooks("FUA.XLSM").Activate Range("AA3").Select sht1.ListObjects.Add(xlSrcRange, , xlYes).Name = _ "Table1" Range("Table1[#All]").Select sht1.ListObjects("Table1").Range.AutoFilter Field:=9, Criteria1:= _ ">=-1000000000000", Operator:=xlAnd, Criteria2:="<=1000000000000000" Application.DisplayAlerts = False Selection.SpecialCells(xlCellTypeVisible).Copy Application.DisplayAlerts = True Set wb2 = Workbooks.Open("C:\Users\Ha.csv") Application.DisplayAlerts = False wb2.Sheets("Ha").Paste wb2.SaveAs Filename:= _ "C:\Users\Ha.csv", FileFormat:= _ xlCSV, CreateBackup:=False Workbooks("Ha.csv").Close End Sub 

这是你的代码重写。
我认为它具有相同的function。

 Sub test() Dim wb1 As Excel.Workbook Set wb1 = Workbooks("FUA.XLSM") ' from here, use wb1 to refer to fua.xlsm Dim wb2 As Excel.Workbook ' ditto for wb2 Set wb2 = Workbooks.Open("C:\Users\Ha.csv") Dim sht1 As Worksheet ' ditto for sht1 Set sht1 = wb1.Sheets("Sheet1") If Application.WorksheetFunction.CountA(sht1.Cells) <> 0 Then LastRow = sht1.Cells.Find( _ What:="*", _ After:=sht1.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row Else LastRow = 1 End If sht1.ListObjects.Add(xlSrcRange, sht1.Range("AA3"), xlYes).Name = "Table1" sht1.ListObjects("Table1").Range.AutoFilter _ Field:=9, _ Criteria1:=">=-1000000000000", _ Operator:=xlAnd, _ Criteria2:="<=1000000000000000" Application.DisplayAlerts = False ' not sure if needed Range("Table1[#All]").SpecialCells(xlCellTypeVisible).Copy sht2.Cells Application.DisplayAlerts = True ' not sure if needed wb2.Save ' already C:\Users\Ha.csv wb2.Close End Sub 

我甚至不打算使用VBA获取数据,使用Power Query并从源文件导入数据,在查询中执行filter并将结果返回到“FUA”工作簿中的表格。

然后可以将查询设置为在“FUA”工作簿打开或查询定义中自动刷新。

大概是下来投票说这个,但如果它没有坏,不要修复它。 你的代码已经正常工作,没有真正的理由要改变,除非它不工作或错误popup。 听起来你已经testing过了。

你的代码已经被优化和更快了,尽pipe这里是避免Select的一个select。 如果1004类似于最后一行sht2.Range("A:I").Copy Columns(last_col + 1).PasteSpecialselect方法,在下面的代码中sht2.Range("A:I").Copy Columns(last_col + 1).PasteSpecial将会继续。

 Sub test() Dim wb1 As Excel.Workbook Set wb1 = Workbooks("XXX.XLSM") ' from here, use wb1 to refer to fua.xlsm Dim wb2 As Excel.Workbook ' ditto for wb2 Set wb2 = Workbooks.Open("C:\Users\Ha.csv") Dim sht1 As Worksheet ' ditto for sht1 Set sht1 = wb1.Sheets("Sheet1") Dim sht2 As Worksheet Set sht2 = wb2.Sheets("Ha") If Application.WorksheetFunction.CountA(sht1.Cells) <> 0 Then LastRow = sht1.Cells.Find( _ What:="*", _ After:=sht1.Range("A1"), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).row Else LastRow = 1 End If sht1.ListObjects.Add(xlSrcRange, sht1.Range("A:I"), xlYes).Name = "Table1" sht1.ListObjects("Table1").Range.AutoFilter _ Field:=9, _ Criteria1:=">=-1000000000000", _ Operator:=xlAnd, _ Criteria2:="<=1000000000000000" Application.DisplayAlerts = False ' not sure if needed sht1.Range("A:I").SpecialCells(xlCellTypeVisible).Copy On Error Resume Next sht2.Range("A:I").Copy Columns(last_col + 1).PasteSpecial On Error Resume Next Application.DisplayAlerts = True ' not sure if needed wb2.Save ' already C:\Users\Ha.csv wb2.Close End Sub