Excel 从不完整的数据集创建列表
我有一个电子表格,上面有连接位置的线条。每个位置都有相应的编号,并放置在一个区域(area)中 我需要一个列表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
节点
,其中包含相应的名称
,以及区域
。由于缺少一些数据,我假设从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行)
=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方法检查是否已找到节点。(有关.Find与COUNTIF等的详细讨论,请参阅。)
- 检查区域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
上校=