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

时间:2015-08-05 07:08:19

标签: excel vba

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

    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.

2 个答案:

答案 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行上的列号是否与正在搜索的列匹配。