Page 1 of 2

อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Wed Jul 18, 2012 12:32 am
by hydrotaxonomy
คือ ต้องการให้ inputBox รับข้อความ เช่น the treasure is buried in the garden
แล้วต้องการให้ข้อความดังกล่าว ติดกันเป็นแบบนี้คะ thetreasureisburiedinthegarden

ต้องทำอย่างไรคะ ขอบคุณสำหรับทุกคำตอบล่วงหน้าคะ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Wed Jul 18, 2012 7:22 am
by snasui
:D กรณีการเขียน VBA ให้ลองเขียนมาก่อน แนบไฟล์ แนบ Code ระบุมาด้วยว่าติดที่ Module ใด Procedure ชื่อว่าอะไร จะได้เข้าถึงข้อมูลได้โดยไวครับ

การตัดช่องว่างสามารถใช้ Replace ได้ครับ เช่น Replace(x," ","")

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Wed Jul 18, 2012 9:57 am
by hydrotaxonomy
หนูเพิ่งเริ่มต้นเรียนการเขียน VBA คะ แล้วหนูมีแต่ไฟล์ที่เป็น excel ที่ต้องเขียน vba เพื่อไปเรียกใช้นะคะ แต่หนูยังเริ่มต้นไม่ถูก
ไฟล์ที่แนบมา คือการถอดรหัส
กำนหนดให้ตัวแปร key และ message เป็นตัวแปรประเภท String
หนูต้องการ กรอก ค่า key เป็นตัวภาษาอังกฤษตัวใหญ่ และ message เป็นตัวภาษาอังกฤษตัวเล็ก
โดยที่ message สามารถมีช่องว่างได้ ตอนที่กรอกลงใน inputbox
แต่การเข้ารหัส ที่ต้องใช้ค่า key และค่า message เปรียบเทียบกันนั้น message จะต้องไม่มีช่องว่าง
เช่น key : "BLOOMINGTON"
message : "the fun has arrived"

message ใหม่ ที่ต้องไปทำการเปรียบเทียบ จะต้องเป็น thefunhasarrived
และค่า key ก็ต้องมีจำนวนเท่ากับตัวจำนวนตัวอักษร message ใหม่ ในที่นี้คือ BLOOMINGTONBLOOM
หลังจากนั้นทำการดึง key และ message มาเปรียบเทียบทีละตัว โดยเทียบจากตารางใน excel จากไฟล์ที่แนบมา
โดย column เป็น ตัวอักษรของ key และ row เป็นตัวอักษรของ message
ในที่นี้ คือ B กับ t เทียบกันจะได้ U
L กับ h เทียบกันจะได้ S
หนูเริ่มต้นตัดช่องว่างใน key ยังไม่ได้นะคะ เลยยังเขียนVBA มาให้ดูไม่ได้ รบกวนช่วยให้คำแนะนำด้วยนะคะ ขอบคุณคะ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Wed Jul 18, 2012 5:53 pm
by snasui
:D จากคำอธิบายและไฟล์แนบ อ่านแล้วไม่เข้าใจและไม่เห็นภาพจึงไม่สามารถแนะนำได้ครับ กรณีเขียน VBA ไม่ได้ควรศึกษาตามตำรามาเป็นลำดับ ติดตรงไหนสามารถถามมาได้เรื่อย ๆ ครับ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Wed Jul 18, 2012 7:30 pm
by hydrotaxonomy
หนูต้องการ รับค่า message มา โดย ตอนรับมี ช่องว่าง หนูจะตัดช่องว่างนั้นทิ้ง ต้องทำอย่างไรคะ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Wed Jul 18, 2012 7:31 pm
by snasui
:shock: ตอบไปแล้วครับ :ard:
snasui wrote: :D กรณีการเขียน VBA ให้ลองเขียนมาก่อน แนบไฟล์ แนบ Code ระบุมาด้วยว่าติดที่ Module ใด Procedure ชื่อว่าอะไร จะได้เข้าถึงข้อมูลได้โดยไวครับ

การตัดช่องว่างสามารถใช้ Replace ได้ครับ เช่น Replace(x," ","")

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Fri Jul 20, 2012 1:56 pm
by วังวู ช่ง
กรณีเขียน VBA ไม่ได้ควรศึกษาตามตำรามาเป็นลำดับ
ขอโทดครับท่านอาจารย์ครับ ตำราหาได้ที่ไหนครับ ผมสนใจตำรา VBA มากครับ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Fri Jul 20, 2012 3:32 pm
by snasui
:D สำหรับตำราที่ผมจะบอกตาม Link นี้คงต้องหาตามร้านใหญ่ ๆ ครับ :arrow: http://www.snasui.com/viewtopic.php?p=7567#p7567

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sat Jul 21, 2012 11:33 am
by akung
ถ้าเริ่มต้นไม่ถูกผมแนะให้ลองใช้ Marco ทำการ Record ดูว่ามันทำงานอย่างไร แล้วเขาไปดู code ว่าเขียนอย่างไรครับ :D

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sat Jul 21, 2012 9:07 pm
by วังวู ช่ง
จิงๆแล้วผ่านมาผมใช้อย่างนั้นถืว่า 100% ครับ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sun Jul 22, 2012 4:28 am
by hydrotaxonomy
หนูจะดึงค่า key มาทีละตัว เเล้วไปหาใน Column A เเล้วให้มันส่งค่าเเถวกลับมาเก็บไว้ใช้ หนูต้องเขียนยังไงคะ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sun Jul 22, 2012 7:17 am
by snasui
:D ดึงค่า Key จากไหนมาทีละตัวครับ ลองอธิบายวิธีการเป็นขั้น ๆ มาตามลำดับ และจาก Code ที่แนบมา ติดปัญหาใดครับ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sun Jul 22, 2012 10:11 am
by hydrotaxonomy
ดึงค่าจากตัวแปร long_key ทีละตัวมาตรวจว่าตรงกับใน column A แถวไหน แล้วให้ส่งค่าแถวกลับมาเก็บไว้

หลังจากนั้นทำการดึงค่าจากตัวแปร plaintext ทีละตัวมาตรวจว่าตรงกับ column ใด ใน R1

นำค่าตัวอักษรที่ได้ในแต่ละรอบมาเรียงต่อกัน ซึ่งจะได้คำใหม่ขึ้นมา

หนูต้องการทำแบบนี้นะคะ แต่หนูเขียนต่อไม่ได้แล้ว เลยมาถามผู้รู้คะ

รบกวนช่วยให้คำแนะนำด้วยนะคะ ขอบคุณคะ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sun Jul 22, 2012 1:07 pm
by snasui
:D Code ที่เขียนมาผมลองปรับเพื่อให้กระชับเป็นตามด้านล่าง

Code: Select all

Public Sub Crypto01()
    Dim Key As String, PlainText As String, Longkey As String
    Key = InputBox("Enter the key of encryption")
    Key = UCase(Key)
    PlainText = InputBox("Enter the message that you want to send")
    PlainText = Replace(PlainText, " ", "")
    Longkey = Left(Application.WorksheetFunction.Rept(Key, 10), Len(PlainText))
    MsgBox "Key = " & Key
    MsgBox "PlainText = " & PlainText
    MsgBox "Longkey = " & Longkey
End Sub
ส่วนที่อธิบายเพิ่มเติมมายังไม่เข้าใจ
hydrotaxonomy wrote:ดึงค่าจากตัวแปร long_key ทีละตัวมาตรวจว่าตรงกับใน column A แถวไหน แล้วให้ส่งค่าแถวกลับมาเก็บไว้
เก็บไว้ในตัวแปรใด :?:
hydrotaxonomy wrote:หลังจากนั้นทำการดึงค่าจากตัวแปร plaintext ทีละตัวมาตรวจว่าตรงกับ column ใด ใน R1
R1 คืออะไร :?:
hydrotaxonomy wrote:นำค่าตัวอักษรที่ได้ในแต่ละรอบมาเรียงต่อกัน ซึ่งจะได้คำใหม่ขึ้นมา
ช่วยยกตัวอย่างให้เป็นภาพด้วยครับ ยกตัวอย่างข้อความที่คีย์ และยกตัวอย่างคำตอบที่ถูกต้องว่าควรได้เป็นอย่างไร เพื่อจะได้เข้าใจตรงกัน สามารถทำลูกศรโยงไปโยงมา ใส่สี ตีเส้นได้เต็มที่ครับ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sun Jul 22, 2012 2:51 pm
by hydrotaxonomy
สมมุติ key = pop
message = the best

จะได้ Plaintext = thebest
Longkey = POPPOPP

หนูต้องการเอา Longkey P

เทียบกับ Plaintext t

ในที่นี้ จับคู่เทียบได้ Pt | Oh | Pe | Pb | Oe | Ps | Pt

จากตารางจะได้ IVTQSHI

แล้วก็นำตัวอักษรที่เทียบจากตาราง มาเรียงเป็นคำใหม่ใช้ชื่อตัวแปรว่า encode แล้วแสดงผลคะ

แต่หนูไม่รู้ว่าจะ mid แล้ววน loop ยังไงนะคะ

รบกวนช่วยให้คำแนะนำด้วยคะ ขอบคุณคะ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sun Jul 22, 2012 3:26 pm
by snasui
:D ลองดู Code ตามด้านล่างครับ

Code: Select all

Public Sub Crypto01()
    Dim Key As String, PlainText As String
    Dim Longkey As String, Encode As String
    Dim t As String, i As Integer
    Key = InputBox("Enter the key of encryption")
    Key = UCase(Key)
    PlainText = InputBox("Enter the message that you want to send")
    PlainText = Replace(PlainText, " ", "")
    Longkey = Left(Application.Rept(Key, 10), Len(PlainText))
    Encode = ""
    For i = 1 To Len(Longkey)
        With Sheets("Sheet1")
            t = Application.Index(.Range("A2:Z27") _
                , Application.Match(Mid(PlainText, i, 1), .Range("A2:A27"), 0) _
                , Application.Match(Mid(Longkey, i, 1), .Range("A1:Z1"), 0))
        End With
        Encode = Encode & t
    Next i
    MsgBox Encode
End Sub

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sun Jul 22, 2012 3:53 pm
by hydrotaxonomy
ขอบคุณสำหรับคำแนะนำคะ หนูขอเรียกว่าอาจารย์แล้วกันนะคะ ขอบคุณจริงๆ คะ อาจารย์ช่วยหนูได้มากเลยคะ

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sun Jul 22, 2012 5:50 pm
by hydrotaxonomy
อาจารย์คะ ถ้าหนูจะแปลงค่า โดยเทียบ encode กับ longkey มาเทียบกันทีละตัว โดยใช้ความยาวของตัวแปร message ที่ยังไม่ได้ตัดช่องว่าง
ซึ่งมันจะไปเก็บค่าไว้ในตัวแปร decode

จากตัวอย่าง
message = the best
Longkey = POPPOPP
encode = IVTQSHI

จะได้ decode ออกมาเป็น the best

ซึ่งความยาว Longkey = 7
แต่ความยาว message = 8

แต่มัน debug คะ ช่วยแก้ไขด้วยนะคะ

Code: Select all

Public Sub Crypto01()
    Dim Key As String, Message As String, PlainText As String, Longkey As String, DecodeSpace As String, _
    Decode As String
    Dim i As Integer, p As Integer
    Key = InputBox("Enter the key of encryption")
    Key = UCase(Key)
    Message = InputBox("Enter the message that you want to send")
    PlainText = Replace(Message, " ", "")
    Longkey = Left(Application.WorksheetFunction.Rept(Key, 10), Len(PlainText))
    MsgBox "Key = " & Key
    MsgBox "PlainText = " & PlainText
    MsgBox "Longkey = " & Longkey
    For i = 1 To Len(Longkey)
        With Sheets("Sheet1")
            t = Application.Index(.Range("A2:Z27") _
                , Application.Match(Mid(PlainText, i, 1), .Range("A2:A27"), 0) _
                , Application.Match(Mid(Longkey, i, 1), .Range("A1:Z1"), 0))
        End With
        Encode = Encode & t
    Next i
    MsgBox Encode
    For p = 1 To Len(Message)
        With Sheets("Sheet1")
            If DecodeSpace = " " Then
                Decode = Decode + " "
                    i = i - 1
            Else
                i = Application.Index(.Range("B2:Z27") _
                    , Application.Match(Mid(Encode, i, 1), .Range("B2:Z27"), 0))
                    , Application.Match(Mid(Message, i, 1), .Range("A1:Z1"), 0))
               Decode = Decode & p
        End If
        End With
    Next p
    MsgBox Decode
   
End Sub


Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sun Jul 22, 2012 6:18 pm
by snasui
:D ลองยกตัวอย่างการเปรียบเทียบ Encode (IVTQSHI) กับ Longkey (POPPOPP) เหมือนการอธิบายในความเห็นก่อนหน้ามาให้ดูหน่อยครับว่ามันได้ผลลัพธ์ตัวแปร Decode เป็นคำว่า the best ได้อย่างไร

Re: อยากทราบวิธีตัดช่องว่างใน VBA

Posted: Sun Jul 22, 2012 6:39 pm
by hydrotaxonomy
ตอนที่ decode มันต้องใช้ความยาวของ message ซึ่งมันมีช่องว่าง

คือหนูต้องการค่า decode กลับมาให้ได้ เหมือนค่า message ที่เราป้อนเข้าไปนะคะ