我被告知使用.Select和.Workbooks.Activate并不是写Vba的好方法。下面的代码往往工作得很好,似乎没有任何实际问题。由于工作簿(“FUA.XLSM”),Activeworkbook不是问题。激活。那么我的问题是,一个好的选择/方法是什么?
如果这是浪费时间或者这是一个愚蠢的问题,我很抱歉,但我听说使用这些方法从长远来看并不是一个好方法。我担心这不会起作用或将来会产生问题。应该注意的是,没有工作簿(“FUA.XLSM”)。激活代码往往会产生错误,因为它对应该选择哪个工作簿感到困惑。
简而言之,我的问题是,我如何能够避免使用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
答案 0 :(得分:0)
这是你的代码重写。
我认为它具有相同的功能。
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
答案 1 :(得分:0)
我甚至不愿意使用VBA获取数据,使用Power Query并从源文件导入数据,在查询中执行过滤器并将结果返回到“FUA”工作簿中的表。
然后可以将查询设置为在“FUA”工作簿开头或查询定义中自动刷新。
答案 2 :(得分:0)
可能会投票赞成这样说但是如果它没有打破就不能解决它。您的代码已经正常工作,没有真正的理由可以更改,除非它没有工作或错误弹出。听起来你已经对它进行了测试。
您的代码已经过优化和更快,但为了避免选择,这里有一个替代方案。如果您使用与下面代码中的最后一行private void DrivesCheck()
{
Drives d = this.Resources["drivesUsage"] as Drives;
d.Update(); //<-- this method should update the Drive* properties
}
类似的select方法获得错误1004,则无论如何都将继续。
sht2.Range("A:I").Copy Columns(last_col + 1).PasteSpecial