Leandro,
O controle de última linha preenchida é feito com esta linha de comandos:
UltimaCel = Range("B4000").End(xlUp).Row + 1
Entendi que você pretende ler sempre a última linha preenchida e somar um, para utilizar a próxima num novo preenchimento.
Acontece que a coluna B, que você escolheu para essa avaliação, está vindo sempre vazia.
Ocorreu ali o que costuma nos tirar horas de trabalho (talvez de sono também) em função de não ter sido observada uma das boas regras de programação no VBA: a colocação da declaração OPTION EXPLICIT no topo do código do módulo (antes da primeira rotina).
Option Explicit instrui ao VBE para não permitir execução de código onde há variável utilizada sem ter sido explicitamente definida. (DIM, PUBLIC, etc)
Coloque-a e o VBE te dirá onde errou, tão logo tente executar o código, ou ao fazer a Depuração.
Spoiler: há uma variável grafada incorretamente. Com o uso do Option Explicit, você teria sido alertado no ato da primeira tentativa de execução do código (ou da depuração).
Obs.: Não avaliei outros aspectos. Porém, sugiro que utilize With/End With para dar maior robustez ao código. Em vez de apenas comandar um SELECT, que em determinadas circunstâncias pode falhar, prefira isto: (Note os pontos antes dos comandos de planilha, que destaquei com tamanho de fonte maior. Ahh... e a variável já corretamente grafada :-))
With Sheets("PREÇO_VENDA")
.Select
UltimaCel = .Range("B4000").End(xlUp).Row + 1
.Range("B" & UltimaCel).Value = FORNECEDOR_CÓDIGO
'....restante do código aqui....
End With
ALeXceL
Excel 365
Oliveira/MG