Notifications
Clear all

Inserir na célula o dia da semana.

7 Posts
3 Usuários
0 Reactions
1,516 Visualizações
(@bellizzi)
Posts: 0
New Member
Topic starter
 

Pessoal,

Mais uma vez peço ajuda. Escrevi o seguinte código para inserir numa célula específica o dia da semana presente em outra célula. Porém está dando erro na linha em destaque abaixo.

Sub dtdiasemana()
Dim n As Date

Range("A3").Select

Do While ActiveCell.Value2 <> ""
ActiveCell.Offset(0, 1).Select 'seleciona celula com a data
n = ActiveCell.Value2
ActiveCell.Offset(0, 3).Select 'seleciona colune E
ActiveCell.Value2 = WeekdayName(n, True)
n = Empty
Loop
End Sub

Somente acrescentando uma informação em resposta a uma resposta anterior que tive, não sei usar matriz, nem vetores e nem os comandos for next e for each netxt. Se alguem ainda puder me ajudar a entender isto também, agradeço.

 
Postado : 26/12/2014 1:05 pm
(@edcronos)
Posts: 1006
Noble Member
 

desculpe mas oq eu te passei é o basico do basico

muito mais simples do que vc está tentando fazer

lf = Cells(Rows.Count, "C").End(xlUp).Row' vai definir a ultima linha da coluna c com valor =linha final
li=2' define a primeira linha
m=cells(li,"C").value2

 ' vai fazer loop da 1ª até a ultima linha
for l= li to lf
if cells(l,"C").value2<>"" then
 m= cells(l,"C").value2 
else 
cells(l,"A").value2 =m
end if

next

loop for next
nesse caso vai contar de Li até Lf e atribuir esse valor em L

e vai executar tudo que estiver entre for e next até L=LF
que nesse caso é contar de 2 (Li) até a ultima linha com dados da coluna "C" (LF)

mas isso vc veria em qualquer pesquisa de vba e for next

if cells(l,"C").value2<>"" then

>>se a celula (L "que contem o valor da contagem de for next" , "C" coluna C) é diferente de vazio então faça
m= cells(l,"C").value2
atribua em "M" o valor da celula (L "que contem o valor da contagem de for next" , "C" coluna C)
senão
cells(l,"A").value2 =m

mas como vc está usando Do While e Offset
que são bem mais complicados eu pensei que saberia como usar esses comandos

não falei nada sobre matriz nem vetores

mas v já mudou a logica da macro
então o ideial seria ter um exemplo e melhor explicação do que vc quer fazer

eu uso pouco coisas de datas
mas WeekdayName(n, True) ao me ver está correto
oq pode está acontecendo é n estar voltando um numero diferente do aceitado

 
Postado : 26/12/2014 1:56 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

O EdCronos já respondeu, mas segue:
Eu, particularmente acho o comando offset mais difícil para quem está iniciando.
Considerações:
WeekDayName utiliza a seguinte sintaxe:
Numero do Dia Da Semana(Integer de 1 a 7),
Abreviação(True ou False; por default é False),
Indicação do Primeiro dia da Semana (Integer de 0 a 7opcional) --> Detalhes veja o help do VBA
O erro que está retornando é devido informar uma data como valor inicial e não o dia.
Utilizando a função offset, deve se certificar de posicionar o cursor corretamente.
Então sua rotina inicial o cursor inicia em A3 "Range("A3").Select", vai para B3 "ActiveCell.Offset(0, 1).Select", vai para E3 "ActiveCell.Offset(0, 3").Select,
então começa o novo loop, mas lembre-se o cursor esta em E3, então nesse novo loop inicia indo para F3.
Obs.: Não se preocupe em "limpar" a variável enquanto está em uso e recebendo um novo valor, esse novo valor irá sobrepor o anterior e não "se juntar" a ele.
Sua rotina deve ser:

Sub dtdiasemana()
Dim n As Date
Range("A3").Select
Do While ActiveCell.Value2 <> ""
ActiveCell.Offset(0, 1).Select 'seleciona celula com a data
n = ActiveCell.Value2
ActiveCell.Offset(0, 3).Select 'seleciona colune E
ActiveCell.Value2 = WeekdayName(Day(n), True, vbMonday)
ActiveCell.Offset(1, -4).Select 'seleciona coluna A da proxima linha
Loop
End Sub

Creio que deva avaliar melhor o uso da "função For ...next.., muito mais simples para entender e manipular posicionamentos.
Ela requer uma variavel com o numero inical de "partida" que irá automaticamente aumentando o valor a cada "passada", até o numero final.
Inicialmente defina a "partida" e "parada" manualmente, até que evolua um pouco mais
Sua rotina poderia ser

Sub dtdiasemanaForNext()
Dim n As Integer, x As Integer

For x = 3 To 10
    n = Day(Range("B" & x))
    Range("E" & x) = WeekdayName(n, , vbMonday)
Next
End Sub
 
Postado : 26/12/2014 2:01 pm
(@edcronos)
Posts: 1006
Noble Member
 

boa reinaldo,
eu nem tinha me ligado que ele tinha declarado n como data

mas não vou dar desculpa esfarrapada...
realmente eu me perdi na avaliação da macro dele e na explicação

Offset até hoje eu acho desnecessário

ao ponto que loops fora for next
eu tenho que ficar reestudando a estrutura quando preciso deles " nunca lembro como se usa"

mas bela explicação

 
Postado : 26/12/2014 2:11 pm
(@bellizzi)
Posts: 0
New Member
Topic starter
 

desculpe mas oq eu te passei é o basico do basico

muito mais simples do que vc está tentando fazer

lf = Cells(Rows.Count, "C").End(xlUp).Row' vai definir a ultima linha da coluna c com valor =linha final
li=2' define a primeira linha
m=cells(li,"C").value2

 ' vai fazer loop da 1ª até a ultima linha
for l= li to lf
if cells(l,"C").value2<>"" then
 m= cells(l,"C").value2 
else 
cells(l,"A").value2 =m
end if

next

loop for next
nesse caso vai contar de Li até Lf e atribuir esse valor em L

e vai executar tudo que estiver entre for e next até L=LF
que nesse caso é contar de 2 (Li) até a ultima linha com dados da coluna "C" (LF)

mas isso vc veria em qualquer pesquisa de vba e for next

if cells(l,"C").value2<>"" then

>>se a celula (L "que contem o valor da contagem de for next" , "C" coluna C) é diferente de vazio então faça
m= cells(l,"C").value2
atribua em "M" o valor da celula (L "que contem o valor da contagem de for next" , "C" coluna C)
senão
cells(l,"A").value2 =m

mas como vc está usando Do While e Offset
que são bem mais complicados eu pensei que saberia como usar esses comandos

não falei nada sobre matriz nem vetores

mas v já mudou a logica da macro
então o ideial seria ter um exemplo e melhor explicação do que vc quer fazer

eu uso pouco coisas de datas
mas WeekdayName(n, True) ao me ver está correto
oq pode está acontecendo é n estar voltando um numero diferente do aceitado

Entendi sua lógica, vou testar para ver se consigo utilizar.
O que estou tentando fazer de fato é o seguinte,
em uma coluna tenho as datas do mês de novembro, em outra coluna desejo inserir o dia da semana referente aquela data.
Mas como minha planilha é muito grande ( aproximadamente 60 mil linhas), e estou treinando VBA, optei por fazer pela Macro.
Quanto ao código, aprendi a utilizar do while, do until, if else. O comando for next e for each next não consegui entender direirto como funciona para aplicar.

No comando WeeddayName(n, true), a minha variavel n está definida como Date. Mas fiz alguma coisa ao longo do programa que não a esta lendo corretamente. Isso é o que acredito.

Mas obrigado pela ajuda.

 
Postado : 29/12/2014 5:35 am
(@bellizzi)
Posts: 0
New Member
Topic starter
 

O EdCronos já respondeu, mas segue:
Eu, particularmente acho o comando offset mais difícil para quem está iniciando.
Considerações:
WeekDayName utiliza a seguinte sintaxe:
Numero do Dia Da Semana(Integer de 1 a 7),
Abreviação(True ou False; por default é False),
Indicação do Primeiro dia da Semana (Integer de 0 a 7opcional) --> Detalhes veja o help do VBA
O erro que está retornando é devido informar uma data como valor inicial e não o dia.
Utilizando a função offset, deve se certificar de posicionar o cursor corretamente.
Então sua rotina inicial o cursor inicia em A3 "Range("A3").Select", vai para B3 "ActiveCell.Offset(0, 1).Select", vai para E3 "ActiveCell.Offset(0, 3").Select,
então começa o novo loop, mas lembre-se o cursor esta em E3, então nesse novo loop inicia indo para F3.
Obs.: Não se preocupe em "limpar" a variável enquanto está em uso e recebendo um novo valor, esse novo valor irá sobrepor o anterior e não "se juntar" a ele.
Sua rotina deve ser:

Sub dtdiasemana()
Dim n As Date
Range("A3").Select
Do While ActiveCell.Value2 <> ""
ActiveCell.Offset(0, 1).Select 'seleciona celula com a data
n = ActiveCell.Value2
ActiveCell.Offset(0, 3).Select 'seleciona colune E
ActiveCell.Value2 = WeekdayName(Day(n), True, vbMonday)
ActiveCell.Offset(1, -4).Select 'seleciona coluna A da proxima linha
Loop
End Sub

Creio que deva avaliar melhor o uso da "função For ...next.., muito mais simples para entender e manipular posicionamentos.
Ela requer uma variavel com o numero inical de "partida" que irá automaticamente aumentando o valor a cada "passada", até o numero final.
Inicialmente defina a "partida" e "parada" manualmente, até que evolua um pouco mais
Sua rotina poderia ser

Sub dtdiasemanaForNext()
Dim n As Integer, x As Integer

For x = 3 To 10
    n = Day(Range("B" & x))
    Range("E" & x) = WeekdayName(n, , vbMonday)
Next
End Sub

Reinaldo,
Obrigado pela ajuda com o código. Comecei a entender como funciona esse laço for, até pq estou começando a estuda-lo em Java.
Porém não é tão funcional para mim pois tenho muitas linhas. Estou procurando aqui como posso desenvolver melhor este código.
O meu código ficou bem parecido com o que me esclareceu no laço Do While. Porém estou encontrando um erro, quando o dia da semana é plotado na minha célula, vem um nome que não é o verdadeiro.
Tenho como solucionar isso inserindo um calendário no excel ou tem outro jeito?

 
Postado : 29/12/2014 6:34 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

No for Next a dificuldade maior é definir a última linha a ser "visitada", então associado com
Cells(Cells.Rows.Count, "A").End(xlUp).Row (retorna a ultima linha com valores na coluna "A", determina-se facilmente a range a ser percorrida.

Sub dtdiasemanaForNext()
Dim n As Integer, x As Integer

For x = 3 To Cells(Cells.Rows.Count, "A").End(xlUp).Row
    n = Day(Range("B" & x))
    Range("E" & x) = WeekdayName(n, , vbMonday)
Next
End Sub

Quanto ao erro, aparentemente deve-se a configuração do primeiro dia da semana. No exemplo acima toma-se por base como sendo o Domingo, então experimente outras configurações, ou mande um exemplo.

 
Postado : 29/12/2014 6:52 am