VBA: seleccionar o intervalo por variáveis
quero seleccionar o intervalo formatado de uma folha do Excel. Para definir a última e a primeira linha, Uso as seguintes funções:
lastColumn = ActiveSheet.UsedRange.Column - 1 + ActiveSheet.UsedRange.Columns.Count
lastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
no próximo passo quero seleccionar esta área: A fórmula deve ser assim:
Range(cells(1, 1), cells(lastRow, lastColumn).Select
No entanto, isto não está a resultar. Talvez alguém tenha uma ideia do que há de errado com ele. Muito obrigado!
6 answers
Gravei uma macro com 'referências relativas' e foi isto que consegui :
Range("F10").Select
ActiveCell.Offset(0, 3).Range("A1:D11").Select
Hera o que eu pensei : se a selecção do intervalo está entre aspas, o VBA realmente quer uma STRING e interpreta as células para fora dela, por isso tentou o seguinte:
Dim MyRange as String
MyRange = "A1:D11"
Range(MyRange).Select
E funcionou:) ie.. basta criar uma string usando as suas variáveis, certifique-se de dimensioná-la como uma string variáveis e o Excel irá ler imediatamente;)
Após o ensaio e o trabalho encontrado:
Sub Macro04()
Dim Copyrange As String
Startrow = 1
Lastrow = 11
Let Copyrange = "A" & Startrow & ":" & "D" & Lastrow
Range(Copyrange).Select
End Sub
Range(Cells(1, 1).Address(), Cells(lastRow, lastColumn).Address()).Select
Que teve o cuidado de converter a localização numérica da célula para o que o intervalo espera, que é o formato A1.
Se apenas quiser seleccionar o intervalo usado, use
ActiveSheet.UsedRange.Select
Se quiser Seleccionar de A1 até ao fim do intervalo usado, pode usar o método SpecialCells como este
With ActiveSheet
.Range(.Cells(1, 1), .Cells.SpecialCells(xlCellTypeLastCell)).Select
End With
Às vezes, o Excel confunde-se com a última célula. Nunca é um intervalo menor do que o atual, mas pode ser maior se algumas células foram apagadas. Para evitar isso, você pode usar o Find e o asterisco wildcard para encontrar a última célula real.
Dim rLastCell As Range
With Sheet1
Set rLastCell = .Cells.Find("*", .Cells(1, 1), xlValues, xlPart, , xlPrevious)
.Range(.Cells(1, 1), rLastCell).Select
End With
Finalmente, certifica-te de que só estás a seleccionar se realmente for necessário. A maioria do que você precisa fazer no Excel VBA você pode fazer diretamente para o intervalo em vez de selecioná-lo primeiro. Em vez de
.Range(.Cells(1, 1), rLastCell).Select
Selection.Font.Bold = True
Podes
.Range(.Cells(1,1), rLastCells).Font.Bold = True
Range(cells(1, 1), cells(lastRow, lastColumn)).Select
Mas devias mesmo olhar para a outra resposta do Dick Kusleika para possíveis alternativas que te possam servir melhor. Especificamente, ActiveSheet.UsedRange.Select
que tem o mesmo resultado final que o seu código.
Está a transformá-los num endereço, mas as células(#,#) usam entradas inteiras e não entradas de endereços, por isso basta usar lastRow = ActiveSheet.UsedRange.Rows.count
e lastColumn = ActiveSheet.UsedRange.Columns.Count
Tentei usar:
Range(cells(1, 1), cells(lastRow, lastColumn)).Select
Onde lastRow
e lastColumn
são inteiros, mas receberam um erro de tempo de execução 1004. Estou usando um VB mais velho (6.5).
O que funcionou foi usar o seguinte:
Range(Chr(64 + firstColumn) & firstRow & ":" & Chr(64 + lastColumn) & firstColumn).Select.