根据其他列的值更新单元格值
我的朋友需要帮助这个代码
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中的对应行将input值为B.
您可以使用.Find()
方法 ,然后使用.Offset
属性将值input到右侧的单元格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
这只能find在给定范围内匹配定义值的第一个string。 如果范围内有多个匹配项,则需要将其合并到一个循环中。
编辑:再次阅读你的问题,这听起来像列内将有多个值。 在这种情况下,将范围input到数组中然后在数组中search任何匹配的值可能会更容易。
您可以在循环时将值input到单元格中。
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秒。 即使closures屏幕更新,也只能减less到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
遵循相同的testing标准,上述运行需要0.13秒。
编辑:说明
lrow = Cells(Rows.Count, 1).End(xlUp).Row
这将find列A中的最后一行Rows.Count
找出工作表上有多less行, 1
表示列.End(xlUp)
从列的最后一行findA列。 通过执行此操作,我们知道列A中的最后一行。
Range(Cells(1, 1), Cells(lrow, 2))
然后我们使用最后一个已知行创build带有值的数组。 Cells(1,1)
代表Range("A1")
,然后Cells(lrow,2)
将代表在A列内有数据的最后一行,但是也将列B也分配给数组(这样我们就可以填充具有分配给列B的值的数组)。 它实际上相当于Range("A1:B60480")
。
尝试这个?
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 Cells(i, 1).Value = "F" Then Cells(i, 2).Value = "B" End If
编辑 :虽然上面的答案已被接受,我回来,并意识到types不匹配错误来自哪里。 我忘了检查行上的列号lastrow = Cells(Rows.Count, 2).End(xlUp).Row
与正在search的列匹配。