Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制工作表原因的简单VBA代码;“Microsoft Excel已停止工作”;_Excel_Vba - Fatal编程技术网

复制工作表原因的简单VBA代码;“Microsoft Excel已停止工作”;

复制工作表原因的简单VBA代码;“Microsoft Excel已停止工作”;,excel,vba,Excel,Vba,我检查了前45个关于“Excel已停止工作”的其他问题。没有一个答案对我有帮助。显然,很多不同的事情都会导致这个问题 我有一本59页的工作簿,但我只需要一打。我编写了一个简单的宏,检查每个工作表的名称,如果名称包含“H2O”或“NG”,则工作表将复制到我以前创建的另一个工作簿中,并在宏运行时打开。第一次尝试复制工作表时,Excel将关闭并重新启动,同时显示“Microsoft Excel已停止工作”消息 工作簿有很多工作表,但在任何工作表上都没有窗体或Active-X控件或公式,没有窗体,只有下

我检查了前45个关于“Excel已停止工作”的其他问题。没有一个答案对我有帮助。显然,很多不同的事情都会导致这个问题

我有一本59页的工作簿,但我只需要一打。我编写了一个简单的宏,检查每个工作表的名称,如果名称包含“H2O”或“NG”,则工作表将复制到我以前创建的另一个工作簿中,并在宏运行时打开。第一次尝试复制工作表时,Excel将关闭并重新启动,同时显示“Microsoft Excel已停止工作”消息

工作簿有很多工作表,但在任何工作表上都没有窗体或Active-X控件或公式,没有窗体,只有下面显示的一个宏。我可以手动复制工作表,或者更改宏以隐藏我不想要的工作表,但是我遇到了同样的错误,一个更复杂的宏将不同文件夹中39个工作簿中的每一个工作表复制到一个包含39个工作表的工作簿,所以我很想知道是什么导致了这种情况。 我正在运行Windows 10 1709版的Microsoft Office 365 ProPlus。宏总是首先遇到“NG”表,因此导致问题的代码行总是在“Case is=“NG”之后:

'工作表(SheetName).Copy After:=工作手册(“气体历史记录Henry Mayo.xlsx”).工作表(GasseetCount)'


请尝试下面的较短版本,不要使用任何
激活

修改代码


虽然错误发生在使用VBA时,但我怀疑这不是因为代码本身有任何问题。我一直在搜索,最后发现了一个建议禁用Excel加载项。我禁用了其中的两个(名称管理器实用程序和查找链接),现在我的原始代码和Shari Rado work提供的改进版本都已禁用

我在StackOverflow发现了6个关于“Excel已停止工作”的讨论,所有讨论都有不同的情况(但主要涉及打开或关闭工作簿),并阅读了45个答案。没有人建议禁用外接程序。所以,如果你是像Shai一样试图帮助在这里发布问题的人的人之一,你应该将这种方法添加到你的技巧包中。我在这里找到了对我有用的答案:


Shai,感谢您抽出时间思考我的问题并编写一些替代代码。不幸的是,我得到了同样的结果。我不认为我们的代码是“错误的”。我认为这是因为Excel是一个复杂的程序,在更大、更复杂的Win10中运行着数百万行代码。你不需要浪费时间的激活stmt。我从宏录制器开始&当你手动录制时,你必须回到源工作簿。我喜欢你使用like来缩短找到正确纸张的过程,因此我得到了一个有用的提示,尽管这个问题仍然没有解决。谢谢谢谢你帮我明白我没有把问题说清楚。我不是问“Excel停止工作”是什么意思。我在问,为什么这个看起来应该有效的简单代码会导致这样的结果。我原以为一个简单的声明就足够了,一些代码会导致Excel阻塞,但我应该说一下为什么这段代码会这样做。我对简洁的追求让我失去了清晰。不过,如果我读的是像我一样的帖子,我不会认为海报不理解这些信息的含义。当我在另一个网站上重新发布时,我将利用这一经验更好地表达我的问题。谢谢不是吹毛求疵,但在这个网站上,关于“Excel停止工作”有6个以上的问题。还有很多。事实上,这个网站上几乎没有一个Excel问题是因为“Excel工作正常”……我的观点是,你之所以只找到你所做的事情,是因为你的术语和问题描述需要更加具体和准确。“停止工作”在解决问题时,这并不意味着任何有用的东西,而且可能会提供更多的信息。(至少是一张截图。)温习一下谷歌和其他网站的高级搜索技巧可能是个好主意。(我的意思不是侮辱性的;在我看来,“有效的谷歌搜索技能”应该是任何程序员的必修课。)准确的措辞和多种变体也应该尝试。将
site:stackoverflow.com
添加到搜索词中,以仅查看上的80。
Sub CreateWaterAndGasWorkbooks()
    Dim i As Integer
    Dim SheetName As String
    Dim SheetType As String
    Dim WaterSheetCount As Integer
    Dim GasSheetCount As Integer
    WaterSheetCount = 1
    GasSheetCount = 1

    With Range("A1")
    For i = 1 To Sheets.Count
       SheetName = Sheets(i).Name
       SheetType = ""
       If InStr(1, SheetName, "H2O") > 0 Then SheetType = "Water"
       If InStr(1, SheetName, "NG") > 0 Then SheetType = "NG"
       .Cells(i, 1).Value = SheetName 'Just for debug, so I know where
       .Cells(i, 2).Value = SheetType 'I was if it bombs.
       Select Case SheetType
       Case Is = "Water"
          Sheets(SheetName).Copy After:=Workbooks("Water History Henry Mayo.xlsx").Sheets(WaterSheetCount)
          WaterSheetCount = WaterSheetCount + 1
          Windows("Utility Cost Spreadsheets.xlsx").Activate
       Case Is = "NG"
          Sheets(SheetName).Copy After:=Workbooks("Gas History Henry Mayo.xlsx").Sheets(GasSheetCount)
          WaterSheetCount = GasSheetCount + 1
          Windows("Utility Cost Spreadsheets.xlsx").Activate
       Case Else
       'do nothing
       End Select
    Next i
    End With
End Sub
Option Explicit

Sub CreateWaterAndGasWorkbooks()

Dim WaterSheetCount As Long
Dim GasSheetCount As Long

Dim WaterWb As Workbook
Dim GasWb As Workbook
Dim Sht As Worksheet

' set the Water workbook object
Set WaterWb = Workbooks("Water History Henry Mayo.xlsx")

' set the Gas workbook object
Set GasWb = Workbooks("Gas History Henry Mayo.xlsx")

WaterSheetCount = 1
GasSheetCount = 1

' loop through all sheets
For Each Sht In ThisWorkbook.Sheets

    Select Case True ' "cheat" a little
        Case Sht.Name Like "*H2O*"
            Sht.Copy After:=WaterWb.Sheets(WaterSheetCount)
            WaterSheetCount = WaterSheetCount + 1

        Case Sht.Name Like "*NG*"
            Sht.Copy After:=GasWb.Sheets(GasSheetCount)
            WaterSheetCount = GasSheetCount + 1

        Case Else
            'do nothing

    End Select
Next Sht

End Sub