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)
คือข้อมูลที่อยู่ในบรรทัดนั้นๆ

อย่างในรูปนี้
Image

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
:D เข้าใจไม่ถูกครับ คำตอบจะได้เป็นเลข 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
:D เดิม 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::D เดิม 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
:lol: จาก 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
:D จาก Code For Each sh In wkb.Sheets เป็นการ Loop ทุกชีทอยู่แล้วครับ

ช่วยแนบไฟล์ปัญหามาด้วยและชี้ให้เห็นว่า ปัญหาคืออะไร ต้องการคำตอบเป็นอย่างไร จะได้เข้าใจตรงกันครับ

Re: สอบถามวิธีตัด part ให้เหลือแต่ชื่อของ workbook

Posted: Thu Jul 11, 2013 1:30 pm
by nc_jajah
snasui wrote::D จาก Code For Each sh In wkb.Sheets เป็นการ Loop ทุกชีทอยู่แล้วครับ

ช่วยแนบไฟล์ปัญหามาด้วยและชี้ให้เห็นว่า ปัญหาคืออะไร ต้องการคำตอบเป็นอย่างไร จะได้เข้าใจตรงกันครับ
แก้ได้แล้วค่ะ Function readSheet ที่เรียกใช้มีการสั่งปิด wkb ทำให้ตอนวนกลับมาทำงานใน loop For นั้นไม่สามารถวนจนครบทุกชีทได้ :lol:
ซึ่งตอนนี้ก็ได้ทำการแก้ไขเรียบร้อยแล้วค่ะ :D

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
:D จาก 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 ได้ครับ