Option Explicit
'copy cells
Sub start()
Dim ws As Worksheet, wsum As Worksheet
Dim wb As Workbook
Dim vws As Variant 'Need to use a Variant for iterator
Dim i As Integer, j As String, k As String
i = 0
Set wb = Workbooks("macro2.xlsm")
Set wsum = wb.Sheets("sum")
'Iterate through the sheets
For Each vws In wb.Sheets
If vws.Name <> "sum" Then
j = CStr(i + 2)
k = CStr(i + 18)
vws.Range("b8").Copy wsum.Range("a" & j)
vws.Range("b5").Copy wsum.Range("b" & j)
vws.Range("b4").Copy wsum.Range("c" & j)
vws.Range("G13:G30").Copy wsum.Range("d" & j & ":d" & k)
vws.Range("h13:h30").Copy wsum.Range("e" & j & ":e" & k)
vws.Range("i13:i30").Copy wsum.Range("f" & j & ":f" & k)
vws.Range("j13:j30").Copy wsum.Range("g" & j & ":g" & k)
vws.Range("k13:k30").Copy wsum.Range("h" & j & ":h" & k)
i = i + 18
End If
Next
End Sub
Reorientado para usar loops e concatenação de strings. Apenas compile testado, então pode não funcionar; quaisquer defeitos são seus e se você estiver insatisfeito, reembolsarei o preço total da compra. Obrigado por comprar na McSoftware's.
Isso é muito básico (sem trocadilhos) e deve ser algo que você possa aprender. Alguns pontos explicativos para explicar como eu descobri isso:
-
For Each vws In wb.Sheets
itera em cada folha da pasta de trabalho. "Iterar" significa "percorrer um por um e manipular cada elemento separadamente em um loop". - Se você precisar de mais de uma dúzia de variáveis em uma função, você está fazendo errado e deve parar imediatamente e tentar outra coisa. Fazer uma pergunta no SuperUser não é a melhor coisa que você poderia ter feito, mas é melhor do que copiar e colar seu código mais 48 vezes, então eu aplaudo pelo menos ao perceber que houve um problema.
- String concatenação significa pegar duas strings menores e juntá-las. Por exemplo, "ele" & "llo" renderia a string concatenada "olá". O operador
&
é usado para concatenar strings no Visual Basic. - Você provavelmente pode reduzir ainda mais a repetitividade desse código adicionando um loop e criando uma matriz constante de letras para "d", "e", "f", "g", "h" - mas como havia Apenas cinco deles, o esforço de escrever um loop é quase o mesmo que fazer um por um. Se você acabar com muito mais colunas, definitivamente escreva um loop com uma matriz ou dicionário de letras.
- Eu usei conversão de números em strings com a função
CStr()
para converter o inteiroi
mais uma constante derivada do seu código original. Portanto, na primeira iteração do loop, colocarávws.Range("b8")
no intervalo da soma da somaA2
porque0 + 2 = 2
. No final do loop, observe oi = i + 18
para incrementar o contador, para que, na segunda iteração, a mesma célula na segunda planilha seja copiada no intervaloA20
da planilha de soma. Você pode ter que ajustar os números porque eu não posso dizer a partir de seus dados de origem se isso vai substituir / atropelar acidentalmente as linhas ou não.
Referências
Antes de tentar algo mais exótico no Visual Basic (para Aplicativos), leia um livro sobre programação.
- Um livro muito básico que leva você passo a passo (provavelmente o que você precisa) aqui -
Excel VBA in Easy Steps
por Ed Robinson. - Um oldie mas bom ,
VBA Developer's Handbook 2nd Edition
de Ken Getz.
Você também pode obter uma perspectiva e um insight adicionais para ser um programador proficiente se tentar uma linguagem de programação mais moderna e genérica, como Python, Java ou C ++, apenas para aprender conceitos que ajudarão você a escrever um bom código em < em> qualquer idioma.