Page 1 of 1
VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Fri Mar 10, 2017 8:05 pm
by suka
เรียนอาจารย์ และท่านผู้รู้ช่วยปรับโค้ดค่ะ
จากตัวอย่างไฟล์แนบตัองการให้โค้ดวางข้อมูลตามเงื่อนไข
หากที่ชีท Form เซลล์ E2 มีค่าเป็น
" เบิกสินค้า " , " โอนสินค้า " ให้ชุดโค้ดใน MainCode ทำงานทั้งชุด
คือวางข้อมูลตามขั้นตอนของโค้ดทั้งหมดใน MainCode ซึ่งได้ตามต้องการค่ะ
ติดปัญหาคือหากชีท Form เซลล์ E2 มีค่าเป็น
" ผลิต " , " ประกอบ " , " ซื้อ " , " ขาย "
ต้องการให้
หยุดการทำงานเฉพาะโค้ด Call PasteData2
ความต้องการคือ ให้โค้ดทำการ Copy ข้อมูลชีท Template เซลล์ A2:AD มาวางที่ไฟล์ Data ชืท Sheet1 ค่ะ
ชีท Template เซลล์ A2:AD ไม่ต้องค่ะ MainCode ควรปรับอย่างไรคะ
Code: Select all
Sub MainCode()
Dim formBook As Workbook
Dim wdShare As Workbook
Dim response As Integer
Dim r As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set formBook = ThisWorkbook
Set wdShare = Workbooks.Open("C:\Documents and Settings\Administrator\Desktop\New Folder (2)\Data.xlsx", False, False)
Set r = formBook.Sheets("Form").Range("K1")
If Application.CountIf(wdShare.Sheets("Sheet1").Range("F:F"), r) <> 0 Then
MsgBox "โปรดตรวจสอบเลขที่เอกสารนี้ได้บันทึกแล้ว รายการซ้ำ "
Exit Sub
End If
Call PasteData2
Call PasteData
Call Sort
Call Data_Copy
wdShare.Close True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Sat Mar 11, 2017 10:02 am
by suka
ขออภัยค่ะ ขอแก้เนื่องจากใส่ช่วงเซลล์ผิดค่ะ
suka wrote:ชีท Template เซลล์ A2:AD ไม่ต้องค่ะ MainCode ควรปรับอย่างไรคะ
เปลี่ยนเป็น
ชีท Template เซลล์ AH2:BK ให้หยุดไม่ต้อง Copy ค่ะ
ที่ MainCode ควรปรับอย่างไรดีคะ ขอบคุณค่ะ
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Sat Mar 11, 2017 8:26 pm
by snasui

ตัวอย่างการปรับ Code ครับ
Code: Select all
'--Other code
With formBook.Sheets("Form").Range("E2")
If .Value = "เบิกสินค้า" Or .Value = "โอนสินค้า" Then
Call PasteData2
End If
End With
'--Other code
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Sun Mar 12, 2017 8:26 pm
by suka
อาจารย์คะ Code ด้านล่างนี้ถ้าชีท Form เซลล์ E2 เป็น
เบิกสินค้า หรือ
โอนสินค้า ถ้าใช่เข้าเงื่อนไขต้องการให้ Run Coed Call PasteData2 และ Call PasteData ทั้ง 2 โค้ดเลยค่ะ
ปัญหาคือโค้ดวางเฉพาะข้อมูลของ Call PasteData เท่านั้นตามตัวอย่างรูปแนบแถวที่ 8 - 10 ค่ะ
ตัวอย่างที่ต้องการตามรูปแนบที่ระบายสีเหลืองค่ะ
MainCode ด้านล่างควรปรับอย่างไรดีคะ ขอบคุณค่ะ
Code: Select all
Sub MainCode()
Dim formBook As Workbook
Dim wdShare As Workbook
Dim response As Integer
Dim r As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set formBook = ThisWorkbook
Set wdShare = Workbooks.Open("C:\Documents and Settings\Administrator\Desktop\New Folder (2)\Data.xlsx", False, False)
Set r = formBook.Sheets("Form").Range("K1")
If Application.CountIf(wdShare.Sheets("Sheet1").Range("F:F"), r) <> 0 Then
MsgBox "โปรดตรวจสอบเลขที่เอกสารนี้ได้บันทึกแล้ว รายการซ้ำ "
Exit Sub
End If
With formBook.Sheets("Form").Range("E2")
If .Value = "เบิกสินค้า" Or .Value = "โอนสินค้า" Then
Call PasteData2
End If
End With
Call PasteData
Call Sort
Call Data_Copy
wdShare.Close True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Sun Mar 12, 2017 9:01 pm
by puriwutpokin
Code: Select all
'--Other code
If .Value = "เบิกสินค้า" Or .Value = "โอนสินค้า" Then
Call PasteData2
Call PasteData
End If
End With
Call Sort
Call Data_Copy
'--Other code
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Mon Mar 13, 2017 9:01 am
by suka
วาง Code ตามด้านล่างนี้ Code ไม่ Run ค่าใด ๆ เลยค่ะ
Code: Select all
Sub MainCode()
Dim formBook As Workbook
Dim wdShare As Workbook
Dim response As Integer
Dim r As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set formBook = ThisWorkbook
Set wdShare = Workbooks.Open("C:\Documents and Settings\Administrator\Desktop\New Folder (2)\Data.xlsx", False, False)
Set r = formBook.Sheets("Form").Range("K1")
If Application.CountIf(wdShare.Sheets("Sheet1").Range("F:F"), r) <> 0 Then
MsgBox "โปรดตรวจสอบเลขที่เอกสารนี้ได้บันทึกแล้ว รายการซ้ำ "
Exit Sub
End If
With formBook.Sheets("Form").Range("E2")
If .Value = "เบิกสินค้า" Or .Value = "โอนสินค้า" Then
Call PasteData2
Call PasteData
End If
End With
Call Sort
Call Data_Copy
wdShare.Close True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Mon Mar 13, 2017 1:35 pm
by logic
อาจารย์ตอบเป็นแนวไว้แล้วน่าจะปรับได้ไม่ยากครับ
คือถ้าเข้าเงื่อนไขว่า
ถ้าชีท Form เซลล์ E2 เป็น เบิกสินค้า หรือ โอนสินค้า ถ้าใช่เข้าเงื่อนไขต้องการให้ Run Coed Call PasteData2 และ Call PasteData ทั้ง 2 โค้ดเลย
คุณ puriwutpokin ตอบไปให้แล้ว ถ้าไม่ได้อีกผมว่าเงื่อนไขผิดแล้วละครับ
หรือจะใส่ else เพิ่มเข้าไปถ้าไม่เข้าเงื่อนไขข้างต้นก็น่าจะเขียนเองได้ไม่ยาก ปกติถ้าใช้ code ได้ก็น่าจะเขียน if..then...else เป็นอยู่แล้ว
อันนี้แบบมี else คือถ้าไม่เข้าเงื่อนไขแล้วจะให้ run code ไหนบ้างก็ใส่ตามที่ต้องการ จะ code ทุกตัวหรือบางส่วนก็แล้วแต่ต้องการครับ
Code: Select all
If .Value = "เบิกสินค้า" Or .Value = "โอนสินค้า" Then
Call PasteData2
Call PasteData
Else
Call x
Call y
Call z
End If
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Mon Mar 13, 2017 6:24 pm
by suka
ขอกวนอีกรอบนะคะ Code นี้ชีท Form เซลล์ E2 ค่าเป็น เบิกสินค้า หรือ โอนสินค้า วางได้ทั้ง Call PasteData และ
Call PasteData2 ได้ครบตามต้องการค่ั
ยังติดที่ถ้าชีท Form เซลล์ E2 ค่าเป็น ผลิต หรือ ประกอบ โค้ดก็รันมาทั้ง 2 โค้ดค่ะ ต้องให้รันแต่โค้ด Call PasteData เพียงโค้ดเีดียวค่ะ ปรับการจะติดสลับกันค่ะถัาได้ เบิกสินค้า หรือ โอนสินค้า ก็จะไปติดที่ ผลิต หรือ ประกอบ
ขออนุญาตนะคะ ขอบคุณค่ะ
Code: Select all
Sub MainCode()
Dim formBook As Workbook
Dim wdShare As Workbook
Dim response As Integer
Dim r As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set formBook = ThisWorkbook
Set wdShare = Workbooks.Open("C:\Documents and Settings\Administrator\Desktop\New Folder (2)\Data.xlsx", False, False)
Set r = formBook.Sheets("Form").Range("K1")
If Application.CountIf(wdShare.Sheets("Sheet1").Range("F:F"), r) <> 0 Then
MsgBox "โปรดตรวจสอบเลขที่เอกสารนี้ได้บันทึกแล้ว รายการซ้ำ "
Exit Sub
End If
With formBook.Sheets("Form").Range("E2")
If .Value = "เบิกสินค้า" Or .Value = "โอนสินค้า" Then
Call PasteData
Else
Call PasteData2
Call PasteData
'Call Sort
Call Data_Copy
End If
End With
wdShare.Close True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Mon Mar 13, 2017 7:14 pm
by snasui
suka wrote:ขอกวนอีกรอบนะคะ Code นี้ชีท Form เซลล์ E2 ค่าเป็น เบิกสินค้า หรือ โอนสินค้า วางได้ทั้ง Call PasteData และ
Call PasteData2 ได้ครบตามต้องการค่ะ

เมื่อได้ครบตามต้องการก็ควรจะมี Code ตามลักษณะที่ตอบ ๆ กันไปคือจะมีลักษณะด้านล่างเป็นอย่างน้อยครับ
Code: Select all
If .Value = "เบิกสินค้า" Or .Value = "โอนสินค้า" Then
Call PasteData
Call PasteData2
Else
Call PasteData
End I
suka wrote:ยังติดที่ถ้าชีท Form เซลล์ E2 ค่าเป็น ผลิต หรือ ประกอบ โค้ดก็รันมาทั้ง 2 โค้ดค่ะ ต้องให้รันแต่โค้ด Call PasteData เพียงโค้ดเีดียวค่ะ ปรับการจะติดสลับกันค่ะถัาได้ เบิกสินค้า หรือ โอนสินค้า ก็จะไปติดที่ ผลิต หรือ ประกอบ
ขออนุญาตนะคะ ขอบคุณค่ะ
หากเป็นไปตามที่อธิบายมา Code จะมีลักษณะตามตัวอย่างด้านบน ตัวอักษรสี่น้ำเงินให้อธิบายมาใหม่ อ่านแล้วไม่เข้าใจครับ
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Mon Mar 13, 2017 9:13 pm
by suka
อาจารย์คะิ ขออนุญาตอธิบายด้วยรูปนะคะ ชีท Form เซลล์ E2 ค่าเป็น ผลิต หรือ ประกอบ ก็จะได้ตามที่ต้องการ
แต่ถ้าชีท Form เซลล์ E2 ค่าเป็น เบิกสินค้า หรือ โอนสินค้า ยังไม่ใช่ ยังไม่ได้ค่ะ
Code: Select all
With formBook.Sheets("Form").Range("E2")
If .Value = "เบิกสินค้า" Or .Value = "โอนสินค้า" Then
Call PasteData
Call PasteData2
Else
Call PasteData
End If
End With
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Mon Mar 13, 2017 9:21 pm
by suka
ชีท Form เซลล์ E2 ค่าเป็น เบิกสินค้า หรือ โอนสินค้า ได้ตามที่ต้องการค่ะ
แต่ถ้าชีท Form เซลล์ E2 ค่าเป็น ผลิต หรือ ประกอบ ยังไม่ได้ตามที่ต้องการค่ะ ในรูปแนบพื้นสีแดงคลุ่มกรอบแถว 24 เกินมาค่ะ ที่ต้องการในรูประบายสีเขียวเข้ม,เขียวอ่อน หากค่าเป็น ผลิต,ประกอบ สีเหลือง ค่าเป็น เบิกสินค้า,โอนสินค้า ค่ะ
Code: Select all
With formBook.Sheets("Form").Range("E2")
If .Value = "เบิกสินค้า" Or .Value = "โอนสินค้า" Then
Call PasteData2
Else
Call PasteData
Call PasteData2
End If
End With
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Mon Mar 13, 2017 10:55 pm
by snasui

ค่อย ๆ ถามตอบกันไป และดูท่าว่าน่าจะถามตอบกันยาวพอควรครับ
ควรจะอธิบายลักษณะเดิมว่าต้องการจะทำอะไร ภาพทั้งหลายที่แนบมาไม่สามารถสื่อความหมายถึงสิ่งที่ต้องการได้เนื่องจากไม่เชื่อมโยงกับ Code ที่ถาม
การตอบคำถามตามกระทู้นี้ยึดตาม Code ที่เขียนมาแล้ว โดยมีเงื่อนไขแต่เพียงว่า
หากเข้าเงื่อนไขชุดที่ 1 ให้ Run Code ชุดที่ 1
หากเข้าเงื่อนไขชุดที่ 2 ให้ Run Code ชุดที่ 2
หากเข้าเงื่อนไขชุดที่ 3 ให้ Run Code ชุดที่ 3
ฯลฯ
กรณีหลายเงื่อนไข สามารถใช้
If...then...elseif... มาช่วยได้ ดู Link นี้ประกอบครับ
viewtopic.php?style=13&f=3&t=2798
การจะวาง Code แบบใดนั้นขึ้นอยู่กับเงื่อนไข ส่วนความถูกต้องในการทำงานของ Code จะต้องแยกออกจากกันกับการตัดสินใจว่าจะทำอะไรหรือไม่ทำอะไรตามเงื่อนไขที่กำหนด
หากเงื่อนไขถูกต้องแล้ว แต่ผลการทำงานยังไม่เป็นที่ต้องการจึงจะค่อยมาดูกันว่าเหตุใดจึงไม่ได้คำตอบ ในขั้นตอนนี้ให้อธิบายเงื่อนไขมาให้ชัดเจนว่าเมื่อเข้าเงื่อนไขใดแล้วให้ Run Code ใดครับ
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Tue Mar 14, 2017 1:18 pm
by suka
สามารถรันโค้ดได้ตรงตามต้องการแล้วค่ะ ปรับใช้โค้ดด้านล่างนี้ค่ะ
ขอบคุณอาจารย์ ขอบคุณคุณ puriwutpokin ขอบคุณคุณ logic ที่เสียสละเวลาเพื่อช่วยเหลือช่วยแก้ปัญหาให้นะคะ
รู้สึกโชคดีมากมายได้เป็นสมาชิกบอร์ดนี้ค่ะ ขอบพระคุณทุกท่านนะคะ
Code: Select all
With formBook.Sheets("Form").Range("E2")
If .Value = "ผลิต" Or .Value = "ประกอบ" Then
Call PasteData
Else
Call PasteData2
Call PasteData
End If
End With
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Tue Mar 14, 2017 2:05 pm
by logic

ขอแสดงความยินดีด้วยครับ

Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Wed Jun 21, 2017 8:51 pm
by suka
เรียนอาจารย์ และ เพื่อน ๆ ช่วยปรับโค้ดค่ะ
ข้อ1.ตัวอย่างไฟล์แนบไฟล์ Form.xlsm ที่ MainCode เมื่อ Run Code แล้วข้อมูลไปไว้ที่ชีท Sheet1 ไฟล์ ProductionData.xlsx และ ชีท Movement ไฟล์ Stock.xlsx Code นี้สามารถทำได้ตามการค่ะ
ข้อ2.ต้องการเพิ่มโค้ดเพื่อ Copy ชีท Sheet1 ไฟล์ ProductionData.xlsx มาวางที่ชืท Database ไฟล์ Form.xlsm และ Copy ชีท Movement ไฟล์ Stock.xlsx มาวางที่ชืท MovementCopy ไฟล์ Form.xlsm
ติดปัญหาเมื่อเพิ่ม Code แล้ว Run Code วางแต่ข้อมูลข้อ 2 ไม่วางข้อมูลข้อ 1 ค่ะ
Code: Select all
Call MovementData_Copy
Call Data_Copy
ความต้องการให้วางข้อมูลทั้งข้อ 1 และข้อมูลข้อ 2 ด้วยค่ะ
ขอรบกวนช่วยด้วยค่ะที่ MainCode ควรปรับอย่างไรคะ
Code: Select all
Sub MainCode()
Dim formBook As Workbook
Dim wdShare As Workbook
Dim response As Integer
Dim r As Range
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set formBook = ThisWorkbook
formBook.Sheets("Form").Activate
Call OpenStock
Set wdShare = Workbooks.Open("C:\Documents and Settings\Administrator\Desktop\ProductionData.xlsx", False, False)
Set r = formBook.Sheets("Form").Range("H2")
If Application.CountIf(wdShare.Sheets("Sheet1").Range("F:F"), r) <> 0 Then
MsgBox "โปรดตรวจสอบเลขที่เอกสารนี้ได้บันทึกแล้ว รายการซ้ำ "
Exit Sub
End If
With formBook.Sheets("Form").Range("E2") '<< == วางค่ากลุ่มเอกสาร
If .Value = "โอนสินค้า" Or .Value = "เบิกสินค้า" Then
Call PasteData
Call PasteData2
Call PasteMovementData
Call PasteMovementData2
Else
Call PasteData
Call PasteMovementData
End If
End With
Call MovementSort '<= Code ให้เรียงลำดับวันที่
Call Sort '<= Code ให้เรียงลำดับวันที่
'Call MovementData_Copy
'Call Data_Copy
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Wed Jun 21, 2017 9:54 pm
by snasui

เขียน Code สำหรับการ Copy ไว้แล้วหรือไม่ เขียนไว้ว่างอย่างไรโพสต์มาในฟอรัมด้วยครับ
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Thu Jun 22, 2017 1:26 pm
by suka
อาจารย์คะ เมื่อได้ทำการแก้ไขโค้ดทั้ง 2 โค้ดด้านล่างนี้แล้ว สามารถแก้ปัญหาที่ติดถามมาในกระทู้ #15 ได้แล้วค่ะ
ขอถามปัญหาใหม่ค่ะ Code Copy ข้อมูลทั้งสองโค้ดด้านล่าง ต้องการเขียนให้คัดลอกเท่าจำนวนข้อมูลที่มีควรปรับโค้ดอย่างดีคะ
ชื่อ Data_Copy สำหรับ Copy ข้อมูจากชีท Sheet1 ไฟล์ ProductionData.xlsx เพื่อนำข้อมูลมาวางที่ชืท Database ไฟล์ Form.xlsm และ Code
ชื่อ MovementData_Copy สำหรับ Copy ข้อมูจากชีท Movement ไฟล์ Stock.xlsx เพื่อนำข้อมูลมาวางที่ชืท MovementCopy ไฟล์ Form.xlsm
Code: Select all
Sub Data_Copy()
Dim rs As Range, rt As Range
Dim wb As Workbook
Dim formBook As Workbook
Set formBook = ThisWorkbook
Set wb = Workbooks("ProductionData.xlsx")
Set rs = Workbooks("ProductionData.xlsx").Sheets(1).Range("a1:y2000")
Set rt = formBook.Sheets("Database").Range("a1")
rs.Copy: rt.PasteSpecial xlPasteValues
Application.Goto reference:="OFFSET(R1C1,COUNTA(C1),0)"
wb.Save
wb.Close False
End Sub
และ
Code: Select all
Sub MovementData_Copy()
Dim wbShare As Workbook
Dim formBook As Workbook
Set formBook = ThisWorkbook
Set wbShare = Workbooks("Stock.xlsx")
With wbShare.Sheets("Movement").Range("A1:P2000").Copy
formBook.Worksheets("MovementCopy").Range("A1").PasteSpecial xlPasteValues
End With
Application.Goto reference:="OFFSET(R1C1,COUNTA(C1),0)"
wbShare.Save
wbShare.Close
End Sub
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Thu Jun 22, 2017 7:10 pm
by snasui
suka wrote:ขอถามปัญหาใหม่ค่ะ Code Copy ข้อมูลทั้งสองโค้ดด้านล่าง ต้องการเขียนให้คัดลอกเท่าจำนวนข้อมูลที่มีควรปรับโค้ดอย่างดีคะ

สร้างตัวแปรขึ้นมาสำหรับการค้นหาว่าบรรทัดสุดท้ายของข้อมูลอยู่ที่บรรทัดใดแล้วค่อยนำตัวแปรนั้นไปใข้ต่อครับ
ยกตัวอย่างเช่น
Code: Select all
dim lstRow as long
With Workbooks("ProductionData.xlsx").Sheets(1)
lstRow = .Range("a" & .rows.count).end(xlup).row
End With
'...Other code
Set rs = Workbooks("ProductionData.xlsx").Sheets(1).Range("a1:y" & lstrow)
'...Other code
Re: VBA ต้องการวางข้อมูลเฉพาะค่าตามเงื่อนไขค่ะ
Posted: Thu Jun 22, 2017 8:38 pm
by suka

ได้ตรงตามที่ต้องการแล้วค่ะ ขอบคุณอาจารย์มาก ๆ ค่ะ ให้ทั้งความรู้ความช่วยเหลือมากมายเลยค่ะ