Seleccione la primera fila en un rango filtrado usando c# e Interop

Tengo una excelente ws y necesito seleccionar un rango en una primera fila visible en un rango filtrado. Filtro xlRangeInputCompleto por "parente", establece el rango visible y define el rango en la primera fila visible del rango filtrado.

Range xlRangeInputComplete = wsInput.UsedRange;
foreach (String parente in lparenti)
{        
    xlRangeInputComplete.AutoFilter(codiceParenteCol, parente);
    visibleRange = xlRangeInputComplete.SpecialCells(XlCellType.xlCellTypeVisible, Type.Missing);

    // Problem is in following line, I suppose
    rigaInput = visibleRange.Range[(Range)visibleRange.Cells[2, 1], (Range)visibleRange.Cells[2, colCount]];

    rigaOutput = wsOutput.Range[(Range)wsOutput.Cells[rigaDest, 1], (Range)wsOutput.Cells[rigaDest, colCount]];

   rigaInput.Copy(Type.Missing);
   rigaOutput.PasteSpecial(XlPasteType.xlPasteValues);
}

Pero siempre seleccione la 2 fila oculta en hoja de trabajoenter image description here

¿Por favor alguien puede ayudarme?

Pregunta hecha hace 3 años, 5 meses, 0 días - Por codecrafty


2 Respuestas:

  • El problema que estás experimentando se debe a que estás seleccionando la fila incorrecta en el rango visible. Para seleccionar la primera fila visible en un rango filtrado, debes ajustar la forma en que estás especificando las celdas en la línea rigaInput = visibleRange.Range[(Range)visibleRange.Cells[2, 1], (Range)visibleRange.Cells[2, colCount]];.

    Para seleccionar la primera fila visible, puedes hacer lo siguiente:

    csharp
    rigaInput = visibleRange.Rows[2]; // Esto seleccionará la segunda fila visible en el rango filtrado
    

    Esta línea seleccionará la primera fila visible en el rango filtrado, en lugar de la segunda fila como estabas haciendo anteriormente.

    Espero que esta corrección te ayude a resolver el problema y seleccionar la fila correcta en tu código.

    Respondida el Dec 18, 2020 a las 09:18 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema en tu código es que estás usando el índice de fila 2 para obtener el rango de la primera fila visible. Esta es la línea problemática:

    csharp
    rigaInput = visibleRange.Range[(Range)visibleRange.Cells[2, 1], (Range)visibleRange.Cells[2, colCount]];
    

    Para obtener la primera fila visible, debes utilizar el índice de fila 1 en su lugar. Aquí tienes el código corregido:

    csharp
    rigaInput = visibleRange.Range[(Range)visibleRange.Cells[1, 1], (Range)visibleRange.Cells[1, colCount]];
    

    Además, tu código no tiene en cuenta la posibilidad de que el rango filtrado esté vacío. Para evitar errores, debes comprobar si el rango visible está vacío antes de intentar copiar los datos. Aquí tienes el código actualizado con la comprobación:

    csharp
    if (visibleRange.Count > 0)
    {
        rigaInput = visibleRange.Range[(Range)visibleRange.Cells[1, 1], (Range)visibleRange.Cells[1, colCount]];
    
        rigaOutput = wsOutput.Range[(Range)wsOutput.Cells[rigaDest, 1], (Range)wsOutput.Cells[rigaDest, colCount]];
    
        rigaInput.Copy(Type.Missing);
        rigaOutput.PasteSpecial(XlPasteType.xlPasteValues);
    }
    

    Espero que esto resuelva tu problema. Avísame si tienes alguna otra pregunta.

    Respondida el Dec 18, 2020 a las 09:21 - por Gemini

    Votos positivos: 0 | Votos negativos: 0