#excel #vba
#excel #vba
Вопрос:
Когда я запускаю код, обновляется только один лист, например, Apple. Остальные 3 листа не обновляются. Код пытается изменить нулевые значения на пробелы в рабочих листах. Код выполняется через весь макрос, но листы Orange, Grape и Pear не обновляются. Как я могу это решить?
Sub ReturnZerosAsBlanks()
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
'Declare variables and objects'
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
'Objects'
Dim wbk As Workbook
Dim wsApple As Worksheet
Dim wsOrange As Worksheet
Dim wsGrape As Worksheet
Dim wsPear As Worksheet
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
'Define variables and objects'
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
'set workbooks and worksheets'
Set wbk = ThisWorkbook
Set wsApple = wbk.Sheets("Apple")
Set wsOrange = wbk.Sheets("Orange")
Set wsGrape = wbk.Sheets("Grape")
Set wsPear = wbk.Sheets("Pear")
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
'Application settings'
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
'Remove zeros from blank linked cells
'Column AA:AB in tab Apple
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
Dim Rng1 As Range
Dim WorkRng1 As Range
On Error Resume Next
Set WorkRng1 = wsApple(Range("AA2"), Range("AB2").End(xlDown))
For Each Rng1 In WorkRng1
If Rng1.Value = 0 Then
Rng1.Value = ""
End If
Next Rng1
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
'Remove zeros from blank linked cells
'Column A:D in tab Orange
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
Dim Rng2 As Range
Dim WorkRng2 As Range
On Error Resume Next
Set WorkRng2 = wsOrange.Range(Range("A2"), Range("D2").End(xlDown))
For Each Rng2 In WorkRng2
If Rng2.Value = 0 Then
Rng2.Value = ""
End If
Next Rng2
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
'Remove zeros from blank linked cells
'Column AD in tab Grape
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
Dim Rng3 As Range
Dim WorkRng3 As Range
On Error Resume Next
Set WorkRng3 = wsGrape(Range("AD2"), Range("AD2").End(xlDown))
For Each Rng3 In WorkRng3
If Rng3.Value = 0 Then
Rng3.Value = ""
End If
Next Rng3
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
'Remove zeros from blank linked cells
'Column G in tab Pear
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
Dim Rng4 As Range
Dim WorkRng4 As Range
On Error Resume Next
Set WorkRng4 = wsPear.Range(Range("G2"), Range("G2").End(xlDown))
For Each Rng4 In WorkRng
If Rng4.Value = 0 Then
Rng4.Value = ""
End If
Next Rng4
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
'Application settings'
'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'*'
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Комментарии:
1. Удалите
On Error Resume Next
, и вы получите сообщение об ошибке в проблемных строках.2. Для этой строки требуется 4:
For Each Rng4 In WorkRng
3. Знаете ли вы, что в Excel есть настройка для отображения нулевой или пустой ячейки? Он работает для каждого листа. При моей установке: Файл -> Параметры -> Дополнительно -> Параметры отображения для этого листа -> Показать ноль в ячейках, которые имеют нулевое значение
4. Похоже, чтобы сделать это из кода, вам действительно нужно выбрать лист, а затем вызвать
ActiveWindow.DisplayZeros = False
Ответ №1:
Заменить на нескольких рабочих листах
Option Explicit
Sub ReturnZerosAsBlanks()
' Constants
Dim SheetNames As Variant
SheetNames = VBA.Array("Apple", "Orange", "Grape", "Pear")
Dim Cols As Variant
Cols = VBA.Array("AA:AB", "A:D", "AD", "G")
Dim wb As Workbook
Set wb = ThisWorkbook 'The workbook containing this code.
' Toggle application settings
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
' Remove zeros from blank linked cells.
Dim ws As Worksheet, rng As Range, cel As Range, LastRow As Long, j As Long
' Loop through worksheets with names supplied in Sheet Names Array.
For j = 0 To UBound(SheetNames)
' Define Current Worksheet.
Set ws = wb.Worksheets(SheetNames(j))
' Using always the first column, calculate Last Row.
LastRow = ws.Cells(ws.Rows.Count, ws.Columns(Cols(j)).Column) _
.End(xlUp).Row
If LastRow < 2 Then GoTo NextSheet
' Define Criteria Range.
Set rng = ws.Columns(Cols(j)).Rows(2).Resize(LastRow - 1) ' 1 = 2 - 1
' This is faster, but doesn't work for formulas, although you should
' not do this when there are formulas in cells.
rng.Replace What:=0, _
Replacement:=Empty, _
LookAt:=xlWhole
' This will work for formulas, too.
' For Each cel In rng.Cells
' If cel.Value = 0 Then
' cel.Value = Empty
' End If
' Next cel
NextSheet:
Next j
' Toggle application settings.
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
' Inform user.
MsgBox "Done."
End Sub
Комментарии:
1. Спасибо, VBasic2008, это решило проблему!