修改查找和替换的 VBA 代码以循环遍历多个工作表

Posted

技术标签:

【中文标题】修改查找和替换的 VBA 代码以循环遍历多个工作表【英文标题】:Modify VBA code for find and replace to loop through multiple Worksheets 【发布时间】:2017-12-24 22:27:10 【问题描述】:

我有以下代码用于在名为“Front_Wing”的工作表中搜索一系列单元格。它将与工作表中名为“Acronyms”列 A 的值匹配的任何单元格值替换为“Acronyms”列 B 中的单元格值。

我有多个工作表,而不仅仅是“Front_Wing”,所以我想修改此代码以循环访问多个工作表。

Private Sub CommandButton2_Click()

Dim wsR As Worksheet
Dim wsData As Worksheet
Dim rng As Range, rngR As Range
Dim i As Long
Dim rngReplacement
Dim c As Range
Dim curVal As String

Set ws = ThisWorkbook.Sheets("Front_Wing")
Set wsR = ThisWorkbook.Sheets("Acronyms")

i = ws.Rows.Count

With ws
    Set rng = ws.Range("B10", ws.Range("C" & i).End(xlUp))
End With

With wsR
    Set rngR = .Range("A1", .Range("A" & i).End(xlUp))
End With


For Each c In rngR
    curVal = c.Value

    With rng
        .Replace curVal, c.Offset(0, 1).Value, xlWhole, , True

    End With

Next


End Sub

【问题讨论】:

您是否要遍历所有工作表,但仍只查看“首字母缩略词”作为替换值? 不是全部,只有少数几个,即:“Bodywork_Internal”、“Bodywork_Lower”和“Chassis”。但是是的 - 总是在看“首字母缩略词” 由于它是特定的工作表,因此您可以创建一个循环来遍历一组工作表名称(您给出的名称)。那将是最简单的,而不是遍历所有文件并限制几张纸,imo。 是的 Cyril,但这是我正在努力解决的循环代码 我刚刚开始起草答案,但我承认我不是最擅长使用数组。需要对其进行一些测试。 【参考方案1】:
Sub CommandButton2_Click()
   Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        If InStr(0, ws.NAME, "wsName1,wsName2,wsName3") > 0 Then ' wsName1,wsName2,wsName3 = worksheets that you wnat to process
           ProcessYourWorksheet (ws)
        End If
    Next ws
End Sub

Private Sub ProcessYourWorksheet(Worksheet As ws)

End Sub

【讨论】:

嗨,理查德。这不会循环遍历所有工作表吗?我只想指定我在上面评论中提到的少数几个。 For Each wsName In Array("name1, "name2")Set ws = ThisWorkbook.Worksheets(wsName) 怎么样?【参考方案2】:

让我们看看我能不能和你一起挣扎……

Dim i as integer, WSArray as String, LRA as Long, LR as Long

LRA = Sheets("Acronym").Cells(Rows.Count, "A").End(xlUp).Row

WSArray=Array("Front_Wing","Bodywork_Internal","Bodywork_Lower","Chassis")

For i = 1 to LR

LR=Sheets(WSArray).Cells(Rows.Count, "A").End(xlUp).Row

'Edit#01, adding something for if statement:
If Sheets(WSArray).Cells(i,1).Value=Application.Index("A1:A" & LRA,Application.Match(Sheets(WSArray).Cells(i,1),Sheets("Acronym").Range("A1:A" & LRA)) Then

    Sheets(WSArray).Cells(i,1).Value=Application.Index("B1:B" & LRA,Application.Match(Sheets(WSArray).Cells(i,1),Sheets("Acronym").Range("A1:A" & LRA))
    Else
    End If

Next i

我最好的猜测是为工作表指定多个名称。

【讨论】:

【参考方案3】:
Assuming your code runs, this should iterate through the worksheets
Private Sub CommandButton2_Click()

Dim wsR As Worksheet
Dim ws As Worksheet
Dim rng As Range, rngR As Range
Dim i As Long
Dim rngReplacement
Dim c As Range
Dim curVal As String
'Since wsR is where you get your comparison values, declare it. 

Set wsR = ThisWorkbook.Sheets("Acronyms")

'This loop will go through each worksheet that is not "Acronym" the rest is the same code as yours. 

For Each ws in Activeworkbook.worksheets

if ws.name <> "Acronyms" then
i = ws.Rows.Count

With wsR
    Set rngR = .Range("A1", .Range("A" & i).End(xlUp))
End With

With ws
    Set rng = ws.Range("B10", ws.Range("C" & i).End(xlUp))
End With

For Each c In rngR
    curVal = c.Value

    With rng
    .Replace curVal, c.Offset(0, 1).Value, xlWhole, , True
End With

Next
end if

next ws
    End Sub

【讨论】:

【参考方案4】:

这是一种使用 Select Case 的方法,因此只需列出您希望宏覆盖的工作表即可。

Private Sub CommandButton2_Click()

Dim wsR As Worksheet
Dim ws As Worksheet
Dim rng As Range, rngR As Range
Dim rngReplacement
Dim c As Range
Dim curVal As String

Set wsR = ThisWorkbook.Sheets("Acronyms")

With wsR
    Set rngR = .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
End With

For Each ws In Worksheets
    Select Case ws.Name
        Case "Bodywork_Internal", "Bodywork_Lower", "Chassis"
            With ws
                Set rng = .Range("B10", .Range("C" & .Rows.Count).End(xlUp))
            End With
            For Each c In rngR
                curVal = c.Value
                With rng
                    .Replace curVal, c.Offset(0, 1).Value, xlWhole, , True
                End With
            Next c
    End Select
Next ws

End Sub

【讨论】:

略有更新以缩短一点。请您接受答案吗?网站就是这样运作的,但您似乎还没有这样做。

以上是关于修改查找和替换的 VBA 代码以循环遍历多个工作表的主要内容,如果未能解决你的问题,请参考以下文章

vba中怎么遍历单元格中所有字符串

使用 VBA 复制和修改连接

使用 VBA 循环遍历工作表中的每个打印页面

我想知道如何运行 vba 脚本来查找和替换仅在一张工作表中而不是整个工作组中的多个单词?

VBA循环遍历数组

VBA 工作薄中所有工作表怎么用代码表示