web-dev-qa-db-ja.com

IPアドレスによるExcel列の並べ替え

ネットワーク内のアイテム(プリンター、サーバー、ワークステーション、ネットワークプロジェクターなど)をリストするかなり大きな(200行を超える)Excelスプレッドシートがあり、最初の列の1つはIPアドレスフィールドで、_192.168.x.y_。並べ替えるときの問題は、(例として)_192.168.0.85_から_192.168.0.9_になっていることです。私が見たいのは、最初の3オクテット、次に最後のオクテットに基づいて論理的にソートすることです(つまり、_.1_、_.2_、_.3_など)。これは可能ですか?もしそうなら、どうですか?

17
Canadian Luke

Nixdaがコメントで述べたように、ヘルパー列はこれを可能にします。後でシートを維持するための2つのオプションがあります。

  • 分割ヘルパー列にすべての新しいIPを追加します。
  • 新しい追加について、テキストから列への手順を繰り返します。

手順は次のとおりです。

  1. IP列を選択し、Data> Text-to-Columnsをクリックします text-to-columns

  2. Delimtedオプションを選択し、Nextをクリックします。 Otherチェックボックスをオンにして、ピリオド.を入力します。次へをクリックします。 choose . as delimiter

  3. すべての列を保持し、一般のままにします。範囲アイコンをクリックして、Destinationセクションを編集します。 change dest 1

  4. 新しいテキストを表示する列を選択します。 Enterキーを押します。 change dest 2

  5. 範囲が選択されていることを確認し、Data> Sortをクリックします。ソート基準を入力します。オクテットごとにレベルを追加していきます。 sorting

  6. これが最終結果です: result

19
rishimaharaj

これは古い投稿だと思いますが、実用的な解決策を提供するために、以下を提示します。

この数式を隣接するセルに配置し、IPアドレスを含むセル(この例ではA1)を指すように参照を更新します。これにより、010.121.008.030のような結果が生成され、アルファベット順で(正しく)ソートできます。次に、新しい列の幅をゼロに設定します。一杯のコーヒーを楽しむ時間。

=TEXT(MID(A1,1,FIND(".",A1)),"000")&"."&TEXT(MID(A1,FIND(".",A1)+1,FIND(".",A1,FIND(".",A1)+1)-1-FIND(".",A1)),"000")&"."&TEXT(MID(A1,FIND(".",A1,FIND(".",A1)+1)+1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)-1-FIND(".",A1,FIND(".",A1)+1)),"000")&"."&TEXT(MID(A1,FIND(".",A1,FIND(".",A1,FIND(".",A1)+1)+1)+1,LEN(A1)),"000")
7
John Homer

John Homerの回答に加えて、ここではTEXT関数が存在しないため、AppleのNumbersアプリケーションでも機能する式を示します。 Googleドキュメントでもテストされています。

=DEC2HEX(LEFT(B2,FIND(".",B2)-1),2)
&
DEC2HEX(MID(
    B2,
    FIND(".",B2)+1,
    FIND(
        ".",
        B2,
        FIND(".",B2)+1
    ) - FIND(".",B2) - 1
),2)
&
DEC2HEX(MID(
    B2,
    FIND(
        ".",
        B2,
        FIND(".",B2)+1
    ) + 1,
    FIND(
        ".",
        B2,
        FIND(
            ".",
            B2,
            FIND(".",B2)+1
        )+1
    ) - FIND(
        ".",
        B2,
        FIND(".",B2)+1
    ) - 1
),2)
&
DEC2HEX(RIGHT(
    B2,
    LEN(B2) - FIND(
        ".",
        B2,
        FIND(
            ".",
            B2,
            FIND(".",B2)+1
        )+1
    )
),2)
1
Hipska
Sub IPSplit()

HeaderRow = 1
ColimnName = "A"
BeginIPaddsressData = 2

Dim HeaderArray As Variant
HeaderArray = Array("IP oct 1", "IP oct 2", "IP oct 3", "IP oct 4")

Dim Octet() As String
Dim RangeSearch As Range, RangeFound As Range, LastCell As Range
Dim LastCellRowNumber As Long, LastCellColumnNumber As Long, RowNumber As Long

With ActiveSheet
Set LastCell = .Cells(HeaderRow, .Columns.Count).End(xlToLeft)
LastHeaderColumnNumber = LastCell.Column

Set RangeSearch = Range("1:1")
Set RangeFound = RangeSearch.Find(What:=HeaderArray(0), LookIn:=xlValues)

If RangeFound Is Nothing Then
RowNumber = 2
    If .Cells(RowNumber, .Columns.Count) <> vbNullString Then
        Set LastCell = .Cells(RowNumber, .Columns.Count)
        LastCellColumnNumber = LastCell.Column
    Else
        Set LastCell = .Cells(RowNumber, .Columns.Count).End(xlToLeft)
'Specifies the last column LastCellColumnNumber.

        LastCellColumnNumber = LastCell.Column
    End If

Range(Cells(HeaderRow, LastCellColumnNumber + 1), Cells(HeaderRow, LastCellColumnNumber + 4)).Value = HeaderArray
'Insert Header

Else
LastCellColumnNumber = RangeFound.Column - 1
End If

Set LastCell = .Cells(.Rows.Count, ColimnName).End(xlUp)
'Specifies the last cell number in the column ColimnName.

LastCellRowNumber = LastCell.Row   
End With

    For I = BeginIPaddsressData To LastCellRowNumber

    Octet = Split(Cells(I, ColimnName).Value, ".")
    For O = 0 To 3       
'cells populate the values of octets 1-4.
      If (UBound(Octet) - O) >= 0 Then      
         Cells(I, ColimnName).Offset(0, LastCellColumnNumber + O).Value = Octet(O)
      End If
    Next
Next
End Sub
1
STTR