una - Crear rangos de Excel utilizando los números de columna en vba?
macro seleccionar rango desde celda activa (8)
¿Cómo es posible crear un rango en vba usando el número de columna, en lugar de letra?
Range.EntireColumn
¡Sí! Puede usar Range.EntireColumn
MSDN
dim column : column = 4
dim column_range : set column_range = Sheets(1).Cells(column).EntireColumn
Range ("ColumnName: ColumnName")
Si busca una columna específica, puede crear un rango de columna codificado con la sintaxis, por ejemplo, Range("D:D")
.
Sin embargo, utilizaría toda la columna, ya que proporciona más flexibilidad para cambiar esa columna en otro momento.
Hoja de trabajo.Columnas
Worksheet.Columns
proporciona acceso de rango a una columna dentro de una hoja de trabajo. MSDN
Si desea acceder a la primera columna de la primera hoja. Columns
función Columns
en la hoja de trabajo.
dim column_range: set column_range = Sheets(1).Columns(1)
La propiedad Columns
también está disponible en cualquier MSDN Range
EntireRow
también puede ser útil si tiene un rango para una sola celda pero le gustaría llegar a otras celdas de la fila, similar a una LOOKUP
dim id : id = 12345
dim found : set found = Range("A:A").Find(id)
if not found is Nothing then
''Get the fourth cell from the match
MsgBox found.EntireRow.Cells(4)
end if
A continuación hay dos soluciones para seleccionar el rango A1.
Cells(1,1).Select ''(row 1, column 1)
Range("A1").Select
También mira este enlace;
Recomendamos encarecidamente que use Range en lugar de Cells para trabajar con celdas y grupos de celdas. Hace tus oraciones mucho más claras y no estás obligado a recordar que la columna AE es la columna 31.
La única vez que usará Celdas es cuando desee seleccionar todas las celdas de una hoja de trabajo. Por ejemplo: Cells.Seleccione Para seleccionar todas las celdas y luego vacíe todas las celdas de valores o fórmulas que usará: Cells.ClearContents
-
"Células" es particularmente útil cuando se configuran los rangos dinámicamente y se recorren los intervalos mediante el uso de contadores. La definición de rangos utilizando letras como números de columna puede ser más transparente en el corto plazo, pero también hará que su aplicación sea más rígida ya que son representaciones "codificadas", no dinámicas.
Gracias a Kim Gysen
Aquí hay un reemplazo condensado para la función ConvertToLetter que en teoría debería funcionar para todos los enteros positivos posibles. Por ejemplo, 1412 produce "BBH" como resultado.
Public Function ColumnNumToStr(ColNum As Integer) As String
Dim Value As Integer
Dim Rtn As String
Rtn = ""
Value = ColNum - 1
While Value > 25
Rtn = Chr(65 + (Value Mod 26)) & Rtn
Value = Fix(Value / 26) - 1
Wend
Rtn = Chr(65 + Value) & Rtn
ColumnNumToStr = Rtn
End Function
En caso de que buscara transformar su número de columna en una carta:
Function ConvertToLetter(iCol As Integer) As String
Dim iAlpha As Integer
Dim iRemainder As Integer
iAlpha = Int(iCol / 27)
iRemainder = iCol - (iAlpha * 26)
If iAlpha > 0 Then
ConvertToLetter = Chr(iAlpha + 64)
End If
If iRemainder > 0 Then
ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
End If
End Function
De esta forma podrías hacer algo como esto:
Function selectColumnRange(colNum As Integer, targetWorksheet As Worksheet)
Dim colLetter As String
Dim testRange As Range
colLetter = ConvertToLetter(colNum)
testRange = targetWorksheet.Range(colLetter & ":" & colLetter).Select
End Function
Esa función de ejemplo seleccionaría la columna completa (es decir, Rango ("A: A"). Seleccione)
Estas respuestas parecen extrañamente intrincadas. A menos que me falta algo ... si quieres convertir números en letras, puedes almacenarlos todos en una matriz usando un bucle for y luego llamar al número asociado con esa letra de columna. Al igual que
For intloop = 1 To 26
colcheck(intloop) = Chr$(64 + intloop)
For lenloop = 1 To 26
colcheck((intloop * 26) + lenloop) = Chr$(64 + intloop) & Chr$(64 + lenloop)
For terloop = 1 To 26
colcheck((intloop * 676) + (lenloop * 26) + terloop) = Chr$(64 + intloop) & Chr$(64 + lenloop) & Chr$(64 + terloop)
For qualoop = 1 To 26
colcheck((intloop * 17576) + (lenloop * 676) + (terloop * 26) + qualoop) = Chr$(64 + intloop) & Chr$(64 + lenloop) & Chr$(64 + terloop) & Chr$(64 + qualoop)
Next qualoop
Next terloop
Next lenloop
Next intloop
A continuación, utilice colcheck (sucolumnnumberhere) y obtendrá el encabezado de columna asociado con esa letra (es decir, colcheck (703) = AAA
Haha, Lovely, déjame también incluir mi versión del código de stackPusher :). Estamos usando esta funcionalidad en C #. Funciona bien para todos los rangos de Excel .:
public static String ConvertToLiteral(int number)
{
int firstLetter = (((number - 27) / (26 * 26))) % 26;
int middleLetter = ((((number - 1) / 26)) % 26);
int lastLetter = (number % 26);
firstLetter = firstLetter == 0 ? 26 : firstLetter;
middleLetter = middleLetter == 0 ? 26 : middleLetter;
lastLetter = lastLetter == 0 ? 26 : lastLetter;
String returnedString = "";
returnedString = number > 27 * 26 ? (Convert.ToChar(firstLetter + 64).ToString()) : returnedString;
returnedString += number > 26 ? (Convert.ToChar(middleLetter + 64).ToString()) : returnedString;
returnedString += lastLetter >= 0 ? (Convert.ToChar(lastLetter + 64).ToString()) : returnedString;
return returnedString;
}
Para hacer referencia al rango de celdas, puede usar Rango (Celda 1, Celda 2), muestra:
Sub RangeTest()
Dim testRange As Range
Dim targetWorksheet As Worksheet
Set targetWorksheet = Worksheets("MySheetName")
With targetWorksheet
.Cells(5, 10).Select ''selects cell J5 on targetWorksheet
Set testRange = .Range(.Cells(5, 5), .Cells(10, 10))
End With
testRange.Select ''selects range of cells E5:J10 on targetWorksheet
End Sub
Realmente me gusta la función ConvertToLetter de stackPusher como solución. Sin embargo, al trabajar con él noté varios errores que ocurren en entradas muy específicas debido a algunos defectos en las matemáticas. Por ejemplo, ingresar 392 devuelve ''N /', 418 devuelve ''O /', 444 devuelve ''P /', etc.
Rehice la función y el resultado produce la salida correcta para todas las entradas hasta 703 (que es el primer índice de columna de tres letras, AAA).
Function ConvertToLetter2(iCol As Integer) As String
Dim First As Integer
Dim Second As Integer
Dim FirstChar As String
Dim SecondChar As String
First = Int(iCol / 26)
If First = iCol / 26 Then
First = First - 1
End If
If First = 0 Then
FirstChar = ""
Else
FirstChar = Chr(First + 64)
End If
Second = iCol Mod 26
If Second = 0 Then
SecondChar = Chr(26 + 64)
Else
SecondChar = Chr(Second + 64)
End If
ConvertToLetter2 = FirstChar & SecondChar
End Function