Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 从不完整的数据集创建列表_Excel_Vba - Fatal编程技术网

Excel 从不完整的数据集创建列表

Excel 从不完整的数据集创建列表,excel,vba,Excel,Vba,我有一个电子表格,上面有连接位置的线条。每个位置都有相应的编号,并放置在一个区域(area)中 我需要一个列表节点,其中包含相应的名称,以及区域。由于缺少一些数据,我假设从PARIS开始的一行也将在PARIS结束 From To From To AreaF AreaT 51191 51190 BARUM OVERL PARIS PARIS 51191 60000 BARUM BARDU PARIS

我有一个电子表格,上面有连接位置的线条。每个位置都有相应的编号,并放置在一个区域(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行)

  • 检查AreaF是否包含有效的区域名称,而不是#N/a或0(False)
  • 检查AreaT是否包含有效的区域名称(False)
  • 检查A列为51059的其他行是否包含有效的区域名称(True,第4行)
  • 在新列表中使用该区域
  • 我的问题主要是第三点。我不知道我必须使用什么功能来完成这个任务

    这似乎适用于第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))
    
    谢谢

    对于第一个问题,“关于如何在Excel中实现这一点,有什么提示吗?有什么有用的功能可以派上用场吗?”:
    你的逻辑很好。但是,在每一个单元格中不是长公式,您可能想考虑在VBA中编码这个公式。格式类似于:

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


  • 回答第二个问题,关于哪些函数可以用于点3:对于不使用VBA的东西,可以考虑<强> vLoopUs/St>>函数,以及<强> CordIf < /St>,作为记住的好函数。但是,请再次参阅,了解有关的详细讨论。查找计数等的比较。

    这里有一个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
    
    子节点列表()
    将工作表设置为工作表
    Set sheet=ActiveWorkbook.Sheets(“Sheet1”)
    "第一栏,
    Dim rngA As范围
    设置rngA=[A2:A10]
    作为变量的Dim数据
    数据=rngA
    我想我会坚持多久
    Dim j尽可能长
    "结果,
    Dim myarray()
    重拨myarray(100100)
    Dim datR作为变量
    作为布尔值的Dim存储
    将副本设置为布尔值
    store=False
    重复=错误
    作为整数的Dim cntr
    cntr=0
    '范围列循环
    对于i=LBound(数据,1)到UBound(数据,1)
    “找到第一个结果
    如果为空(myarray(0,0)),则
    “上校有效吗?
    如果不是IsError(rngA(i,5)),那么
    如果rngA(i,5)0或rngA(i,5)“N/A”或非空(rngA(i,5)),则
    “E列是有效的
    store=True
    col=5
    如果结束
    如果结束
    “F列有效吗?
    如果store=False而不是IsError(rngA(i,6)),那么
    如果rngA(i,6)0或rngA(i,6)“N/A”或非空(rngA(i,6)),则
    “E列是有效的
    store=True
    col=6
    如果结束
    如果结束
    '将值存储到结果中
    如果store=True,则
    myarray(0,0)=rngA(i,1)
    myarray(0,1)=rngA(i,col)
    store=False
    如果结束
    其他的
    '结果至少有一个重复值检查
    '循环通过结果
    对于k=LBound(myarray)到UBound(myarray)
    如果数据(i,1)=myarray(k,0),则
    “找到重复的
    重复=真
    退出
    如果结束
    下一个
    如果duplicate=False,则
    '验证数据
    如果不是IsError(rngA(i,5)),那么
    如果rngA(i,5)0或rngA(i,5)“N/A”或非空(rngA(i,5)),则
    “E列是有效的
    store=True
    col=5
    如果结束
    如果结束
    “F列有效吗?
    如果store=False而不是IsError(rngA(i,6)),那么
    如果rngA(i,6)0或rngA(i,6)“N/A”或非空(rngA(i,6)),则
    “E列是有效的
    store=True
    col=6
    如果结束
    如果结束
    '将值存储到结果中
    如果store=True,则
    cntr=cntr+1
    myarray(cntr,0)=rngA(i,1)
    myarray(cntr,1)=rngA(i,col)
    store=False
    如果结束
    如果结束
    重复=错误
    如果结束
    下一个
    弱rngB As范围
    设置rngB=[B2:B10]
    数据=rngB
    '范围列循环
    对于i=LBound(数据,1)到UBound(数据,1)
    “找到第一个结果
    如果为空(myarray(0,0)),则
    “上校有效吗?
    如果不是IsError(rngA(i,5)),那么
    如果rngA(i,5)0或rngA(i,5)“N/A”或非空(rngA(i,5)),则
    “E列是有效的
    store=True
    col=5
    如果结束
    如果结束
    “F列有效吗?
    如果store=False而不是IsError(rngA(i,6)),那么
    如果rngA(i,6)0或rngA(i,6)“N/A”或非空(rngA(i,6)),则
    “E列是有效的
    store=True
    上校=