我正在尝试运行一些代码来替换具有已定义名称的特定列中的单元格值。另外,我有一个条件,只有当值的前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
回答你原来的问题:
我不确定为什么代码中没有任何反应(没有错误信息,没有)。
没有任何反应,因为您的工作表值是小写的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
有时也会导致问题。)Dim
时,都不会重新初始化变量。初始化仅在第一次发生。如果我正确理解你的帖子(我怀疑它),我想你想在“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
让我们假设这是你的输入:
在这种情况下,您希望将范围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