我的 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
如果你想让你的代码更加健壮(并且更短),那么还有很多事情需要解决。
例如:
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
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
更干净:
Selection.Value = Selection.Value
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"),...