
Tenho 2 listas em duas folhas separadas e estou tentando combiná-las em uma terceira folha. Essas listas são preenchidas automaticamente com base na entrada do usuário, portanto, o número de linhas na lista pode variar. Assim, uma vez que não detecta nada na primeira coluna da planilha um, ele começa a preencher a lista da planilha 3 com as colunas da planilha 2, assim
Folha 1
Make Model License Plate
Ford Escape UVC345
Honda Civic KD2YR9
Folha 2
Make Model License Plate
Dodge Charger 34TRLS2
VW Passat V70YTR
Folha 3
Make Model License Plate
Ford Escape UVC345
Honda Civic KD2YR9
Dodge Charger 34TRLS2
VW Passat V70YTR
Atualizar:
O problema que estou enfrentando ao usar o VBA para copiar e colar é que ele está colando e identificando as fórmulas que são usadas para preencher automaticamente a lista inicial na planilha 1. Por estar colando as fórmulas, não está identificando corretamente onde a última célula está na planilha 3.
Sub Copy_Alternatives()
Worksheets("CNA eTool Alternatives").Range("A:A").Copy
Worksheets("Repair Replacement Recom").Range("A:A").PasteSpecial xlPasteValues
Worksheets("CNA eTool Alternatives").Range("B:B").Copy
Worksheets("Repair Replacement Recom").Range("B:B").PasteSpecial xlPasteValues
Worksheets("CNA eTool Alternatives").Range("C:C").Copy
Worksheets("Repair Replacement Recom").Range("C:C").PasteSpecial xlPasteValues
End Sub
Sub Copy_Paste_Range()
Dim lNewRow As Long
Dim lDataRow As Long
ThisWorkbook.Activate
lNewRow = Worksheets("CNA eTool Addit. Alternatives").Cells(Worksheets("CNA eTool Addit. Alternatives").Rows.Count, "H").End(xlUp).Row
lDataRow = Worksheets("Repair Replacement Recom").Cells(Worksheets("Repair Replacement Recom").Rows.Count, 1).End(xlUp).Row
lDataRow = lDataRow + 1
Worksheets("CNA eTool Addit. Alternatives").Range("H2:J" & lNewRow).Copy
Worksheets("Repair Replacement Recom").Range("A" & lDataRow).PasteSpecial
End Sub
Responder1
Você pode fazer isso com funções de planilha.
Digamos que sua primeira planilha seja Sheet1
e a segunda sejaExtra1
Coloque a seguinte fórmula em sua planilha mesclada em A2 e copie e cole nas outras células:
=IF(ROW()>COUNTA(Sheet1!A:A)+COUNTA(Extra1!A:A)-1,"",INDIRECT(IF(ROW()<=COUNTA(Sheet1!A:A),"Sheet1!","Extra1!")&SUBSTITUTE(ADDRESS(1,COLUMN(),4),1,"")&ROW()-IF(ROW()<=COUNTA(Sheet1!A:A),0,COUNTA(Sheet1!A:A)-1)))
Como isso funciona:
- Verifica se a linha atual é maior que o número de linhas da primeira planilha + a segunda planilha menos um (porque ambas possuem cabeçalhos);
- Se a linha atual for maior, mostre vazio. Caso contrário, vai para a próxima etapa;
- Prepara um
INDIRECT
. Se a linha atual for inferior às linhas da primeira planilha, obtém o nome da primeira planilha. Caso contrário, recebe o nome da segunda planilha; - Ele usa o
SUBSTITUTE + ADDRESS
truque para retornar a letra atual da coluna. É bom porque aí ele usa a mesma fórmula em todos os campos, e aceita mesmo quando a coluna vira AA - Por fim, obtém a linha atual se a linha atual for menor que o número de itens da primeira planilha, caso contrário obtém a linha atual MENOS a contagem de linhas da primeira planilha, menos um, para retornar a linha inicial da planilha dois .
Eu sei que é um pouco complicado e difícil de ler, mas às vezes as fórmulas são melhores que o VBA.
Editar: Bem, tive uma epifania e consegui uma versão VBA funcional
Sub merge()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet
Set ws1 = Sheets("Sheet1") 'First sheet to get merged
Set ws2 = Sheets("Extra1") 'Second sheet to get merged
Set ws3 = Sheets("Merged") 'Name of the sheet you want results
Dim lr As Long 'To return the number of the last row
Dim arrayone As Variant
lr = ws1.Cells(Rows.Count, 1).End(xlUp).Row
arrayone = Range(ws1.Cells(2, 1), ws1.Cells(lr, 3)).Value 'From Row 2 onwards, considering it has headers
Dim arr2 As Variant
lr = ws2.Cells(Rows.Count, 1).End(xlUp).Row
arr2 = Range(ws2.Cells(2, 1), ws2.Cells(lr, 3)).Value 'From Row 2 onwards, considering it has headers
Dim arr3 As Variant
ReDim arr3(1 To UBound(arrayone, 1) + UBound(arr2, 1), 1 To 3)
For i = 1 To UBound(arr3, 1)
For j = 1 To 3
If i <= UBound(arrayone, 1) Then
arr3(i, j) = arrayone(i, j)
Else
arr3(i, j) = arr2(i - UBound(arrayone, 1), j)
End If
Next j
Next i
Range(ws3.Cells(2, 1), ws3.Cells(UBound(arr3) + 1, 3)).Value = arr3
End Sub