选择工作表时Excel VBA宏崩溃-于1周前工作

时间:2018-08-20 13:33:21

标签: excel vba excel-vba

我在这里和其他地方都花了很多时间进行搜索,但没有找到答案。我有一个在Excel O365中创建和使用的电子表格,用于管理待完成的测试积压工作,并且还包括一个用于处理预测的选项卡。

在两个单独的宏中,选择工作表的过程导致Excel崩溃。

它的行为就好像工作表已在文件中重命名,但未在vba中更新(我以前犯过的错误,并且很难理解),但没有重命名,据我所知已经改变了几个月。但是,大约一周前开始出现这种情况,我无法解决。

失败的示例代码:

Sub Send_Range_Or_Whole_Worksheet_with_MailEnvelope()
Dim AWorksheet As Worksheet
Dim Sendrng As Range
Dim rng As Range

'On Error GoTo StopMacro

With Application
    .ScreenUpdating = False
    .EnableEvents = False
End With

'Fill in the Worksheet/range you want to mail
'Note: if you use one cell it will send the whole worksheet
Set Sendrng = ThisWorkbook.Sheets("Weekly Forecast").Range("A10:A78")

'Remember the activesheet
Set AWorksheet = ActiveSheet

With Sendrng
    ' Select the worksheet with the range you want to send
    .Parent.Select
    'Remember the ActiveCell on that worksheet
    Set rng = ActiveCell
    'Select the range you want to mail
    .Select
    ' Create the mail and send it
    ActiveWorkbook.EnvelopeVisible = True
    With .Parent.MailEnvelope
        ' Set the optional introduction field thats adds
        ' some header text to the email body.
        .Introduction = "See below for the weekly forecast. Thank you!"

         With .Item
            .To = "(redacted email address)"
            .Subject = "Weekly Forecast"
            .Send
        End With

    End With

    'select the original ActiveCell
    rng.Select
End With

'Activate the sheet that was active before you run the macro
AWorksheet.Select

StopMacro:
With Application
    .ScreenUpdating = True
    .EnableEvents = True
End With
ActiveWorkbook.EnvelopeVisible = False

End Sub

“ Set Sendrng =”语句是单步执行此宏时Excel崩溃的位置。

示例2是一个穷人的一些数据日志,这些数据只是从一个工作表中复制并粘贴到另一个工作表中以进行“快照”:

Sub RefreshAllData()

' Updated 28Nov2017: Added "add to backlog log" ability
' RefreshAllData Macro
' Turn off screen updating

Application.ScreenUpdating = False

' Refresh all data / queries
ActiveWorkbook.RefreshAll

'Calculate should update all pivot tables
Calculate

' Append latest backlog to the backlog log
Sheets("2.7").Select
Range("A60:D73").Select
Selection.Copy
Sheets("Backlog Log").Select
Range("A" & Rows.Count).End(xlUp).Offset(1).Select
Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
    xlNone, SkipBlanks:=False, Transpose:=False
Sheets("2.7").Select
Range("A1").Select

' Resume screen updating
Application.ScreenUpdating = True
End Sub

Sheets(“ 2.7”)。Select语句是Excel崩溃的地方。

我尝试过的事情:

  1. 您可以看到我有一个实例,该实例的工作表选择是直接的,一个实例是一个命名范围,两者都失败了。
  2. 我试图重命名工作表并更新代码以反映新名称,但是这些也失败了。
  3. 我已重置宏安全性,以强制其重新询问/重新启用宏,但这没有影响。

在这个看似微不足道的问题上,我精疲力尽,但是这些节省了足够的手动时间,我真的很想弄清楚它们。任何帮助或指示,将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以在第一个子菜单中尝试此操作。将MailMe范围修改为您的预测范围。

Option Explicit

Sub ForeCast()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Weekly Forecast")

'Modify the below range to send
Dim MailMe As Range: Set MailMe = ws.Range("A10:A78")

Application.ScreenUpdating = False

With MailMe
    ThisWorkbook.EnvelopeVisible = True
    With MailEnvelope
        .Introduction = "See below for the weekly forecast. Thank you!"
             With .Item
                .To = "(redacted email address)"
                .Subject = "Weekly Forecast"
                .Send
            End With
    End With
End With

ThisWorkbook.EnvelopeVisible = False
Application.ScreenUpdating = True

End Sub

如果代码存储在容纳您工作表的书中,则下面的方法应该有效。请注意,您不需要.Select.Selection来移动/添加/更改/删除单元格/范围/工作表/书籍。

Sub RefreshAllData()

Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("2.7")
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Sheets("Backlog Log")

Application.ScreenUpdating = False
    ThisWorkbook.RefreshAll
    ws1.Range("A60:D73").Copy
    ws2.Range("A" & ws2.Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValuesAndNumberFormats
Application.ScreenUpdating = True

End Sub