1 Pregunta: ¿Cómo puedo hacer que una función Reemplazar en Excel solo se ejecute hasta la primera aparición de una palabra en otro libro de Excel?

pregunta creada en Wed, Apr 10, 2019 12:00 AM

Quiero repasar las palabras de reemplazo en una hoja de trabajo y reemplazar la primera aparición de esas palabras en otro libro. La columna A da una palabra y la columna B da un valor que se usa para reemplazar las ocurrencias de palabras en la columna A.

El código que estoy usando reemplaza todas las apariciones de las palabras en la Columna A a la Columna B.

Sub Sample2()
    Dim NameListWB As Workbook, thisWb As Workbook
    Dim NameListWS As Worksheet, thisWs As Worksheet
    Dim i As Long, lRow As Long

    Set thisWb = ThisWorkbook
    Set thisWs = thisWb.Sheets("Sheet1")

    Set NameListWB = Workbooks.Open("C:document.xlsx")
    Set NameListWS = NameListWB.Worksheets("Sheet2")

    With thisWs
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
        For i = 1 To lRow
            NameListWS.Columns(1).Replace What:=.Range("A" & i).Value, _
                                      Replacement:=.Range("B" & i).Value, _
                                      SearchOrder:=xlByColumns, _
                                      MatchCase:=False
        Next i
        For i = 1 To lRow
            NameListWS.Columns(2).Replace What:=.Range("A" & i).Value, _
                                      Replacement:=.Range("B" & i).Value, _
                                      SearchOrder:=xlByColumns, _
                                      MatchCase:=False
        Next i
        For i = 1 To lRow
            NameListWS.Columns(3).Replace What:=.Range("A" & i).Value, _
                                      Replacement:=.Range("B" & i).Value, _
                                      SearchOrder:=xlByColumns, _
                                      MatchCase:=False
        Next i
        For i = 1 To lRow
            NameListWS.Columns(4).Replace What:=.Range("A" & i).Value, _
                                      Replacement:=.Range("B" & i).Value, _
                                      SearchOrder:=xlByColumns, _
                                      MatchCase:=False
        Next i
        For i = 1 To lRow
            NameListWS.Columns(5).Replace What:=.Range("A" & i).Value, _
                                      Replacement:=.Range("B" & i).Text, _
                                      SearchOrder:=xlByColumns, _
                                      MatchCase:=False
        Next i
        For i = 1 To lRow
            NameListWS.Columns(6).Replace What:=.Range("A" & i).Value, _
                                      Replacement:=.Range("B" & i).Value, _
                                      SearchOrder:=xlByColumns, _
                                      MatchCase:=False
        Next i
        For i = 1 To lRow
            NameListWS.Columns(7).Replace What:=.Range("A" & i).Value, _
                                      Replacement:=.Range("B" & i).Value, _
                                      SearchOrder:=xlByColumns, _
                                      MatchCase:=False
        Next i
        For i = 1 To lRow
            NameListWS.Columns(8).Replace What:=.Range("A" & i).Value, _
                                      Replacement:=.Range("B" & i).Value, _
                                      SearchOrder:=xlByColumns, _
                                      MatchCase:=False
        Next i
    End With
End Sub
    
0
1 Respuestas                              1                         
Sub Sample2()
    Dim NameListWB As Workbook, thisWb As Workbook
    Dim NameListWS As Worksheet, thisWs As Worksheet
    Dim i As Long, lRow As Long, columnNum As Long
    Dim maxColumnToRepalce As Integer
    Dim findRange As Range

    Set thisWb = ThisWorkbook
    Set thisWs = thisWb.Sheets("Sheet1")

    Set NameListWB = Workbooks.Open("C:document.xlsx")
    Set NameListWS = NameListWB.Worksheets("Sheet2")

    maxColumnToRepalce = 8

    With thisWs
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row
        For columnNum = 1 To maxColumnToRepalce
            For i = 1 To lRow
                Set findRange = NameListWS.Columns(columnNum).Find(What:=.Range("A" & i).Value, _
                                      SearchOrder:=xlByColumns, _
                                      after:=.Cells(Columns(columnNum).Rows.Count, columnNum), _
                                      MatchCase:=False)
                If Not findRange Is Nothing Then
                    findRange.Value = .Range("B" & i)
                End If
            Next i
        Next columnNum
    End With
End Sub

Use el método Buscar para encontrar la primera aparición y luego haga el reemplazo. Por cierto, puedes simplificar el código agregando otro bucle.

    
0
2019-04-17 03: 46: 24Z
  1. Recibo un error "Variable de objeto o con la variable de bloque no establecida" en findRange.Value
    2019-04-11 02: 42: 58Z
  2. Lo siento por la respuesta tardía. El error aparece porque no hay un rango coincidente en esa columna. Modifico la respuesta agregando la variable de objeto check. Debería funcionar ahora.
    2019-04-17 03: 50: 31Z
fuente colocada aquí