如何避免在创建表时使用.Select和.Activate?

时间:2017-08-22 04:18:22

标签: excel vba excel-vba

我被告知使用.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 

3 个答案:

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