:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser

การแปลงข้อมูล

ฟอรัมถาม-ตอบปัญหาการใช้งาน MS Excel and VBA
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

การแปลงข้อมูล

#1

Post by Bafnet »

สวัสดีครับอาจารย์
มีเรื่องรบกวนหน่อยครับ อาจารย์ช่วยหาวิธีการที่จะให้ข้อมูลในชีท1 ตามไฟล์แนบ
มาแสดงค่าในชีทที่2 ตามลักษณะตัวอย่างที่ชีท2
อาจารย์ช่วยสร้างคำสั่งให้หน่อยนะครับ
ผมไม่สามารถเขียน หรือลองบันทึกมาโคร เพราะทราบแต่ผลที่ต้องการ
แต่ไม่สามารถสร้างเส้นทางไปถึงผลได้ รบกวนเขียนคำสั่งให้กรณีนี้นะครับ
ขอขอบคุณครับ :)
z.xlsx
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30919
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแปลงข้อมูล

#2

Post by snasui »

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

Code: Select all

Sub ReRangeData()
Dim rs As Range, rt As Range
Dim lng As Long
Application.ScreenUpdating = False
With Worksheets("Sheet1")
    Set rs = .Range("A2", .Range("B2").End(xlDown))
End With
For lng = 1 To 7
    Set rt = Worksheets("Sheet1").Range("A2").End(xlDown).Offset(1, 0)
    rs.Copy: rt.PasteSpecial xlPasteValues
Next lng
Set rs = rs.Offset(0, 5).Resize(, 3)
For lng = 1 To 7
    Set rt = Worksheets("Sheet1").Range("C2").End(xlDown).Offset(1, 0)
    rs.Copy: rt.PasteSpecial xlPasteValues
    Set rs = rs.Offset(0, 3)
Next
Application.ScreenUpdating = True
End Sub
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: การแปลงข้อมูล

#3

Post by Bafnet »

สวัสดีครับ
ขอบคุณครับเล่นเอาซึมไปเลย :lol: อาจารย์ครับจาก code ที่เขียนมา
มันส่งข้อมูลเฉพาะงวดที่ 2 มาครับ
ใน 1 แถวมี 8 งวดครับ
อย่างสัญญา 43010719 งวดทีส่งมาคือ 54 5 6000 ต้องการให้ส่งงวดทั้งหมดในแถวนั้นลงมาด้วยครับ
ผมแบ่งสีให้อาจารย์ดูนะครับ อย่างสัญญาที่ 43010719 ผลที่ต้องการคือ
43010719 1 54 5 6000
43010719 1 54 6 2000
43010719 1 55 6 2000
43010719 1 57 6 2000
43010719 1 0 0 0
43010719 1 0 0 0

รบกวนด้วยนะครับ อืม...น่าจะส่งไปชีท2 ด้วยนะครับ :lol:ลองขอดูเผื่อได้..อิอิ
ขอบคุณครับ
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30919
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแปลงข้อมูล

#4

Post by snasui »

:lol: Code ที่ผมให้ไปก็ทำเช่นนั้นแหละครับ ถ้าลองกดแป้น F8 เพื่อ Run ทีละ Step จะเห็นว่าเป็นการนำข้อมูลไปวางต่อกันทีละชุด หากจะให้เรียงกันแบบตัวอย่างที่ทำมาก็สามารถ Sort ตามคอลัมน์ที่ต้องการได้ครับ

หากต้องการจะนำไปวางที่ Sheet2 แบบไม่ต้องปรับ Code เยอะก็แค่เขียนให้ Copy ค่าในคอลัมน A:E ที่ได้มาแล้วไปวางใน Sheet2 ก็ได้ครับ :mrgreen:
User avatar
snasui
Site Admin
Site Admin
Posts: 30919
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแปลงข้อมูล

#5

Post by snasui »

:D อันนนี้ผมปรับให้วางที่ Sheet2 ครับ

Code: Select all

Sub ReRangeData()
Dim rs As Range, rt As Range
Dim lng As Long, lngLr As Long
Application.ScreenUpdating = False
lngLr = Rows.Count
Worksheets("Sheet1").Range("A1:E1").Copy Worksheets("Sheet2").Range("A1")
With Worksheets("Sheet1")
    Set rs = .Range("A2", .Range("B2").End(xlDown))
End With
For lng = 1 To 8
    Set rt = Worksheets("Sheet2").Range("A" & lngLr).End(xlUp).Offset(1, 0)
    rs.Copy: rt.PasteSpecial xlPasteValues
Next lng
Set rs = rs.Offset(0, 2).Resize(, 3)
For lng = 1 To 8
    Set rt = Worksheets("Sheet2").Range("C" & lngLr).End(xlUp).Offset(1, 0)
    rs.Copy: rt.PasteSpecial xlPasteValues
    Set rs = rs.Offset(0, 3)
Next
Worksheets("Sheet2").Range("B1").EntireColumn.Delete
Application.ScreenUpdating = True
End Sub
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: การแปลงข้อมูล

#6

Post by Bafnet »

อายครับ..อายอาจารย์และอายตัวเอง :tt:
ผมผิดเองครับที่ไม่ดูให้ดี
ถูกต้องและสมบูรณ์ทุกอย่างครับ เพียงแค่แต่ละงวดของสัญญามันอยู่ห่างไกลกัน
กรองข้อมูลก็สมบูรณ์ครับ
ขออภัยในความใจร้อนและไม่รอบคอบครับ

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

Code: Select all

With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\swbpr\data\datafdu\PALM110815\FILEC.", Destination:=Range("$A$1"))
        .Name = "FILEC."
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 874
        .TextFileStartRow = 1
        .TextFileParseType = xlFixedWidth
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileFixedColumnWidths = Array(8, 1, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, _
        2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
    Columns("F:G").Select
    Selection.Delete Shift:=xlToLeft
    Columns("I:J").Select
    Selection.Delete Shift:=xlToLeft
    Columns("L:M").Select
    Selection.Delete Shift:=xlToLeft
    Columns("O:P").Select
    Selection.Delete Shift:=xlToLeft
    Columns("R:S").Select
    Selection.Delete Shift:=xlToLeft
    Columns("U:V").Select
    Selection.Delete Shift:=xlToLeft
    Columns("X:Y").Select
    Selection.Delete Shift:=xlToLeft
    Columns("AA:AB").Select
    Selection.Delete Shift:=xlToLeft
และผมมีอีกหนึ่งคำสั่งเพื่อให้ผู้ใช้เลือกเปิด FILEC จาก PALM ที่ผู้ใช้เลือก

Code: Select all

Private Sub CommandButton1_Click()
Dim fileToOpen
Sheet3.Activate
ChDir "C:\swbpr\data\datafdu"
fileToOpen = Application.GetOpenFilename("FILEC ที่ได้จาก BPR->PALM,")
If fileToOpen <> False Then
ทำอย่างไรครับจะรวมสองคำสั่งนี้ โดยให้ Text ของมาโครที่บันทึกคือ FILEC ที่ตำแหน่งผู้ใช้เลือก

Code: Select all

With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;C:\swbpr\data\datafdu\PALM110815\FILEC.", Destination:=Range("$A$1"))'ให้ตรงนี้เปลี่ยนตามตำแหน่งFileC ที่ผู้ใช้เลือก
ปัญหาตอนนี้คือ Text ที่ชื่อ FILEC ตายตัวอยู่ที่ PALM110815

ข้อมูลเพิ่มเติม
ที่ตำแหน่ง C:\swbpr\data\datafdu มีแฟ้มที่ชื่อ PALM จำนวนหลายแฟ้มซึ่งมีวันที่กำกับเช่น PALM110815 ,PALM110818 (โหลดจากข้อมูลธนาคาร)
แต่ละ PALM ก็มี FILETEXT ที่ชื่อ FILEC

รบกวนด้วยนะครับ...ขอบคุณครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 30919
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแปลงข้อมูล

#7

Post by snasui »

:D หากผมเข้าใจถูกต้องเป็นการให้ผู้ใช้เลือกไฟล์เพื่อ Import

ตัวอย่างการปรับ Code ตามด้านล่างครับ

Code: Select all

Dim fileToOpen
Sheet3.Activate
ChDir "C:\swbpr\data\datafdu"
fileToOpen = Application.GetOpenFilename("FILEC ที่ได้จาก BPR->PALM,")
If fileToOpen = False Then
    MsgBox "Please select file."
    Exit Sub
End If
With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & fileToOpen, Destination:=Range("$A$1"))
' Other code
End With
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: การแปลงข้อมูล

#8

Post by Bafnet »

สวัสดีครับอาจารย์
ขอบคุณมากๆครับ
เมื่อคืนก็ลองทำดู เหมือนอาจารย์เป๊ะ!

Code: Select all

With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT; fileToOpen", Destination:=Range("$A$1"))
End With

แต่ขาดไปตัวเดียว ตัวเดียวที่สำคัญ
"& :lol:

ถ้าสะกิดใจสักนิดว่าการระบุตำแหน่งตามชื่อที่เราต้องการ มันก็มีหลักการเขียน
เหมือนกับครั้งแรกที่อาจารย์สอน เรื่องการนำรูปภาพตามค่าของTextBoxมาแสดง

Code: Select all

myPic = "D:\My Picture\" & TexBox1 & ".jpg"
ซึ่งครั้งนั้นทำไม่ได้ก็เพราะไม่มี "&

เมื่อคืนทำไปทำมาได้แบบนี้ครับ ใช้ได้ผลครับ เพียงแต่มันเปิดเป็นบุ๊คใหม่ที่ชื่อ FILEC แล้ว Coppy
ข้อมูลมาวาง/ปิดตัวเองโดยไม่บันทึก

Code: Select all

Private Sub CommandButton1_Click()
Dim fileToOpen
Sheet3.Activate
Sheet3.Range("A:AP").Value = ""
ChDir "C:\swbpr\data\datafdu"
fileToOpen = Application.GetOpenFilename("FILEC ·Õèä´é¨Ò¡ BPR->PALM,")
If fileToOpen <> False Then
Workbooks.OpenText Filename:="FILEC", _
        Origin:=874, StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array( _
        Array(0, 1), Array(8, 1), Array(9, 1), Array(11, 1), Array(13, 1), Array(20, 1), Array(22, 1 _
        ), Array(24, 1), Array(26, 1), Array(28, 1), Array(35, 1), Array(37, 1), Array(39, 1), Array _
        (41, 1), Array(43, 1), Array(50, 1), Array(52, 1), Array(54, 1), Array(56, 1), Array(58, 1), _
        Array(65, 1), Array(67, 1), Array(69, 1), Array(71, 1), Array(73, 1), Array(80, 1), Array( _
        82, 1), Array(84, 1), Array(86, 1), Array(88, 1), Array(95, 1), Array(97, 1), Array(99, 1), _
        Array(101, 1), Array(103, 1), Array(110, 1), Array(112, 1), Array(114, 1), Array(116, 1), _
        Array(118, 1), Array(125, 1), Array(127, 1)), TrailingMinusNumbers:=True
        Sheets("FILEC").Range("A:AP").Select
          Selection.Copy
    Workbooks("z.xlsm").Worksheets("Sheet3").Activate
    Columns("A:A").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
  Workbooks("FILEC").Close , False
      End If
End Sub
แต่ชอบแบบอาจารย์มากว่า แต่ก็ดีใจที่พบอีกหนึ่งวิธีหนึ่ง :tt:
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: การแปลงข้อมูล

#9

Post by Bafnet »

สวัสดีครับอาจารย์
ผมต้องขออภัยที่ไม่ได้เปิดกระทู้ใหม่นะครับ
พอดีมีประเด็นนิดเดียวครับ
ตาม code

Code: Select all

Private 
Sub	CommandButton8_Click()												
If TextBox1.Value	= Then												
Exit Sub															
End If															
[color=#FF0040]If ComboBox1.Value = เพื่อเป็นค่าลงทุนในการประกอบอาชีพอย่างอื่น Or ComboBox1.Value = เพื่อเป็นค่าใช้จ่ายในการประกอบอาชีพอย่างอื่น Or ComboBox1.Value = เพื่อเป็นค่าลงทุนในการพัฒนาคุณภาพชีวิต	Or ComboBox1.Value = เพื่อชำระหนี้สินภายนอก[/color] Then
MsgBox	ท่านทำสัญญานอกภาคการเกษตรครับ เลือก วิเคราะห์นอกภาค <= 300,000 ครับ, vbOKOnly,"DumP"							
Exit Sub															
End If															
If TextBox121.Value = ผลการวิเคราะห์ ลูกค้าสามารถชำระหนี้ได้	Then											
Sheet2.PrintOut																
Else																
MsgBox "โปรดแก้ไข รายรับรายจ่าย ครับ",	vbOKOnly,"DumP"												
Exit Sub															
End If															
End Sub
อาจารย์ช่วยแนะนำการเขียน If Or ให้สั้นหน่อยครับ ขอบคุณครับ :roll:
User avatar
snasui
Site Admin
Site Admin
Posts: 30919
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแปลงข้อมูล

#10

Post by snasui »

:D ลองใช้ Select Case เข้ามาช่วย ตามตัวอย่างด้านล่างครับ

Code: Select all

'Other code
Select Case ComboBox1.Value
    Case "เพื่อเป็นค่าลงทุนในการประกอบอาชีพอย่างอื่น", " เพื่อเป็นค่าใช้จ่ายในการประกอบอาชีพอย่างอื่น", _
        "เพื่อเป็นค่าลงทุนในการพัฒนาคุณภาพชีวิต", "เพื่อชำระหนี้สินภายนอก"
        MsgBox "ท่านทำสัญญานอกภาคการเกษตรครับ เลือก วิเคราะห์นอกภาค <= 300,000 ครับ", vbOKOnly, "DumP"
        Exit Sub
    Case "ผลการวิเคราะห์ ลูกค้าสามารถชำระหนี้ได้"
        Sheet2.PrintOut
End Select
'Other code
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: การแปลงข้อมูล

#11

Post by Bafnet »

สวัสดีครับ :D
snasui wrote::D ลองใช้ Select Case เข้ามาช่วย ตามตัวอย่างด้านล่างครับ

Code: Select all

'Other code
Select Case ComboBox1.Value
Case "เพื่อเป็นค่าลงทุนในการประกอบอาชีพอย่างอื่น", " เพื่อเป็นค่าใช้จ่ายในการประกอบอาชีพอย่างอื่น", _
"เพื่อเป็นค่าลงทุนในการพัฒนาคุณภาพชีวิต", "เพื่อชำระหนี้สินภายนอก"
MsgBox "ท่านทำสัญญานอกภาคการเกษตรครับ เลือก วิเคราะห์นอกภาค <= 300,000 ครับ", vbOKOnly, "DumP"
Exit Sub
Case "ผลการวิเคราะห์ ลูกค้าสามารถชำระหนี้ได้"
Sheet2.PrintOut
End Select
'Other code
เป็นความรู้ใหม่ ผมจะฝึกใช้ครับ จากคำสั่ง

Code: Select all

Case "ผลการวิเคราะห์ ลูกค้าสามารถชำระหนี้ได้"
หมายถึงค่าของ Textbox121 หรือเป็นค่าของComboBox1.Value ครับ เพราะคำสั่งที่ผมแนบมาการสั่งพิมพ์เป็นเงื่อนไข
ของ Textbox121

Code: Select all

If TextBox121.Value = ผลการวิเคราะห์ ลูกค้าสามารถชำระหนี้ได้   Then                                 
Sheet2.PrintOut                                                
Else


ต่อไปก็อีกสักคำถามนะครับ คำถามสำคัญ
โปรแกรมช่วยงานที่ทำอยู่ เมื่อสั่งรัน ทุกอย่างผมใช้งานบน UserForm ทั้งหมด แผ่นงานเป็นเพียงที่คำนวณ
ผมสังเกตุว่าในขณะที่ใช้งานบน UserForm แล้วผมมีความจำเป็นต้องเปิด Excel อีกไฟล์หนึ่ง
และกลับมาที่๊ UserForm(ซึ่งยังค้างอยู่) เมื่อสั่งรันปุ่มคำสั่ง มันจะDebug
เหมือนกับว่ามันไม่รู้ว่าจะทำงานบน Excel ไฟล์ไหน
ต้องเอาเมาส์ไปคลิ๊กที่แผ่นงานก่อนจึงไม่ debug
นึกถึงว่าหากใช้งานจริง ซึ่งตั้งใจไว้ว่า เมื่อเปิด ไฟล์ DumP จะสั่งปิดเครื่่องมือ Excel ของไฟล์ DumP ทั้งหมด
ให้ผู้ใช้เห็นเฉพาะ Userform

แล้วปัญหาข้างต้นหากผู้ใช้เปิดไฟล์ Ecel อื่นๆ และกลับมาคลิ๊กที่ UserForm ของโปรแกรม
จะให้ไม่เกิด Debug จะแก้ไขอย่างไรครับ

คำสั่งที่ Debug เช่น
With Worksheets("FileA")
เหมือนกับว่ามันไม่รู้ว่าชีท FileA ของ DumP
User avatar
snasui
Site Admin
Site Admin
Posts: 30919
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแปลงข้อมูล

#12

Post by snasui »

Bafnet wrote:เป็นความรู้ใหม่ ผมจะฝึกใช้ครับ จากคำสั่ง
โค้ด: เลือกทั้งหมด
Case "ผลการวิเคราะห์ ลูกค้าสามารถชำระหนี้ได้"

หมายถึงค่าของ Textbox121 หรือเป็นค่าของComboBox1.Value ครับ เพราะคำสั่งที่ผมแนบมาการสั่งพิมพ์เป็นเงื่อนไข
ของ Textbox121
ตัวอย่างที่ผมเขียนให้มานั้นเป็นของ ComboBox1 ครับ โดยใช้ Select Case เป็นการให้ดูว่าค่าของ ComboBox1 เข้ากรณีใด

ถ้าเป็นกรณีใดกรณีหนึ่งต่อไปนี้ "เพื่อเป็นค่าลงทุนในการประกอบอาชีพอย่างอื่น", " เพื่อเป็นค่าใช้จ่ายในการประกอบอาชีพอย่างอื่น", "เพื่อเป็นค่าลงทุนในการพัฒนาคุณภาพชีวิต", "เพื่อชำระหนี้สินภายนอก" ก็ให้แสดง MsgBox "ท่านทำสัญญานอกภาคการเกษตรครับ เลือก วิเคราะห์นอกภาค <= 300,000 ครับ", vbOKOnly, "DumP"

แต่หากค่าใน ComboBox1 มีค่าเป็น "ผลการวิเคราะห์ ลูกค้าสามารถชำระหนี้ได้" ก็ให้สั่ง Sheet2.PrintOut เช่นนี้เป็นต้นครับ คงจะประยุกต์ต่อได้ไม่ยาก

อีกคำถาม คิดแบบเร็ว ๆ เพราะไม่เห็น Code คงต้องเขียน Code ให้ระบุให้ชัดว่าต้องการทำงานกับไฟล์ไหนครับ อย่าระบุเป็น ActiveWorkbook, ActiveSheet เพราะขณะปัจจุบันที่ Active อยู่นี้อาจจะไม่ใช่ไฟล์ที่ต้องการให้ Run ก็ได้
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: การแปลงข้อมูล

#13

Post by Bafnet »

สวัดีครับ

จากประเด็นดังกล่าวแสดงว่าผมต้องระบุเส้นทางใน code ให้ชัดเจน
With Workbooks("DumP.xlsm").Worksheets("FileA") ซึ่งไม่ Debug
ใช่ไหมครับ
ถ้าใช่ ขอถามดังนี้

Workbooks("DumP.xlsm").Worksheets("FileA").Range("A2").Value
Workbooks("DumP.xlsm").Sheet8.Range("A2").Value

ผลเหมือนกันใช่ไหมครับ Sheet8 ชื่อชีท FileA (คงต้องแก้กันมากมาย)

ถ้าผมคิดว่าจะเอาคำสั่ง Active ไฟล์ DumP ไปใส่ในคำสั่งของUserform
อาจารย์คิดว่าจะได้ไหมครับ ถ้าได้คงดี

Code: Select all

Private Sub UserForm_Click()

End Sub
จะเขียนคำสั่งอย่างไรครับ เมื่อ Click ฟอร์มแล้ว DumP จะ Active
ผมไม่เคยเขียน Active นำหน้า ส่วนใหญ่เขียนแต่

Workbooks("DumP.xlsm").Worksheets("FileA").Activate

ลองเขียน ActiveWorkbooks("DumP.xlsm") ไปก็ Debug
มาไกลแล้วครับ :sg:
User avatar
snasui
Site Admin
Site Admin
Posts: 30919
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแปลงข้อมูล

#14

Post by snasui »

:D ปกติการอ้างอิงถึงเซลล์จะใช้แบบนี้ครับ
Bafnet wrote:Workbooks("DumP.xlsm").Worksheets("FileA").Range("A2").Value
ส่วนแบบนี้ผมทดสอบแล้วเกิด Error
Bafnet wrote:Workbooks("DumP.xlsm").Sheet8.Range("A2").Value
แต่หากทดสอบว่าใช้งานได้ก็ไม่น่าจะมีประเด็นอะไร

การใช้ ActiveWorkbooks ปกติไม่ต้องระบุชื่อ Workbook จะใช้ที่ส่วนใดของ Code ก็ได้ครับ และสามารถใช้ ActiveWorkbooks ได้เลย ถ้ามั่นใจว่าที่ Active อยู่ ณ ขณะนี้คือ Book ที่ต้องการทำงาน
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: การแปลงข้อมูล

#15

Post by Bafnet »

สวัสดีครับอาจารย์ มีเรื่องให้อาจารย์ช่วยหน่อยนะครับ
ตามคำสั่งที่อาจารย์ทำให้
snasui wrote::D อันนนี้ผมปรับให้วางที่ Sheet2 ครับ

Code: Select all

Sub ReRangeData()
Dim rs As Range, rt As Range
Dim lng As Long, lngLr As Long
Application.ScreenUpdating = False
lngLr = Rows.Count
Worksheets("Sheet1").Range("A1:E1").Copy Worksheets("Sheet2").Range("A1")
With Worksheets("Sheet1")
    Set rs = .Range("A2", .Range("B2").End(xlDown))
End With
For lng = 1 To 8
    Set rt = Worksheets("Sheet2").Range("A" & lngLr).End(xlUp).Offset(1, 0)
    rs.Copy: rt.PasteSpecial xlPasteValues
Next lng
Set rs = rs.Offset(0, 2).Resize(, 3)
For lng = 1 To 8
    Set rt = Worksheets("Sheet2").Range("C" & lngLr).End(xlUp).Offset(1, 0)
    rs.Copy: rt.PasteSpecial xlPasteValues
    Set rs = rs.Offset(0, 3)
Next
Worksheets("Sheet2").Range("B1").EntireColumn.Delete
Application.ScreenUpdating = True
End Sub
หลังจากที่ได้ข้อมูลแล้ว :oops: เอ่อ...
อาจารย์ช่วยเขียนต่อให้มันตรวจดูว่าถ้าแถวไหนที่สัญญา มีค่า 0 0 0 (ค่าในคอลัมม์ B,C,D ต้องเป็น 0 ทั้งสามตัว)
ให้ลบแถวสัญญานั้นทิ้งไปเลย...นะครับ :lol:
(ขอเป็นลักษณะ Loop นะครับ ผมจะนำมาเทียบเคียง% กับจำนวนข้อมูลทั้งหมดเพื่อแสดง%การประมวลผลได้)
ขอบคุณครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 30919
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแปลงข้อมูล

#16

Post by snasui »

:D ลองเขียนมาก่อนดีไหมครับ ติดตรงไหนก็แจ้งมาพร้อม Code ที่เป็นปัญหา จะได้ช่วยกันดูต่อครับ เขียนแยกออกมาอีก Sub Procedure ก็ได้ ไม่จำเป็นต้องไปรวมกับ Code ที่ผมทำเป็นตัวอย่างไปให้ก็ได้ครับ :mrgreen:
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: การแปลงข้อมูล

#17

Post by Bafnet »

snasui wrote:ลองเขียนมาก่อนดีไหมครับ
ดีครับ... :D สวัสดีครับอาจารย์หวังว่าอาจารย์คงยังอยู่
จาก Cod คำสั่ง
snasui wrote:Next
Worksheets("Sheet2").Range("B1").EntireColumn.Delete
Application.ScreenUpdating = True
มันทำให้ข้อมูลที่อยู่ด้านหลังหมายถึงสูตรอื่นที่ผมเขียนไว้ ขยับ เช่นเคยอยูที่ F4 ก็เลื่อนมาเป็น E4
หากตัดคำสั่ง

Code: Select all

Worksheets("Sheet2").Range("B1").EntireColumn.Delete
จะมีผลต่อข้อมูลตามคำสั่งที่อาจารย์ให้มาไหมครับ

2.อย่างที่ได้แจ้งให้ทราบก่อนหน้านี้ว่าข้อมูลที่นำมาแปลงเป็นข้อมูลที่นำเข้ามา ผมต้องนำ
คำสั่งของอาจารย์มารวม เพราะต้องการให้การนำเข้าและจัดการข้อมูลเสร็จในครั้งเดียว
หากมีหลายปุ่มคำสั่งเกรงผู้ใช้จะงง
lonex.jpg

Code: Select all

Private Sub CommandButton28_Click()
Dim fileToOpen
Dim rs As Range, rt As Range, ri As Range
Dim lng As Long, lngLr As Long
Sheet10.Range("A:D").Value = ""
Application.ScreenUpdating = False
Sheet22.Activate
Sheet22.Range("A1:AP1").Value = Sheet15.Range("A200:AP200").Value
ChDir "C:\swbpr\data\datafdu"
fileToOpen = Application.GetOpenFilename("FILEC ·Õèä´é¨Ò¡ BPR->PALM,")
If fileToOpen = False Then
    MsgBox "Please select file."
    Exit Sub
End If
With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & fileToOpen, Destination:=Range("$A$2"))
.Name = "FILEC."
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 874
        .TextFileStartRow = 1
        .TextFileParseType = xlFixedWidth
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileFixedColumnWidths = Array(8, 1, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, _
        2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=True
    End With
    Columns("F:G").Select
    Selection.Delete Shift:=xlToLeft
    Columns("I:J").Select
    Selection.Delete Shift:=xlToLeft
    Columns("L:M").Select
    Selection.Delete Shift:=xlToLeft
    Columns("O:P").Select
    Selection.Delete Shift:=xlToLeft
    Columns("R:S").Select
    Selection.Delete Shift:=xlToLeft
    Columns("U:V").Select
    Selection.Delete Shift:=xlToLeft
    Columns("X:Y").Select
    Selection.Delete Shift:=xlToLeft
    Columns("AA:AB").Select
    Selection.Delete Shift:=xlToLeft

ActiveSheet.QueryTables(1).Delete
Application.ScreenUpdating = False
lngLr = Rows.Count
Worksheets("DataC").Range("A1:E1").Copy Worksheets("FileC").Range("A1")
With Worksheets("DataC")
    Set rs = .Range("A2", .Range("B2").End(xlDown))
End With
For lng = 1 To 8
    Set rt = Worksheets("FileC").Range("A" & lngLr).End(xlUp).Offset(1, 0)
    rs.Copy: rt.PasteSpecial xlPasteValues
Next lng
Set rs = rs.Offset(0, 2).Resize(, 3)
For lng = 1 To 8
    Set rt = Worksheets("FileC").Range("C" & lngLr).End(xlUp).Offset(1, 0)
    rs.Copy: rt.PasteSpecial xlPasteValues
    Set rs = rs.Offset(0, 3)
Next
Worksheets("FileC").Range("B1").EntireColumn.Delete'ทำให้Colummเลื่อน แก้เป็นApplication.CutCopyMode = False
Sheet22.Range("A:Z").ClearContents
Application.ScreenUpdating = True

   'With Workbooks("DumP.xlsm").Worksheets("FileC") 'สั่งกรองข้อมูลเพื่อลบข้อมูลที่เป็น 0
'Set ri = .Range(.Range("A2"), .Range("D65536") _
    '.End(xlUp)).SpecialCells(xlCellTypeVisible)
'End With
   'Sheet10.Activate
            'Sheet10.Range("A:D").AutoFilter Field:=2, Criteria1:="0"
           'Sheet10.Range("A:D").AutoFilter Field:=3, Criteria1:="0"
           'Sheet10.Range("A:D").AutoFilter Field:=4, Criteria1:="0"
           'ri.Select
       'ri.Value = ""
       'Sheet10.ShowAllData
       'Sheets("FileC").Activate
                'Sheet10.Columns("A:D").Select
    'ActiveWorkbook.Worksheets("FileC").Sort.SortFields.Clear
    'ActiveWorkbook.Worksheets("FileC").Sort.SortFields.Add key:=Range("A1"), _
        'SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    'With ActiveWorkbook.Worksheets("FileC").Sort
        '.SetRange Range("A2:D65633")
        '.Header = xlNo
      '  .MatchCase = False
    '    .Orientation = xlTopToBottom
    '    .SortMethod = xlPinYin
        '.Apply
    'End With
    
    'Sheet22.Activate
    'Sheet22.Range("A:Z").Delete
     'Workbooks("DumP.xlsm").Save
End Sub
หลังจากที่ได้ข้อมูลมาก็ใช้คำสั่งต่อไปนี้เพื่อสร้าง FilceC ให้สมบูรณ์

Code: Select all

Private Sub CommandButton5_Click()
Dim r As Integer
If Sheet10.Range("F2").Value <> "" Then
Exit Sub
End If
With Workbooks("DumP.xlsm").Worksheets("FileC")
 Application.ScreenUpdating = False
Sheets("FileC").Activate
Label18.Caption = "กำลังรวบรวมข้อมูล FileC %"
Sheet10.Range("W1").Value = "เขต"
Sheet10.Range("F1").Value = "เลขทะเบียน"
Sheet10.Range("G1").Value = "ชื่อ-สกุล"
Sheet10.Range("H1").Value = "ที่อยู่"
Sheet10.Range("I1").Value = "รหัสโครงการ"
r = 2
Do Until Sheet10.Cells(r, 1).Value = ""
Sheet10.Cells(r, 6).Formula = "=VLOOKUP(" & Sheet10.Cells(r, 1).Address & ",FileB!A:T,3,0)"
Sheet10.Cells(r, 7).Formula = "=VLOOKUP(" & Sheet10.Cells(r, 6).Address & ",FileA!A:G,5,0)"
Sheet10.Cells(r, 8).Formula = "=VLOOKUP(" & Sheet10.Cells(r, 6).Address & ",FileA!A:G,7,0)"
Sheet10.Cells(r, 9).Formula = "=VLOOKUP(" & Sheet10.Cells(r, 1).Address & ",FileB!A:T,17,0)"
Sheet10.Cells(r, 23).Formula = "=VLOOKUP(" & Sheet10.Cells(r, 6).Address & ",FileA!A:G,3,0)"
TextBox7.Value = Sheet10.Range("P1").Value
DoEvents
r = r + 1
Loop

 Sheet10.Range("J:J").Value = Sheet10.Range("F:F").Value
Sheet10.Range("K:K") = Sheet10.Range("G:G").Value
Sheet10.Range("L:L") = Sheet10.Range("H:H").Value
Sheet10.Range("M:M") = Sheet10.Range("I:I").Value
Sheet10.Range("E:E") = Sheet10.Range("W:W").Value
Sheet10.Range("F:I").Value = Sheet10.Range("J:M").Value
Sheet10.Range("J:M").ClearContents
Sheet10.Range("W:W").ClearContents
Label18.Caption = "ข้อมูล FileC สมบูรณ์  " & Now()
       MsgBox "รวบรวมข้อมูล FileC สมบูรณ์" , vbOKOnly, "DumP"
 Sheet10.Range("S1").Value = Label18.Caption
   End With
   Application.ScreenUpdating = True
   Workbooks("DumP.xlsm").Save
End Sub
เกิดปัญหาครับ เลขที่สัญญาที่ได้จากการนำเข้าและจัดเรียงตามคำสั่งแรกไม่สามารถ VLookup ได้ครับ
จากการหาสาเหตุ ผมคิดว่ามันมีรูปแบบเป็นText หรือเป็น ตัวเลข แต่ก็ไม่ใช่
ต้องเอาเมาส์ไปคลิ๊กที่เลขที่สัญญา แล้วKEy *1 ค่าในเซลนั้นแสดงผลเป็น *1 มันก็Vlookup เจอทันที
A2 = 40014235
E2=VLOOKUP(A2,FileB!A:T,3,0) ค่าที่ได้ #N/A
แต่พอ เลือก A2 แล้วพิมพ์ *1 ปรากฎว่าที่ E2 ก็แสดงค่าตามต้องการ
งงครับ ช่วยด้วยครับ
You do not have the required permissions to view the files attached to this post.
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: การแปลงข้อมูล

#18

Post by Bafnet »

สวัสดีครับอาจารย์
นั่งหาส่เหตุ ต้องขออภัยอาจารย์ด้วยครับ
ที่บอกว่า *1 แล้วหาค่าได้ ไม่ครับผิด
มันได้ค่าเป็น 37 ทุกราย
หรือเป็นเพราะเลขที่สัญญาที่อยู่ในอีกชีทหนึ่งมีค่าเป็นText และไม่ได้เรียงลำดับ
:flw:
User avatar
snasui
Site Admin
Site Admin
Posts: 30919
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแปลงข้อมูล

#19

Post by snasui »

Bafnet wrote:หากตัดคำสั่ง
โค้ด: เลือกทั้งหมด
Worksheets("Sheet2").Range("B1").EntireColumn.Delete

จะมีผลต่อข้อมูลตามคำสั่งที่อาจารย์ให้มาไหมครับ
ไม่มีผลใด ๆ ครับ Code ยังคงทำงานปกติ คำสั่งด้านบนเป็นการสั่งให้ลบคอลัมน์ B ทิ้งไปเมื่อไม่ต้องการลบก็ลบคำสั่งหรือทำเป็น Comment ได้ตามสะดวกครับ
Bafnet wrote:2.อย่างที่ได้แจ้งให้ทราบก่อนหน้านี้ว่าข้อมูลที่นำมาแปลงเป็นข้อมูลที่นำเข้ามา ผมต้องนำ
คำสั่งของอาจารย์มารวม เพราะต้องการให้การนำเข้าและจัดการข้อมูลเสร็จในครั้งเดียว
หากมีหลายปุ่มคำสั่งเกรงผู้ใช้จะงง
ปกติ Procedure หนึ่ง ๆ เราจะเขียนเพื่องานใดงานหนึ่ง เพื่อลดความซับซ้อน ง่ายต่อการหาค่าผิดพลาดและทำการแก้ไขปรับปรุง หากต้องใช้พร้อมกันหลาย ๆ งานก็ค่อยเรียกใช้จาก Procedure อื่น ๆ ไม่ได้หมายความว่าเขียนหลาย Procedure แล้วจะต้องมีปุ่มสำหรับเรียกใช้ทุก Procedure ครับ :mrgreen:

ผมสังเกต Vlookup จาก Code ก็ใส่ส่วนประกอบมาครบแล้วครับ แต่ที่ไม่ได้คำตอบก็ต้องตรวจสอบดูว่าค่าที่ Vlookup กับค่าต้นทางเหมือนกันหรือไม่ เป็น Number หรือเป็น Text เหมือนกันหรือไม่ ถ้าไม่เหมือนก็แปลงให้เหมือนกันก่อนครับ นอกจากนี้ก็ตรวจสอบดูว่าเล่นไปเล่นมาแล้วไปเผลอกำหนดให้โปรแกรมตั้งค่าการคำนวณเป็น Manual ไปแล้วหรือไม่ หากใช่ก็ปรับมาให้เป็น Automatic ครับ

Code สำหรับการลบ 0 ออกทุกบรรทัด ผมเขียนมาให้โดยดูที่ B, C และ D หากปรับเป็นคอลัมน์อื่นแล้วคิดว่าน่าจะปรับปรุง Code ได้ครับ

Code: Select all

Sub DelZero()
Dim rAll As Range
Dim r As Range
With Worksheets("Sheet2")
    Set rAll = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
End With
For Each r In rAll
    If r = 0 And r.Offset(0, 1) = 0 And r.Offset(0, 2) = 0 Then
        r = ""
    End If
Next r
    On Error Resume Next
    rAll.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: การแปลงข้อมูล

#20

Post by Bafnet »

snasui wrote:ปกติ Procedure หนึ่ง ๆ เราจะเขียนเพื่องานใดงานหนึ่ง เพื่อลดความซับซ้อน ง่ายต่อการหาค่าผิดพลาดและทำการแก้ไขปรับปรุง หากต้องใช้พร้อมกันหลาย ๆ งานก็ค่อยเรียกใช้จาก Procedure อื่น ๆ ไม่ได้หมายความว่าเขียนหลาย Procedure แล้วจะต้องมีปุ่มสำหรับเรียกใช้ทุก Procedure ครับ
:lol: เป็นอีกหนึ่งความรู้ เพราะเข้าใจในแบบของผมมาตลอดว่า ต้องมีเครื่องมือพวก ToolBox หรือ โมดูล แล้วดับดบเบิ้ล Click ถึงจะเขียนคำสั่งได้
งั้นที่ถูกต้องคือบนหน้าต่าง Vb ที่เราใช้เขียนคำสั่ง
เราเขียนคำสั่งได้เลยใช่ไหมครับ เพียงแค่ขึ้นต้น
Sub ชื่อSub
แล้วก็เขียน Code ที่ต้องการ
End sub
ถ้าใช่ก็แสดงว่า...อืมโง่มานานเลยครับ :mrgreen: มิน่าล่ะบางดีดูตัวอย่างคนอื่น
ทำไมคำสั่งมันมากกว่าปุ่ม อยากรู้ว่าคำสั่งนี้สั่งจากปุ่มไหนก็หาไม่เจอ เจอแต่ Call.
เวลาจะใช้งาน เราอย่างไรครับ ยกตัวอย่างให้หน่อยครับ

อีกเรื่องรบกวนอาจารย์ดู Code ให้หน่อยครับ รู้สึกว่า ช้าและ ดูจะหลาย Activate เกินไป (ตามประสาผมล่ะ)

Code: Select all

Private Sub CommandButton28_Click()
Dim fileToOpen
Dim rs As Range, rt As Range, ri As Range
Dim lng As Long, lngLr As Long

Sheet10.Range("A:X").ClearContents
Application.ScreenUpdating = False
Sheet22.Activate
Sheet22.Range("A1:AP1").Value = Sheet15.Range("A200:AP200").Value
ChDir "C:\swbpr\data\datafdu"
fileToOpen = Application.GetOpenFilename("FILEC ·Õèä´é¨Ò¡ BPR->PALM,")
If fileToOpen = False Then
    MsgBox "Please select file."
    Exit Sub
End If
With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & fileToOpen, Destination:=Range("$A$2"))
.Name = "FILEC."
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 874
        .TextFileStartRow = 1
        .TextFileParseType = xlFixedWidth
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, _
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileFixedColumnWidths = Array(8, 1, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, _
        2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 2)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=True
    End With
    Columns("F:G").Select
    Selection.Delete Shift:=xlToLeft
    Columns("I:J").Select
    Selection.Delete Shift:=xlToLeft
    Columns("L:M").Select
    Selection.Delete Shift:=xlToLeft
    Columns("O:P").Select
    Selection.Delete Shift:=xlToLeft
    Columns("R:S").Select
    Selection.Delete Shift:=xlToLeft
    Columns("U:V").Select
    Selection.Delete Shift:=xlToLeft
    Columns("X:Y").Select
    Selection.Delete Shift:=xlToLeft
    Columns("AA:AB").Select
    Selection.Delete Shift:=xlToLeft

ActiveSheet.QueryTables(1).Delete
Application.ScreenUpdating = False
lngLr = Rows.Count
Worksheets("DataC").Range("A1:E1").Copy Worksheets("FileC").Range("A1")
With Worksheets("DataC")
    Set rs = .Range("A2", .Range("B2").End(xlDown))
End With
For lng = 1 To 8
    Set rt = Worksheets("FileC").Range("A" & lngLr).End(xlUp).Offset(1, 0)
    rs.Copy: rt.PasteSpecial xlPasteValues
Next lng
Set rs = rs.Offset(0, 2).Resize(, 3)
For lng = 1 To 8
    Set rt = Worksheets("FileC").Range("C" & lngLr).End(xlUp).Offset(1, 0)
    rs.Copy: rt.PasteSpecial xlPasteValues
    Set rs = rs.Offset(0, 3)
Next
Application.CutCopyMode = False
Application.ScreenUpdating = True
Sheet22.Range("A:Z").ClearContents
Sheet10.Activate
Sheet10.Columns("B:B").Select
    Selection.Delete Shift:=xlToLeft
   With Workbooks("DumP.xlsm").Worksheets("FileC")
Set ri = .Range(.Range("A2"), .Range("D65536") _
    .End(xlUp)).SpecialCells(xlCellTypeVisible)
    Sheet10.Range("A:D").AutoFilter
             Sheet10.Range("A:D").AutoFilter Field:=4, Criteria1:="0"
         ri.Select
     ri.Value = ""
    Sheet10.ShowAllData
 End With
   
            Sheet10.Columns("A:D").Select
    Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
        Sheet10.Range("N1").Formula = "=COUNTA(A:A)"
        Sheet10.Range("O1").Formula = "=COUNTA(F:F)"
        Sheet10.Range("P1").Formula = "=O1*100/N1"
    
        MsgBox "นำเข้าข้อมูล FileC สมบูรณ์", vbOKOnly, "DumP"
     
End Sub
จริงๆผมอยากใส่ Worksheets("Sheet2").Range("B1").EntireColumn.Delete

แต่ไม่เข้าใจว่าทำไมพอใส่ คำสั่งที่อยู่ด้านล่างจึงเพี้ยน เหมือนกับว่า

Code: Select all

Worksheets("Sheet2").Range("B1").EntireColumn.Delete
ทำงานเป็นคำสั่งสุดท้าย 
ทั้งๆจากที่ระบุ อยู่ด้านล่างคำสั่ง Worksheets("Sheet2").Range("B1").EntireColumn.Delete

Code: Select all

 Sheet10.Range("N1").Formula = "=COUNTA(A:A)"
        Sheet10.Range("O1").Formula = "=COUNTA(F:F)"
        Sheet10.Range("P1").Formula = "=O1*100/N1"
ผลที่ได้ จากN1 ไปอยู่ที่ M1 ,O1 ไปอยู่ที่ N1
ผมเลยใช้

Code: Select all

Application.CutCopyMode = False
Application.ScreenUpdating = True
Sheet22.Range("A:Z").ClearContents
Sheet10.Activate
Sheet10.Columns("B:B").Select
    Selection.Delete Shift:=xlToLeft
อาจารย์ปรับ ให้หน่อยนะครับ เอาแบบเดิมก็ได้ครับแต่ช่วยดูหน่อยว่าอันไหนเกินความจำเป็น แบบสั่งแล้วสั่งอีก
:lol: ขอบคุณครับ
Post Reply