VBA使有向图无向

时间:2017-05-02 00:01:26

标签: excel vba excel-vba directed-graph undirected-graph

我有一个excel电子表格,其中包含2列,用于指示2个顶点(服务器)之间的关系。不幸的是,列太多了,所以有A,B和B,A条。我需要摆脱那些冗余的条目。有人可以提供功能吗?

示例:

enter image description here

更喜欢将输出分开,但如果它修改了相同的输入列,则表示没问题。

1 个答案:

答案 0 :(得分:1)

通过回答这个问题,我希望它能为您提供一个理解基础的起点或想法,并在下次提出您的半工作解决方案。

没有VBA:

您可以比较字符串。在小区D2中 - &gt; =IF(A2<B2,A2,B2)为您提供两个字母中的第一个字母。同样的事情发生在E2 - &gt; =IF(A2<B2,B2,A2)。将这些公式复制到最后,然后将它们复制/粘贴为值,然后从数据功能区中删除重复项。

使用VBA:

您可以再次使用比较对字母重新排序,然后将它们连接在两者之间。然后检查它们是否存在于您的字典中,如果它们不存在则将它们添加到字典中。您可以将它们写入流程中的工作表单元格,也可以稍后从字典中提取它们:

Sub removeDub()
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
Dim i As Long
Dim s1, s2 As String
'Dim a() As String

With Sheets("Sheet1")
For i = 2 To .Range("A1").End(xlDown).Row
    If Cells(i, 1).Value < Cells(i, 2).Value Then
        s1 = .Cells(i, 1).Value
        s2 = .Cells(i, 2).Value
    Else
        s1 = .Cells(i, 2).Value
        s2 = .Cells(i, 1).Value
    End If

    If Not dict.Exists(s1 & "," & s2) Then
        dict.Add s1 & "," & s2, 1
        .Range("D" & .Cells.Rows.Count).End(xlUp).Offset(1) = s1
        .Range("E" & .Cells.Rows.Count).End(xlUp).Offset(1) = s2
    End If
Next i

'For Each Key In dict.Keys
'    a = Split(Key, ",")
'    .Range("D" & .Cells.Rows.Count).End(xlUp).Offset(1) = a(0)
'    .Range("E" & .Cells.Rows.Count).End(xlUp).Offset(1) = a(1)
'Next Key
End With

End Sub