Page 2 of 2
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Sun Jul 07, 2013 9:19 am
by nc_jajah
สอบถาม code หน่อยนะคะ
Code: Select all
wbk.Sheets("Sheet1").Range("A" & Rows.count).End(xlUp).Row
คือเลขของบรรทัด
Code: Select all
wbk.Sheets("Sheet1").Range("A" & Rows.count).End(xlUp)
คือข้อมูลที่อยู่ในบรรทัดนั้นๆ
อย่างในรูปนี้
Code: Select all
wbk.Sheets("Sheet1").Range("A" & Rows.count).End(xlUp).Row
จะได้เป็น 1, 2
Code: Select all
wbk.Sheets("Sheet1").Range("A" & Rows.count).End(xlUp)
จะได้เป็น a, b
เราเข้าใจถูกมั๊ยคะ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Sun Jul 07, 2013 9:54 am
by snasui
เข้าใจไม่ถูกครับ คำตอบจะได้เป็นเลข 2 ตัวเดียวเท่านั้น
wbk.Sheets("Sheet1").Range("A" & Rows.count).End(xlUp)
หมายถึงเซลล์สุดท้ายที่มีข้อมูลในคอลัมน์ A
wbk.Sheets("Sheet1").Range("A" & Rows.count).End(xlUp).Row
หมายถึงเลขบรรทัดของเซลล์สุดท้ายที่มีข้อมูลในคอลัมน์ A
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Mon Jul 08, 2013 9:49 am
by nc_jajah
รบกวนต่อค่ะ
ที่ Function copy_data() เดิมค่ะ
เราแก้ไขใหม่แล้วตามไฟล์ที่แนบมา
พอรัน Function เสร็จแล้ว ตัวแปร StrRow รับค่ามาผิดค่ะ คือรับเป็นค่า 3 มาตลอดเลย
ซึ่งที่จริงต้องรับ 4, 5, 6, 7 ตามลำดับ
จะต้องแก้ยังไงหรอคะ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Mon Jul 08, 2013 11:32 am
by snasui
เดิม StrRow กำหนดให้มีค่าเท่ากับ IntRow เสมอ หากต้องการให้ค่าเพิ่มขึ้นก็ต้องเพิ่มค่าของ IntRow ด้วย ยกตัวอย่างเช่น Code ด้านล่าง จะเป็นการเพิ่มค่าให้กับ IntRow ด้วยค่าของ count2 ครับ
Code: Select all
If InStr(rRow, "Wk") Then
IntRow = rRow.Row
ReDim Preserve StrRow(count2)
StrRow(count2) = IntRow + count2
count2 = count2 + 1
End If
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Mon Jul 08, 2013 11:55 am
by nc_jajah
snasui wrote: เดิม StrRow กำหนดให้มีค่าเท่ากับ IntRow เสมอ หากต้องการให้ค่าเพิ่มขึ้นก็ต้องเพิ่มค่าของ IntRow ด้วย ยกตัวอย่างเช่น Code ด้านล่าง จะเป็นการเพิ่มค่าให้กับ IntRow ด้วยค่าของ count2 ครับ
Code: Select all
If InStr(rRow, "Wk") Then
IntRow = rRow.Row
ReDim Preserve StrRow(count2)
StrRow(count2) = IntRow + count2
count2 = count2 + 1
End If
IntRow ไม่ได้เพิ่มค่าขึ้นเรื่อยๆ ค่ะ แต่จะเก็บเลขแถวของ cell ที่มีคำว่า "Wk" อยู่
เหมือนกับ StrCol ที่กำหนดให้เก็บเลขบรรทัดของ cell ที่มีทำว่า COMMODITY
ซึ่ง StrCol สามารถเก็บค่าได้ถูกต้อง แต่ IntRow ค่าไม่ถูกต้องค่ะ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Mon Jul 08, 2013 1:22 pm
by snasui
จาก
IntRow = rRow.Row
Code นี้ทำงานผิดพลาดอย่างไรครับ ผมทดสอบแล้วก็ให้ค่าที่ถูกต้องอยู่เสมอ
ควรอธิบายมาว่าต้องการจะทำอะไร ข้อมูลต้นแหล่งอยู่ที่ไหน ต้องการคำตอบเป็นอย่างไร เพื่อจะได้เข้าใจตรงกันครับ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Mon Jul 08, 2013 1:56 pm
by nc_jajah
ได้แล้วค่ะอาจารย์
เพราะเปลี่ยนเป็น IntRow = rRow.Column ก็ได้แล้วค่ะ
ลืมไปว่า rRow.Row นั้นเก็บข้อมูลของ Row
ขอบคุณมากค่ะ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Tue Jul 09, 2013 10:31 am
by nc_jajah
Code: Select all
With wbk.Worksheets("Sheet1")
Set rData = .Range(.Cells(IntCol + 1, "A"), .Range("A" & rl).End(xlUp))
End With
For Each rDataCol In rData
While rDataCol <> ""
ReDim Preserve StrData(i)
StrData(i) = rDataCol
i = i + 1
rDataCol = ""
Wend
Next rDataCol
จาก Workbooks : Sample.xls, Function copy_data() ค่ะ
การทำงานของ code ที่ต้องการคือ วนรับข้อมูลใน rData ถ้าเจอช่องว่างก็จะเลื่อนไป row ถัดไป
เช่นถ้าดึงข้อมูลจากไฟล์ตัวอย่างคือ Workbooks : Sample2.xls, Sheets : Sheet1
ข้อมูลตัวแรกที่จะได้คือ AAA จากนั้นเมื่อเจอ cell ว่าง ก็จะเลื่อนเป็นที่ cell B เพื่อเก็บ BBB เป็นแบบนี้ไปเรื่อยๆ
มีคำถาม 2 ข้อค่ะ
1. อยากทราบวิธีเปลี่ยน code ด้านบนค่ะ ถ้าต้องการจะเปลี่ยนจาก Col A เป็น Col B โดยที่ไม่ใช่เปลี่ยนเป็นแบบด้านล่าง
Code: Select all
Set rData = .Range(.Cells(IntCol, "B"), .Range("B" & rl).End(xlUp))
มีวิธีอื่นอีกมั๊ยคะ เพราะจริงๆ แล้วเราจะไม่รู้เลยว่า row สุดท้ายนั้นคือ row อะไร
2. Loob While จะทำงานไปเรื่อยๆ จนไปรับเอา SUM มาด้วย ซึ่งจริงๆ แล้วต้องการให้หลุดตั้งแต่เจอ cell ว่างแล้วค่ะ ต้องแก้ยังไงหรอคะ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Tue Jul 09, 2013 6:34 pm
by snasui
nc_jajah wrote:1. อยากทราบวิธีเปลี่ยน code ด้านบนค่ะ ถ้าต้องการจะเปลี่ยนจาก Col A เป็น Col B โดยที่ไม่ใช่เปลี่ยนเป็นแบบด้านล่าง
โค้ด: เลือกทั้งหมด
Set rData = .Range(.Cells(IntCol, "B"), .Range("B" & rl).End(xlUp))
สามารถใช้
rData = rData.Offset(0,1)
ครับ
ลองใช้ If เข้าไปช่วยครับ เช่น
Code: Select all
while
'other code
if r = "" then exit sub
'other code
wend
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Thu Jul 11, 2013 10:12 am
by nc_jajah
ขอบคุณมากค่ะ จะลองนำไปใช้กับงานนะคะ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Thu Jul 11, 2013 11:05 am
by nc_jajah
Code: Select all
For Each sh In wkb.Sheets
If sh.Visible = xlSheetVisible Then
Set wsh = wkb.Sheets(sh.Name)
Do While Not wsName <> ""
If InStr(1, wsh.Name, StrPara(i)) Then
wsName = StrPara(i)
End If
i = i + 1
Loop
Call readSheet(wsName, wkb, wsh)
Next
code Loop For ด้านบนจะทำงานแค่รอบเดียว
อยากให้วนทำงานจนครบทุก Sheet ที่มีใน wkb ค่ะ
จะแก้ยังไงหรอคะ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Thu Jul 11, 2013 12:19 pm
by snasui
จาก Code
For Each sh In wkb.Sheets
เป็นการ Loop ทุกชีทอยู่แล้วครับ
ช่วยแนบไฟล์ปัญหามาด้วยและชี้ให้เห็นว่า ปัญหาคืออะไร ต้องการคำตอบเป็นอย่างไร จะได้เข้าใจตรงกันครับ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Thu Jul 11, 2013 1:30 pm
by nc_jajah
snasui wrote: จาก Code
For Each sh In wkb.Sheets
เป็นการ Loop ทุกชีทอยู่แล้วครับ
ช่วยแนบไฟล์ปัญหามาด้วยและชี้ให้เห็นว่า ปัญหาคืออะไร ต้องการคำตอบเป็นอย่างไร จะได้เข้าใจตรงกันครับ
แก้ได้แล้วค่ะ Function readSheet ที่เรียกใช้มีการสั่งปิด wkb ทำให้ตอนวนกลับมาทำงานใน loop For นั้นไม่สามารถวนจนครบทุกชีทได้
ซึ่งตอนนี้ก็ได้ทำการแก้ไขเรียบร้อยแล้วค่ะ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Thu Jul 11, 2013 3:37 pm
by nc_jajah
มารบกวนอีกแล้วค่ะ
code รันไม่ผ่านค่ะ
Code: Select all
If wsh.Cells(curLine, 1) <> "" Then
While year = ""
If year <> "TTL" Then
year = Offset(wsh.Cells(curLine, 1), 0, 0, -6, j)
j = j + 1
End If
Wend
End If
พอรันแล้วแจ้ง error ว่า
"Sub or Function not defined"
โดย
- curLine คือ เลขบรรทัดที่มีข้อมูลอยู่
ที่ต้องการคือ เลื่อนขึ้นไปข้างบน 6 row
เลื่อนไปด้าน col เรื่อยๆ ตามค่า j
ต้องการหาตำแหน่งที่มีคำว่า "TTL" อยู่ค่ะ
Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook
Posted: Thu Jul 11, 2013 4:26 pm
by snasui
จาก Code นี้
Offset(wsh.Cells(curLine, 1), 0, 0, -6, j)
จะให้ค่าผิดพลาด เนื่องจาก Arguments เกินมา
การใช้ Offset ใน VBA จะมีแค่ 2 Arguments คือ Offset(Row,Column) เช่น Range("A1").Offset(1,2) เป็นต้น
ไม่สามารถใช้ Offset ที่เป็น Worksheet Function ของ Excel ได้ครับ