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

问题描述 投票:1回答:3

我正在尝试运行一些代码来替换具有已定义名称的特定列中的单元格值。另外,我有一个条件,只有当值的前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
excel vba excel-vba named-ranges
3个回答
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时,都不会重新初始化变量。初始化仅在第一次发生。

0
投票

如果我正确理解你的帖子(我怀疑它),我想你想在“Sheet1”和“Sheet2”中循环遍历“C”列。每个以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

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
© www.soinside.com 2019 - 2024. All rights reserved.