Bir dizenin ilk bölümünü Excel'de karşılaştırma


4

IP adreslerinin sınıf kimliğini, adresin ilk bölümünü kontrol ederek Sütun A'nın giriş bölümüne girdikten sonra belirleyen otomatik bir işlev oluşturmaya çalışıyorum. Örnek:

Column A  | Column B

10.250.1.1 | A sınıfı

(Giriş bölümü adresin olduğu yerdir.)

Bunu, adresin ilk bölümünü (10) .250.1.1 kontrol ederek ve sınıfa eşleştirerek yapardı. Sınıflar bunun gibi:

A sınıfı = 1 ila 127

B sınıfı = 128 - 191

C sınıfı = 192 - 223

Yani başka bir örnek

Column A  | Column B

194.250.1.1 | C sınıfı

B adresinde IP adresinin ilk kısmının IE'ye hangi aralıkta sığacağını belirleyen bir IF ifadesi oluşturmaya çalışmıştım: 58.250.1.1 Ve 58'in 1 ile 127 arasında olduğu için A Sınıfına girdiğini görecekti. "58" 'in IP’den nasıl ayrılacağından emin değilim, IP’nin tamamını kullanarak, sadece bir kısmını kullanarak nasıl karşılaştırılacağını biliyorum. -


B adresinde IP adresinin ilk kısmının IE'ye hangi aralıkta sığacağını belirleyen bir IF ifadesi oluşturmaya çalışmıştım: 58.250.1.1 Ve 58'in 1 ile 127 arasında olduğu için A Sınıfına girdiğini görecekti. "58" 'in IP’den nasıl ayrılacağından emin değilim, IP’nin tamamını kullanarak, sadece bir kısmını kullanarak nasıl karşılaştırılacağını biliyorum.
David,

Yanıtlar:


1

VBa tamamsa, istediğinizi yapar mı?

Böylece başlangıç ​​ve bitiş değerlerini görebilirsiniz. Bu, 3 sınıfın her biri için aralıktır (dolayısıyla A, B ve C). Daha sonra classA, classB ve classC'yi görebilirsiniz - Bu değerleri herhangi bir nedenden ötürü değiştirmek için ihtiyaç duyduğunuzdan rahatsız ettim. Son olarak, IP hangi sütunda yaşıyor ( columnToLookUpve son olarak hangi sütunda sonuçları görmek istiyorsunuz? Sırasıyla A ve B'yi seçtim).

Option Explicit
Sub DoThis()

'Edit this top part as you need

Dim startClassA As Integer
startClassA = 1

Dim endClassA As Integer
endClassA = 127

Dim startClassB As Integer
startClassB = 128

Dim endClassB As Integer
endClassB = 191

Dim startClassC As Integer
startClassC = 192

Dim endClassC As Integer
endClassC = 223

Dim classA As String
classA = "Class A"

Dim classB As String
classB = "Class B"

Dim classC As String
classC = "Class C"

Dim columnToLookUp As String
columnToLookUp = "A"

Dim resultColumn As String
resultColumn = "B"

'no need to edit below this (hopefully) ***************

Dim row As Integer
row = 1

Do While (Range(columnToLookUp & row).Value <> "")
    Dim ip() As String

    ip = Split(Range(columnToLookUp & row).Value, ".")

    Dim ipSub As Integer
    ipSub = ip(0)

    If (ipSub >= startClassA And ipSub <= endClassA) Then
        Range(resultColumn & row).Value = classA
    End If

    If (ipSub >= startClassB And ipSub <= endClassB) Then
        Range(resultColumn & row).Value = classB
    End If

    If (ipSub >= startClassC And ipSub <= endClassC) Then
        Range(resultColumn & row).Value = classC
    End If


row = row + 1
Loop


End Sub

Ayrıca yardımcı olabilir: VBA'yı MS Office'e nasıl eklerim?


Tamam, yardımınız için ve özellikle hızlı tepki süresi için çok teşekkür ederiz!
David,

3

Bunu, oldukça basit ve basit bir formülle yapabilirsiniz. IP adresi A1için aşağıdakileri kullanın:

=INDEX({"Class A","Class B","Class C"},MATCH(VALUE(LEFT(A1,FIND(".",A1)-1)),{1,128,192,224},1))

Yıkılıyor:

VALUE(LEFT(A1,FIND(".",A1)-1)) Adresin ilk bölümünü tanımlamak için string işlevlerini kullanır ve onu bir dize değil sayı olarak kullanır.

Bu sayı daha sonra sınıf alt sınır dizisi ile eşleştirilir {1,128,192,224}. MATCHson argümanla 1, bu dizideki son pozisyonu döndürür, örneğin 25döndürür 1, sayı 150döndürür 2.

Bu pozisyon daha sonra INDEXkategori dizisindeki o pozisyondaki değeri döndüren fonksiyona geçer {"Class A","Class B","Class C"}.

Bu formül #N/A1'den küçük #REF!değerler ve 223'ten büyük değerler için geri dönecektir .


Bu da çok iyi çalışıyor ve kesinlikle çok daha kısa, teşekkürler!
David,

0

LOOKUP işlevini kullanarak yapabilirsiniz. Sözdizimi

LOOKUP ( lookup_value, lookup_vector, [result_vector])

ARA hakkında güzel bir şey ARA kesin bulamazsa, bir lookup_value , bu en büyük değeri ile eşleşen bakılan_vektör olduğu için daha az veya eşit Bakılan_değer .

Aşağıdaki resim, B ve C sütunlarındaki yardımcıları kullanarak D ve E sütunlarında yapmanın birkaç yolunu göstermektedir.

görüntü tanımını buraya girin


0

VBA, gelişmiş işlevler için mükemmel ancak bir bedeli var, kodunuz artık makro içeriyor ve bir dijital sertifikaya sahip değilseniz, microsoft güvenlik mesajlarıyla sizi etkileyecek. Sayfa yalnızca sizin içinse, bunu devre dışı bırakabilirsiniz ancak sayfanızı başka bir kabusla paylaşmanızı sağlar.

Neyse ki, probleminiz için saf Excel'de daha basit bir çözüm var:

Aşağıdaki düzenlemeyi göz önüne alarak:

  • A sütunundaki IP adresleri
  • B adresindeki IP adresinin ilk baytı
  • C sütununda Sonuç Sınıfı

tablo

B sütunundaki formül şöyle olacaktır:

=VALUE(LEFT(A1,FIND(".",A1,1)-1))

C sütunundaki formül şöyle olur:
=IF(B1<128,"Class A",IF(B1<192,"Class B",IF(B1<256,"Class C","Not a valid IP")))


Okunabilirlik konusunda sıkıntı duymuyorsanız, yardımcı kolondan bile kaçınabilirsiniz: kısa masa

B sütununu kullanarak:

=IF(VALUE(LEFT(A1,FIND(".",A1,1)-1))<128,"Class A",IF(VALUE(LEFT(A1,FIND(".",A1,1)-1))<192,"Class B",IF(VALUE(LEFT(A1,FIND(".",A1,1)-1))<256,"Class C","Not a valid IP")))

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.