【问题标题】:VBA in excel move value between columnsexcel中的VBA在列之间移动值
【发布时间】:2015-04-20 13:00:27
【问题描述】:

我有填充了两列的 excel 文件。首先,包括数字,第二个字母。我想用条件按字母填写第三列: 如果相同的数字在第二列的任何单元格中都有“A”,那么在第三列中为该数字的每个单元格填写字母 A ELSEIF "B" THEN B 在第三列... 优先级 A>B>C>D

【问题讨论】:

  • 试试COUNTIF函数

标签: vba loops excel conditional-statements


【解决方案1】:

使用这个

Sub test()
    Dim Dic As Object: Set Dic = CreateObject("Scripting.Dictionary")
    Dim Cl As Range, i&
    i = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
    For Each Cl In ActiveSheet.Range("A1:A" & i)
        If Not Dic.exists(Cl.Value & Cl.Offset(, 1).Value) Then
            Dic.Add (Cl.Value & Cl.Offset(, 1).Value), Cl.Row
        End If
    Next
    For Each Cl In ActiveSheet.Range("A1:A" & i)
        If Dic.exists(Cl.Value & "A") Then
            Cl.Offset(, 2).Value = "A"
        ElseIf Dic.exists(Cl.Value & "B") Then
            Cl.Offset(, 2).Value = "B"
        ElseIf Dic.exists(Cl.Value & "C") Then
            Cl.Offset(, 2).Value = "C"
        ElseIf Dic.exists(Cl.Value & "D") Then
            Cl.Offset(, 2).Value = "D"
        End If
    Next
End Sub

输出结果是

根据新要求进行了更新

使用这个

Sub test()
    Dim Dic As Object: Set Dic = CreateObject("Scripting.Dictionary")
    Dim Cl As Range, i&, key As Variant
    i = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
    For Each Cl In ActiveSheet.Range("A1:A" & i)
        If Not Dic.exists(Cl.Value & Cl.Offset(, 1).Value) Then
            Dic.Add (Cl.Value & Cl.Offset(, 1).Value), Cl.Row
        End If
    Next
    For Each Cl In ActiveSheet.Range("A1:A" & i)
        For Each key In Dic
            If UCase(key) Like Cl.Value & "*A*" Then
                Cl.Offset(, 2).Value = Mid(key, 2, 100)
                Exit For
            End If
        Next
        If Cl.Offset(, 2).Value = Empty Then
            For Each key In Dic
                If UCase(key) Like Cl.Value & "*B*" Then
                    Cl.Offset(, 2).Value = Mid(key, 2, 100)
                    Exit For
                End If
            Next
        End If
        If Cl.Offset(, 2).Value = Empty Then
            For Each key In Dic
                If UCase(key) Like Cl.Value & "*C*" Then
                    Cl.Offset(, 2).Value = Mid(key, 2, 100)
                    Exit For
                End If
            Next
        End If
        If Cl.Offset(, 2).Value = Empty Then
            For Each key In Dic
                If UCase(key) Like Cl.Value & "*D*" Then
                    Cl.Offset(, 2).Value = Mid(key, 2, 100)
                    Exit For
                End If
            Next
        End If
    Next
End Sub

输出结果

【讨论】:

  • 完美,这正是我需要的,但我还有另一个问题。如果在“B”列中将是字符串,例如 ABA、BBB、CCC 等,并且想要相同的结果,如果 ABA 包含“A”那么 ABA。如何改变这个“存在”的方法?
  • 我的意思是类似的情况,但“B”列包含单个字母(A、B、C、D)句子,例如“我的名字是 mac”。如果在 B 列中是“名称是”,则填写“C”列
  • @mac 如果我理解正确,请使用类似的内容(请参阅更新后的帖子)。在这种情况下“存在”不适用
  • 好的,非常感谢。我完全是 VBA 的初学者,你对我很有帮助
【解决方案2】:

如果你可以使用公式而不是 VBA,那么下面的公式就可以了:

=IF(COUNTIFS(A:A,A2,B:B,"A")>0,"A",IF(COUNTIFS(A:A,A2,B:B,"B")>0,"B",IF(COUNTIFS(A:A,A2,B:B,"C")>0,"C","D")))

在这个公式中,COUNTIF 函数结合了 2 个条件并计算这些条件是否满足,则 IF 函数正在向单元格输入相关字母。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    相关资源
    最近更新 更多