根据其他列的值更新单元格值

我的朋友需要帮助这个代码

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的列匹配。