แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - pirin

หน้า: 1 2 [3] 4 5
37
เพิ่งรู้นะครับว่าโปรแกรมนี้มีฟรีแวร์ด้วย ผมเห็นแต่เป็นแบบทดลองใช้แล้วมันจะมีลายน้ำที่รูป อ.laemthong มีแบบเป็น 64bit หรือเปล่าครับ ถ้ามีรบกวนขอแบบ 64bit ด้วยครับ ขอบคุณครับ
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

38
เปลี่ยนจาก visible เป็น enabled น่าจะดีกว่ามั๊ยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

39


Record ในแต่ละรายการ ใน Subform
หากสถานะถูกติ๊กเป็น เครื่องหมายถูก
ให้ Label COA และ Button ขอเอกสาร
กำหนดให้ User สามารถเห็น (Visible = True)

แต่ หากรายการไหนสถานะ "ไม่" ถูกติ๊กเครื่องหมายถูก
ให้ Label COA และ Button ขอเอกสาร
กำหนดให้ User ไม่สามารถเห็น (Visible = False)

ไม่ทราบว่า จะเขียน Code ที่ส่วนไหนของ Sub form ครับ
ตอนนี้ ผมเขียนที่ On current มันแสดงหมดทุกรายการเหมือนกันหมด

If Me.COA_Require = -1 Then
    Me.CmbRequireCOA.Visible = True

Else
        Me.CmbRequireCOA.Visible = False

End If
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

40
ภาษา VBA นำมาจากภาษา BASIC ซึ่งเป็นภาษาเก่าแก่ สิ่งนึงที่ตกทอดมาถึง VBA ก็คือหมายเลขบรรทัด เราสามารถใส่เลขที่บรรทัด จะเป็นเลขอะไรก็ได้ตั้งแต่ 1 ถึง 65535 และแต่ละบรรทัดจะเป็นเลขอะไรก็ได้ ไม่จำเป็นต้องเรียงลำดับ ไม่จำเป็นต้องมีทุกบรรทัด ขอให้ไม่ซ้ำใน Sub หรือ Function Procedure เดียวกันก็พอ โดยเขียนไว้เป็นส่วนแรกของโค้ดแต่ละบรรทัด ที่ทำๆกันมาเป็นมาตรฐานก็คือเริ่มจาก 10  และเพิ่มทีละ 10 เพื่อให้อ่านง่ายและสะดวกเมื่อมีการแทรกบรรทัดเพิ่ม จะได้ใส่เลขบรรทัดได้โดยไม่ต้องไปแก้หมายเลขของบรรทัดอื่นๆให้เสียเวลาครับ

ตย.ของโค้ดก็เช่น
โค๊ด: [Select]
Private Function NewSalesPrice(Price As Variant, Percent As Variant) As Single
          Dim Factor  As Single

          On Error GoTo ErrHandler

10        Factor = 1 + Percent / 100
20        NewSalesPrice = Price * Factor

ExitRtn:
30        Exit Function
               
ErrHandler:
40        MsgBox "In [NewSalesPrice], Line " & Str(Erl) & ", Error " & Str(Err.Number) & " : " & Err.Description
50        Resume ExitRtn
End Function

เลขบรรทัดทำหน้าที่แบบเดียวกับลาเบล เราสามารถสั่ง Goto <ลาเบล/เลขบรรทัด> หรือ GoSub <ลาเบล/เลขบรรทัด> เพื่อให้โค้ดข้ามไปทำงานที่บรรทัดตามเลขที่นั้นได้ แต่ประโยชน์ที่ชัดเจนที่สุดก็คือ ถ้าเกิด Runtime Error ขึ้นในบรรทัดของโค้ดที่มีเลขที่บรรทัดอยู่ เราสามารถใช้ฟังก์ชั่น Erl เพื่อคืนเลขที่บรรทัดออกมาได้ด้วย ดังนั้นเราจึงใส่ไว้ในส่วนของ Error Handling Routine เพื่อบอกให้ทราบว่าเกิดปัญหาที่บรรทัดอะไร การ Debug หรือแก้ไขปัญหาก็จะทำได้ง่ายขึ้นมาก แต่หากเกิด Error ในบรรทัดที่ไม่ได้ใส่หมายเลขบรรทัดเอาไว้  ฟังก์ชั่น Erl จะคืนค่าของเลขบรรทัดสุดท้ายที่อยู่ก่อนหน้าออกมาให้แทน หรือถ้าไม่มีเลย ก็จะคืนค่าเป็นศูนย์แทนครับ

ตย.ของข้อความ

โพสต์นี้ได้รับคำขอบคุณจาก: pirin

41
ลองแทรกบรรทัดสีแดงนี้เข้าไปที่โค้ด แนวคิดคือใช้การตรวจสอบว่า ถ้าเซล A1 มีข้อความเหมือนชื่อหัวเรื่องอยู่แล้วก็ให้ข้ามการแทรกเซลไป อะไรประมาณนี้ครับ

    Set xlSheet = xlWorkbook.ActiveSheet
    '-------------ตรวจสอบหากมีหัวเรื่องชื่อเดียวกันซ้ำก็ให้ข้ามการแทรกไป
    If xlSheet.Cells(1, 1).Value = "ชื่อหัวเรื่องที่ต้องการ" Then Exit Sub
    '-------------------------------------------------
    With xlSheet.Range("A1")
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

42
ยอดเยี่ยมเลยค่ะ..ใช้ได้ตามที่ต้องการแล้ว

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

หนูเลือกใช้คำสั่ง .Columns("A").EntireColumn.AutoFit สะดวกสวยงามได้ตามที่ต้องการเลยค่ะ

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

ในส่วนของข้อมูลนั้น OK ไม่มีปัญหาค่ะ มันอัพเดตทับแทนที่ข้อมูลเดิมไปเลยค่ะ
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

43
Private Sub Command0_Click()
    Dim xlApp           As Object
    Dim xlWorkbook      As Object
    Dim xlSheet         As Object
   
    DoCmd.TransferSpreadsheet acExport, , "Query1", "D:\ExportQuery1.xls", True
   
    Set xlApp = CreateObject("excel.application")
    Set xlWorkbook = xlApp.Workbooks.Open("D:\ExportQuery1.xls")
    Set xlSheet = xlWorkbook.activesheet

    With xlSheet.range("A1")
        .entirerow.insert -4121             ' Insert and Shift Row Down
        .entirerow.insert -4121             ' Insert and Shift Row Down
        xlApp.DisplayAlerts = False
        xlSheet.range("A1:F2").merge        ' Merge Cells (ผสานเซล A1:F2)
        xlApp.DisplayAlerts = True
    End With
   
    With xlSheet.range("A1")
        .Value = "ชื่อหัวเรื่องที่ต้องการ"
        .Font.Name = "Tahoma"
        .Font.Size = 18
        .Font.Bold = True
        .HorizontalAlignment = -4108        ' Align Center
    End With

With xlSheet
      .Columns("A").ColumnWidth = ......
      .Columns("B").ColumnWidth = ......
      .Columns("C").ColumnWidth = ......
      .Columns("D").ColumnWidth = ......
      .Columns("E").ColumnWidth = ......
      .Columns("F").ColumnWidth = ......
  End With   
    xlApp.ActiveWorkbook.Close True
End Sub

ตรง .....ลองกำหนดขนาดดูครับ
เพิ่มเติมนะครับถ้าอยากให้Column พอดีกับข้อความในเซล ก็ใส่เป็น
.Columns("A").EntireColumn.AutoFit


โพสต์นี้ได้รับคำขอบคุณจาก: pirin

44
ขออนุญาตรบกวนเพิ่มเติมอีกนิดนะคะอาจารย์

จากคำสั่งดังกล่าว เราสามารระบุขนาดความกว้างของแต่ละเซลส์ ลงไปด้วยได้ไหมคะ

เช่น

เซลส์ A = 50 พิกเซล
เซลส์ B = 100 พิกเซล
เซลส์ C = 150 พิกเซล
เซลส์ D = 200 พิกเซล
เซลส์ E = 250 พิกเซล
เซลส์ F = 300 พิกเซล

ประมาณนี้ค่ะอาจารย์
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

45
เพิ่มคำสั่งตอนท้ายครับเป็นแบบนี้
Private Sub Command0_Click()
    Dim xlApp           As Object
    Dim xlWorkbook      As Object
    Dim xlSheet         As Object
   
    DoCmd.TransferSpreadsheet acExport, , "Query1", "D:\ExportQuery1.xls", True
   
    Set xlApp = CreateObject("excel.application")
    Set xlWorkbook = xlApp.Workbooks.Open("D:\ExportQuery1.xls")
    Set xlSheet = xlWorkbook.activesheet

    With xlSheet.range("A1")
        .entirerow.insert -4121             ' Insert and Shift Row Down
        .entirerow.insert -4121             ' Insert and Shift Row Down
        xlApp.DisplayAlerts = False
        xlSheet.range("A1:F2").merge        ' Merge Cells (ผสานเซล A1:F2)
        xlApp.DisplayAlerts = True
    End With
   
    With xlSheet.range("A1")
        .Value = "ชื่อหัวเรื่องที่ต้องการ"
        .Font.Name = "Tahoma"
        .Font.Size = 18
        .Font.Bold = True
        .HorizontalAlignment = -4108        ' Align Center
    End With
    xlApp.ActiveWorkbook.Close True
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

46
 :shout: เย้...ใช้ได้ตามที่ต้องการเลยค่ะอาจารย์

หนูนำโค๊ดไปปรับแต่งใช้ดังนี้ค่ะ

Private Sub Command0_Click()
    Dim xlApp           As Object
    Dim xlWorkbook      As Object
    Dim xlSheet         As Object
   
    DoCmd.TransferSpreadsheet acExport, , "Query1", "D:\ExportQuery1.xls", True
   
    Set xlApp = CreateObject("excel.application")
    Set xlWorkbook = xlApp.Workbooks.Open("D:\ExportQuery1.xls")
    Set xlSheet = xlWorkbook.activesheet

    With xlSheet.range("A1")
        .entirerow.insert -4121             ' Insert and Shift Row Down
        .entirerow.insert -4121             ' Insert and Shift Row Down
        xlApp.DisplayAlerts = False
        xlSheet.range("A1:F2").merge        ' Merge Cells (ผสานเซล A1:F2)
        xlApp.DisplayAlerts = True
    End With
   
    With xlSheet.range("A1")
        .Value = "ชื่อหัวเรื่องที่ต้องการ"
        .Font.Name = "Tahoma"
        .Font.Size = 18
        .Font.Bold = True
        .HorizontalAlignment = -4108        ' Align Center
    End With

End Sub

แต่ เกิดปัญหาเล็กน้อยกับไฟล์ Excel ขณะตอนเปิดไฟล์ มีแจ้งประมาณว่า ไฟล์นี้ถูกเปิดอยู่แล้ว (ตามรูปค่ะ)
ไม่ทราบว่า ต้อแก้ไขอย่างไรคะ ขอบคุณค่ะอาจารย์

โพสต์นี้ได้รับคำขอบคุณจาก: pirin

47
โค๊ด: [Select]
    Dim xlApp           As Object
    Dim xlWorkbook      As Object
    Dim xlSheet         As Object
   
    DoCmd.TransferSpreadsheet acExport, , "ชื่อคิวรี่", "พาธ\ไฟล์.xls หรือ .xlsx", True
   
    Set xlApp = CreateObject("excel.application")
    Set xlWorkbook = xlApp.Workbooks.Open("พาธ\ไฟล์.xls หรือ .xlsx")
    Set xlSheet = xlWorkbook.activesheet

    With xlSheet.range("A1")
        .entirerow.insert -4121             ' Insert and Shift Row Down
        .entirerow.insert -4121             ' Insert and Shift Row Down
        xlApp.DisplayAlerts = False
        xlSheet.range("A1:E2").merge        ' Merge Cells
        xlApp.DisplayAlerts = True
    End With
   
    With xlSheet.range("A1")
        .Value = "ชื่อหัวเรื่อง"
        .Font.Name = "Tahoma"
        .Font.Size = 18
        .Font.Bold = True
        .HorizontalAlignment = -4108        ' Align Center
    End With
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

48


สามารถไปกำหนดได้ที่ File  >  Option  > Object Designer > QueryDesign
กำหนดรูปแบบฟ้อน กับขนาดได้เลยครับ


โพสต์นี้ได้รับคำขอบคุณจาก: pirin

49
สวัสดีครับ
ไม่แน่ใจว่ามีใคร เป็นเหมือนผมหรือเปล่า
แต่พยายามหากระทู้เก่าๆแล้ว ไม่เจอ
คือรู้สึกว่า เวลาเขียน Query ในหน้า มุมมอง SQL ตัวหนังสือมันเล็กมาก อยากทราบว่ามันสามารถปรับขนาดตัวหนังสือได้หรือไม่ครับ
ส่วนตัวพอดีว่าถนัดเขียนเป็น query ไม่ถนัดลากๆแปะๆ ในหน้า ออกแบบ
หรือมีเทคนิคแบบไหนแชร์กันบ้างครับ
ขอบคุณครับ  :dizzy:
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

50
ขอเรียนถามดังนี้นะคะ

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

ไม่ทราบว่าสามารถทำได้หรือไม่อย่างไรคะ (ตามรูปตัวอย่างค่ะ)
ID : pbr39o-9aa58e
2018-07-12 18:15:24
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

51
code ตามที่คุณปิ่นณรงค์ให้มาใช้ได้ครับ จะมีปัญหาตรงที่บางครั้งผมอาจมีการfilter Style หรือ OD# อย่างใดอย่างหนึ่ง และที่สำคัญแต่ละStyle หรือแต่ละOD# ที่เราfilter มันจะมีหลายrecord เวลาเรา filterแล้ว กด Next ไปrecord อื่นแล้วทำการcopy มันจะerrorครับ เหมือนกับมันจะให้ copyเฉพาะที่ filter เท่านั้น

อ่อ งั้นเราก็ไปกำหนดให้มันเลือก Record ปัจจุบันที่เราใช้งานเลือกอยู่ ก่อนจะ Copy Record ได้ครับ โดยสร้าง Textbox ของ ID มาแสดงในฟอร์มด้วยทีนี้ถึงท่านแก้ไขเนื้อหา ก่อน Copy หรือจะกำหนด Filter ยังไงก็ได้ครับ เพราะมันจะFilter ข้อมูลจาก ID แล้ว Copy ไป Paste ในตารางให้
โค๊ด: [Select]
If MsgBox("คุณต้องการ copy ข้อมูลหรือไม่", vbQuestion + vbYesNo + vbDefaultButton2, "Copy ข้อมูล") = vbYes Then
    Forms![Merchandiser Key Update].Form.Filter = "[ID] = " & ID
    Me.FilterOn = True
DoEvents
DoCmd.RunCommand acCmdSelectRecord
DoEvents
DoCmd.RunCommand acCmdCopy
DoEvents
DoCmd.RunCommand acCmdPaste
End If
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

52
พอดีว่าต้องลง Ms Access ใหม่ เป็น 2013 จากเดิมที่เคยใช้ตัว 2010 แล้ว VBA มันไม่ทำงานครับ ต้องแก้ยังไง



ไปตั้งค่า Trust Center ครับ

1) trust center >> trust center setting > macro setting...
ตั้ง enable all...
2) trust center >> trust center setting > ActiveX setting...
ตั้ง enable all....
ไม่เลือก Save mode...

ตัวอย่างการตั้งค่า
https://www.ugetproject.com/wp/ms-office-access/ตั้งค่าให้vbaทำงาน.html
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

53
    Dim N As Integer
   
    For N = 2 To 50
        Me("Text" & CStr(N)).Enabled = Not IsNull(Me.Text1)
    Next
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

54
รบกวนอีกครับ

Sub CalTotal()
Me.Total = CDbl(Nz(Me.Amount, 0)) * CDbl(Nz(Me.Price, 0))
Me.Text37.Requery
End Sub

ช่่วยอธิบาย
CDbl(Nz  คืออะไร
.Requery คืออะไร


ขอบคุณครับ

CDbl คือ การแปลงเป็น double ใช้กรณี ที่ข้อมูลเป็น text หรือจำนวนเต็ม หรืออื่นๆ เมื่อกำหนด double ก็จะได้ค่าเป็นจำนวน มีทศนิยมด้วย


.Requery คือ การสั่ง แสดงผลใหม่เพื่อแสดงค่าล่าสุดที่เปลี่ยนแปลงไป ใช้ใน control หรือ Form หรืออื่นๆแล้วแต่กรณี
โพสต์นี้ได้รับคำขอบคุณจาก: pirin

หน้า: 1 2 [3] 4 5