Page 1 of 1

ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ครับ

Posted: Tue Mar 27, 2012 9:03 am
by godman
อยากทราบว่าทำไมผมสร้างสูตร list รายการใน table จึงerror แต่พอสร้างนอก table กลับใช้การได้ ผมอยากใช้คุณสมบัตรของ table ให้คุ้มค่า เพราะเห็นว่า ไม่ต้องลากเซลล์เผื่อไว้เยอะๆ เพราะการลากเผื่อไว้อาจทำให้ลืม และเปลืองเนื้อที่ด้วยใช่ไหมครับ รบกวนอาจารย์แก้ไขให้ผมด้วย เรื่องสูตรลิตต์ในคอลัมพ์ ที่เซลลแรกคือ 0 หนะครับตามไฟล์แนบครับ

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 9:24 am
by bank9597
:D ลองตามนี้ครับ
ที่ AB2 คีย์ =IF(AA2<>"","",MAX($AB$1:AB1)+1)

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 9:45 am
by godman
ขอบคุณครับ แต่ยังไม่ใช่คำตอบครับ เพราะใน sheet home ผมเปลี่ยนเงื่อนไขเป็น Closed ปรากฏว่า สูตรใน table ขึ้นไม่ตรงกับ นอก table ครับ ตามไฟล์แนบ จุดประสงค์คือ list รายการตามเงื่อนไข ซึ่งเงื่อนไขอยู่ในหน้า Home เป็น Data validation ในช่อง ที่ผมทำสีและเขียนว่า select ครับ

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 10:06 am
by bank9597
:D ขออภัยครับ ผมยังไม่รู้เงื่อนไข

ปรับสูตรเป็น =IF(Home!$E$2="","",IF(Home!$E$2=$O$2,(IF(AA2<>"","",MAX($AB$1:AB1)+1)),(IF(AA2="","",MAX($AB$1:AB1)+1))))
คัดลอกลงมา ทดสอบเปลี่ยนเงื่อนไขในชีท Home ครับ

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 10:08 am
by godman
ตรงครับ และขอรบกวนขอคำอธิบายสูตรได้ไหมครับ ต่างจากสูตรนอก table อย่างไร ขอบคุณครับ

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 10:42 am
by bank9597
:D เรื่องอธิบายสูตร ผมไม่ค่อยมั่นใจครับ อยากให้รออาจารย์มาอธิบายอีกครั้งครับ อีกประการคือ สูตรถูกใช้งานบน Table ซึ่งผมก็ไม่ชำนาญกับฟังก์ชั่นนี้เช่นกัน

ตามที่ผมเข้าใจ สูตร Lookup สามารถใช้อ้างอิงกับข้อมูลที่เป็นตัวเลขเท่านั้น จะเป็นตัวอักษรไม่ได้ ต่างจากสูตร Max ที่อ้างอิงข้อมูลทั้งตัวเลขและตัวอักษรได้

จากสูตร =IF(ISNUMBER(SEARCH(Home!$E$2,Database!$O2)),LOOKUP(9.9999999999999E+307,$AD$1:AD1)+1,"") หากเปลี่ยนค่าที่ AD1 เป็นตัวอักษร สูตรนี้ก็จะใช้ไม่ได้เช่นกัน

แต่สูตร =IF(Home!$E$2="","",IF(Home!$E$2=$O$2,(IF(AA2<>"","",MAX($AB$1:AB1)+1)),(IF(AA2="","",MAX($AB$1:AB1)+1)))) หากเปลี่ยนค่าที่ AB1 เป็นตัวอักษร สูตรก็ยังให้ค่าที่ถูกต้องเหมือนเดิม

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

ทดสอบคีย์เลข 0 ที AB1 แล้วที่ เซลล์ใดๆ คีย์ =Count($AB$1:AB1) จะได้เท่ากับ 0 ที่เป็นเช่นนั้นเพราะสูตร Count จะนับแค่ตัวเลขเท่านั้น หากเป็น Text มันจะนับค่าไม่ได้ ดังนั้นถึงแม้ที่ AB1 จะคีย์เลข 0 ลงไปก็ตาม ฟังก์ชั่น Table ก็จะเปลี่ยนให้เป็น Text ทั้งหมด

แต่หาก คีย์เลข 0 ตั้งแต่ AB2 ลงมา แล้วเปลี่ยนอ้างอิงในสูตรเป็น =IF(ISNUMBER(SEARCH(Home!$E$2,Database!$O2)),LOOKUP(9.9999999999999E+307,$AB$2:AB2)+1,"")
สูตรก็จะแสดงค่าได้โดยไม่แสดง Error ใด

ด้วยเหตุดังกล่าวมานี้ ผมเลยคิดว่าน่าจะเป็นไปประมาณนี้ครับ แต่หากจะให้แน่ชัดจริง ต้องรออาจารย์มาอธิบายอีกครั้งครับ :D

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 10:58 am
by snasui
godman wrote:อยากทราบว่าทำไมผมสร้างสูตร list รายการใน table จึงerror แต่พอสร้างนอก table กลับใช้การได้ ผมอยากใช้คุณสมบัตรของ table ให้คุ้มค่า เพราะเห็นว่า ไม่ต้องลากเซลล์เผื่อไว้เยอะๆ เพราะการลากเผื่อไว้อาจทำให้ลืม และเปลืองเนื้อที่ด้วยใช่ไหมครับ รบกวนอาจารย์แก้ไขให้ผมด้วย เรื่องสูตรลิตต์ในคอลัมพ์ ที่เซลลแรกคือ 0 หนะครับตามไฟล์แนบครับ
เนื่องจาก Field ของ Talble สามารถเป็น Text ได้เท่านั้น ไม่สามารถเป็น Number ได้ จึงต้องเปลี่ยนสูตรที่ AB2 เป็น

=IF(ISNUMBER(SEARCH(Home!$E$2,Database!$O2)),LOOKUP(9.9999999999999E+307,$AB$1:AB1+0)+1,"")

Enter > Copy ลงด้านล่าง
bank9597 wrote:ด้วยฟังก์ชัน Table ที่น่าจะกำหนดให้หัวคอลัมน์มีฟอร์แมตเป็น Text เท่านั้น ไม่สามารถเป็นตัวเลขได้ ถึงแม้จะคีย์ตัวเลขลงไปก็ตาม สูตรทุกสูตรจะอ่านค่าเป็น Text เท่านั้น
เข้าใจถูกต้องแล้วครับ

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 11:05 am
by bank9597
:mrgreen: ขอบคุณอาจารย์มากๆครับ :mrgreen:

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 12:14 pm
by godman
ขอบคุณอาจารย์ทั้งสองครับ พอเข้าใจบ้างแล้วครับ แต่ผมก็มีปัญหาต่อไป คือ ผมเป็นแฟนคลับของ Dynamic Range Name เพราะทำให้ผมไม่ต้องกังวัลว่าเซลล์จะไปสิ้นสุดตรงใหน แต่ใน sheet นี้ผมกลับเจอปัญหาเมื่อไป offset ใน table ที่ผู้ใช้เว้นช่องว่างไว้ ทำให้ range ไม่เท่านกันในแต่ละ filed เช่น
=OFFSET(Database!$Y$1,0,0,MATCH("*",Database!$Y:$Y,-1),1) เป็นของฟิลด์ ValidationDatail แต่มันก็ range ได้แค่เซลล์สุดท้ายยังไม่สุดและไม่เท่ากับ range name อื่นและสูตรตั้งชื่อก็ต่างกัน อาจารย์ช่วยแนะนำสูตรที่ผมจะตั้งชื่อได้ทีเดียวเหมื่อนกันหมดและจำนวนเซลล์ที่ไปถึงเท่ากัน เพราะต้องนำไปใช้กับ array ต่อด้วยครับ

=OFFSET(Database!$D$1,0,0,MATCH("*",Database!$D:$D,-1),1) ชือของ Part number ซึ่งมีช่องว่าง 1 ช่องในฟิลล์ และเราไม่สามารถควบคุมได้ เพราะผมดึงดาต้านี้มาจาก MICROSFOT aCCESS ครับ
สรุปว่า สูตร Dynamic Range name ที่ครอบคลุม case แบบนี้มีไหมครับ

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 12:53 pm
by snasui
:lol: การตั้งชื่อให้ Range มีความสูงเท่ากันทั้งหมด จำเป็นต้องทราบว่าคอลัมน์ไหนมีข้อมูลครบทุกบรรทัด เพื่อจะได้นับคอลัมน์นั้นมาเป็นความสูงของทุก ๆ Range Name

จากไฟล์ตัวอย่าง คอลัมน์ A คือ ID มีครบทุกบรรทัด ควรใช้คอลัมน์นี้เป็นความสูงของทุก ๆ Range Name สำหรับข้อมูลในตารางนี้ ยกตัวอย่างการตั้งชื่อให้กับ Part Number# ซึ่งอยู่ที่คอลัมน์ D ควรจะใช้สูตรเป็น

=OFFSET(Database!$D$2,0,0,COUNT(Database!$A:$A))

ลองปรับใช้กับ Range Name อื่น ๆ ครับ

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 1:00 pm
by bank9597
:D เท่าที่อ่านไป พอเข้าใจครับ

ลองตั้งชื่อ Range Name ชื่อ Test กำหนดช่วงแถว =Database!$AA$2:$AA$23 สูตรจะคลุมจาก AA2:AA23

ลองทดสอบคีย์ข้อมูลในเซลล์ AA24 ดูครับ แล้ว ลองไปดูสูตรใน Range Name ชื่อ Test สูตรจะเปลี่ยนเป็น =Database!$AA$2:$AA$24


ฟังก์ชั่น table มีความสามารถที่ดีมากอยู่แล้วครับ หากคุณเพิ่มข้อมูลลงไปเรื่อยๆ สูตรมันก็จะลากไปให้เองอัตโนมัติครับ :D

หากผมเข้าใจผิด ขออภัยด้วยน่ะครับ :mrgreen:

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 1:15 pm
by godman
เยี่ยมเลยครับ สำหรับคำตอบ ขอบพระคุณมาก ครับขอให้มีความสุขมากๆ ครับ

Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 1:40 pm
by godman
อาจารญ์ครับ ถามต่อ พอดีผมอาจจะเป็น lazy man ขี้เกียจสร้าง Dyanamic Range name เยอะๆด้วยการนั่งพิมพ์สูตรทีละ field ผมได้ macro ตัวนี้มา คงพูดไม่เต็มปากว่าเขียนเอง แต่นำมาดัดแปลงใช้กับลัษณะงานที่ทำอยู่ แต่พอผม run แล้วมันติด error ขอรบกวนอาจารย์ช่วยดู MACRO ให้ด้วยครับ มันเกิดจากอะไร หรือเป็นเพราะเหตุผลข้างบนหรือปล่าวครับ ที่ไม่สามารถทำได้ เพราะมี cell ว่างอยู่ ข้อมูลไม่เเต็มแถวหรือปล่ววครับ ขอบคุณครับ

Code: Select all

Sub CreateNames()


    Dim wb As Workbook, ws As Worksheet
    Dim lrow As Long, lcol As Long, i As Long
    Dim myName As String, Start As String

    ' set the row number where headings are held as a constant
    ' change this to the row number required if not row 1
    Const Rowno = 1

    ' set the Offset as the number of rows below Rowno, where the
    ' data begins
    Const ROffset = 1

    ' set the starting column for the data, in this case 1
    ' change if the data does not start in column A
    Const Colno = 1
    
    ' Set an Offset from the starting column, for the column number that
    ' will always have data entered, and will therefore be used in calculating lrow
    
    Const COffset = 0  ' in this case, the first column will always contain data.

    On Error GoTo CreateNames_Error

    Set wb = ActiveWorkbook
    Set ws = ActiveSheet

    ' count the number of columns used in the row designated to
    ' have the header names
 
    lcol = Cells(Rowno, Columns.Count).End(xlToLeft).Column
    lrow = ws.Cells(Rows.Count, Colno).End(xlUp).Row
    Start = Cells(Rowno, Colno).Address
    
    wb.Names.Add Name:="lcol", RefersTo:="=COUNTA($" & Rowno & ":$" & Rowno & ")"
    wb.Names.Add Name:="lrow", RefersToR1C1:="=COUNTA(C" & Colno + COffset & ")"
    wb.Names.Add Name:="myData", RefersTo:= _
                  "=" & Start & ":INDEX($1:$65536," & "lrow," & "Lcol)"

    For i = Colno To lcol
        ' if a column header contains spaces, replace the space with an underscore
        ' spaces are not allowed in range names.
        myName = Replace(Cells(Rowno, i).Value, " ", "_")
        If myName = "" Then
            ' if column header is blank, warn the user and stop the macro at that point
            ' names will only be created for those cells with text in them.
            MsgBox "Missing Name in column " & i & vbCrLf _
                   & "Please Enter a Name and run macro again"
            Exit Sub
        End If
        wb.Names.Add Name:=myName, RefersToR1C1:= _
                     "=R" & Rowno + ROffset & "C" & i & ":INDEX(C" & i & ",lrow)"
nexti:
    Next i

    On Error GoTo 0
        MsgBox "All dynamic Named ranges have been created"
    Exit Sub

    Exit Sub

CreateNames_Error:

    MsgBox "Error " & Err.Number & " (" & Err.Description & _
    ") in procedure CreateNames of Module Technology4U"

End Sub


Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 8:30 pm
by snasui
:D เพิ่มบรรทัดนี้เพื่อลบเครื่องหมาย # ในการตั้ง Range Name ทิ้งไปครับ

Code: Select all

myName = Replace(myName, "#", "")
จะได้เป็น

Code: Select all

Option Explicit

Sub CreateNames()

    Dim wb As Workbook, ws As Worksheet
    Dim lrow As Long, lcol As Long, i As Long
    Dim myName As String, Start As String
    
    Const Rowno = 1
    Const ROffset = 1
    Const Colno = 1
    Const COffset = 0  ' in this case, the first column will always contain data.
    
    On Error GoTo CreateNames_Error
    Set wb = ActiveWorkbook
    Set ws = ActiveSheet
    lcol = Cells(Rowno, Columns.Count).End(xlToLeft).Column
    lrow = ws.Cells(Rows.Count, Colno).End(xlUp).Row
    Start = Cells(Rowno, Colno).Address
    wb.Names.Add Name:="lcol", RefersTo:="=COUNTA($" & Rowno & ":$" & Rowno & ")"
    wb.Names.Add Name:="lrow", RefersToR1C1:="=COUNTA(C" & Colno + COffset & ")"
    wb.Names.Add Name:="myData", RefersTo:= _
                  "=" & Start & ":INDEX($1:$65536," & "lrow," & "Lcol)"
                  
    For i = Colno To lcol
        myName = Replace(Cells(Rowno, i).Value, " ", "_")
        myName = Replace(myName, "#", "")
        If myName = "" Then
            MsgBox "Missing Name in column " & i & vbCrLf _
                   & "Please Enter a Name and run macro again"
            Exit Sub
        End If
        wb.Names.Add Name:=myName, RefersToR1C1:= _
                     "=R" & Rowno + ROffset & "C" & i & ":INDEX(C" & i & ",lrow)"
    Next i
    
    On Error GoTo 0
        MsgBox "All dynamic Named ranges have been created"
    Exit Sub
    
CreateNames_Error:
    MsgBox "Error " & Err.Number & " (" & Err.Description & _
    ") in procedure CreateNames of Module Technology4U"
    
End Sub


Re: ทำไมสร้างสูตร list รายการตามเงื่อนไขใน Table จึง error ค

Posted: Tue Mar 27, 2012 8:41 pm
by godman
มันยอดมากเลยครับอาจารย์ ผมคลั่งไคล้มันมาก และมันช่วยให้ชีวิตผมง่ายขึ้น สะดวกขึ้นมีเวลาอยู่กับครอบครัวมากขึ้นขอบคุณมากครับ
เพราะมันไม่คำนึงถึงช่องว่าง มันไม่คำนึงถึงสูตร เอ้ะไม่แน่ใจ ขอให้อาจารย์มีแค่ความสุขครับ