使用VBA宏查找并替换一个单元格中的部分字符串,其下面的单元格值为

时间:2014-10-25 08:56:37

标签: excel vba excel-vba

我在excel中的一行中有多个单元格,它们都包含HTML。每个单元格都在不同的lang中,但在整个例子中具有相同的URL:(... loc = en-uk)我需要在每个单元格中找到并替换它,但每个单元格的值不同,例如:find“en-uk “在单元格A中,替换为”it-it“,移动到下一个单元格,找到”en-uk“,替换为”es-es“,依此类推,直到达到空单元格。

尝试过以下操作,但只需查找并替换相同的2个单元格中的值:

Dim Findtext As String 
Dim Replacetext As String 

Findtext = Range("B2").Value 
Replacetext = Range("C2").Value 
Cells.Replace What:=Findtext, Replacement:=Replacetext, LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False 

2 个答案:

答案 0 :(得分:1)

您将需要使用Cells而不是Range,并使用Variable" lCol"循环遍历列。 范围(列号,行号)有其限制,因为您使用的是一封信。很难将1添加到C .. C + 1 = D?所以使用Cells(row#,col#)。这样,您可以使用数字而不是字母逐步地通过列或行。在这种情况下,变量是列,因此我们将使用lCol并从1循环到最后一列号。使用原始帖子替换原始源字符串中的文本作为起点。

注意:我不确定原始字符串的位置。另外,如果您知道从原始字符串中替换的是什么,并且发现自己在工作表中看到Row2是完全相同的事情,那么您可以在下面的replaceString语句中设置它。

试一试 - 一旦你拿出所有的评论,它只有几行。

Sub TextReplace()

Dim sheetName As String
Dim findText As String
Dim replaceText As String
Dim lastCol As Long
Dim lCol As Long

'Set the sheetName here, so you don't have to change it multiple times later
sheetName = "Sheet1"

'Check the Last Column with a value in it in Row 3.  Assuming Row 3 has the Replacement text.
lastCol = Sheets(sheetName).Cells(3, Columns.Count).End(xlToLeft).Column

'Assuming you have an original string in a cell.  Range("A1"), in this case.
origString = Sheets(sheetName).Cells(1, 1).Value

'Loop through each Column - lCol is going to increase by 1 each time.  
'Starting on Column B,since Column A contains your original String.
For lCol = 2 To lastCol

'Using Cells(row#, col#), instead of Range(ColLetter, row#) gives you the ability to loop with lCol.
    findText = Sheets(sheetName).Cells(2, lCol).Value
    replaceText = Sheets(sheetName).Cells(3, lCol).Value

    'Put the value from Range("A1") with the text replaced from Row 2 with Row 3's value.
    Sheets(sheetName).Cells(1, lCol) = Replace(origString, findText, replaceText)

Next lCol

End Sub

编辑:更新列以在B上开始,而不是A。

答案 1 :(得分:0)

试试这个(例如第16行和第20行):

Sub ReplaceTextinRow()
Dim lastCol, iter
lastCol = ActiveSheet.UsedRange.Columns.Count 'this approach is not always applicable

For iter = 1 To lastCol
'Cells(16, iter).Offset(4, 0).Value = Replace(Cells(16, iter).Value, "en-us", "en-uk")

Cells(20, iter).value = Replace(Cells(20, iter).value, Cells(20, iter).Offset(-4, 0).Value)
Next
End Sub