: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
🪷 คำแสดงเจตนา
ขอผลแห่งการให้ความรู้นี้ จงกลับไปยังผู้ที่เป็นเจ้าของเดิม แม้ข้าพเจ้าจะไม่รู้จักท่านก็ตาม ขอให้แสงแห่งปัญญาที่ท่านเคยจุดไว้ ได้กลับไปเติมเต็มชีวิตของท่านอีกครั้ง และขอให้เจตนาของข้าพเจ้าเป็นการคืนความดีอย่างสงบ

คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

ฟอรัมถาม-ตอบปัญหาการใช้งาน 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

คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#1

Post by Bafnet »

สวัสดีคีครับ...อาจารย์

วันนี้ขออนุญาตเปิดหัวข้อใหม่ และมีเรื่องให้อาจารย์ช่วยเขีบน code คำสั่งให้หน่อยนะครับ
หน้าตา frmreport ใน Workbook("Dump.xlsm")
lone.jpg
มีเงื่อนไขดังนี้นะครับ
1.ข้อมูลอยู่ที่ Sheets("Report")
2.ที่ปุ่มคำสั่งที่เป็นรูป Exel ต้องการคำสั่งให้นำข้อมูล Sheets("Report").Range("A:T").value ไปยังสมุดงานใหม่ที่เราสั่งให้สร้างขึ้น
-สั่งสร้างสมุดงานใหม่ โดยกำหนดชื่อว่า "Report" & Now()
-ให้นำข้อมูลใน Workbook("Dump.xlsm").Worksheets("Report").Range("A:T").value ไปไว้ที่Sheet1.ของสมุดงานใหม่
- สั่ง Save As สมุดงานใหม่ในชื่อ Report & Now() เก็บไว้ที่ตำแหน่ง Desktop
- สั่งปิด สมุดงานดังกล่าว

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

อันนี้คงต้องรบกวนอาจารย์เขียนให้หน่อยนะครับ :D ขอบคุณมากครับ
DumP.xlsm
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: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#2

Post by Bafnet »

อาจารย์ครับ..ผมได้ทดลองบันทึกมาโครได้คำสั่งดังนี้

Private Sub CommandButton1_Click()
Workbooks.Add
ActiveWorkbook.SaveAs Filename:="C:\Users\BPR-2\Desktop\Report.xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=True
Windows("DumP.xlsm").Activate
Columns("A:J").Select
Selection.Copy
Windows("Report.xlsx").Activate
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveWorkbook.Save
ActiveWindow.Close
Windows("DumP.xlsm").Activate
End Sub

มีปัญหาดังนี้

1.
ActiveWorkbook.SaveAs Filename:="C:\Users\BPR-2\Desktop\Report.xlsx", _
FileFormat:=xlOpenXMLWorkbook, CreateBackup:=True
ผมอยากให้ระบุเป็นแค่ :="C:\Desktop\Report.xlsx" เพื่อให้ใช้ได้กับทุกเครื่อง แต่พอใส่ตามนั้นมันก็ debug

2.เมื่อรันมาโครรอบที่สอง มันก็จะถามว่าต้องการแทนที่ไฟล์ Report เดิมหรือไม่ ถ้าตอบว่าใช่ ก็ได้ไฟล์ตามคำสั่ง
แต่ถ้าตอบว่าไม่ มันก็ Debug ครับ
จะทำอย่างไรครับเพื่อให้ผู้ใช้ สามารถกำหนดว่าจะแทนที่ไฟล์ Report เดิม หรือบันทึกชื่อเป็นไฟล์ตามที่ผู้ใช้ต้องการ

อาจารย์อย่าทิ้งผมนะ :roll: ขอบคุณครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#3

Post by snasui »

:D ดูตัวอย่างที่กระทู้นี้ครับ ผู้ใช้สามารถเลือกได้เองว่าจะเซฟที่ไหน ไฟล์ชื่อใด viewtopic.php?f=3&t=309
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#4

Post by Bafnet »

อาจารย์ครับ...หมดปัญญาครับ
พอจะได้รูปแบบดังนี้

Private Sub Export()
Dim FileSaveName As String
Dim ri As Range
With Workbooks("DumP.xlsm").Worksheets("Report")
Set ri = .Range(.Range("A1"), .Range("J65536") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With
ri.Copy
Workbooks.Add
Range("A1").Select มัน Debug ตรงนี้ครับ เหมือนกับไม่รู้จัก A1
Selection.PasteSpecial xlPasteValues
Application.CutCopyMode = False
FileSaveName = Application.GetSaveAsFilename( _
filefilter:="Exel Files (*.xl),*.xl") 'กำหนดตรงนี้อย่างไรครับ เพราะจากกระทู้ตัวอย่างเป็น Text File
If FileSaveName <> "" Then
ActiveWorkbook.SaveAs Filename:=FileSaveName, FileFormat:=xlsx 'กำหนดตรงนี้อย่างไรครับ เพราะจากกระทู้ตัวอย่างเป็น Text File
MsgBox "Already save file " & FileSaveName
End If
Application.DisplayAlerts = False
ActiveWindow.Close
Workbooks("DumP.xlsm").Worksheets("Report").Activate
Application.DisplayAlerts = True

อาจารย์ช่วยหน่อยเถอะครับ อยู่กับตรงนี้มา4วันแล้วครับ :roll: ไปต่อไม่ได้
ขอบคุณครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#5

Post by snasui »

:D ลองดูตัวอย่าง Code ตามด้านล่างครับ ผม Test แล้วสามารถบันทึกได้ ไม่มี Error ครับ

Code: Select all

Private Sub Export()
Dim FileSaveName As String
Dim ri As Range
With Workbooks("DumP.xlsm").Worksheets("Report")
    Set ri = .Range(.Range("A1"), .Range("J65536") _
    .End(xlUp)).SpecialCells(xlCellTypeVisible)
End With
ri.Copy
Workbooks.Add
Range("A1").Select
Selection.PasteSpecial xlPasteValues
Application.CutCopyMode = False
FileSaveName = Application.GetSaveAsFilename( _
    filefilter:="Excel Files (*.xlsx),*.xlsx")
If FileSaveName <> "" Then
    ActiveWorkbook.SaveAs Filename:=FileSaveName, FileFormat:=xlNormal
    MsgBox "Already save file " & FileSaveName
End If
Application.DisplayAlerts = False
ActiveWindow.Close
Workbooks("DumP.xlsm").Worksheets("Report").Activate
Application.DisplayAlerts = True
End Sub
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#6

Post by Bafnet »

สวัสดีครับ
อืม..ได้ในระดับหนึ่งแล้วครับ

Private Sub CommandButton2_Click()
Dim FileSaveName As String
Dim ri As Range
On Error Resume Next
With Workbooks("DumP.xlsm").Worksheets("Report")
Set ri = .Range(.Range("A1"), .Range("J65536") _
.End(xlUp)).SpecialCells(xlCellTypeVisible)
End With
ri.Copy
Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
FileSaveName = Application.GetSaveAsFilename( _
filefilter:="Exel Workbook (*.xlsx),*.xlsx")
If FileSaveName <> "" Then
ActiveWorkbook.SaveAs Filename:=FileSaveName
MsgBox "บันทึกไฟล์สมบูรณ์" & FileSaveName
End If

Application.DisplayAlerts = False
ActiveWindow.Close
Workbooks("DumP.xlsm").Worksheets("Report").Activate
Application.DisplayAlerts = True

End Sub

อาจารย์ครับ หากต้องการส่งออกและSave ไฟล์ ในชื่อ Report.xlsx ที่ตำแหน่ง Desktop
โดยไม่ต้องให้ผู้ใช้เลือกและหากมีไฟล์ที่ชื่อ Report.xlsx อยู่แล้วก็ให้ทับไฟล์เดิมไปเลย
คืออยากส่งออกไปแบบเงียบๆ

รบกวนด้วยนะครับ :roll:
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#7

Post by Bafnet »

อาจารย์ครับ
จาก Code ที่อาจารย์ให้มา
เมื่อนำไปใส่ในมาโคร ใช้ได้ครับ
แต่เมื่อนำคำสั่งดังกล่าวใช้ใน CommandButton ก็ debug ครับ ที่บรรทัดเดิม

Range("A1").Select

มันบอกว่า Class Range ล้มเหลว
แต่ก็สามารถแก้ไข ได้แล้วก่อนหน้านี้ โดยเปลี่ยนจาก

Workbooks.Add
Range("A1").Select
Selection.PasteSpecial xlPasteValues
เป็น
Workbooks.Add
ActiveSheet.Paste

รบกวนประเด็นที่ผมถามมาเพิ่มเติมด้วยนะครับ การกำหนดตายตัว
Bafnet wrote:สวัสดีครับ
อาจารย์ครับ หากต้องการส่งออกและSave ไฟล์ ในชื่อ Report.xlsx ที่ตำแหน่ง Desktop
โดยไม่ต้องให้ผู้ใช้เลือกและหากมีไฟล์ที่ชื่อ Report.xlsx อยู่แล้วก็ให้ทับไฟล์เดิมไปเลย
MsgBox"ส่งออกรายงานข้อมูลสมบูรณ์",VbOkonly,"Dump"
คืออยากส่งออกไปแบบเงียบๆ

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

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#8

Post by snasui »

:lol: ในการโพสต์ Code ช่วยทำให้แสดงข้อความเป็น Code ด้วยครับ ผมและเพื่อน ๆ จะได้สะดวกในการ Copy ไปทดสอบครับ กรณีท่อนใดติดปัญหาก็ค่อยยกออกมาถามเป็นตอน ๆ ไปครับ Code ทั้งหมดควรโพสต์ไว้ด้วยกันครับ :roll:

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

สำหรับการบังคับให้วางในโฟลเดอร์ใด ๆ เป็นชื่อไฟล์ใด ๆ แก้ที่ Code ด้านล่างครับ จาก

Code: Select all

FileSaveName = Application.GetSaveAsFilename( _
filefilter:="Excel Workbook (*.xlsx),*.xlsx")
เป็นเช่น

Code: Select all

FileSaveName = "C:\Desktop\Report.xlsx"
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#9

Post by Bafnet »

สวัสดีอีกครั้งครับ
ต้องขออภัยสำหรับการอ้าง Code ผมทำไม่เป็นครับ เคยนึกสงสัยอยู่ว่าอาจารย์ทำอย่างไร :tt:
อาจารย์ครับ ตอนนี้ยังไม่โดนใจครับ Code คำสั่ง ที่ได้ คือผมลองดูว่าเกิดผู้ใช้เปลี่ยนใจ
บอกยกเลิก ตอนที่อยู่หน้า Application.GetSaveAsFilename
มันก็ยังคงส่งออกไฟล์ข้อมูลดังกล่าว แต่อยู่ในชื่อไฟล์ FALSE.xlsx
จะปรับอย่างไร ให้กรณีผู้ใช้ Cancel ไม่เกิดลักษณะดังกล่าว และกลับไปที่ DumP

อีกประเด็นหนึ่งนะครับ ก็พยายามนะครับที่อยากหาวิธีที่ตรงใจที่สุด
ไปอ่านหนังสือพบการเขียนคำสั่งเพื่อตรวจสอบไฟล์ และคำสั่งเลือกไฟล์และลบไฟล์ที่เลือก
ก็เลยลองเอามารวมกัน เนื่องจากผมไม่อยากให้ Exel ถามว่าต้องการแทนที่ไฟล์ Reort.xlsx เดิมหรือไม่
ความตั้งใจคือตรวจสอบว่ามีชื่อไฟล์ Report.xlsx หรือไม่ ถ้ามีก็ให้ลบทิ้งซะ จากนั้นจึงไปสู่คำสั่งส่งออกต่อไป

Code: Select all

Private Sub CommandButton1_Click()
Dim MyWorkbook As Workbook
Dim FileSaveName As String
Dim MyFile As String
Dim ri As Range
MyFile = "Report.xlsx"
For Each MyWorkbook In Application.Workbooks
If MyWorkbook.Name = MyFile Then
MyWorkbook.Activate
End If
Next
Kill (MyFile)
With Workbooks("DumP.xlsm").Worksheets("Report")
    Set ri = .Range(.Range("A1"), .Range("J65536") _
    .End(xlUp)).SpecialCells(xlCellTypeVisible)
End With
ri.Copy
Workbooks.Add
     ActiveSheet.Paste
Application.CutCopyMode = False
On Error Resume Next
FileSaveName = "Report.xlsx"
 Workbooks("Report.xlsx").Saved = True
    ActiveWorkbook.SaveAs Filename:="Report.xlsx"
            Application.DisplayAlerts = False
ActiveWindow.Close
Workbooks("DumP.xlsm").Worksheets("Report").Activate
Application.DisplayAlerts = True
If Err > 0 Then
MsgBox "ไม่มีการส่งออกข้อมูล "
Exit Sub
Else
MsgBox "การส่งออกข้อมูลสมบูรณ์" & FileSaveName
End If
    End Sub
ผมคงเขียนอะไรผิดในการรวมคำสั่งนี้

Code: Select all

MyFile = "Report.xlsx"
For Each MyWorkbook In Application.Workbooks
If MyWorkbook.Name = MyFile Then
MyWorkbook.Activate
End If
Next
Kill (MyFile) 'Debug
รู้สึกย่ำแย่ครับ เพราะเริ่มรู้สึกว่ารบกวนอาจารย์มาก ขออภัยด้วยครับ :oops:
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#10

Post by Bafnet »

Bafnet wrote:คือผมลองดูว่าเกิดผู้ใช้เปลี่ยนใจ
บอกยกเลิก ตอนที่อยู่หน้า Application.GetSaveAsFilename
มันก็ยังคงส่งออกไฟล์ข้อมูลดังกล่าว แต่อยู่ในชื่อไฟล์ FALSE.xlsx
จะปรับอย่างไร ให้กรณีผู้ใช้ Cancel ไม่เกิดลักษณะดังกล่าว และกลับไปที่ DumP

Code: Select all

FileSaveName = Application.GetSaveAsFilename(, filefilter:="Exel Files (*.xlsx),*.xlsx", Title:=" DumP โปรดระบุชื่อไฟล์และที่ตั้งเพื่อบันทึก")
    If FileSaveName = "False" Then
    MsgBox "ยกเลิกการส่งออกข้อมูล", vbOKOnly, "DumP"
    Application.DisplayAlerts = False
ActiveWindow.Close
Workbooks("DumP.xlsm").Worksheets("Report").Activate
Application.DisplayAlerts = True
    Exit Sub
ขอบคุณครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#11

Post by snasui »

:D เห็นมี If มาดักและมี Exit Sub แสดงว่าทำได้แล้ว ยินดีด้วยครับ Image
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#12

Post by Bafnet »

สวัสดีครับอาจารย์
ใกล้จะจบหน้า Report แล้วครับ
มีเรื่องสอบถามอาจารย์สักสองประเด็นนะครับ
ผมใช้ For Next เพื่อสั่งพิมพ์จดหมายถึงลูกค้าตามจำนวนลูกค้าในรายงาน
โดยมีการกำหนดชื่อเซล AA4=Total=COUNTA(Report!A2:A30000), กำหนดเซลชื่อ AB4 = Choice
และกำหนดที่ AA5= INDEX(Report!A2:A30000,Choice,1)

ประเด็นที่1. ก็คือว่า ผมต้องการระบุช่วงเซลเป็น AA5= INDEX(Report!A:A,Choice,1) เพราะกลัวข้อมูลบางสาขาจะมากกว่าที่กำหนดไว้
จะทำอย่างไรครับให้ INDEX ที่แถวแรกสุดเริ่มต้นที่ 0 ไม่ใช่ 1

ประเด็นที่2.จาก Code คำสั่ง

Code: Select all

Private Sub Mail()
Dim lng As Long, rs As Range, rt As Range
Dim Inx As Long, ry As Range, ro As Range
If Label17.Caption <> "FileC" Then
Exit Sub
End If
 Application.ScreenUpdating = False
On Error Resume Next
  i = InputBox(Message, "กำหนดลำดับเริ่มต้นที่ท่านต้องการ", Default, 11500, 7000)
Total = InputBox(Message, "กำหนดลำดับสุดท้าย", Default, 11500, 7000)
For i = i To [Total]
    [Choice] = i
    Sheet15.Range("A1").Value = Sheet18.Range("AB5").Value
  With Worksheets("FileA")
On Error Resume Next
    lng = Application.Match(Sheet15.Range("A1"), .Range("A:A"), 0)
    Set rs = .Range("A" & lng).Resize(, 21)
    Set rt = Sheet15.Range("A3")
    End With
    rs.Copy: rt.PasteSpecial xlPasteValues
        Application.CutCopyMode = False
    Rep.Rep
    Sheet20.Range("D5").Value = Sheet15.Range("G29").Value
    Sheet20.Range("D7").Value = Sheet15.Range("G30").Value
    Sheet20.Range("D9").Value = Sheet15.Range("G31").Value
    Sheet20.Range("D11").Value = Sheet15.Range("G32").Value
    Sheet20.Range("D13").Value = Sheet15.Range("G33").Value
    If [Choice] = 0 Then
    Exit Sub
    Else
    Sheet20.PrintOut
End If
 Next i
  
End Sub
ในกรณีที่กำหนดชื่อที่ Cell อย่างนี้เช่น Total , Choice ,i
เราต้องหรือควรจะประกาศตัวแปรอีกหรือไม่ อย่างไร

Code: Select all

 i = InputBox(Message, "กำหนดลำดับเริ่มต้นที่ท่านต้องการ", Default, 11500, 7000)
Total = InputBox(Message, "กำหนดลำดับสุดท้าย", Default, 11500, 7000)
จากคำสั่งข้างต้น ผมต้องกำหนด ตัวเลข 11500,7000 เพื่อกำหนดตำแหน่งของ inputBox (ซึ่งต้องนั่งไล่จาก 100 และดูผลของการแสดงตำแหน่ง)
การเขียนที่ถูกต้องเพื่อกำหนดให้ InPutBox อยู่ในตำแหน่งกลางหน้าจอ Center ทำอย่างไรครับ?

คำสั่งข้างต้นใช้ได้ผลครับ แต่ที่สอบถามเพื่อเข้าใจเรื่องของการประกาศตัวแปรและการเขียนที่ถูกต้องครับ
ขอบพระคุณครับ
:flw:
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#13

Post by snasui »

:D
Bafnet wrote:ประเด็นที่1. ก็คือว่า ผมต้องการระบุช่วงเซลเป็น AA5= INDEX(Report!A:A,Choice,1) เพราะกลัวข้อมูลบางสาขาจะมากกว่าที่กำหนดไว้
จะทำอย่างไรครับให้ INDEX ที่แถวแรกสุดเริ่มต้นที่ 0 ไม่ใช่ 1
การให้แถวแรกเริ่มจาก 0 สามารถใช้ Offset แทน Index ครับ =Offset(Report!A1,0,0) สำหรับ Offset อ่านจากที่นี่ครับ http://snasui.blogspot.com/2009/03/offset.html
Bafnet wrote:ในกรณีที่กำหนดชื่อที่ Cell อย่างนี้เช่น Total , Choice ,i
เราต้องหรือควรจะประกาศตัวแปรอีกหรือไม่ อย่างไร
การกำหนดชื่อเซลล์ไว้แล้วเราจะประกาศตัวแปรหรือไม่ก็ได้ครับ ปกติแม้เราให้ชื่อเซลล์ไว้แล้ว แต่การอ้างอิงก็ต้องอ้าง Collection.Object อยู่ดีครับ เช่นการอ้างถึงชื่อ Choice

Code: Select all

Worksheets("Sheet1").Range("Choice")
แต่หากเราประกาศตัวแปรเราสามารถอ้างสั้นลงได้ เพราะตอนที่เรา Assigned ได้อ้าง Collection ไว้ด้วย เช่น

Code: Select all

Set r = Worksheets("Sheet1").Range("Choice")
ประโยชน์ของการให้ชื่อเซลล์ช่วยในเรื่องไม่ต้องอ้างตำแหน่งเซลล์เข้าไปตรง ๆ ไม่ต้องคอยแก้ไข Code หากมีการย้ายเซลล์ไปตำแหน่งอื่น เพราะย้ายไปไหนชื่อเซลล์ก็จะเป็นชื่อเดิม
Bafnet wrote:การเขียนที่ถูกต้องเพื่อกำหนดให้ InPutBox อยู่ในตำแหน่งกลางหน้าจอ Center ทำอย่างไรครับ?
ปกติถ้าไม่กำหนดพิกัด ตัวหน้าต่าง Pop-up ทั้งหลายจะอยู่กลางจออยู่แล้วครับ
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#14

Post by Bafnet »

สวัสดีครับอาจารย์
snasui wrote:ปกติถ้าไม่กำหนดพิกัด ตัวหน้าต่าง Pop-up ทั้งหลายจะอยู่กลางจออยู่แล้วครับ
:lol: ขอบคุณมากมาย ผมก็ดันใส่มาเป็นหลายปี พอดีตัวอย่างในหนังสือมันใส่ครับแต่เป็น 100,100
ผมเลยหลงเข้าใจว่าต้องใส่เลขกำกับ

วันนี้มาก็มีเรื่องเรียนถามหน่อยครับ จากภาพ ฟอร์มใหญ่ชื่อ frmlone , ฟอร์มเล็กชื่อ frmlonex
Dump.jpg
อาจารย์ครับ ฟอร์มเล็กถูกเรียกใช้จากปุ่มคำสั่งในฟอร์มใหญ่ด้วยคำสั่ง

Code: Select all

Private Sub CommandButton26_Click()
frmlonex.Show
End Sub
ปัญหาคือพอเราปิดฟอร์มเล็ก ฟอร์มใหญ่ก็ปิดตามครับ
จะเขียนคำสั่งดักที่ Private Sub UserForm_Terminate()'ของฟอร์มเล็กอย่างไรครับ
เพื่อไม่ให้ฟอร์มใหญ่ปิดตาม หรือพูดง่ายๆว่ากลับไปทำงานที่ฟอร์มใหญ่ต่อ

Code: Select all

Private Sub CommandButton26_Click()
frmlone.Hide
frmlonex.Show
End Sub

Code: Select all

Private Sub UserForm_Terminate()
frmlone.Show
End Sub
อันนี้ได้ผลแต่ไม่ราบว่ามีวิธีไหนบ้างที่ไม่ต้องสั่ง frmlone.Hide :roll:
ขอบคุณครับ
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#15

Post by snasui »

:D เท่าที่อ่านเนื่องจากไปสั่งให้ Form ใหญ่ มันซ่อนด้วย Code นี้
Bafnet wrote:

Code: Select all

Private Sub CommandButton26_Click()
frmlone.Hide
frmlonex.Show
End Sub
เมื่อปิด Form เล็กก็ต้องเขียน Code ให้ Show Form ใหญ่ขึ้นมาก็ถูกแล้วครับ ถ้าไม่ต้องการให้มันซ่อนไปก่อนก็เอา

Code: Select all

frmlone.Hide
ออกไปครับ
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#16

Post by Bafnet »

สวัสดีครับ
ผมคงอธิบายความต้องการผิดไป

เมื่อเอาคำสั่งออกไป ซึ่งผมเองก็ไม่ต้องการซ่อนฟอร์มใหญ่

Code: Select all

frmlone.Hide


ปัญหาผมคือเมื่อปิดฟอร์มเล็ก(X) ฟอร์มใหญ่ก็ปิดตาม
ทั้งๆที่ในฟอร์มเล็กมีคำสั่งนี้

Code: Select all

Private Sub UserForm_Terminate()
frmlone.Show
End Sub
ชักจะอธิบายไม่ถูกครับงง. :lol: ไม่ต้องการให้ฟอร์มใหญ่ปิดตามฟอร์มเล็ก
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#17

Post by Bafnet »

สวัสดีครับ
อาจารย์ครับผมเข้าใจแล้วครับ ผมลองสร้างไฟล์ใหม่
เวลาสั่งปิดฟอร์มเล็ก ก็ไม่มีผลกระทบกับฟอร์มใหญ่

แต่ในโปรแกรมที่ผมกำลังทำอยู่
เวลาสั่งปิดฟอร์มเล็ก ฟอร์มใหญ่ก็ดันปิดตามครับ
กำลังหาสาเหตุว่าเป็นเพราะอะไร
Bafnet
Member
Member
Posts: 167
Joined: Thu Jun 09, 2011 11:52 pm

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#18

Post by Bafnet »

สวัสดีอีกครั้งครับ
Bafnet wrote:แต่ในโปรแกรมที่ผมกำลังทำอยู่
เวลาสั่งปิดฟอร์มเล็ก ฟอร์มใหญ่ก็ดันปิดตามครับ
เจอสาเหตุแล้วครับ

เป็นเพราะผมไปกำหนด properties ตัวที่ชื่อ
ShowModal = False
ต้องขออภัยอาจารย์ด้วยนะครับ

ขอถามอีกเรื่องนะครับ

properties ตัวที่ชื่อ Cycle มีการกำหนดไว้ 2 แบบ
0-fmCycleAllforms
2-fmCyclecurentForm
มีความหมายอย่างไรครับ และใช้เมื่อใด
ขอบคุณครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: คำสั่ง ส่งออกข้อมูลเป็นไฟล์ Exel ใหม่

#19

Post by snasui »

:D ดูคำอธิบายที่นี่ครับ http://msdn.microsoft.com/en-us/library/gg278603.aspx
Post Reply