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

จากไฟล์ที่แนบมา ตัวอย่าง 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
ขอบคุณมากครับ จะลองนำมาประยุกต์ใช้นะครับ

Re: ปัญหาเรื่องการแสดงตัวเลขครับ
Posted: Fri Feb 17, 2012 1:36 pm
by freedomzaa
snasui wrote:
จากไฟล์ที่แนบมา ตัวอย่าง 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

ควรถามด้วยตัวอย่างที่เป็นตัวแทนของข้อมูลจริงครับ จะได้ทราบว่าข้อมูลมีความหลากหลายอย่างไร ลองปรับ 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

ผมเขียน Code สำหรับการกระจายค่าออกมาให้ดูเป็นตัวอย่างตามด้านล่าง ซึ่งดัดแปลงมาจาก
http://snasui.blogspot.com/2011/06/vba.html
สิ่งที่ผมอยากให้คุณลองเขียนเองบ้างคือตัดค่าให้เหลือเฉพาะ
E, ตัวเลข, /, -, เครื่องหมาย , (คอมม่า) และ . (จุด) เพื่อจะได้นำค่านั้นมาใช้ต่อกับ Code ด้านล่าง ซึ่งคิดว่าไม่ยากจนเกินไป อย่างน้อยก็มีผู้ช่วยเขียนมาให้ระดับหนึ่งแล้ว
สำหรับการถาม VBA จะต้องเขียนมาเองก่อนเสมอ ติดตรงไหนก็ค่อยมาถามกันได้เรื่อย ๆ ส่วน Code ด้านล่างนี้ผมมีอยู่ก่อนแล้วตาม Link ด้านบนเพียงแต่เอามาปรับปรุงให้ดูเป็นตัวอย่าง กรณีทำ Project ส่งอาจารย์ก็ควรจะดัดแปลงให้ดีนะครับ ผมทราบว่าอาจารย์หลายท่านก็แวะมาที่นี่เหมือนกัน
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
ตัวอย่างภาพการใช้งาน

Re: ปัญหาเรื่องการแสดงตัวเลขครับ
Posted: Tue Feb 21, 2012 9:33 am
by freedomzaa

ขอบคุณสำหรับคำแนะนำมากครับ
รบกวนถามอีกนิดหน่อยครับ ในโค๊ดที่อาจารย์เขียน อะไรคือ
Call RemoveUnused มันคือ function ที่เราต้องเขียนมาเอง หรือเป็น function สำหรับการ Remove String ที่เราไม่ใช้แล้วออกไป ไม่มีได้ไหมครับ
Re: ปัญหาเรื่องการแสดงตัวเลขครับ
Posted: Tue Feb 21, 2012 9:38 am
by snasui

เป็น 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

จาก 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

ขอบคุณครับ
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

ช่วยแนบตัวอย่างที่เป็นปัญหามาด้วยครับ จากไฟล์ที่ส่งมาไม่พบปัญหาที่ถามมาครับ
นอกจากนี้ Code ที่แนบมาไม่ได้เป็น Code ล่าสุดที่ผมโพสต์ให้ไป สังเกตว่า SplitThenJoin ก็ Update เพิ่มไปให้ใหม่ครับ
Re: ปัญหาเรื่องการแสดงตัวเลขครับ
Posted: Wed Feb 22, 2012 1:40 pm
by freedomzaa
snasui wrote:
ช่วยแนบตัวอย่างที่เป็นปัญหามาด้วยครับ จากไฟล์ที่ส่งมาไม่พบปัญหาที่ถามมาครับ
นอกจากนี้ Code ที่แนบมาไม่ได้เป็น Code ล่าสุดที่ผมโพสต์ให้ไป สังเกตว่า SplitThenJoin ก็ Update เพิ่มไปให้ใหม่ครับ
Update SplitThenJoin เรียบร้อยครับ แต่ก็ยังติดปัญหาเดิมครับ
Re: ปัญหาเรื่องการแสดงตัวเลขครับ
Posted: Wed Feb 22, 2012 1:45 pm
by snasui

ในไฟล์แนบที่ปรับ Code มาผม Run แล้วก็ได้ตามนั้นครับ
A5 = E.1.5.7
A31 = E.1.5.8
A32 = E.1.5.9
ไม่ทราบว่าที่ผิดมันได้เป็นค่าใดครับ

ตัวอย่างตามไฟล์แนบครับ