簡體   English   中英

從VBA中的一個文本單元中提取字符串

[英]Extract strings from one text cell in VBA

我必須從如下所示的文本單元格中提取Hostnames和IP地址,它們是Hostnames:IP Address:之后的字符串,如下所示,一個單元格可能具有多個Hostnames和IP地址,我也有許多這樣的單元格:

這是我的示例數據:

   Please refer to CR_Implementation_Reversion_Plan UNIX and Informatica (9.1) 
-------------------- 
IP Address: 10.89.140.123, 10.89.140.125, 10.89.140.127, 10.89.140.92 
Hostname: a01gbiapp1a, a01gbiapp1b, a01gbiapp1z, w01ggdwtd1a 
Informatica ID: proddeploy(Informatica) 
Unix ID:cbitimpl, root(su- bipadm,pdm, bipxtr, bdwadm, cpmsadm, dqadm, rmgadm, cbgadm, bdwxtr, hkb2adm, biptwadm, bipinadm, bipcnadm, biphkadm, bipidadm, bipotadm) 

UNIX and Informatica (7.1) 
-------------------- 
IP Address: 10.89.140.52, 10.89.140.53, 10.89.140.37, 10.89.140.37 
Hostname: a01ginf1a , a01ginf1b, a01ginf1z, a01ginf1z 
Informatica ID: proddeploy(Informatica) 
Unix ID: cbitimpl, root(su- bipadm, bipdm, bipxtr, bdwadm, cpmsadm, dqadm, rmgadm, cbgadm, bdwxtr, hkb2adm, biptwadm, bipinadm, bipcnadm, biphkadm, bipidadm, bipotadm) 

Teradata 
-------- 
IP Address: 10.89.140.97 
Hostname: r01gtddb1a 
ID: fdwadmin, bdwadmin 

InformaticaClient 
------------------ 
w01gdnv1a or w01ggdwtd1a or w01ggdwtd10a 10.89.140.92(Informatica Client), 
ID: infadeploy

BO implementation:Draw Rack Keys: 
------------------------------------- 
IP Address: 10.89.140.105, 10.89.140.106, 10.89.140.48, 10.89.140.49 
Hostname: W01GBOXIAPP1A, W01GBOXIAPP2A, W01GBOXIAPP3A, W01GBOXIAPP4A 
BO ID: boimpl 


SAS 
--- 
IP Address: 10.89.136.122, 10.89.136.125, 10.89.136.126 
Hostname: w01gsaseapp1a, a01gsaseapp1a, a01gsaseapp2a 
SAS ID: sas_impl 

Power Exchange 
-------------- 
IP ADDRESS: 10.80.250.73 
ID: DMSDDTL1, DMSDDTL2, DMSDDTL3

UI 
--- 
IP: 10.89.140.112 
Hostname: A01GWAWEB1A 
ID: wasuser 

WODM 
---- 
IP: 10.89.140.109 
Hostname: A01GWABRE1A 
ID: wodmadm 

DB2 Server 
---------- 
IP: 10.89.140.113 
DB : DBSWATS 
Schema : watsusr 


DBS_IBMSG_BTEAM: 
Pls allow Ramakishore M/ Prashanth Badugu/ Srinivasa Theerdhala Part B and       Satish Parmarthy / Dileep EP / Krishna Reddy / Raghavendra Goud Part A to withdraw the 
"infaoper" and "proddeploy" ID for server a01gbiapp1a, a01gbiapp1b, a01gbiapp1z.

我已經使用Perl從HTML文件中提取字符串,如下所示:

if ($ReadFile =~ /^OS Version\/Service Pack\:/)     { 
    #print "$ReadFile\n"
    ($OSVer)=(split /:/, $ReadFile)[1]; print "$OSVer\n";
    &myServerInfo("$OSVer","4");
}

我想知道我是否可以使用相同的方法為VBA此類文本單元提取主機名和IP地址,將不勝感激。

首先,我想介紹一下我的代碼可以完美處理的輸入數據。 在輸入數據中,“ IP地址”和“主機名”的節奏必須相等。 我的意思是這些對的靜態串行如下:

................................
---------------------------
IP地址:
主機名:
................................
---------------------------
IP地址:
主機名:
................................
---------------------------
IP:
主機名:
................................
---------------------------
IP地址:
................................
---------------------------
IP地址:
主機名:

輸入數據必須是該串行格式。 只有采用這種格式,我的代碼才能正常工作。 好..? 我的意思是它不能用於以下串行輸入:

................................
---------------------------
IP地址:
主機名:
................................
---------------------------
IP地址:
主機名:
................................
---------------------------
主機名:
IP地址:

因此,我對您的輸入數據做了一些小的修改,如下所示:

Please refer to CR_Implementation_Reversion_Plan UNIX and Informatica (9.1) 
---------------------------------------------------------------------------------
IP Address: 10.89.140.123, 10.89.140.125, 10.89.140.127, 10.89.140.92 
Hostname: a01gbiapp1a, a01gbiapp1b, a01gbiapp1z, w01ggdwtd1a 
Informatica ID: proddeploy(Informatica) 
Unix ID:cbitimpl, root(su- bipadm,pdm, bipxtr, bdwadm, cpmsadm, dqadm, rmgadm, cbgadm, 
        bdwxtr, hkb2adm, biptwadm, bipinadm, bipcnadm, biphkadm, bipidadm, bipotadm) 


UNIX and Informatica (7.1) 
---------------------------------------------------------------------------------
IP Address: 10.89.140.52, 10.89.140.53, 10.89.140.37, 10.89.140.37 
Hostname: a01ginf1a , a01ginf1b, a01ginf1z, a01ginf1z 
Informatica ID: proddeploy(Informatica) 
Unix ID: cbitimpl, root(su- bipadm, bipdm, bipxtr, bdwadm, cpmsadm, dqadm, rmgadm, 
         cbgadm, bdwxtr, hkb2adm, biptwadm, bipinadm, bipcnadm, biphkadm, bipidadm, 
   bipotadm) 


Teradata 
---------------------------------------------------------------------------------
IP Address: 10.89.140.97 
Hostname: r01gtddb1a 
ID: fdwadmin, bdwadmin 


InformaticaClient 
---------------------------------------------------------------------------------
IP Address: 10.89.140.92 
Hostname: w01gdnv1a or w01ggdwtd1a or w01ggdwtd10a
ID: infadeploy(Informatica Client)


BO implementation:Draw Rack Keys: 
--------------------------------------------------------------------------------- 
IP: 10.89.140.105, 10.89.140.106, 10.89.140.48, 10.89.140.49 
Hostname: W01GBOXIAPP1A, W01GBOXIAPP2A, W01GBOXIAPP3A, W01GBOXIAPP4A 
BO ID: boimpl 


SAS 
---------------------------------------------------------------------------------
IP ADDRESS: 10.89.136.122, 10.89.136.125, 10.89.136.126 
Hostname: w01gsaseapp1a, a01gsaseapp1a, a01gsaseapp2a 
SAS ID: sas_impl 


Power Exchange 
---------------------------------------------------------------------------------
IP Address: 10.80.250.73 
ID: DMSDDTL1, DMSDDTL2, DMSDDTL3


UI 
---------------------------------------------------------------------------------
IP Address: 10.89.140.112 
Hostname: A01GWAWEB1A 
ID: wasuser 


WODM 
---------------------------------------------------------------------------------
IP Address: 10.89.140.109 
Hostname: A01GWABRE1A 
ID: wodmadm 


DB2 Server 
---------------------------------------------------------------------------------
IP Address: 10.89.140.113 
DB : DBSWATS 
Schema : watsusr 


DBS_IBMSG_BTEAM: 
Pls allow Ramakishore M/ Prashanth Badugu/ Srinivasa Theerdhala Part B and       
Satish Parmarthy / Dileep EP / Krishna Reddy / Raghavendra Goud Part A to withdraw 
the "infaoper" and "proddeploy" ID for server a01gbiapp1a, a01gbiapp1b, a01gbiapp1z.

我修改我的代碼以運行該輸入,如下所示:

Public Sub splitHostnameAndIPAddress()

    Dim addressStream As String

    Dim lineList() As String
    Dim line As Integer
    Dim tempHosts, tempIps As String
    Dim hostList(), ipList() As String
    Dim hostIndex, ipIndex, tempIndex As Integer
    Dim result As String
    Dim ipFlag As Boolean

    hostIndex = 1
    ipIndex = 1

    'Get address string from cell
    addressStream = Sheets("Sheet5").Range("A1")

    'Split by vbLf(line by line)
    lineList = Split(addressStream, vbLf)

    'Loop all line
    For line = 0 To UBound(lineList)

        'If "IP Address" string include in line, store ip address
        If InStr(lineList(line), "IP Address") Or InStr(lineList(line), "IP ADDRESS") Or InStr(lineList(line), "IP") Then

            'Check for getting right pair.
            If ipFlag Then
                hostIndex = hostIndex + 1
            Else
                ipFlag = True
            End If

            'Getting Ip(s)
            tempIps = Trim(Split(lineList(line), ":")(1))

            'If there is several ip in string which are separated by ","
            If InStr(tempIps, ",") Then

                'Loop ip list which is separated by "," and store
                For tempIndex = 0 To UBound(Split(tempIps, ","))

                    ReDim Preserve ipList(ipIndex)

                    ipList(ipIndex) = Trim(Split(tempIps, ",")(tempIndex))

                    ipIndex = ipIndex + 1

                Next tempIndex

            'Else single ip is store
            Else

                ReDim Preserve ipList(ipIndex)

                ipList(ipIndex) = tempIps

                ipIndex = ipIndex + 1

            End If


        'If "Hostnames" string include in line, store host name
        ElseIf InStr(lineList(line), "Hostname") Then

            'Check for getting right pair.
            If ipFlag Then
                ipFlag = False
            Else
                ipIndex = ipIndex + 1
            End If

            'Getting host(s)
            tempHosts = Trim(Split(lineList(line), ":")(1))

            'If there is several host in string which are separated by ","
            If InStr(tempHosts, ",") Then

                'Loop host list which is separated by "," and store
                For tempIndex = 0 To UBound(Split(tempHosts, ","))

                    ReDim Preserve hostList(hostIndex)

                    hostList(hostIndex) = Trim(Split(tempHosts, ",")(tempIndex))

                    hostIndex = hostIndex + 1

                Next tempIndex

            'Else single host is store
            Else

                ReDim Preserve hostList(hostIndex)

                hostList(hostIndex) = tempHosts

                hostIndex = hostIndex + 1

            End If

        End If

    Next line

    'Adjust two list size
    If hostIndex > ipIndex Then
        ReDim Preserve ipList(hostIndex - 1)
    ElseIf ipIndex > hostIndex Then
        ReDim Preserve hostList(ipIndex - 1)
    End If

    'Loop host list
    For index = 1 To UBound(hostList)

        'Add host & ip pair
        result = result & ipList(index) & vbTab & hostList(index) & vbNewLine

    Next index

    'Show result
    MsgBox result

End Sub

然后,我測試了我的代碼,並得到了以下結果。

在此處輸入圖片說明

我盡力解決這個問題。 我不能再考慮輸入數據了。 因此,請嘗試根據我的建議調整輸入數據。 如果可以,您可以修改我的代碼以滿足您的要求。 感謝您提出具有挑戰性的問題。

在VBA中,它將放在右邊的單元格中,例如,如果上面在A1中,選擇A1運行它,然后在B1,C1,D1中您將擁有“ a01 ...”,“ 10.89 ...”,“ swnet”

Sub t()
With ActiveCell
    sp = Split(.Value, Chr(10))

    For i = 0 To UBound(sp)
        sp2 = Split(sp(i), ":")

        .Offset(0, 1 + i).Value = Trim(sp2(1))
    Next
End With
End Sub

可以將activecell更改為一個范圍,然后循環執行上述代碼以一次復制更多的tahn

這得到了大多數。 假定數據在活動工作表的單元格A1中。 可以輕松對其進行修改以在其他單元格上工作。 讓我知道您是否需要。

Public Sub ParseHostIP()

    Dim i As Long
    Dim s As String, sIP As String, sHost As String
    Dim v As Variant, vIP As Variant, vHost As Variant

    s = [a1]
    s = Replace(Replace(Replace(s, "IP Address:", "~~"), "IP ADDRESS:", "~~"), "IP:", "~~")
    s = Replace(Replace(s, "Hostname:", "~~"), " ", vbNullString)    
    v = Split(s, vbLf)
    For i = 0 To UBound(v)
        If Left$(v(i), 2) = "~~" Then
            'Stop
            If Left$(v(i + 1), 2) = "~~" Then
                sIP = sIP & "," & Mid$(v(i), 3)
                sHost = sHost & "," & Mid$(v(i + 1), 3)
                i = i + 1
            End If
        End If
    Next
    vIP = Split(Mid$(sIP, 2), ",")
    vHost = Split(Mid$(sHost, 2), ",")


    '*******************************************
    ' Done.
    ' The rest is here only to display results.
    '*******************************************
    s = vbNullString
    For i = 0 To UBound(vIP)
        s = s & vIP(i) & vbTab & vHost(i) & vbLf
    Next
    MsgBox s

End Sub

更新#1

根據評論中提供的新信息,此處為修訂版本:

Public Sub ParseHostIP()

    Dim i As Long, k As Long
    Dim s As String, sIP As String, sHost As String
    Dim vIn As Variant, vOut As Variant, v As Variant        

    With Worksheets(1).Columns(2).Cells(4)
        vIn = .Resize(.End(xlDown).Row).Value
    End With

    ReDim vOut(1 To UBound(vIn), 1 To 2)
    For k = 1 To UBound(vIn)
        s = vIn(k, 1)
        s = Replace(Replace(Replace(s, "IP Address:", "~~"), "IP ADDRESS:", "~~"), "IP:", "~~")
        s = Replace(Replace(s, "Hostname:", "~~"), " ", vbNullString)

        v = Split(s, vbLf)

        For i = 0 To UBound(v)
            If Left$(v(i), 2) = "~~" Then
                'Stop
                If Left$(v(i + 1), 2) = "~~" Then
                    sIP = sIP & "," & Mid$(v(i), 3)
                    sHost = sHost & "," & Mid$(v(i + 1), 3)
                    i = i + 1
                End If
            End If
        Next

        vOut(k, 1) = Mid$(sIP, 2)
        vOut(k, 2) = Mid$(sHost, 2)
    Next

    Worksheets(2).Range("a1").Resize(UBound(vOut), 2) = vOut

End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM