Excel VBA中的缓冲区溢出

我已经完成了我的VBA模块,根据提供的医疗服务计算每月logging差异。 这工作很好。 然而,当我试着运行第三个月(即三月)的代码,并使用二月份的数据作为静态数据 – 我被警告,我的代码已经开始缓冲区溢出的事实。

我去了我的代码,但我不明白为什么会这样 – 唯一一贯的因素是,当我到第三个月(没有进一步testing),四分之一的时候我会得到一个防病毒警报closuresexcel表示溢出。 任何人都可以请帮助我确定为什么是这样的情况?

Sub monthlyCalculation() Dim ws As Worksheet 'Worksheet Variable required for IF statement Sheets("StaticRecord").Copy After:=Sheets("StaticRecord") Sheets("StaticRecord (2)").Visible = True 'Rename Summary (3) to Monthly Comparison Sheets("StaticRecord (2)").Name = "MonthlyComparison" 'Remember to do the subtraction calculations here Sheets("MonthlyComparison").Select 'Don't use ActiveCell but rather a direct reference to subtract Range("I6").Value = "=ABS(Summary!I6-'StaticRecord'!I6)" Range("I6").Select Selection.AutoFill Destination:=Range("I6:I28"), Type:=xlFillDefault 'Key Metrics Calculation for the created MonthlyComparison Tab Range("D6").Value = "= ABS(VALUE(LEFT(Summary!D6,2))-VALUE(LEFT('StaticRecord'!D6,2)))" Range("D7").Value = "=ABS((Summary!D7)-('StaticRecord'!D7))" Range("D8").Value = "=ABS((Summary!D8)-('StaticRecord'!D8))" Range("D9").Value = "= SUM('Template:Template - Book End'!H55)-2" Range("D10").Value = "= $D7/$D8" Range("D11").Value = "= 1 - D$10" Range("D12").Value = "= Summary!D12" Range("D13").Value = "= Summary!D13" Range("D14").Value = "= Summary!D14" Range("D15").Value = "= Summary!D15" '# Sessions Calculations Range("J6").Value = "=ABS('StaticRecord'!J6-Summary!J6)" Range("J6").Select Selection.AutoFill Destination:=Range("J6:J27"), Type:=xlFillDefault Range("J6:J27").Select 'Now that we have done the calculation we need to get rid of the initial Summary by replacing it with a blank template copy 'However we know that the summary tab CANNOT be cleared unless the user tabs are cleared so we must clear these tabs instead 'We will do this by looping through all user tabs and clearing the set fields' For Each ws In Worksheets If Len(ws.Name) <= 5 Then ws.Range("B7:C100").ClearContents End If Next 'Lastly we need to ensure that if a new comparison is to be completed, it will compare this against the static record which is last 'months statistics. This means that MonthlyComparison will need to be copied across and renamed as a static record with static values. Application.DisplayAlerts = False 'StaticRecord has now been deleted so we need to create a new StaticRecord Sheets("MonthlyComparison").Copy After:=Sheets("MonthlyComparison") Sheets("MonthlyComparison (2)").Visible = True Sheets("MonthlyComparison (2)").Name = "StaticRecord (2)" 'Once the monthlyComparison is deleted, the copy of staticRecord (2) will show all REF values 'This will need to be corrected by making the values static Sheets("MonthlyComparison").Select Range("I6:J28").Select Selection.Copy Sheets("StaticRecord (2)").Select Range("I6:J28").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Sheets("MonthlyComparison").Select Range("D6:D15").Select Selection.Copy Sheets("StaticRecord (2)").Select Range("D6:D15").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False For Each ws In Worksheets If ws.Name = "StaticRecord" Then ws.delete End If Next 'Rename the newly created StaticRecord (2) into StaticRecord Sheets("StaticRecord (2)").Name = "StaticRecord" 'Now that we have copied the data from MonthlyComparison we can eliminate this tab as it is no longer required For Each ws In Worksheets If ws.Name = "MonthlyComparison" Then ws.delete End If Next End Sub 

我修补了一下,我我已经发现了什么导致我的缓冲区溢出问题。 通过编写这个函数,我们有很多名单交换的工作,因为新创build的工作表采用旧的删除工作表的名称。 其中一个工作表(MonthlyComparisons)的计算依赖于来自另一个工作表(StaticRecord)的数据。 一旦StaticRecord被删除,然后重新命名,我可能会引入一个指针问题,我指向的内存已经被清除,这使得Excel的混淆,并导致它closures。 此外,我改变了哪些标签被删除的顺序。

  For Each ws In Worksheets If ws.Name = "MonthlyComparison" Then ws.delete End If Next For Each ws In Worksheets If ws.Name = "StaticRecord" Then ws.delete End If Next 

最初,我有StaticRecord标签首先删除然后每月比较。 不过,MonthlyRecord依赖于StaticRecord。 所以一旦我先删除了MonthlyRecord,然后再删除了StaticRecord,这个问题似乎(至less现在)自行解决了。

这是代码的其余部分,以防你可以发现任何其他问题,我已经写了:)

 Sub monthlyCalculation() Dim ws As Worksheet Sheets("StaticRecord").Copy After:=Sheets("StaticRecord") Sheets("StaticRecord (2)").Visible = True Sheets("StaticRecord (2)").Name = "MonthlyComparison" Sheets("MonthlyComparison").Select Range("I6").Value = "=ABS('StaticRecord'!I6-Summary!I6)" Range("I6").Select Selection.AutoFill Destination:=Range("I6:I28"), Type:=xlFillDefault 'Key Metrics Calculation Range("D6").Value = "= ABS(VALUE(LEFT('StaticRecord'!D6,2))-VALUE(LEFT(Summary!D6,2)))" Range("D7").Value = "=ABS(('StaticRecord'!D7)-(Summary!D7))" Range("D8").Value = "=ABS(('StaticRecord'!D8)-(Summary!D8))" Range("D9").Value = "= SUM('Template:Template - Book End'!H55)-2" Range("D10").Value = "= $D7/$D8" Range("D11").Value = "= 1 - D$10" Range("D12").Value = "= Summary!D12" Range("D13").Value = "= Summary!D13" Range("D14").Value = "= Summary!D14" Range("D15").Value = "= Summary!D15" '# Sessions Calculations Range("J6").Value = "=ABS('StaticRecord'!J6-Summary!J6)" Range("J6").Select Selection.AutoFill Destination:=Range("J6:J27"), Type:=xlFillDefault Range("J6:J27").Select 'For future calculations, comparisons between static record and the monthlyComparison tab will be made. This means that 'MonthlyComparison will need to be copied across and renamed as a static record with static values. Application.DisplayAlerts = False Sheets("MonthlyComparison").Copy After:=Sheets("MonthlyComparison") Sheets("MonthlyComparison (2)").Visible = True Sheets("MonthlyComparison (2)").Name = "StaticRecord (2)" 'Once the monthlyComparison is deleted, the copy of staticRecord (2) will show all REF values. It relies on another 'This will need to be corrected by making the values static so values from MonthlyComparison are copied to Static Record (2) Sheets("MonthlyComparison").Select Range("I6:J28").Select Selection.Copy Sheets("StaticRecord (2)").Select Range("I6:J28").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Sheets("MonthlyComparison").Select Range("D6:D15").Select Selection.Copy Sheets("StaticRecord (2)").Select Range("D6:D15").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'Now we delete the existence of MonthlyComparison as it relies on StaticRecord for calculations For Each ws In Worksheets If ws.Name = "MonthlyComparison" Then ''Or ws.Name = "StaticRecord"' ws.delete End If Next For Each ws In Worksheets If ws.Name = "StaticRecord" Then ws.delete End If Next End Sub 
Interesting Posts