我在这段VBA代码中做错了什么?

问题描述 投票:0回答:1

我的 VBA 经验来自使用/分析记录器和谷歌搜索,所以这就是为什么你可能会在我的代码中看到一些荒谬的东西。这个宏工作了好几年,但我最近添加了这部分代码,现在 Excel 每次运行它时都会崩溃 - 崩溃意味着所有窗口强制关闭,我必须打开一个新的 Excel 实例,然后它会显示我恢复的文件。我注意到,崩溃后(当 Excel 打开一个新的、干净的实例时)它通常会正常运行,这让我认为有一些缓存或数据堵塞了东西,但有时它甚至会因新实例而崩溃。有什么意见或想法吗?谢谢你

========================================

Range(LColNumberEditLetter & "1").Select
ActiveCell.FormulaR1C1 = "Local BU"

Sheets("Start Here").Select

'FIND
    Dim ColStartHereInput As Long
    
    ColStartHereInput = Cells.Find(What:="Input", _
                        After:=Range("A1"), _
                        LookAt:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlNext, _
                        MatchCase:=False).Column
        
    'Convert Cell Number to Column Letters
    Dim ColStartHereInputLetter
        ColStartHereInputLetter = Split(Cells(1, ColStartHereInput).Address(True, False), "$")(0)
        
'FIND
    Dim ColStartHereVariable As Long
    
    ColStartHereVariable = Cells.Find(What:="Variable", _
                        After:=Range("A1"), _
                        LookAt:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlNext, _
                        MatchCase:=False).Column
        
    'Convert Cell Number to Column Letters
    Dim ColStartHereVariableLetter
        ColStartHereVariableLetter = Split(Cells(1, ColStartHereVariable).Address(True, False), "$")(0)

Sheets(Roster).Select

Range(LColNumberEditLetter & "2").Select
ActiveCell.FormulaR1C1 = _
    "=IFERROR(VLOOKUP(RC" & ColLocationDescrEdit & ",'Start Here'!C" & ColStartHereInput & ":C" & ColStartHereVariable & ",2,FALSE),""Manually Review - New Office"")"
Range(LColNumberEditLetter & "2").Select
Selection.AutoFill Destination:=Range(LColNumberEditLetter & "2:" & LColNumberEditLetter & LRowFWR)
Range(LColNumberEditLetter & "2:" & LColNumberEditLetter & LRowFWR).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
    
Application.CutCopyMode = False
    
'ADJUST BUs to MATCH

'FIND
    Dim ColBUSubAfterTheFact As Long
    
    ColBUSubAfterTheFact = Cells.Find(What:="BU Subregion", _
                        After:=Range("A1"), _
                        LookAt:=xlPart, _
                        LookIn:=xlFormulas, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlNext, _
                        MatchCase:=False).Column
        
    'Convert Cell Number to Column Letters
    Dim ColBUSubAfterTheFactLetter
        ColBUSubAfterTheFactLetter = Split(Cells(1, ColBUSubAfterTheFact).Address(True, False), "$")(0)
        
    'Convert Cell Number to Column Letters
    Dim ColBUSubAfterTheFactLetter2
        ColBUSubAfterTheFactLetter2 = Split(Cells(1, ColBUSubAfterTheFact + 1).Address(True, False), "$")(0)

Columns(ColBUSubAfterTheFactLetter2 & ":" & ColBUSubAfterTheFactLetter2).Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range(ColBUSubAfterTheFactLetter2 & "2").Select
ActiveCell.FormulaR1C1 = _
    "=IFERROR(VLOOKUP(RC[-1],'Start Here'!C" & ColStartHereInput & ":C" & ColStartHereVariable & ",2,FALSE),""Other"")"
Range(ColBUSubAfterTheFactLetter2 & "2").Select
Selection.AutoFill Destination:=Range(ColBUSubAfterTheFactLetter2 & "2:" & ColBUSubAfterTheFactLetter2 & LRowFWR)
Range(ColBUSubAfterTheFactLetter2 & "2:" & ColBUSubAfterTheFactLetter2 & LRowFWR).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Range(ColBUSubAfterTheFactLetter & "2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Columns(ColBUSubAfterTheFactLetter2 & ":" & ColBUSubAfterTheFactLetter2).Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlToLeft
Range(ColBUSubAfterTheFactLetter & "1").Select
    
Columns(LColNumberEditLetter & ":" & LColNumberEditLetter).Select
Columns(LColNumberEditLetter & ":" & LColNumberEditLetter).EntireColumn.AutoFit

Application.CutCopyMode = False
excel vba crash
1个回答
0
投票

如果你想让你的代码更加健壮(并且更短),那么还有很多事情需要解决。

例如:

  1. 跳过列号>>字母转换
Dim colNum As Long, colLetter As String

colNum = 2 'for example

'don't do this...
colLetter = Split(Cells(1, ColStartHereInput).Address(True, False), "$")(0)
Range(colLetter & "2").Select
ActiveCell.FormulaR1C1 = "..."

'when you can do this...
Cells(2, colNum).FormulaR1C1 = "..." 'no Select, no number-to-letter conversion
  1. 这种用值替换公式的方法:
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

更干净:

Selection.Value = Selection.Value
  1. 使用工作簿/工作表变量,并避免在没有工作表限定符的情况下隐式使用单元格/范围:
Dim wb As Workbook, wsStart As Worksheet

Set wb = Thisworkbook 'for example
Set wsStart = wb.Worksheets("Start Here")
ColStartHereInput = wsStart.Cells.Find(What:="Input", _
                        After:=wsStart.Range("A1"),...
© www.soinside.com 2019 - 2024. All rights reserved.