web-dev-qa-db-ja.com

式を使用してIPアドレスのオクテットを分離する

数式を使用してIPアドレスのオクテットを分離したいと思います。

代替&検索などを試しましたが、理解できません。

Cell A1とCellB1から始めるだけで、達成したいことの例:

10.17.9.192 | 192.168.0.1
10          | 192
17          | 168
9           | 0
192         | 1
7
Luke Wolfenden

ここにあなたが必要とする4つの公式があります

A2:=LEFT(A1,FIND(".",A1)-1)
A3:=MID(A1,FIND(".",A1)+1,FIND(".",A1,FIND(".",A1)+1)-FIND(".",A1)-1)
A4:=MID(A1,FIND(".",A1,FIND(".",A1)+1)+1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)-(FIND(".",A1,FIND(".",A1)+1)+1))
A5:=MID(A1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)+1,LEN(A1)-FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1))

FIND関数には、startという名前の3番目の引数があります。したがって、2番目の小数点を見つけるには、小数点を見つけますが、最初の小数点がプラス1であるところから始めます。こんな感じ

=FIND(".",A1,4)

最初の小数点が位置3にあるため、4から開始します。しかし、それがわからないため、「4」を計算する必要があります。

=FIND(".",A1,FIND(".",A1)+1)

ここで4を取得するために、最初の小数を見つけて1を追加します。2番目を見つけるのはそれほど悪くありません。しかし、3番目を見つけるには、別のレベルに進む必要があります。そして4番目はさらに別のレベルです。読みにくく、維持しにくい。

少し簡単にするために、ヘルパー列を使用できます。

A2        =LEFT(A1,C2-1)
C2        =FIND(".",A1)
A3        =MID(A1,C2+1,C3-C2-1)
C3        =FIND(".",A1,C2+1)
A4        =MID(A1,C3+1,C4-C3-1)
C4        =FIND(".",A1,C3+1)
A5        =MID(A1,C4+1,LEN(A1)-C4-1)

そうすれば、CでFINDを実行し、Aでそれらの数値を参照します。

ヘルパー列が気に入らない場合、そして私が気に入らない場合は、次のようなUDFを作成できます。

Public Function FINDi(find_text As String, within_text As String, Optional instance As Long) As Long

    Dim lReturn As Long
    Dim i As Long

    Const lFINDFIRST As Long = 0

    If instance = lFINDFIRST Then
        lReturn = InStr(1, within_text, find_text)
    ElseIf instance < lFINDFIRST Then 'negative numbers finds last
        lReturn = InStrRev(within_text, find_text)
    Else
        lReturn = 0
        For i = 1 To instance
            lReturn = InStr(lReturn + 1, within_text, find_text)
        Next i
    End If

    FINDi = lReturn

End Function

そしてそれはあなたにこのような式を与えます

A2        =LEFT(A1,findi(".",A1)-1)
A3        =MID(A1,findi(".",A1)+1,findi(".",A1,2)-findi(".",A1,1)-1)
A4        =MID(A1,findi(".",A1,2)+1,findi(".",A1,3)-findi(".",A1,2)-1)
A5        =MID(A1,findi(".",A1,3)+1,LEN(A1)-findi(".",A1,3)-1)

ヘルパーカラムほどきれいではありませんが、自己完結型で、組み込みのFINDよりも間違いなく優れています。

あなたが書くことができる別のUDFは、VBAの分割関数が行うことと重複しています。

Public Function SplitString(ByVal sInput As String, ByVal sDelim As String, ByVal lWhich As Long) As String

    SplitString = Split(sInput, sDelim)(lWhich - 1)

End Function

その式は次のようになります

A2        =SplitString($A$1,".",ROW()-1)
A3        =SplitString($A$1,".",ROW()-1)
A4        =SplitString($A$1,".",ROW()-1)
A5        =SplitString($A$1,".",ROW()-1)
8
Dick Kusleika

これが古典的な1つの公式ソリューションです:

=TRIM(MID(SUBSTITUTE(A$1,".",REPT(" ",999)),(ROW()-1)*999-998,999))

enter image description here

"."-は区切り文字です。
(ROW()-1)-区切りテキストでn番目の項目を指定します。

詳細については [〜#〜] excelfox [〜#〜]

15
zx8754

問題に示されているように、行1はA1から始まるIPアドレス(IPv4)です。

_  |      A      |      B
--+-------------+-------------
1 | 10.17.9.192 | 192.168.0.1
2 | 10          | 192
3 | 17          | 168
4 | 9           | 0
5 | 192         | 1
_

解決

  • 前半(セルA2):=VALUE( LEFT(SUBSTITUTE(A1, ".", " "), 3 ))
  • 2番目の部分(セルA3):=VALUE( MID(SUBSTITUTE(A1, ".", " "), 8, 5 ))
  • 第3部(セルA4):=VALUE( MID(SUBSTITUTE(A1, ".", " "), 15, 7))
  • 第4部(セルA5):=VALUE(RIGHT(SUBSTITUTE(A1, ".", " "), 3 ))

右の式を記入してください。

注:結果をテキスト形式にする場合は、TRIM(...)の代わりにVALUE(...)を使用できます。


ボーナス:フォーマットされたIPアドレスを取得するための単一の式

フォーマット済みIPアドレス _001.002.003.004_は、次の式で取得できます。

_= TEXT( LEFT(SUBSTITUTE(A1, ".", "      "), 3    ), "000") & "."
& TEXT(  MID(SUBSTITUTE(A1, ".", "      "), 8, 5 ), "000") & "."
& TEXT(  MID(SUBSTITUTE(A1, ".", "      "), 15, 7), "000") & "."
& TEXT(RIGHT(SUBSTITUTE(A1, ".", "      "), 3    ), "000")
_

説明

ドット_._を6つのスペースでSUBSTITUTEすることにより、次のようになります。

_                   |123456789|123546789|123456789|
1.1.1.1         ->  1      1      1      1
11.11.11.11     ->  11      11      11      11
111.111.111.111 ->  111      111      111      111
                    =1=    ==2==  ===3===
_
  • 文字1〜3には、最初の部分のみが含まれています。
  • 文字8〜12には、2番目の部分のみが含まれています。
  • 文字15-21には、3番目の部分のみが含まれています。
  • 右端の3文字には、4番目の部分のみが含まれています。
1
wilson