VBA - 循环选项卡,按名称查找标题,替换值

时间:2018-03-23 19:35:20

标签: vba for-loop

我想在工作簿中有4个标签

  • 循环,
  • 找到标题" ClaimName",如果它存在的话,它位于不同的位置,
  • 然后替换值" Claim1Score"," Claim2Score"," Claim3Score"," Claim4Score"与"声明1","声明2" ......等等。

我对vba生锈了。

我发现了类似的问题,但似乎无法让他们解决问题。

3 个答案:

答案 0 :(得分:1)

一个不优雅但有效的解决方案就是检查每个选项卡上每个条目的每个范围 - 这不是很好但是它会起作用。我已经给你下面的组件拼凑在一起,这是一个学习经验!

如果它们不是很大,它将足够快超过4个标签,但您可以通过仅检查相关范围来改进解决方案,例如只是标题行而不是整个表格。

这里有几个不同的组件:

  • 循环显示标签:

    Dim TempWs as Worksheet
    For Each TempWs in ThisWorkbook.Worksheets
    
        [ Code ]
    
    Next TempWs 
    
  • 在每个标签中检查“ClaimName” - 这取代上面的“[Code]”:

    Dim TempRng as Range
    For Each TempRng in TempWs.UsedRange
    
         If TempRng.Value = "ClaimName" Then
    
              [More code]
    
         End If
    
    Next TempRng
    
  • 替换文字 - 这取代上面的“[更多代码]”

    Dim TempRng2 as Range
    For Each TempRng2 in TempWs.UsedRange
    
         If TempRng2.Value = "Claim1Score" Then
    
              TempRng2.Value = "Claim 1"
    
         End If
    
    Next TempRng2
    
    Exit For 'To abandon checking for 'ClaimName' as this is no longer required
    

你需要一个超出“[更多代码]”for循环的循环,然后在[更多代码] For循环内部,你使用下面的代码来构造输入和输出。因此,对于您处理的索赔数量,您可以参数化数字,然后在您进行替换后退出。例如。

    Dim i As Integer
    For i = 1 to 10

          If...... = "Claim" & i & "Score"

                  = "Claim " & i

          End If

    Next i

答案 1 :(得分:1)

此字符串上的代码非常有用。我最终做了以下事情:

    'find "ClaimName" and replace values to match template format
    Dim sh2 As Worksheet, R As Range
     For Each sh2 In b1.Sheets
      Set R = sh2.Cells.Find("ClaimName", , xlValues, xlWhole)
     If R Is Nothing Then
         GoTo Nx
     Else
         sh2.Range(R, sh2.Cells(sh2.Rows.Count, R.Column).End(xlUp)).Replace "Score", "", xlPart
         sh2.Range(R, sh2.Cells(sh2.Rows.Count, R.Column).End(xlUp)).Replace "Claim", "Claim ", xlPart
     End If
Nx:
     Next sh2

如果有什么东西可以让它更优雅,请告诉我。

答案 2 :(得分:0)

如果你没有很多单元格(代码中的范围A1:Z1),你可以遍历它们:

Sub replaceClaim()
    For Each ws In ActiveWorkbook.Worksheets
        For Each cel In ws.Range("A1:Z1")
            If cel.Text Like "Claim#Score" Then
                cel.Value = "Claim " + Mid(cel.Text, 6, 1)
            ElseIf cel.Text Like "Claim##Score" Then
                cel.Value = "Claim " + Mid(cel.Text, 6, 2)
            End If
        Next cel
    Next ws
End Sub

适用于“Claim0Score”至“Claim99Score”。否则你必须修改: - )