MPrudencio:
Ao adicionar a linha que você citou o seguinte erro aparece:
"O objeto não aceita esta propriedade ou método"
alexandrevba:
Tudo bem, segue abaixo o código completo, já que o while é quase tudo mesmo, resolvi postar tudo de uma vez. Só espero que não fique muito confuso.
Public Sub Manut()
Dim wbp, wbc As Workbook
Set wbp = Workbooks("plano de manutençao1.xlsm")
Dim wsc, wsm, wsh As Worksheet
Set wsc = Worksheets("Clientes")
Set wsm = Worksheets("Próximas Manutenções")
Dim i, UM, hr, c, m, z, b, menor As Single
Dim dt As Date
Dim tm(), r(), dia(), obs As String
Dim intCount As Integer
i = 3
Application.EnableEvents = False
Application.ScreenUpdating = False
wbp.wsm.Range("A3:B4").ClearContents ' -> Erro "O objeto não aceita esta propriedade ou método" (erro some se usar: Workbooks("plano de manutençao1.xlsm"). Worksheets("Próximas Manutenções")..Range("A3:B4").ClearContents
While wbp.wsc.Cells(i, 1).Value <> "" ' -> Erro "O objeto não aceita esta propriedade ou método" (erro também some se fizer como acima)
Workbooks.Open ("C:UsersUsuarioDesktopBrunomelhoriasclientes" & wbp.wsc.Cells(i, 1).Value) '-> mesmo erro
Set wbc = Workbooks(wbp.ws.Cells(i, 1).Value) '-> mesmo erro
Set wsh = Worksheets("Histórico de Manutenções")
hr = wbp.wsc.Cells(i, 5).Value + (DateDiff("d", wsc.Cells(i, 7), Date) * wsc.Cells(i, 8)) '-> ainda não testei, mas deve dar o mesmo erro
obs = "Existem menos de 2 dias de diferença entre as manutenções de "
'saber se existe dados no histórico
If wbc.wsh.Cells(3, 1).Value = "" Then
c = 1
Else
c = 2
End If
'Separar os tipos de manutenção
tm = split(wbp.wsc.Cells(i, 5), ",")
For intCount = LBound(tm) To UBound(tm)
Debug.Print Trim(tm(intCount))
Next
'Sem dados no histórico
If c = 1 Then
m = (wbp.wsc.Cells(i, 6).Value + CInt(tm(0)) - hr) wbp.wsc.Cells(i, 8)
wbp.wsm.Cells(i, 1).Value = wbp.wsc.Cells(i, 1).Value
wbp.wsm.Cells(i, 2).Value = DateAdd("d", Date, m)
wbp.wsm.Cells(i, 3).Value = CInt(tm(0))
Else
For z = 0 To intCount ' pega a ultima linha de cada tipo de manutenção
b = 3
While wbc.wsh.Cells(b, 1) <> ""
If wbc.wsh.Cells(b, 1).Value = CInt(tm(z)) Then
r(z) = b
b = b + 1
Else
b = b + 1
End If
Wend
Next
For z = 0 To intCount 'calcula quantos dias para prox manutenção para cada tipo
dia(z) = (wbc.wsh.Cells(r(z), 2) + CInt(tm(z)) - hr) wbp.wsc.Cells(i, 8)
Next
For z = 1 To intCount 'compara o dia de manutenções para casos menores que 2
If Abs(dia(z - 1) - dia(z)) <= 2 Then
obs = obs + tm(z - 1) + "e" + tm(z)
End If
Next
If obs <> "" Then
If DateAdd("d", Date, dia(0)) > DateAdd("d", Date, dia(1)) Then
wbp.wsm.Cells(i, 1).Value = wbp.wsc.Cells(i, 1).Value
wbp.wsm.Cells(i, 2).Value = DateAdd("d", Date, dia(1))
wbp.wsm.Cells(i, 3).Value = CInt(tm(0)) + " + " + CInt(tm(1))
wbp.wsm.Cells(i, 4).Value = obs
Else
wbp.wsm.Cells(i, 1).Value = wbp.wsc.Cells(i, 1).Value
wbp.wsm.Cells(i, 2).Value = DateAdd("d", Date, dia(0))
wbp.wsm.Cells(i, 3).Value = CInt(tm(0)) + " + " + CInt(tm(1))
wbp.wsm.Cells(i, 4).Value = obs
End If
Else
If DateAdd("d", Date, dia(0)) > DateAdd("d", Date, dia(1)) Then
wbp.wsm.Cells(i, 1).Value = wbp.wsc.Cells(i, 1).Value
wbp.wsm.Cells(i, 2).Value = DateAdd("d", Date, dia(1))
wbp.wsm.Cells(i, 3).Value = CInt(tm(1))
Else
wbp.wsm.Cells(i, 1).Value = wbp.wsc.Cells(i, 1).Value
wbp.wsm.Cells(i, 2).Value = DateAdd("d", Date, dia(0))
wbp.wsm.Cells(i, 3).Value = CInt(tm(0))
End If
End If
End If
wbc.Close
i = i + 1
Wend
wsm.Columns("A:D").AutoFit
' Reordenar
ActiveWorkbook.Worksheets("Próximas Manutenções").ListObjects("Tabela2").Sort. _
SortFields.Clear
ActiveWorkbook.Worksheets("Próximas Manutenções").ListObjects("Tabela2").Sort. _
SortFields.Add Key:=Range("Tabela2[[#All],[Data]]"), SortOn:=xlSortOnValues _
, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Próximas Manutenções").ListObjects("Tabela2"). _
Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Application.EnableEvents = True
Application.ScreenUpdating = True
MsgBox ("Planilha atualizada")
End Sub
Postado : 28/11/2016 5:39 am