Notifications
Clear all

Trocar o conteúdo de duas seleções entre elas

9 Posts
2 Usuários
0 Reactions
1,342 Visualizações
(@fefo32br)
Posts: 0
New Member
Topic starter
 

Olá, pessoal ... me chamo Fernando. Esse é meu primeiro post.
Procurei no fórum, mas não achei algo semelhante a isso. Como sou novo aqui, caso esteja fazendo algo de errado, me avisem, pls.

Como consigo criar uma rotina que troque o conteúdo de dois ranges entre eles mesmos selecionados ao mesmo tempo?
Ou seja, Seleciono dois ranges (A e B).. o conteúdo e a formatação do A, deve ir para o B, e vice versa.

No exemplo anexo, o conteúdo inteiro (incluindo formatação) do range (L7 : R8) deve ir para para o range (L10 : R11) e vice versa.

Agradeço desde já!

 
Postado : 08/08/2018 9:55 pm
(@edsonbr)
Posts: 0
New Member
 

Bom dia, Fernando, seja bem vindo ao Planilhando!

Uma solução seria o VBA copiar cada uma das áreas (de tamanhos iguais) pré-selecionadas com CTRL como especificado e colar em algum espaço vazio da planilha (ou para uma nova planilha que poderia ser eliminada depois) e depois copiar e colar de volta invertendo os ranges. Escolhi para isso as células à partir da A30 em sua planilha, já que estão vazias. Adapte esse local vazio para seu caso.

Sub SwapRange()
  Dim rg1 As Range, rg2 As Range, rgTemp1 As Range, rgTemp2 As Range
  Set rg1 = Selection.Areas(1): Set rg2 = Selection.Areas(2)
  If rg1.Rows.Count = rg2.Rows.Count And _
     rg1.Columns.Count = rg2.Columns.Count Then
     Application.ScreenUpdating = False
       Set rgTemp1 = [A30].Resize(rg1.Rows.Count, rg1.Columns.Count)
       Set rgTemp2 = rgTemp1.Cells(rg1.Rows.Count, 1).Offset(1, 0) _
                     .Resize(rg2.Rows.Count, rg2.Columns.Count)
       rg1.Copy rgTemp1: rg2.Copy rgTemp2
       rgTemp1.Copy rg2: rgTemp2.Copy rg1
       rgTemp1.Clear: rgTemp2.Clear
     Application.ScreenUpdating = True
  Else
    MsgBox "As áreas selecionadas não são do mesmo tamanho"
  End If
End Sub
 
Postado : 09/08/2018 6:49 am
(@fefo32br)
Posts: 0
New Member
Topic starter
 

Edson, MUITO OBRIGADO!

Como eu conseguiria adaptar para.. ao invés de colar o conteúdo com suas formatações completas, colar TUDO, MENOS BORDA?

existe essa função no excel.. o código acho que é esse... mas não sei como trocar no esquema que você fez...
Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False

Consegue me dar essa última ajuda?

Obrigado!

Abs

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

Essa cria uma nova planilha para cada range temporário e ao final as elimina:

Sub SwapRange()
  Dim rg1 As Range, rg2 As Range, rgTemp1 As Range, rgTemp2 As Range
  Set rg1 = Selection.Areas(1): Set rg2 = Selection.Areas(2)
  If rg1.Rows.Count = rg2.Rows.Count And _
    rg1.Columns.Count = rg2.Columns.Count Then
    Application.ScreenUpdating = False
      Set rgTemp1 = Worksheets.Add.Range("A1").Resize(rg1.Rows.Count, rg1.Columns.Count)
      Set rgTemp2 = Worksheets.Add.Range("A1").Resize(rg2.Rows.Count, rg2.Columns.Count)
      rg1.Copy rgTemp1: rg2.Copy rgTemp2
      rgTemp1.Copy rg2: rgTemp2.Copy rg1
      Application.DisplayAlerts = False
        rgTemp1.Parent.Delete: rgTemp2.Parent.Delete
      Application.DisplayAlerts = True
    Application.ScreenUpdating = True
  Else
    MsgBox "As áreas selecionadas não são do mesmo tamanho"
  End If
End Sub
 
Postado : 09/08/2018 9:20 am
(@fefo32br)
Posts: 0
New Member
Topic starter
 

Meu amigo, você não faz ideia do quanto está me ajudando!
rsrs

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

Fóruns são pra isso mesmo! ;)

 
Postado : 09/08/2018 9:28 am
(@fefo32br)
Posts: 0
New Member
Topic starter
 

Meu amigo, um último ponto, por favor.

Como eu conseguiria adaptar para.. ao invés de colar o conteúdo com suas formatações completas, colar TUDO, MENOS BORDA?

existe essa função no excel.. o código acho que é esse... mas não sei como trocar no esquema que você fez...
Selection.PasteSpecial Paste:=xlPasteAllExceptBorders, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False

Consegue me dar essa última ajuda?

Obrigado!

Abs

 
Postado : 09/08/2018 9:33 am
(@edsonbr)
Posts: 0
New Member
 
Sub SwapRange()
  Dim rg1 As Range, rg2 As Range, rgTemp1 As Range, rgTemp2 As Range
  Set rg1 = Selection.Areas(1): Set rg2 = Selection.Areas(2)
  If rg1.Rows.Count = rg2.Rows.Count And _
    rg1.Columns.Count = rg2.Columns.Count Then
    Application.ScreenUpdating = False
      Set rgTemp1 = Worksheets.Add.Range("A1").Resize(rg1.Rows.Count, rg1.Columns.Count)
      Set rgTemp2 = Worksheets.Add.Range("A1").Resize(rg2.Rows.Count, rg2.Columns.Count)
      rg1.Copy rgTemp1: rg2.Copy rgTemp2
      rgTemp1.Copy: rg2.PasteSpecial xlPasteAllExceptBorders
      rgTemp2.Copy: rg1.PasteSpecial xlPasteAllExceptBorders
      Application.DisplayAlerts = False
        rgTemp1.Parent.Delete: rgTemp2.Parent.Delete
      Application.DisplayAlerts = True
    Application.ScreenUpdating = True
  Else
    MsgBox "As áreas selecionadas não são do mesmo tamanho"
  End If
End Sub
 
Postado : 09/08/2018 9:53 am
(@fefo32br)
Posts: 0
New Member
Topic starter
 

Ficou PERFEITO!

MUITO OBRIGADO!!!!!!

Grande abraço!

 
Postado : 09/08/2018 10:07 am