Como posso obter uma certa linha, uma linha abaixo?

0

O que quero dizer é que tenho um excel doc com 4 linhas

   A      B       C        D
1  Data1   Data2  Data3   Data4
2  Data5   Data6  Data7   Data8

Eu quero que todos os dados da linha D entrem na linha abaixo e se tornem assim.

   A      B       C       
1  Data1   Data2  Data3   
2  Data4   // First Data of D row on below line moved on line 2
3  Data5   Data6  Data7 
4  Data8  // Second Data of D row on below line moved on line 4.

Isso pode ser feito de qualquer maneira?

Obrigado antecipadamente. - > Eu uso o Excel 2007, mas eu adoraria saber se isso pode ser feito em versões mais recentes do Excel.

Edit: Então eu gravei uma macro fazendo isso para uma coluna. Se eu correr de volta depois de 2 colunas é o seu feito como eu quero.

The code of the macro is this:
Sub Μακροεντολή3()
'
' Μακροεντολή3 Μακροεντολή
'

'
    Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove
    ActiveCell.Offset(-1, 3).Range("A1").Select
    Selection.Cut
    ActiveCell.Offset(1, -3).Range("A1").Select
    ActiveSheet.Paste
End Sub

Você pode me ajudar a obter um loop para todas as colunas com a etapa 2 até o final?

Obrigado antecipadamente.

    
por foutzos 28.06.2016 / 04:17

4 respostas

0

Esta fórmula pode ser usada para o seu exemplo. Ele pode ser usado para criar uma nova tabela em que o "quebra de linha é adicionado" antes de cada valor na última coluna.

=IFERROR(INDEX($A$1:$D$20,TRUNC((ROW()-ROW($F$1)+2)/2,0),COLUMN()-COLUMN($F$1)+1+MOD((ROW($F$1)-ROW()),2)*(COLUMNS($A$1:$D$20)-1)),"")

$A$1:$D$20 é a tabela de origem $F$1 é a primeira célula da nova tabela

Para intervalos usados acima: Insira a fórmula na célula F1 e estenda até H40. Você pode ajustar a fórmula substituindo o intervalo e iniciando o endereço da célula no bloco de notas (CTL + H é seu amigo).

Como funciona?

  1. Veja a ajuda do Excel da função INDEX.
  2. O parâmetro de linha é: TRUNC((ROW()-ROW($F$1)+2)/2,0) , coloque-o em qualquer célula e estenda-se - ele retorna números aumentando em 1 a partir de 1. Esse valor é igual a cada duas linhas.
  3. COLUMN()-COLUMN($F$1)+1+MOD((ROW($F$1)-ROW()),2)*(COLUMNS($A$1:$D$20)-1)) é um pouco confuso, mas consiste em duas partes. Primeiro: COLUMN()-COLUMN($F$1)+1 retorna apenas o índice da linha na tabela de resultados. Segundo: MOD((ROW($F$1)-ROW()),2)*(COLUMNS($A$1:$D$20)-1)) é "ativo" somente em linhas pares (porque MOD((ROW($F$1)-ROW()),2) = 1 , na linha ímpar é MOD((ROW($F$1)-ROW()),2) = 0 e multiplica a última parte (COLUMNS($A$1:$D$20)-1) que representa a contagem de linhas na tabela de origem menos 1 Então, quando esta fórmula está na linha par (na primeira coluna), o parâmetro da coluna para a função INDEX é "column index in result table"+1*"column count in source table -1") o que é 1+1*(4-1) e seu índice da última coluna.
  4. A função IFERROR é usada para substituir códigos de erro (quando a função INDEX está fora do intervalo) por "" representa a célula em branco.

PS: Quando você estica a tabela de resultados para a mesma contagem de colunas que a tabela de origem, obtém valores indesejados nesta última coluna (ela pode ser evitada usando mais uma função IF, mas a fórmula de resultado será muito mais complexa / confuso)

PPS: Desculpe por mau Inglês

    
por 28.06.2016 / 12:54
0

@ A resposta de Lluser é impressionante.

Minha resposta é talvez mais simples. Novamente, você pode fazer isso copiando os dados para outra tabela (ou conjunto de colunas).

Você pode usar três fórmulas em três novas colunas, F, G e H, da seguinte maneira:

F1:  =IF(MOD(ROW(),2)=1,INDIRECT(CONCATENATE("A",(ROUNDDOWN(ROW()/2,0))+1)),INDIRECT(CONCATENATE("D",(ROUNDDOWN(ROW()/2,0)))))

G1:  =IF(MOD(ROW(),2)=1,INDIRECT(CONCATENATE("B",(ROUNDDOWN(ROW()/2,0))+1)),"")

H1:  =IF(MOD(ROW(),2)=1,INDIRECT(CONCATENATE("C",(ROUNDDOWN(ROW()/2,0))+1)),"")

E preencha-os para duplicar o número de linhas como na tabela original.

Portanto, deve parecer um pouco assim:

Algumasexplicações:

  1. Vocêdescobresealinhaatualéparouímpar.Cadaparímpar/parnanovatabelacorrespondeaumadaslinhasdatabelaoriginal(issoseráverdadeiroseonúmerodalinhaímparfor"MOD (ROW (), 2) = 1").
  2. Se houver uma linha ímpar na nova tabela, você receberá valores das colunas A B e C.
  3. Se até mesmo linha na nova tabela E você está em um dos G ou H, então você só tem uma string vazia.
  4. Se houver uma linha na nova tabela E você estiver na coluna F, você estará obtendo o quarto valor (coluna D) da tabela original.

O ponto 2 é alcançado com isto:

INDIRECT(CONCATENATE("A",(ROUNDDOWN(ROW()/2,0))+1))

que simplesmente faz referência à linha que você está segmentando. "Indireto" é a maneira especial do Excel de construir uma referência a partir de uma string (como A1, A2, etc.). Nesse caso, estou criando uma string com A e o número da linha que a nova tabela está segmentando.

O ponto 4 é muito semelhante ao ponto 2, exceto pelo fato de estar trabalhando na segunda linha do par, na nova tabela.

Espero que isso ajude e possa ser entendido.

    
por 28.06.2016 / 17:08
0

Na guia "Desenvolvedor", lembre-se de ativar "Usar referências relativas"

  • Gravar Macro
  • Da A1, vá para D1
  • Recortar
  • Ir para a A2
  • Inserir linha
  • Colar
  • Ir para a próxima linha
  • Parar macro
  • Salvar macro
  • Em seguida, reexecute a macro.

O loop de uma macro:

Sub Macro1 ()

Vamos x = 0

Do While x < 10

seu código

x = x + 1

Loop

End Sub

    
por 28.06.2016 / 17:12
0

como eu tentei todas as suas respostas eu segui macro constrói no excel. Eu fiz algumas coisas e, em seguida, eu tenho pilha, então eu postei diferente, mas ainda a mesma pergunta em stackoverflow. Então aqui está a resposta. link

    Sub ConvertColDtoRow()
'Note that this code is written specifically for column D, but it can be adjusted as needed by changing the column specified

Dim Count As Long, LastRow As Long
Count = 1
LastRow = ActiveSheet.UsedRange.Rows.Count
Do While Count <= LastRow
    If Not IsEmpty(ActiveSheet.Cells(Count,4)) Then
        Range(Cells(Count,4).Address).Offset(1,0).EntireRow.Insert
        Cells(Count + 1,1).Value = Cells(Count,4).Value
        Cells(Count,4).Value = ""
        Count = Count + 2
        LastRow = LastRow + 1
    Else
        Count = Count + 1
    End If
Loop

End Sub

Créditos para @RGA. Muito obrigado a todos pelo seu tempo.

    
por 29.06.2016 / 14:57