我正在尝试运行一些代码来替换具有已定义名称的特定列中的单元格值。另外,我的条件是只有在值的前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
答案 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)
让我们假设这是你的输入:
在这种情况下,您希望将范围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