Notifications
Clear all

selecionar intervalos de celulas com variavel

11 Posts
4 Usuários
0 Reactions
1,781 Visualizações
(@paulovitor)
Posts: 0
New Member
Topic starter
 

pessoal, tem alguma forma de selecionar gradativamente intervalos de celulas manipulando o metodo (ou objeto, sei la) worksheet.range?

eu estou fazendo uma macro que copia e cola, estilo assim

     Worksheets("lc").Range("c2:r14").Copy
    ...    
     Worksheets("lc").Range("c16:r28").Copy
 

mas queria nao ter que colocar todos os intervalos no codigo, ate pq eles vao variar de extensao. e sempre vai somar no valor do intervalo sete (7). tem como eu fazer alguma coisa pra manipular esse Range (Cx:Ry) com x+7 e y+7?

 
Postado : 05/06/2018 12:42 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

paulovitor,

Boa tarde!

Não sei se entendi corretamente. Você quer selecionar faixas de células não contíguas? É isso? Se for isso, pode ser assim:

    Range("C2:R14,C16:R27,C29:R45").Select
 
Postado : 05/06/2018 12:48 pm
(@xlarruda)
Posts: 0
New Member
 

Uma outra possibilidade:

dim r1,r2,myrange as range
set r1 = Worksheets("lc").Range("c2:r14")
set r2 = Worksheets("lc").Range("c16:r28")

myrange = Union(r1,r2)
myrange.Copy

Agora toda vez que quiser se referir ao seu conjunto de ranges durante o seu código bastar usar a variável, myrange.
Acrescente quantas ranges for necessário. (r3,r4,r5....)

 
Postado : 05/06/2018 1:07 pm
(@paulovitor)
Posts: 0
New Member
Topic starter
 

nao exatamente, o que eu queria era um loop, talvez um for or while mais ou menos assim:

var x as integer

for x = 2, x = x+7
do 
 copy x
 paste x
end

desculpem o amadorismo, algoritmo nao eh o meu forte. mas queria uma coisa similar, sabem.

ate que alcancasse digamos, a linha 100, ele copiasse esses intervalos,
primeiro copiasse c2:r14, e colasse em outra planilha
depois copiasse c9:r28 e colasse em outra planilha
depois copiasse c11:r35

soh eu nao queria ter que digitar todos os intervalos no Worksheet("sheet").Range( "intervalo1").copy e ter que escrever varias linhas.

queria uma forma de manipular com a variavel esse parametro que indica a celula dos intervalos: A (x): C(y), B(x):C(y)...

 
Postado : 06/06/2018 7:07 am
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

paulovitor,

Boa tarde!

Amigo, tá difícil de entender a sua necessidade... pelo menos para mim, está muito confuso.

Veja: você fala num For de 2 a 100 que primeiro selecione C2 a R14, Depois que selecione C9 a R28 e depois que selecione C11 a R35. Essa relação não está batendo. De C2 para C9 tem 7 linhas, de R14 para R28 também. Mas de C2 para C9 só tem 2 linhas enquanto que de R14 para R28 também tem 7 e de R28 para R35 também tem 7 linhas. Ou seja: Nenhum tipo de laço vai fazer uma relação como essa onde há divergência de quantidades.

A melhor forma de tentarmos resolver sua demanda é você anexar um exemplo pequeno do seu arquivo, no máximo 5 linhas, com o mesmo layour do seu arquivo original e explicar exatamente, com detalhes o que você realmente de fato quer.

 
Postado : 06/06/2018 11:35 am
(@paulovitor)
Posts: 0
New Member
Topic starter
 

para ficar mais claro, vou reduzir a amplitude do problema e dos termos:

vamos dizer que eu tenha um arquivo com 5000 linhas preenchidas, mais ou menos assim:

a1 - fernando
a2 -
a3 - mario
a4 -
a5 - carlos
a6
a7 - bianca

eu preciso copiar essas celulas pra outro lugar. nao eh excel. por isso nao posso copiar a1:a5000 nem excluir as celulas em branco.

no momento, o que eu tenho como opcao de codigo eh isso:

Worksheets("lc").Range("a1").Copy
Worksheets("lc").Range("a3").Copy
Worksheets("lc").Range("a5").Copy
Worksheets("lc").Range("a7").Copy
Worksheets("lc").Range("a9").Copy

tem como eu posso simplificar isso com uma variavel? com um loop? jah que as celulas copiadas sempre serao impares?

 
Postado : 08/06/2018 9:08 am
(@edsonbr)
Posts: 0
New Member
 

Uma ideia:

Sub teste1()
  Dim rg As Range, i As Long
  For i = 1 To 5000 Step 2
    Worksheets("lc").Range("A" & i).Copy Destination:=Worksheets("OutraQualquer").Range("B" & i + 5)
    'Ou então Worksheets("lc").Cells(i, 1).Copy
  Next i
End Sub

Ou então:

Sub teste()
  Dim rg As Range, i As Long
  For i = 1 To 5000 Step 2
    If Not rg Is Nothing Then
      Set rg = Union(rg, Worksheets("lc").Range("A" & i))
    Else
      Set rg = Worksheets("lc").Range("A" & i)
    End If
  Next i
  rg.Copy Destination:=Worksheets("OutraQualquer").Range("A1")
End Sub
 
Postado : 08/06/2018 10:57 am
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

paulovitor,

Boa tarde!

Siga o código do Edson que dará bem certinho!

Pedimos, por gentileza, ao postar código VBA utilizar a ferramenta CODE localizada no início da caixa de mensagem (quinto botão da esquerda para a direita).

 
Postado : 08/06/2018 11:44 am
(@paulovitor)
Posts: 0
New Member
Topic starter
 

oi, edson, grato pela ajuda. axo que vai dar certo
obrigado wagner, valeu as dicas

axo que vou usar a opção com cells, é mais intuitivo pra mim.

notei que o pessoal gosta sempre de definir um intervalo como uma variavel e depois manipular ele, como o "rg"

parece que nao se gosta muito de escrever o metodo inteiro worksheets.range...

 
Postado : 08/06/2018 11:45 am
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

É mais prático e poupa tempo.

 
Postado : 08/06/2018 12:27 pm
(@edsonbr)
Posts: 0
New Member
 

notei que o pessoal gosta sempre de definir um intervalo como uma variavel e depois manipular ele, como o "rg"
parece que nao se gosta muito de escrever o metodo inteiro worksheets.range...

Não se trata apenas de estilo ou de "preguiça". O que acontece é que numa boa prática de programação deve-se tentar reduzir o número de chamadas aos objetos pois isso traz economiza em processamento e por consequência dá mais velocidade.

No VBA e em outras linguagens orientadas a objetos, cada "ponto" usado como em Objeto.SubObjeto.SubSubObjeto.Propriedade é uma chamada a mais que se faz. E isso demanda tempo. Por isso é recomendável atribuir objetos-pai a uma variável e usá-la sempre que possível, ainda mais quando se está trabalhando com um loop com muitos repasses.

Também pode-se usar a instrução With e finalizar com End With ao invés de usar variáveis.

Note que não tive essa preocupação quando fiz o exemplo anterior, pois o interesse era só ilustrar a forma de resolver o problema.

 
Postado : 08/06/2018 1:34 pm