【问题标题】:Deleting workbook variable in a loop在循环中删除工作簿变量
【发布时间】:2017-02-03 14:47:28
【问题描述】:

我已将工作簿分配给变量。 然后我正在做一些事情并保存文件并关闭工作簿:

如果我想在循环中使用此代码,将工作簿设置为 Nothing 是个好主意吗?

    For i = 1 To UBound(a_ven_lst1)
        Set wb_input1 = Application.Workbooks.Add
        Set ws_input1 = wb_input1.Sheets(1)
        .Rows(1).Copy ws_input1.Rows(1)
        .Rows(d_fst_ven_row & ":" & d_lst_ven_row).Copy ws_input1.Rows(2)
        s_save_path = f_str_file_name(ws_input1.Cells(2, i_ven_col_cnt).Value)
        s_file_path = s_path & "\" & s_save_path & ".xlsx"
        a_ven_lst1(i, 2) = s_file_path
        wb_input1.SaveAs Filename:=s_file_path
        wb_input1.Close True
        Set wb_input1 = Nothing
    Next i

我是否以适当的方式杀死了这个变量? 在粉碎代码后,我看到一些对象仍然存在于 VBA 编辑器中,但远远超出了这一点。

【问题讨论】:

  • IMO,最好的方法是将变量 Dim 设置为所需的最小范围。在这种情况下,我会在循环内声明wb_input1。这样您就不必取消设置了。
  • 由于您在循环中重复使用它,您实际上不需要在循环中将其设置为空。实际上,只要它的作用域是 sub 的本地范围,那么默认情况下它就会被清除。
  • @A.S.H VBA 中最小的范围是过程级;循环没有自己的范围。我会将循环体提取到它自己的过程中并声明变量 there.
  • @Mat'sMug 你是对的,很好的建议。我总是像在 C++ 中一样,尽可能深入地研究范围,但忘记了它在 VBA 中没有什么区别 :)
  • @A.S.H IMO 这仍然是一个好习惯——你声明的东西接近它们的使用位置,而不是在程序顶部的声明墙上的某个地方;太赞了!

标签: vba excel


【解决方案1】:

不用担心工作簿变量设置和取消设置的替代代码

With ws_input

    '...

    Dim rowToCopy1 As Range, rowToCopy2 As Range        
    Set rowToCopy1 = .Rows(1) '<--| set first row to copy, since it's "constant" against the subsequent loop
    Set rowToCopy2 = .Rows(d_fst_ven_row & ":" & d_lst_ven_row) '<--| set second row to copy, since it's "constant" against the subsequent loop

    For i = 1 To UBound(a_ven_lst1)
        With Application.Workbooks.Add '<--| open a new workbook and reference its instance
            With .Sheets(1) '<--| reference referenced workbook sheet(1)
                rowToCopy1.Copy .Rows(1)
                rowToCopy1.Copy .Rows(2)
                s_save_path = f_str_file_name(.Cells(2, i_ven_col_cnt).Value)
            End With
            s_file_path = s_path & "\" & s_save_path & ".xlsx"
            a_ven_lst1(i, 2) = s_file_path
            .SaveAs Filename:=s_file_path
            .Close True
        End With '<--| discard the instance of the opened workbok
    Next i

    '...

End With

【讨论】:

  • 整洁!我多么希望世界上的每一个 With 块都拥有并持有对象引用……遗憾的是,With 块常常只用于减少编写代码所需的击键次数。
  • 好主意,实现范围界定的间接方式;)
  • @Eswemenasja,如果我的回答解决了您的问题,您可能希望将其标记为已接受。谢谢!
  • @user3598756 这是一个非常好的解决方案。所以你说在VBA中'With'是一个类似于乐趣子的范围,它重置'End With'上的变量?它会重置所有使用的变量,还是仅重置它在一行中打开的变量?请接受投票,直到我对其进行测试。
  • 如果objectWith object 语句之前从未被实例化,那么它会在那里实例化并在End With 发布。如果 object 已经在 With object 之前实例化,那么它会在任何 Set object = Nothing 或到达其范围的末尾时被释放
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多