【问题标题】:VBA: Subs do nothing unless file was manually openedVBA:除非手动打开文件,否则 Subs 什么都不做
【发布时间】:2015-11-17 20:10:47
【问题描述】:

我有以下宏:

Sub Remove_Junk_Data()

Call Open_Workbook
Call Scrub_Master
Call Scrub_Change_History
Call Scrub_Update
Call Scrub_ExistingOwnership
Call Save_Scrubbed

End Sub

Sub Open_Workbook()

Workbooks.Open "https://company.sharepoint.com/sites/project/subproject/subsubproject/subsubprojecttool/tooloutput/tooloutput.xlsx"

Workbooks("tooloutput.xlsx").Activate

End Sub

Sub Scrub_Master()

Dim myValue As String
Dim LastRow As Long
Dim i As Long
Dim r As Range

LastRow = Cells(Rows.Count, "A").End(xlUp).Row
myValue = ""

Sheets("Master").Select

For i = LastRow To 1 Step -1
Set r = Cells(i, 1)
If r.Value = myValue Then r.EntireRow.Delete
Next i

End Sub

Sub Scrub_Change_History()

Dim myValue As String
Dim LastRow As Long
Dim i As Long
Dim r As Range

LastRow = Cells(Rows.Count, "A").End(xlUp).Row
myValue = ""

Sheets("Change History").Select

For i = LastRow To 1 Step -1
Set r = Cells(i, 1)
If r.Value = myValue Then r.EntireRow.Delete
Next i

End Sub

Sub Scrub_Update()

Dim myValue As String
Dim LastRow As Long
Dim i As Long
Dim r As Range

LastRow = Cells(Rows.Count, "A").End(xlUp).Row
myValue = ""

Sheets("Update").Select

For i = LastRow To 1 Step -1
Set r = Cells(i, 1)
If r.Value = myValue Then r.EntireRow.Delete
Next i

End Sub

Sub Scrub_ExistingOwnership()

Dim myValue As String
Dim LastRow As Long
Dim i As Long
Dim r As Range

LastRow = Cells(Rows.Count, "A").End(xlUp).Row
myValue = ""

Sheets("ExistingOwnership").Select

For i = LastRow To 1 Step -1
Set r = Cells(i, 1)
If r.Value = myValue Then r.EntireRow.Delete
Next i

End Sub

Sub Save_Scrubbed()

Application.DisplayAlerts = False
    ActiveWorkbook.SaveAs Filename:= _
    "https://company.sharepoint.com/sites/project/subproject/subsubproject/subsubprojecttool/tooloutput/tooloutput.xlsx", _
    FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    Application.DisplayAlerts = False

Workbooks("Master_FM_Update.xlsx").Close

End Sub

如果我注释掉“Open_Workbook”子并手动打开工作簿,然后运行 ​​Remove_Junk_Data() 的其余部分,它可以完美运行。

如果我尝试在 Open_Workbook 处于活动状态的情况下运行 Remove_Junk_Data,则不会引发任何错误,但中间的 4 个潜艇不会做任何事情...

有没有人遇到过这样的事情?你找到解决方案了吗?我想点击一个按钮,让所有 6 个潜艇都正确地做他们的事情......

编辑:有了输入,新的宏,它就可以工作了!谢谢大家!:

Sub Remove_Junk_Data()

Workbooks.Open "https://company.sharepoint.com/sites/project/subproject/subsubproject/Subsubprojecttool/tooloutput/tooloutput.xlsx"

Dim myValue As String
Dim LastRow As Long
Dim i As Long
Dim r As Range



With Workbooks("tooloutput.xlsx").Sheets("Master")
    LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
    myValue = ""    
    For i = LastRow To 1 Step -1
    Set r = .Cells(i, 1)
    If r.Value = myValue Then r.EntireRow.Delete
    Next i
End With

With Workbooks("tooloutput.xlsx").Sheets("Change History")
    LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
    myValue = ""    
    For i = LastRow To 1 Step -1
    Set r = .Cells(i, 1)
    If r.Value = myValue Then r.EntireRow.Delete
    Next i
End With

With Workbooks("tooloutput.xlsx").Sheets("Update")
    LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
    myValue = ""    
    For i = LastRow To 1 Step -1
    Set r = .Cells(i, 1)
    If r.Value = myValue Then r.EntireRow.Delete
    Next i
End With

With Workbooks("tooloutput.xlsx").Sheets("ExistingOwnership")
    LastRow = .Cells(Rows.Count, "A").End(xlUp).Row
    myValue = ""    
    For i = LastRow To 1 Step -1
    Set r = .Cells(i, 1)
    If r.Value = myValue Then r.EntireRow.Delete
    Next i
End With

End Sub

【问题讨论】:

  • 您将需要限定宏应针对每个子操作的确切工作簿和工作表。它现在的工作方式是代码将针对运行代码的工作簿运行。 (除了workbook_open sub ...例如,LastRow 将始终在运行宏时找到工作表中的最后一行。如果该工作表没有数据,则您的行将为 1 并且那些永远不会发生循环。
  • "中间的 4 个子程序什么都不做" - 你有没有逐行运行代码来查看代码在做什么 [在 VBA 模块中,一次按 f8 一行] ?它在哪一行不再按预期/预期运行?
  • @Scott Holtzman 所以我会在每个子的开头而不是在第一个子的末尾使用“Workbooks("tooloutput.xlsx").Activate”来限定工作簿?
  • 或者看看one question down^_^;
  • 你也有所有做同样事情的潜艇。为什么不创建 1 个 sub 并将工作簿和工作表名称作为参数传递给您要在调用所有这些 sub 的主 sub 中 scrub 的每个工作表?

标签: excel vba


【解决方案1】:

我已经对你的代码做了一些改动,程序中的 cmets 意图解释这些改动。我的建议是,除了您从 Stackoverflow 等网站获得的信息外,您还应该阅读相应的文档,以更深入地了解所使用的概念和资源。不过,在您继续发展您的编程技能时,请不要犹豫,提出问题。

下面的代码将您尝试在一个过程中执行的所有操作合并在一起,您将在其中看到如何为一系列值(即本例中的工作表)运行重复代码

建议访问以下页面:

Variables & ConstantsApplication Object (Excel)Excel Objects

With Statement, For...Next Statement, For Each...Next Statement, If...Then...Else Statement

Worksheets Object (Excel)Worksheet Object (Excel)Range Object (Excel)

Sub Remove_Junk_Data()
Rem Use an Array Variable to List all the worksheets you want to work with
Dim aWsh As Variant, vItm As Variant
aWsh = Array("Master", "Change History", "Update", "ExistingOwnership")

Rem Declare Object Variables
Dim Wbk As Workbook
Dim Wsh As Worksheet

Dim lRowLst As Long
Dim lRow As Long

    Rem Open Workbook & Set Workbook Object Variable
    Set Wbk = Workbooks.Open("https://company.sharepoint.com/sites/project/subproject/subsubproject/subsubprojecttool/tooloutput/tooloutput.xlsx")

    Rem Loop throught the worksheet list and process each one
    For Each vItm In aWsh

        Rem Set Worksheet Object Variable
        Set Wsh = Wbk.Worksheets(vItm)

        With Wsh
            lRowLst = Cells(Rows.Count, "A").End(xlUp).Row
            For lRow = lRowLst To 1 Step -1
                With .Cells(lRow, 1)
                    If .Value2 = Empty And Not (.HasFormula) Then .EntireRow.Delete

    End With: Next: End With: Next

    Application.DisplayAlerts = False
    Wbk.Save
    Application.DisplayAlerts = True

    Workbooks("Master_FM_Update.xlsx").Close

End Sub

【讨论】:

  • 数组很好用。
猜你喜欢
  • 2017-12-19
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2015-12-12
  • 2016-04-13
  • 2023-03-05
相关资源
最近更新 更多