ネットワーク内のアイテム(プリンター、サーバー、ワークステーション、ネットワークプロジェクターなど)をリストするかなり大きな(200行を超える)Excelスプレッドシートがあり、最初の列の1つはIPアドレスフィールドで、_192.168.x.y
_。並べ替えるときの問題は、(例として)_192.168.0.85
_から_192.168.0.9
_になっていることです。私が見たいのは、最初の3オクテット、次に最後のオクテットに基づいて論理的にソートすることです(つまり、_.1
_、_.2
_、_.3
_など)。これは可能ですか?もしそうなら、どうですか?
Nixdaがコメントで述べたように、ヘルパー列はこれを可能にします。後でシートを維持するための2つのオプションがあります。
手順は次のとおりです。
IP列を選択し、Data
> Text-to-Columns
をクリックします
Delimtedオプションを選択し、Nextをクリックします。 Other
チェックボックスをオンにして、ピリオド.
を入力します。次へをクリックします。
すべての列を保持し、一般のままにします。範囲アイコンをクリックして、Destination
セクションを編集します。
新しいテキストを表示する列を選択します。 Enterキーを押します。
範囲が選択されていることを確認し、Data
> Sort
をクリックします。ソート基準を入力します。オクテットごとにレベルを追加していきます。
これが最終結果です:
これは古い投稿だと思いますが、実用的な解決策を提供するために、以下を提示します。
この数式を隣接するセルに配置し、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")
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)
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