1

我有一个电子表格,其中有连接位置的线条。每个地方都有一个对应的编号,并被放置在一个区域(area)中。

我想要一个Node带有相应Name, 和的列表Area。由于缺少一些数据,我假设从 开始的行PARIS也会以PARIS.

From    To          From    To      AreaF   AreaT
51191   51190       BARUM   OVERL   PARIS   PARIS
51191   60000       BARUM   BARDU   PARIS   0
51059   51074       FOLLO   DYRLO   #N/A    #N/A
51059   51070       FOLLO   DYRLO   #N/A    BERG
51059   50795       FOLLO   NYSTU   #N/A    #N/A
51059   59001       FOLLO   VEVEL   #N/A    #N/A
51059   50362       FOLLO   MYRVO   #N/A    #N/A
51059   50363       FOLLO   MYRVO   #N/A    #N/A
51059   50812       FOLLO   NORDB   #N/A    #N/A

我想要的是:

Node    Name    Area
50362   MYRVO   BERG
50363   MYRVO   BERG
50795   NYSTU   BERG
50812   NORDB   BERG
51059   FOLLO   BERG
51070   DYRLO   BERG
51074   DYRLO   BERG
51190   OVERL   PARIS
51191   BARUM   PARIS
59001   VEVEL   BERG
60000   BARDU   PARIS

关于如何在 Excel 中完成此操作的任何提示?任何有用的功能可能会派上用场?

我能想到的最好的逻辑是:

(例如对于第 3 行)

  1. 检查 AreaF 是否包含有效的区域名称,而不是 #N/A 或 0(假)
  2. 检查 AreaT 是否包含有效的区域名称 (False)
  3. 检查 A 列为 51059 的其他行是否包含 Valie 区域名称(True,第 4 行)
  4. 在新列表中使用该区域

我的问题主要是第3点。我无法弄清楚我必须使用什么功能等来完成这个。

这似乎适用于第 1 点和第 2 点:

=IF(ISNA(F2);IF(ISNA(G2);$M$2;IF(G2=0;$M$2;G2));IF(F2=0;IF(ISNA(G2);$M$2;IF(G2=0;$M$2;G2));F2))

谢谢!

4

2 回答 2

1

对于第一个问题,“关于如何在 Excel 中完成此操作的任何提示?任何可能派上用场的有用功能? ”:
您的逻辑可以正常工作。但是,您可能需要考虑在 VBA 中编码,而不是每个单元格中的长公式。格式类似于:

  1. 遍历所有节点
    • 使用For...Next循环遍历节点。
  2. 如果尚未看到该节点,请将其添加到列表中。
    • 例如,使用Range.Find方法检查是否已找到节点。(有关.FindCOUNTIF等的良好讨论,请参见此处)
  3. 在该节点上进行计算。
    • 检查区域 T 或区域 F 是否包含有效名称。
    • 将该区域用于节点。

要回答关于第 3 点可以使用哪些函数的第二个问题:对于不使用 VBA 的东西,您可能会考虑VLOOKUP函数以及COUNTIF,作为要牢记的好函数。但同样,请参阅此处以获得关于.FindCOUNTIF等的良好讨论。

于 2013-10-01T18:52:30.960 回答
1

这是一个循环遍历范围的 VBA 方法,本质上是用蛮力进行评估。

我相信它可以被清理并提高效率。应该让你开始。

Sub NodeList()
    Dim sheet As Worksheet
    Set sheet = ActiveWorkbook.Sheets("Sheet1")

    'First Column
    Dim rngA As Range
    Set rngA = [A2:A10]
    Dim datA As Variant
    datA = rngA
    Dim i As Long
    Dim j As Long

    'Results
    Dim myarray()
    ReDim myarray(100, 100)
    Dim datR As Variant
    Dim store As Boolean
    Dim duplicate As Boolean
    store = False
    duplicate = False
    Dim cntr As Integer
    cntr = 0

    'Range Column loop
    For i = LBound(datA, 1) To UBound(datA, 1)
        'Find first result
        If IsEmpty(myarray(0, 0)) Then
            'Is Col E valid?
            If Not IsError(rngA(i, 5)) Then
                If rngA(i, 5) <> 0 Or rngA(i, 5) <> "#N/A" Or Not IsEmpty(rngA(i, 5)) Then
                    'Col E is valid
                    store = True
                    col = 5
                End If
            End If
            'Is Col F valid?
            If store = False And Not IsError(rngA(i, 6)) Then
                If rngA(i, 6) <> 0 Or rngA(i, 6) <> "#N/A" Or Not IsEmpty(rngA(i, 6)) Then
                    'Col E is valid
                    store = True
                    col = 6
                End If
            End If

            'Store value to results
            If store = True Then
                myarray(0, 0) = rngA(i, 1)
                myarray(0, 1) = rngA(i, col)
                store = False
            End If
        Else
            'Results has at least one value check for duplicate
            'Loop thru results
            For k = LBound(myarray) To UBound(myarray)
                If datA(i, 1) = myarray(k, 0) Then
                    ' duplicate found
                    duplicate = True
                    Exit For
                End If
            Next

            If duplicate = False Then
                'validate data
                If Not IsError(rngA(i, 5)) Then
                    If rngA(i, 5) <> 0 Or rngA(i, 5) <> "#N/A" Or Not IsEmpty(rngA(i, 5)) Then
                        'Col E is valid
                        store = True
                        col = 5
                    End If
                End If
                'Is Col F valid?
                If store = False And Not IsError(rngA(i, 6)) Then
                    If rngA(i, 6) <> 0 Or rngA(i, 6) <> "#N/A" Or Not IsEmpty(rngA(i, 6)) Then
                        'Col E is valid
                        store = True
                        col = 6
                    End If
                End If

                'Store value to results
                If store = True Then
                    cntr = cntr + 1
                    myarray(cntr, 0) = rngA(i, 1)
                    myarray(cntr, 1) = rngA(i, col)
                    store = False
                End If
            End If
            duplicate = False
        End If
    Next


    Dim rngB As Range
    Set rngB = [B2:B10]
    datA = rngB

    'Range Column loop
    For i = LBound(datA, 1) To UBound(datA, 1)
        'Find first result
        If IsEmpty(myarray(0, 0)) Then
            'Is Col E valid?
            If Not IsError(rngA(i, 5)) Then
                If rngA(i, 5) <> 0 Or rngA(i, 5) <> "#N/A" Or Not IsEmpty(rngA(i, 5)) Then
                    'Col E is valid
                    store = True
                    col = 5
                End If
            End If
            'Is Col F valid?
            If store = False And Not IsError(rngA(i, 6)) Then
                If rngA(i, 6) <> 0 Or rngA(i, 6) <> "#N/A" Or Not IsEmpty(rngA(i, 6)) Then
                    'Col E is valid
                    store = True
                    col = 6
                End If
            End If

            'Store value to results
            If store = True Then
                myarray(0, 0) = rngA(i, 2)
                myarray(0, 1) = rngA(i, col)
                store = False
            End If
        Else
            'Results has at least one value check for duplicate
            'Loop thru results
            For k = LBound(myarray) To UBound(myarray)
                If datA(i, 1) = myarray(k, 0) Then
                    ' duplicate found
                    duplicate = True
                    Exit For
                End If
            Next

            If duplicate = False Then
                'validate data
                If Not IsError(rngA(i, 5)) Then
                    If rngA(i, 5) <> 0 Or rngA(i, 5) <> "#N/A" Or Not IsEmpty(rngA(i, 5)) Then
                        'Col E is valid
                        store = True
                        col = 5
                    End If
                End If
                'Is Col F valid?
                If store = False And Not IsError(rngA(i, 6)) Then
                    If rngA(i, 6) <> 0 Or rngA(i, 6) <> "#N/A" Or Not IsEmpty(rngA(i, 6)) Then
                        'Col E is valid
                        store = True
                        col = 6
                    End If
                End If

                If store = False Then
                    'Both are invalid
                    'look in col 'A' and reloop thru value to find another match

                    For p = LBound(myarray) To UBound(myarray)
                        If rngA(i, 1) = myarray(p, 0) Then
                            cntr = cntr + 1
                            myarray(cntr, 0) = rngA(i, 2)
                            myarray(cntr, 1) = myarray(p, 1)
                            store = False
                            Exit For
                        End If
                    Next

                End If

                'Store value to results
                If store = True Then
                    cntr = cntr + 1
                    myarray(cntr, 0) = rngA(i, 2)
                    myarray(cntr, 1) = rngA(i, col)
                    store = False
                End If
            End If
            duplicate = False
        End If
    Next

    For i = LBound(myarray) To UBound(myarray)
        Range("H" & i + 1).Value = myarray(i, 0)
        Range("I" & i + 1).Value = myarray(i, 1)
    Next
End Sub

输出如下所示:

在此处输入图像描述

我没有添加名称,但您可以通过修改数组来做到这一点。

于 2013-10-01T20:04:11.513 回答