excel - una - seleccionar rango variable vba




Crear rangos de Excel utilizando los números de columna en vba? (6)

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

¿Cómo es posible crear un rango en vba usando el número de columna, en lugar de letra?


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


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)

Fuente: http://support.microsoft.com/kb/833402


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


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




vba