用定义的名称替换特定工作表中的单元格值

时间:2017-11-30 12:54:29

标签: excel vba excel-vba named-ranges

我正在尝试运行一些代码来替换具有已定义名称的特定列中的单元格值。另外,我的条件是只有在值的前9个字符为xxxxxxxxx时才能进行替换。

更确切地说,它应该更改2个特定工作表中的C:C中的值(我不想遍历整个工作簿)。

我不确定为什么代码中没有任何反应(没有错误消息,没有)。

但是,我认为如果我希望代码在这两个特定的工作表中工作,我不应该使用With。我也知道我对Range的使用可能并不完全正确。

Sub ChangeMe()

  Dim cl As Range

  For Each cl In Worksheets("Sheet1").Range("C:C").End(xlUp)
    With Worksheets("Sheet2").Range("C:C").End(xlUp)
      If Left(cl.Value, 9) = "XXXXXXXXX" Then
        cl.Value = ThisWorkbook.Names("MyDefinedName").RefersToRange
      End If
    End With
  Next cl

End Sub

3 个答案:

答案 0 :(得分:1)

回答您的原始问题:

  

我不确定为什么代码中没有任何反应(没有错误消息,没有)。

因为您的工作表值小写 xxxxxxxxx,而您的代码检查大写 XXXXXXXXX,所以没有任何结果。

  

但是,我认为如果我希望代码在这两个特定的工作表中工作,我不应该使用With

实际上,可以使用With多张,我将在下面演示。

  

我也知道我对Range的使用可能并不完全正确。

这是事实。如果您要解决大写问题,则只会更改C1。这是因为.End()适用于单个单元格。如果提供多单元格范围,则使用最左上角的单元格。因此,.Range("C:C").End(xlUp)相当于.Range("C1").End(xlUp),其评估结果为C1

以下内容将回答您更新的问题:

Option Explicit

Public Sub ChangeMe()

  Const l_xxxxxxxxx      As String = "xxxxxxxxx"
  Const l_MyDefinedName  As String = "MyDefinedName"
  Const s_Delimiter      As String = ","
  Const s_WorkSheetNames As String = "Sheet1,Sheet2"
  Const s_ColumnToChange As String = "C:C"

  Dim varWorkSheetName As Variant
  For Each varWorkSheetName In Split(s_WorkSheetNames, s_Delimiter)
    With Worksheets(varWorkSheetName).Range(s_ColumnToChange)
      Dim rngCell As Range
      For Each rngCell In .Resize(.Cells(Rows.Count).End(xlUp).Row)
        With rngCell
          Dim strCellValue As String: strCellValue = .Value2
          If Left(strCellValue, Len(l_xxxxxxxxx)) = l_xxxxxxxxx Then
            .Value2 _
            = Names(l_MyDefinedName).RefersToRange.Value2 _
            & Right$(strCellValue, Len(strCellValue) - Len(l_xxxxxxxxx))
          End If
        End With
      Next rngCell
    End With
  Next varWorkSheetName

End Sub


注意:

  • 使用常量是个好主意,因此所有文字值只输入一次并保持组合在一起。

  • 使用.Value2代替.Value,是访问单元格值的推荐方法,因为它避免了隐式转换,因此速度更快。 (使用.Value有时也会导致问题。)

  • 令人惊讶的是,在VBA中,有充分的理由将变量声明尽可能接近第一次使用变量。两个这样的原因是1)它提高了可读性,2)它简化了未来的重构。请记住,每次遇到Dim时都不会重新初始化变量。初始化仅在第一次发生。

答案 1 :(得分:0)

让我们假设这是你的输入:

enter image description here

在这种情况下,您希望将范围A1:A2中的值更改为C1(命名范围xxxx123)中的值,因为它以xxxx123开头。这是实现它的代码:

Public Sub TestMe()

    Dim myCell          As Range
    Dim myNamedRange    As String

    myNamedRange = "xxxx123"

    For Each myCell In Range("A1:A2")
        If Left(myCell, Len(myNamedRange)) = myNamedRange Then
            myCell.Value = Range(myNamedRange)
        End If
    Next myCell

End Sub

答案 2 :(得分:0)

如果我正确地理解了你的帖子(我怀疑它),我认为你想要遍历专栏" C"在" Sheet1"和" Sheet2"。每个以9 "XXXXXXXXX"开头的单元格都应替换为"MyDefinedName"命名范围中的值。

<强>代码

Option Explicit

Sub ChangeMe()

Dim cl As Range
Dim sht As Worksheet

For Each sht In ThisWorkbook.Sheets
    With sht
        If .Name = "Sheet1" Or .Name = "Sheet2" Then
            For Each cl In .Range("C1:C" & .Cells(.rows.Count, "C").End(xlUp).Row)
                If Left(cl.Value, 9) = "XXXXXXXXX" Then
                    cl.Value = ThisWorkbook.Names("MyDefinedName").RefersToRange
                End If
            Next cl
        End If
    End With
Next sht

End Sub