Page 1 of 1

ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Thu Feb 16, 2012 9:49 pm
by freedomzaa
String_Num.xlsm
ปัญหานะครับ เช่น มีประโยค E.1.5 Network Settings/07,12.01-12.25 Prohibited Processes
อยากให้แสดงออกมาเป็น
E.1.5.7
E.1.5.12.1
E.1.5.12.2
E.1.5.12.3
E.1.5.12.4
.
.
.
E.1.5.12.25
โค๊ด VBA ที่ผมทำนะครับ

คือตัดตัวอักษรออกให้หมด แล้วเต็มจุดแทน ส่วนค่าไหนที่เป็นขีด เช่น 1-5 ก็ให้แสดงเป็น 1,2,3,4,5

Code: Select all

Private Sub CommandButton1_Click()Dim regEx, myMatch, myMatches, arg
Dim i As String
Dim j As Integer
Set regEx = CreateObject("vbscript.regexp")
For j = 1 To 4
arg = Range("A" & j).Value
With regEx
.Pattern = "\d{1}"
.Global = True
If .Test(arg) Then
Set myMatches = .Execute(arg)
i = ""
For Each myMatch In myMatches
i = i & "." & myMatch.Value
Next myMatch
MsgBox ("E" & i)
End If
End With
Next j
End Sub
ช่วยด้วยนะครับ ผมพยายามแล้วครับ

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Thu Feb 16, 2012 11:31 pm
by snasui
:D จากไฟล์ที่แนบมา ตัวอย่าง Code การตัดให้คงเหลือเฉพาะค่าที่ต้องการตามด้านล่างครับ

Code: Select all

Sub Test0()
    Dim rAll As Range, r As Range
    Dim t As String, i As Integer
    Set rAll = Sheets("Sheet1").Range("A1:A4")
    For Each r In rAll
        With Application.WorksheetFunction
            t = .Substitute(r, " Network Settings", "")
            i = .Search(" ", t) - 1
            r.Offset(0, 1) = Left(t, i)
        End With
    Next r
End Sub
ส่วนการแสดงค่าทั้งหมดกรณีคั่นด้วยเครื่องหมาย - ลองประยุกต์จากที่นี่ครับ Split then Join

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Fri Feb 17, 2012 8:25 am
by freedomzaa
ขอบคุณมากครับ จะลองนำมาประยุกต์ใช้นะครับ :D

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Fri Feb 17, 2012 1:36 pm
by freedomzaa
snasui wrote::D จากไฟล์ที่แนบมา ตัวอย่าง Code การตัดให้คงเหลือเฉพาะค่าที่ต้องการตามด้านล่างครับ

Code: Select all

Sub Test0()
    Dim rAll As Range, r As Range
    Dim t As String, i As Integer
    Set rAll = Sheets("Sheet1").Range("A1:A4")
    For Each r In rAll
        With Application.WorksheetFunction
            t = .Substitute(r, " Network Settings", "")
            i = .Search(" ", t) - 1
            r.Offset(0, 1) = Left(t, i)
        End With
    Next r
End Sub
ส่วนการแสดงค่าทั้งหมดกรณีคั่นด้วยเครื่องหมาย - ลองประยุกต์จากที่นี่ครับ Split then Join
รบกวนอีกนิดครับ ถ้าในกรณีทีไม่ได้ใช้คำว่า "Network Settings" เหมือนกันล่ะครับ ใช้ึคำที่แตกต่างกันออกไป จะต้องแก้เป็นยังไงครับ

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Fri Feb 17, 2012 5:50 pm
by snasui
:D ควรถามด้วยตัวอย่างที่เป็นตัวแทนของข้อมูลจริงครับ จะได้ทราบว่าข้อมูลมีความหลากหลายอย่างไร ลองปรับ Code ดูเองก่อน ติดตรงไหนถามมาได้เรื่อย ๆ ครับ

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Mon Feb 20, 2012 10:25 pm
by freedomzaa
ถ้ามีประโยคที่หลากหลายแบบนี้ล่ะครับ
ตัวอย่างนะครับ
เช่นมี String
"E.1.1 Passwords/02 Maximum Password Age*" ก็ให้่แสดงเป็น
E.1.1.2

"E.1.5 Network Settings/01.06,02.05 Passwd Files in ETC Subdirectory of the FTP Account Home Dir*" ก็ให้่แสดงออกมาเป็น
E.1.5.1.6
E.1.5.2.5

"E.1.5 Network Settings/18.01-18.05 NFS Access Contains Confidential Data" ก็ให้่แสดงออกมาเป็น
E.1.5.18.1
E.1.5.18.2
E.1.5.18.3
E.1.5.18.4
E.1.5.18.5

"E.1.5 Network Access/01.06,02.05,18.01-18.05 NFS Access Contains Confidential Data" ก็ให้่แสดงออกมาเป็น
E.1.5.1.6
E.1.5.2.5
E.1.5.18.1
E.1.5.18.2
E.1.5.18.3
E.1.5.18.4
E.1.5.18.5

ควรใช้ code อะไรที่ แทนค่า string ทั้งหมดได้ ไม่ใช่แค่ "Network Settings"

หรือ ผมควรดึงค่าแค่ ตัวเลขออกมาก่อนดีครับ แล้วค่อยมาตัดแบ่งตามที่ต้องการทีหลัง ครับ

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Mon Feb 20, 2012 11:30 pm
by snasui
:D ผมเขียน Code สำหรับการกระจายค่าออกมาให้ดูเป็นตัวอย่างตามด้านล่าง ซึ่งดัดแปลงมาจาก http://snasui.blogspot.com/2011/06/vba.html

สิ่งที่ผมอยากให้คุณลองเขียนเองบ้างคือตัดค่าให้เหลือเฉพาะ E, ตัวเลข, /, -, เครื่องหมาย , (คอมม่า) และ . (จุด) เพื่อจะได้นำค่านั้นมาใช้ต่อกับ Code ด้านล่าง ซึ่งคิดว่าไม่ยากจนเกินไป อย่างน้อยก็มีผู้ช่วยเขียนมาให้ระดับหนึ่งแล้ว

สำหรับการถาม VBA จะต้องเขียนมาเองก่อนเสมอ ติดตรงไหนก็ค่อยมาถามกันได้เรื่อย ๆ ส่วน Code ด้านล่างนี้ผมมีอยู่ก่อนแล้วตาม Link ด้านบนเพียงแต่เอามาปรับปรุงให้ดูเป็นตัวอย่าง กรณีทำ Project ส่งอาจารย์ก็ควรจะดัดแปลงให้ดีนะครับ ผมทราบว่าอาจารย์หลายท่านก็แวะมาที่นี่เหมือนกัน :mrgreen:

Code: Select all

Sub SplitThenJoin()
    Dim s As String, a() As String
    Dim r As Range, rAll As Range
    Dim i As Integer, j As Integer, k As Integer
    Call RemoveUnused
    With Worksheets("Sheet1")
        Set rAll = .Range("B1", .Range("B" & Rows.Count).End(xlUp))
    End With
    For Each r In rAll
        s = ""
        a = Split(Right(r, Len(r) - 6), ",")
        For i = 0 To UBound(a)
            j = InStr(1, a(i), "-")
            If IsNumeric(Left(a(i), 1)) And j > 0 Then
                For k = Left(a(i), j - 1) * 100 To Mid(a(i), j + 1, 255) * 100
                    s = s & Left(r, 5) & "." & Format(k / 100, "0.00") & ","
                Next k
            End If
            If Len(s) > 1 Then
                a(i) = Left(s, Len(s) - 1)
            Else
                a(i) = Left(r, 5) & a(i) / 10
            End If
        Next i
        s = Join(a, ",")
        a = Split(s, ",")
        For i = 0 To UBound(a)
            a(i) = Replace(a(i), ".0", ".")
        Next i
        Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Resize(UBound(a) + 1) _
            = Application.Transpose(a)
    Next r
End Sub
ตัวอย่างภาพการใช้งาน :ard:

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Tue Feb 21, 2012 9:33 am
by freedomzaa
:D ขอบคุณสำหรับคำแนะนำมากครับ

รบกวนถามอีกนิดหน่อยครับ ในโค๊ดที่อาจารย์เขียน อะไรคือ Call RemoveUnused มันคือ function ที่เราต้องเขียนมาเอง หรือเป็น function สำหรับการ Remove String ที่เราไม่ใช้แล้วออกไป ไม่มีได้ไหมครับ

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Tue Feb 21, 2012 9:38 am
by snasui
:D เป็น Procedure ที่ผมใช้ Remove อักขระที่ไม่ใช้แล้วออกไป และมุ่งหมายให้เขียนขึ้นมาเองก่อน ผมเรียกใช้ผ่าน Procedure SplitThenJoin เพื่อสะดวกในการเรียกใช้จากการกดปุ่มเดียวแล้วทำทุกงานที่ต้องการ จะไม่นำมารวมกันก็สามารถทำได้ครับ คือ แยกเป็นตัดอักขระที่ไม่จำเป็นออกก่อน จากนั้นค่อย Generate ค่าต่าง ๆ ออกมา

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Tue Feb 21, 2012 4:43 pm
by freedomzaa
snasui wrote: สิ่งที่ผมอยากให้คุณลองเขียนเองบ้างคือตัดค่าให้เหลือเฉพาะ E, ตัวเลข, /, -, เครื่องหมาย , (คอมม่า) และ . (จุด) เพื่อจะได้นำค่านั้นมาใช้ต่อกับ Code ด้านล่าง ซึ่งคิดว่าไม่ยากจนเกินไป อย่างน้อยก็มีผู้ช่วยเขียนมาให้ระดับหนึ่งแล้ว
อาจารย์ครับผมทำได้แล้วนะครับ ตอนนี้ผมตัดตัวอักษรข้างหน้าได้ แต่ดันเหลืออักษรข้างหลัง ผมจะเอามันออกยังไงดีครับ

อันนี้เป็นกระทู้ทีไปศึกษามาครับ http://www.mrexcel.com/forum/showthread.php?t=615173

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Tue Feb 21, 2012 4:57 pm
by snasui
:lol: จาก Link ด้านบนต้องขออภัยที่จะบอกว่า ยังคง Concept เดิมคือถามยังไม่ครบทุก ๆ เงื่อนไขที่อาจจะเป็นไปได้ครับ ต้องขอบคุณท่านเหล่านั้นที่ช่วยกันเต็มที่

ลองนำ Code ตามด้านล่างไปปรับใช้ดูครับ

Code: Select all

Sub RemoveUnused()
    Dim rAll As Range, r As Range
    Dim t As String, v As String, u As String
    Dim i As Integer, s As String
    Set rAll = Sheets("Sheet1").Range("A1:A4")
    For Each r In rAll
        v = Left(r, 5)
        u = Replace(r, v, "")
        t = "0123456789,.-/"
        s = ""
        i = 1
        Do While i <= Len(u)
            If InStr(t, Mid(u, i, 1)) > 0 Then
                s = s & Mid(u, i, 1)
            End If
            i = i + 1
        Loop
        r.Offset(0, 1) = v & s
    Next r
End Sub

Sub SplitThenJoin()
    Dim s As String, a() As String
    Dim r As Range, rAll As Range
    Dim i As Integer, j As Integer, k As Integer
    Call RemoveUnused
    With Worksheets("Sheet1")
        Set rAll = .Range("B1", .Range("B" & Rows.Count).End(xlUp))
    End With
    For Each r In rAll
        s = ""
        a = Split(Right(r, Len(r) - 6), ",")
        For i = 0 To UBound(a)
            j = InStr(1, a(i), "-")
            If IsNumeric(Left(a(i), 1)) And j > 0 Then
                For k = Left(a(i), j - 1) * 100 To Mid(a(i), j + 1, 255) * 100
                    s = s & Left(r, 5) & "." & Format(k / 100, "0.00") & ","
                Next k
            End If
            If Len(s) > 1 Then
                a(i) = Left(s, Len(s) - 1)
            ElseIf Mid(a(i), 3, 1) = "." Then
                a(i) = Left(r, 5) & "." & a(i)
            Else
                a(i) = Left(r, 5) & a(i) / 10
            End If
        Next i
        s = Join(a, ",")
        a = Split(s, ",")
        For i = 0 To UBound(a)
            a(i) = Replace(a(i), ".0", ".")
        Next i
        Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Resize(UBound(a) + 1) _
            = Application.Transpose(a)
    Next r
End Sub

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Tue Feb 21, 2012 7:41 pm
by freedomzaa
:D ขอบคุณครับ

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Wed Feb 22, 2012 10:29 am
by freedomzaa
อาจารย์ครับ ตอนนี้ทำได้แล้วนะครับ แต่ติดอยู่ที่บางค่ายังไม่ตรงครับ เช่นค่า E.1.5/07 ค่าที่ควรจะได้คือ E.1.5.7 แต่ค่าที่แสดงออกมากลับเป็น E1.50.7

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Wed Feb 22, 2012 11:08 am
by snasui
:D ช่วยแนบตัวอย่างที่เป็นปัญหามาด้วยครับ จากไฟล์ที่ส่งมาไม่พบปัญหาที่ถามมาครับ

นอกจากนี้ Code ที่แนบมาไม่ได้เป็น Code ล่าสุดที่ผมโพสต์ให้ไป สังเกตว่า SplitThenJoin ก็ Update เพิ่มไปให้ใหม่ครับ

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Wed Feb 22, 2012 1:40 pm
by freedomzaa
snasui wrote::D ช่วยแนบตัวอย่างที่เป็นปัญหามาด้วยครับ จากไฟล์ที่ส่งมาไม่พบปัญหาที่ถามมาครับ

นอกจากนี้ Code ที่แนบมาไม่ได้เป็น Code ล่าสุดที่ผมโพสต์ให้ไป สังเกตว่า SplitThenJoin ก็ Update เพิ่มไปให้ใหม่ครับ
Update SplitThenJoin เรียบร้อยครับ แต่ก็ยังติดปัญหาเดิมครับ

Re: ปัญหาเรื่องการแสดงตัวเลขครับ

Posted: Wed Feb 22, 2012 1:45 pm
by snasui
:shock: ในไฟล์แนบที่ปรับ Code มาผม Run แล้วก็ได้ตามนั้นครับ

A5 = E.1.5.7
A31 = E.1.5.8
A32 = E.1.5.9

ไม่ทราบว่าที่ผิดมันได้เป็นค่าใดครับ :?:
ตัวอย่างตามไฟล์แนบครับ