Saltar a la celda en la columna seleccionada y la fila que contiene el valor en otra columna

Estoy tratando de escribir una macro para saltar a una celda en Excel, donde seleccionaría una columna específica resaltándola y luego saltaría a la fila que contiene un valor buscado de una columna diferente. Sé cómo hacer la macro y el acceso directo, es solo el código vba con el que estoy luchando. Encontré que esta macro solo necesitaba saber cómo cambiarla para que salte a la fila que contiene un valor buscado en una columna específica, y no al número de fila de la entrada.

Sub JumpTo()
'Description: Select the specified row or column
  'If row is specified, active column is used
  'If column is specified, active row is used
'Source: https://www.excelcampus.com/vba/jump-to-row-column-keyboard-shortcut

Dim sResult As String

  On Error Resume Next 'Blanket error handling
  
  'Display inputbox to prompt user for row/column
  sResult = InputBox("Type a row number or column letter and press Enter.", "Jump To...")
  
  If IsNumeric(sResult) Then 'Select row
    Cells(sResult, ActiveCell.Column).Select
  Else 'Select column
    Cells(ActiveCell.Row, sResult).Select
  End If

End Sub
Answer

Varios consejos (además de los comentarios en el ejemplo de código)

  • Úselo Option Explicitpara forzar declaraciones de tipo e intentar ser explícito. Ejemplo: Dim r As Variantaunque un implícito Dim rsería suficiente.

  • Califique completamente la(s) referencia(s) de su hoja . Ejemplo: Cellssolo se referiría a cualquier hoja actualmente activa que no necesita ser la que tiene el foco. Prefijo, por ejemplo, por ws.Cells(r, "A")...o use un prefijo de punto dentro de una estructura With ws- End With.

  • Declare el tipo de hoja exacto específicamente. Ejemplo: como se refiere a las hojas de trabajo, no codifique Dim ws As Sheetcon formas también. Restringir el campo a través de Dim ws As Worksheet.

  • Consulte la hoja deseada ya sea a través de su nombre de hoja tabular como, por ejemplo , Set ws = ThisWorkbook.Worksheets("Sheet1")o el Código de la hoja del proyecto (Nombre) como se indica en la ventana de propiedades del Editor de VB, por ejemplo, Set ws = Sheet1como nombre de variable (sin comillas).

  • Evite On Error Resume Nextsin un manejo de errores específico y un conocimiento exacto de lo que está haciendo. Encontrará numerosos ejemplos en SO.

  • Como norma general evitar .Selecty en la .Activatemedida de lo posible, si no se quiere o se necesita expresamente (como en este ejemplo). Consulte Cómo evitar el uso de select en Excel VBA .

ejemplo de código

  • ad 1+2) Tenga en cuenta que InputBox(al contrario de Application.InputBox) solo devuelve resultados de cadena. Entonces, este código de ejemplo simple asume valores de cadena o entradas de cadena numérica que se cambiarían a dobles para permitir hallazgos.

  • anuncio 3) Solo una forma de encontrar valores coincidentes (sin distinción entre mayúsculas y minúsculas) es mediante Application.Match. Alternativamente, puede aplicar un Range.Findcomo se propone en el comentario o recorrer una matriz de campos de datos de 2 dim uno por uno, etc.

  • El Application.Matchenfoque (que no pretende ser el mejor) tiene la ventaja de permitir una comprobación positiva sencilla de resultados de fila válidosIsNumeric mediante la detección/ignorancia Error 2042de valores (para evitar errores eventuales al intentar utilizar un resultado de error)... Alternativamente, usted podría verificar negativamente a través de If Not IsError(r) Then.

Option Explicit                                 ' Module head: Force type declarations
Sub JumpTo()
'0) Fully qualify sheet reference
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")  ' << change to your needs

'1) Display inputbox to prompt user for value input
    Dim srch As Variant                          ' provide for possible change to double   
    srch = InputBox("Type a value to be searched in column A and press Enter.", "Jump To...")
'2) Change numeric search string to double
    If IsNumeric(srch) Then srch = CDbl(srch)    
'3) Get row number of search value and go to found cell
    With ws                                      ' refer to worksheet object ws
        'a) Execute Match                        ' case independant
        Dim r As Variant                         ' needs Variant for IsNumeric check!
        r = Application.Match(srch, .Columns("A"), 0)
        'b) Check if Match returns a valid row number
        If IsNumeric(r) Then                     ' ignores error 2042 if not found
            .Cells(r, "A").Select                ' or: .Cells(r, 1).Select
        Else
            MsgBox "Value " & srch & " not found!", vbExclamation, "Error 2042"
        End If
    End With
End Sub