【发布时间】:2015-03-31 17:22:40
【问题描述】:
我在 Excel 中创建了一个宏,它基本上将来自 1 个工作表的所有数据外包出去,并将它们分开到它们所属的位置。但是,有时会出现需要手动更正的错误值(如果手动完成,则会在将数据重定向到单独的工作表的过程中立即发现)。
当找到这样的值时,它旁边的单元格被标记(以识别它是错误的),为用户弹出警告,但我也希望代码“暂停”,让用户手动更改值,然后在准备好后恢复,这是我不知道该怎么做的部分(暂停和恢复)。
操作的整个代码如下(还有另一个宏准备这些工作表,但现在并不重要)。
Private Sub Zaradi_Click()
Dim wb As Workbook
Dim ws As Worksheet
Dim rngPlan As Range
Dim pvtTable As PivotTable
Dim pvtField As PivotField
Dim pvtItem As PivotItem
Dim i As Integer
Dim vykon As Long
Dim praca As String
Dim meno As String
Dim er As String
Dim errArray(1 To 20) As String
Dim mbResult As Integer
Dim parySpolu As Integer
Set wb = Workbooks("Zoznam plánov")
er = "Nesedia páry!"
mbResult = MsgBox("Tieto zmeny sú nezvratné. Potvrdte, že túto operáciu si prajete vykona?", _
vbYesNoCancel)
Select Case mbResult
Case vbYes
Workbooks("Kontrola plánov").Sheets("Summary").Activate
meno = Workbooks("Kontrola plánov").Sheets("summary").Cells(2, 9)
' zoznam kontrolovanych planov
Set rngPlan = Workbooks("Kontrola plánov").Sheets("Summary").Range(Cells(2, 1), Cells(10000, 1).End(xlUp))
For i = 1 To rngPlan.Rows.Count ' pocet riadkov (size) kontrolovanych planov
' hodnota vykonu
vykon = Workbooks("Kontrola plánov").Sheets("summary").Cells(i + 1, 6)
' co robil prace
praca = Workbooks("Kontrola plánov").Sheets("summary").Cells(i + 1, 4)
' aktivuje pouzivany plan
Set ws = wb.Sheets("Plán " & rngPlan(i))
ws.Activate
' prida pracu
ws.Cells(10000, 1).End(xlUp).Offset(1) = praca
' prida vykon
ws.Cells(10000, 2).End(xlUp).Offset(1) = vykon
' prida meno
ws.Cells(10000, 3).End(xlUp).Offset(1) = meno
Set pvtTable = ws.PivotTables(1)
Set pvtField = pvtTable.PivotFields(1)
pvtTable.PivotCache.Refresh
For j = 1 To pvtField.PivotItems().Count
Set pvtItem = pvtField.PivotItems(j)
pvtItem.ShowDetail = False
ActiveSheet.PivotTables(1).NullString = "0"
If pvtItem.Value = "(blank)" Then
Else
parySpolu = pvtTable.GetPivotData("Páry", "Práca", pvtField.PivotItems(j))
If parySpolu > ws.Cells(2, 7) Then
ws.Cells(j + 1, 11) = er
pvtItem.ShowDetail = True
MsgBox er
Else
ws.Cells(j + 1, 11) = "OK"
End If
End If
Next j
Next i
' aktivuje sumarizaciu
Workbooks("Kontrola plánov").Sheets("summary").Activate
Case vbNo
Exit Sub
Case vbCancel
Exit Sub
End Select
Workbooks("Kontrola plánov").Sheets(1).Activate
MsgBox errNumbers
End Sub
发现错误值并给出警告的代码部分在这里:
If parySpolu > ws.Cells(2, 7) Then
ws.Cells(j + 1, 11) = er
pvtItem.ShowDetail = True
MsgBox er
Else
ws.Cells(j + 1, 11) = "OK"
End If
我已经对如何做到这一点提出了建议。一个是使用 InputBox,但我认为这对于这种情况并不理想(因为用户更愿意正确检查所有内容、源表、找到问题的根源等),所以我认为暂停和恢复会更好。另一个建议是这样做:
公共 lastCellChecked 作为字符串
Sub Check_Someting()
Dim cell As Excel.Range
Dim WS As Excel.Worksheet
If Not lastCellChecked = vbNullString Then Set cell = Evaluate(lastCellChecked)
'// Rest of code...
'// Some loop here I'm assuming...
lastCellChecked = "'" & WS.Name & "'!" & cell.Address
If cell.Value > 10 Then Exit Sub '// Lets assume this is classed as an error
'// Rest of loop here...
lastCellChecked = vbNullString
End Sub
错误前最后一个单元格的地址被存储在哪里,宏在下一次运行时从那里继续(如果没有存储,它从头开始运行)。我认为这个解决方案更适合我的问题。然而,最后,我是一个非常缺乏经验的“程序员”,所以想知道什么是最有效/最好的方法(以及对我已经实现的代码的任何其他改进将不胜感激)。
【问题讨论】: