Vbajr10, boa noite!
Agradeço por ter apontado a falha. Ela está na linha:
NGrupos = Int((NumReg / NumRegPorGrupo) + 0.5)
onde minha intenção era forçar o arredondamento da quantidade de grupos pro valor imediatamente acima justamente prá prevenir essa situação de registros não múltiplos de 5.000 (ou outro valor qualquer). Obviamente não funcionou, pois não me dei conta que a função int() não faz esse arredontamento, mesmo somando 0.5 ao final.
A linha pode então ser substituída por:
NGrupos = (NumReg NumRegPorGrupo) - ((NumReg Mod NumRegPorGrupo) > 0)
Por esse motivo é sempre bom uma outra visão do mesmo problema, outras formas de resolvê-lo, pois a gente sempre sai ganhando. Por isso é que quando se trata de revisão/correção deve-se dar preferência a que outra pessoa o faça. Dou maior valor.
Prá me redimir, aqui o código corrigido:
Sub DivideEmArquivos()
Const NumRegPorGrupo As Integer = 5000 'Divisão de 5000 em 5000 registros
Dim wbBase As Workbook, wsBase As Worksheet, rgBase As Range, NomeWbBase As String
Dim rgCabeçalho As Range
Dim wbFilho As Workbook, wsFilho As Worksheet, rgFilho As Range, NomeWbFilho As String
Dim NumReg As Long, NGrupos As Integer, i As Integer
Set wbBase = ThisWorkbook
NomeWbBase = Left(wbBase.Name, InStrRev(wbBase.Name, ".") - 1)
Set wsBase = wbBase.Worksheets("Base")
Set rgBase = wsBase.Range("A1").CurrentRegion
Set rgCabeçalho = rgBase.Rows(1)
Set rgBase = rgBase.Offset(1, 0).Resize(RowSize:=rgBase.Rows.Count - 1)
NumReg = rgBase.Rows.Count
NGrupos = (NumReg NumRegPorGrupo) - ((NumReg Mod NumRegPorGrupo) > 0)
Application.ScreenUpdating = False
For i = 0 To NGrupos - 1
Set rgFilho = Union(rgCabeçalho, rgBase.Offset(i * NumRegPorGrupo, 0).Resize(RowSize:=NumRegPorGrupo))
Set wbFilho = Workbooks.Add
Set wsFilho = wbFilho.Worksheets(1)
rgFilho.Copy Destination:=wsFilho.Range("A1")
NomeWbFilho = wbBase.Path & "" & NomeWbBase & Format(i + 1, "00") & ".xlsx"
wbFilho.SaveAs Filename:=NomeWbFilho, FileFormat:=xlOpenXMLWorkbook
wbFilho.Close
Set wbFilho = Nothing
Next i
Application.ScreenUpdating = True
Set wbBase = Nothing: Set wsBase = Nothing: Set rgBase = Nothing
Set rgCabeçalho = Nothing: Set wsFilho = Nothing: Set rgFilho = Nothing
End Sub
Obrigado novamente!
Postado : 18/07/2016 10:59 pm