我的朋友需要帮助这个代码
Sub autoUpdate()
Dim R As String
Dim A As String
Dim G As String
Dim myrange As Range
Dim givenrng As Range
Set myrange = Sheets("Sheet1").Cells(2, 2)
Set givenrng = Sheets("Sheet1").Cells(2, 3)
'If Worksheets("Project Details").Range("L") = R And Worksheets("Project Detials").Range("M") = R Then
'Worksheets("Project Details").Range("K") = R
If myrange.Value = "F" Then
givenrng.Value = "B"
End sub
不是将myrange作为特定单元格而是可以将其更改为列范围吗?例如,如果列A中的任何单元格为F,则列B中的相应行将输入值为B.
答案 0 :(得分:1)
您可以使用.Find()
Method,然后使用.Offset
Property在右侧的单元格1列中输入值。
Option Explicit
Sub findValue()
Dim rngCol As Range, rngFound As Range
Set rngCol = Columns("A:A")
Set rngFound = rngCol.Find(What:="F", LookIn:=xlValues)
If Not rngFound Is Nothing Then
rngFound.Offset(0, 1).Value = "B"
End If
End Sub
这只找到在给定范围内与定义值匹配的第一个字符串。如果范围内有多个匹配项,则需要将其合并到循环中。
编辑:再次阅读您的问题后,听起来列中会有多个值。在这种情况下,可能更容易将您的范围输入数组,然后在数组中搜索任何匹配的值。
您可以在循环播放时将值输入到单元格中。
Sub arrayFindValue2()
Dim rngValues() As Variant
Dim lrow As Long, i As Long
lrow = Cells(Rows.Count, 1).End(xlUp).Row
rngValues = Range(Cells(1, 1), Cells(lrow, 2))
For i = 1 To UBound(rngValues, 1)
If rngValues(i, 1) = "F" Then
Cells(i, 2).Value = "B"
End If
Next i
End Sub
在60,480行数据上,有6048个匹配,上面需要0.84秒才能运行。即使关闭屏幕更新,这只会减少到0.80秒。
或者您可以将值分配给数组,然后在末尾用数组的内容填充工作表。
Sub arrayFindValue()
Dim rngValues() As Variant
Dim lrow As Long, i As Long
lrow = Cells(Rows.Count, 1).End(xlUp).Row
rngValues = Range(Cells(1, 1), Cells(lrow, 2))
For i = 1 To UBound(rngValues, 1)
If rngValues(i, 1) = "F" Then
rngValues(i, 2) = "B"
End If
Next i
Range("A1").Resize(UBound(rngValues, 1), 2).Value = rngValues
End Sub
遵循相同的测试标准,上述时间为0.13秒。
编辑:说明
lrow = Cells(Rows.Count, 1).End(xlUp).Row
这将找到A列中的最后一行。Rows.Count
找出工作表上有多少行,而1
代表A列。.End(xlUp)
去在A列中,从找到的底行开始。通过执行此操作,我们知道在A列中包含数据的最后一行。
Range(Cells(1, 1), Cells(lrow, 2))
然后我们使用最后一个已知行来创建带有值的数组。 Cells(1,1)
表示Range("A1")
,然后Cells(lrow,2)
将表示在A列中包含数据的最后一行,但也将列B分配给数组(以便我们可以使用值填充数组)分配到B列)。它实际上等同于Range("A1:B60480")
。
答案 1 :(得分:0)
试试这个?
Dim lastrow as Long
lastrow = Cells(Rows.Count, 2).End(xlUp).Row
For i = 1 to lastrow
If Cells(i, 2).Value = "F" Then
Cells(i, 3).Value = "B"
End If
Next i
因此,从工作表的第一行到包含数据的最后一行工作表,如果B列中的单元格包含" F",则C列将显示" B" (因为那些是您朋友代码中的单元格当前显示的列。)
虽然如果它特别是从A列到B列,您只需将If更改为:
If Cells(i, 1).Value = "F" Then
Cells(i, 2).Value = "B"
End If
编辑:虽然上面的答案已被接受,但我回过头来意识到了类型不匹配错误的来源。我忘了检查lastrow = Cells(Rows.Count, 2).End(xlUp).Row
行上的列号是否与正在搜索的列匹配。