【问题标题】:Excel Lookup IP addresses in multiple rangesExcel 查找多个范围内的 IP 地址
【发布时间】:2017-02-13 05:19:27
【问题描述】:

我正在尝试为A 列找到一个公式,该公式将检查B 列中的IP 地址,并查找它是否属于其他两列C 和@987654324 中的2 个地址范围(或之间) @。

例如

     A           B             C             D
+---------+-------------+-------------+------------+
| valid?  | address     | start       | end        |
+---------+-------------+-------------+------------+
| yes     | 10.1.1.5    | 10.1.1.0    | 10.1.1.31  |
| Yes     | 10.1.3.13   | 10.1.2.16   | 10.1.2.31  |
| no      | 10.1.2.7    | 10.1.1.128  | 10.1.1.223 |
| no      | 10.1.1.62   | 10.1.3.0    | 10.1.3.127 |
| yes     | 10.1.1.9    | 10.1.4.0    | 10.1.4.255 |
| no      | 10.1.1.50   | …           | …          |
| yes     | 10.1.1.200  |             |            |
+---------+-------------+-------------+------------+

这应该代表一个具有 4 列标题和 7 行的 Excel 表格作为示例。 我可以使用

进行横向检查
=IF(AND((B3>C3),(B3 < D3)),"yes","no")

它只根据它旁边的范围检查 1 个地址。 我需要一些东西来检查所有范围的 1 IP 地址。即第 1 到 100 行。

这是根据路由检查访问列表规则,看看我是否可以消除冗余规则......但如果我能实现它还有其他用途。 为了让它更加特别,我不能使用 VBA 宏来完成它。

我正在考虑某种索引匹配以在数组中查找它,但不确定如何应用它。我什至不知道它是否可以完成。祝你好运。

【问题讨论】:

  • “我可以使用=IF(AND((B3&gt;C3),(B3 &lt; D3)),"yes","no") 进行横向检查”。真的?!您必须将每个 addressstartend 分解为八位字节并单独评估它们以完成您的要求。我能想到的唯一解决方案可能需要 ~12-14 个辅助列。
  • 是的,最初的横向检查似乎失败了。对于各种地址...

标签: arrays excel-formula match


【解决方案1】:

好的,所以自从我最初发表评论以来,我一直在跟踪这个问题,但没有花时间回答,因为就像 Lana B:

我喜欢一个很好的谜题,但如果我必须继续猜测,这不是很好地利用时间

感谢 Lana 在这个问题上的耐心和努力。

但是,IP 寻址是我经常处理的事情,所以为了我自己的利益,我决定解决这个问题。另外,没有冒犯,但是获取开头的 MIN 和结尾的 MAX 是错误的。这不会考虑 IP 白名单中的空白。正如我所提到的,这需要 15 个辅助列,而我的结果只是 10 分别对应于 InOut。这是一个屏幕截图(每列下方显示的公式):

F2:J2 中的公式为:

=NUMBERVALUE(MID(B2,1,FIND(".",B2)-1))              
=NUMBERVALUE(MID(B2,FIND(".",B2)+1,FIND(".",B2,FIND(".",B2)+1)-1-FIND(".",B2)))         
=NUMBERVALUE(MID(B2,FIND(".",B2,FIND(".",B2)+1)+1,FIND(".",B2,FIND(".",B2,FIND(".",B2)+1)+1)-1-FIND(".",B2,FIND(".",B2)+1)))        
=NUMBERVALUE(MID(B2,FIND(".",B2,FIND(".",B2,FIND(".",B2)+1)+1)+1,LEN(B2)))  
=F2*256^3+G2*256^2+H2*256+I2

是的,我使用公式而不是“文本到列”来自动化将更多信息添加到“活”工作表的过程。

L2:P2 中的公式相同,只是将B2 替换为C2

R2:V2中的公式也一样,只是将B2替换为D2

X2 的公式是

=SUMPRODUCT(--($P$2:$P$8<=J2)*--($V$2:$V$8>=J2))

我还在A 列中复制了您原来的“有效”集,您会看到它与我的结果相符。

【讨论】:

  • 我现在可以看到了。我什至不知道空格是什么,所以我只是解析了数字,你是对的。从技术上讲,对于没有足够详细信息和非常有限的数据样本的简报,我的回答是相关的,我仍然喜欢在这方面工作。但是您的回答很酷,可以解决问题。下班后我会花时间好好思考一下——这对我来说是一个很好的学习。谢谢!
  • @LanaB 是的,我从回答中学到的比提问要多得多。另外,我感谢您为理解问题陈述奠定了基础。如果没有您的答案中的 cmets,我不会尝试。
  • 非常感谢你们 (@LanaB) 对此的意见。抱歉,我无法更清楚地了解这个问题。我的路由表(地址范围)超过 20K 行,我不愿意发布真正的路由(即使它们受到保护),所以我需要进行相当多的检查和纠错。我必须使用带有掩码的查找表才能在正确的八位字节列中正确获取最终 IP 地址。关键是 =F2*256^3+G2*256^2+H2*256+I2 和 =SUMPRODUCT(--($P$2:$P$8=J2)) 进行比较。再次,非常感谢您在这方面的帮助,问候德鲁
  • 归根结底,IP 地址是二进制数。很容易忘记这一点。很高兴你修好了它!请标记正确答案,以便我们帮助他人。
【解决方案2】:

您将需要辅助列。

  • 如图所示组织数据。
  • 将地址、开始和结束以逗号分隔成列(功能区菜单 Data=>Text To Columns)。
  • 在开始/结束部分之上,计算所有拆分文本部分的 MIN FOR START 和 MAX FOR END(即 MIN(K5:K1000)。

公式:

有效性公式 - 复制到单元格 D5,然后向下拖动:

=IF(AND(B6>$I$1,B6<$O$1),"In",
   IF(OR(B6<$I$1,B6>$O$1),"Out",
     IF(B6=$I$1,
       IF(C6<$J$1, "Out",
         IF( C6>$J$1, "In",
           IF( D6<$K$1,  "Out",
             IF( D6>$K$1, "In",
               IF(E6>=$L$1, "In", "Out"))))),
     IF(B6=$O$1,
       IF(C6>$P$1, "Out",
         IF( C6<$P$1, "In",
           IF( D6>$Q$1,  "Out",
             IF( D6<$Q$1, "In",
               IF(E6<=$R$1, "In", "Out") ))))   )
 )))

【讨论】:

  • 感谢您到目前为止的帮助。无论如何,我都是从文本字符串中提取 IP 地址,因此将其分解为八位字节是没有问题的。我使用了一些基本的私有地址作为示例,但如果有意义的话,我的数据混合了公共和私有 IP 地址。这样他们就可以开始了。 10.50..、172.30.. 或 203...
  • 我不确定您所说的最窄范围和最宽范围是什么意思。将范围视为不连续的地址池,并检查地址是否适合其中任何一个。
  • 我已经修改了我的答案以使用任何 IP,并检查地址是否在 MIN(start) 和 MAX(end) 范围内(忘记最严格的,我想多了)。
  • 太棒了。你是个天才。刚刚修复了最小值/最大值中的一些错误校正。并将验证放在F5中向下拖动。
  • @Drew,你引用的那个公式确实做到了,这就是我理解比较应该起作用的方式。您能否修改您的示例以包含您刚才提到的内容?我喜欢一个很好的谜题,但如果我不得不继续猜测,那就不是很好地利用时间:))
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 2013-08-22
  • 2020-11-03
  • 2023-03-28
  • 2012-11-17
  • 2021-12-01
  • 2020-01-03
  • 2017-05-21
相关资源
最近更新 更多