:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser
🪷 คำแสดงเจตนา
ขอผลแห่งการให้ความรู้นี้ จงกลับไปยังผู้ที่เป็นเจ้าของเดิม แม้ข้าพเจ้าจะไม่รู้จักท่านก็ตาม ขอให้แสงแห่งปัญญาที่ท่านเคยจุดไว้ ได้กลับไปเติมเต็มชีวิตของท่านอีกครั้ง และขอให้เจตนาของข้าพเจ้าเป็นการคืนความดีอย่างสงบ

อยากใช้ VBA สร้าง function

Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่

Post a reply


This question is a means of preventing automated form submissions by spambots.
Smilies
:D :thup: :cp: :flw: :rz: :sg: :tt: :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :ard: :arl: :aru: :| :mrgreen: :geek: :ugeek:

BBCode is ON
[img] is ON
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: อยากใช้ VBA สร้าง function

Re: อยากใช้ VBA สร้าง function

#10

by snasui » Sun Oct 02, 2011 1:39 pm

:D ยินดีด้วยครับ และขอบคุณสำหรับคำชื่นชมครับ :P

Re: อยากใช้ VBA สร้าง function

#9

by picpostman » Sun Oct 02, 2011 1:03 pm

ทดลองแล้วครับ ใช้งานได้ทุก row และ column

ขอบคุณจากใจจริงอีกครั้งครับ ผมจากคนที่ไม่เคยเขียน vba มาก่อนเลย ทำให้ได้ความรู้เยอะมากเลยครับ
นับถือน้ำใจของท่าน ที่ยอมสละเวลามาให้ความช่วยเหลือ

ปล. อาจารย์ เทพมาก (สุดๆ)

Re: อยากใช้ VBA สร้าง function

#8

by snasui » Sun Oct 02, 2011 12:34 pm

:D ผมปรับ Code ด้านบนใหม่อีกรอบเนื่องจากคีย์ตกไปบางตัวเลยทำให้ครั้งแรกยังให้ผลไม่ถูกต้อง ลองทดสอบดูได้เลยครับ :aru:

Re: อยากใช้ VBA สร้าง function

#7

by picpostman » Sun Oct 02, 2011 12:18 pm

ขอโทษอีกครั้ง เพราะตอนแรกผมจะใช้ fucntion โดยใช้ เมาส์ลาก เลยไม่ได้แจ้งว่ามีมากกว่า 1 column
ผมกำลังเปิดหนังสือ ดูเรื่อง offset อยู่ครับ เพราะลองปรับด้วยตนเอง ยังได้ไม่หมด
ปล. อาจารย์ตอบไวมากเลยครับ

ผมขอไปลองของอาจารย์อีกทีครับ

Re: อยากใช้ VBA สร้าง function

#6

by snasui » Sun Oct 02, 2011 12:06 pm

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

Code: Select all

Public Sub SumPern()
Dim a As Variant, b As Variant
Dim k As Integer, i As Integer
Dim t As Integer, u As Integer
Dim r As Range, ra As Range
Dim rl As Range, rall As Range
Dim j As Integer
a = Array("N", "R", "RW", "M", "F", "D")
b = Array(0, 1, 2, 3, 4, 5)
With ActiveSheet
    Set rall = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
    For Each rl In rall
        If rl = "Sum-Perm" Then
            k = rl.Row - rl.Offset(0, -1).End(xlUp).Row
            For j = 0 To 3
                u = 0
                t = 0
                Set ra = rl.Offset(-k, 1 + j).Resize(k, 1)
                For Each r In ra
                    For i = 0 To UBound(a)
                        If r = a(i) Then
                            t = b(i)
                        End If
                        If t >= u Then
                            u = t
                        End If
                    Next i
                Next r
                rl.Offset(0, j + 1) = a(u)
            Next j
        End If
      Next rl
End With
End Sub

Re: อยากใช้ VBA สร้าง function

#5

by picpostman » Sun Oct 02, 2011 11:41 am

สวัสดีครับ
ผมทดลองของอาจารย์ แล้วใช้งานได้ครับ อ่าน code แล้ว advance มากเลยครับ

แต่ติดปัญหาอีกแล้วครับ เพราะแนวนอน (permission) จะได้แค่อันเดียว ต้องขอโทษจริงๆ ผมบอกข้อมูลไม่ครบ เพราะ permission มีมากกว่า 1 น่ะครับ
ต้องปรับ code ของอาจารย์ตรงไหนถึงจะได้ มากกว่า 1 column ครับ เช่น 10 column

ปล. ถ้าเป็น function ที่ผมเขียนจะใช้เมาส์ลากแนวนอน ได้เลย แต่มันก็ติดตรงแนวตั้งที่ไม่ได้อีก

เพิ่มไฟล์แนบ แบบ permission หลาย column
ขอบคุณมากครับ
Attachments
permission1-n.xlsm
(22.61 KiB) Downloaded 18 times

Re: อยากใช้ VBA สร้าง function

#4

by snasui » Sun Oct 02, 2011 10:07 am

:D ปกติการใช้ฟังก์ชั่นจะสามารถระบุช่วงข้อมูลที่แน่นอนมาใช้

สำหรับโจทย์นี้ผมเขียนตัวอย่างเป็น Sub Procedure มาให้ตามด้านล่าง ก่อน Run ให้ย้าย User1 มาไว้ที่ A2 ก่อน เพื่อให้เหมือนกับช่วงอื่น ๆ

Code: Select all

Sub SumPern()
Dim a As Variant, b As Variant
Dim k As Integer, i As Integer
Dim t As Integer, u As Integer
Dim r As Range, ra As Range
Dim rl As Range, rall As Range
a = Array("N", "R", "RW", "M", "F", "D")
b = Array(0, 1, 2, 3, 4, 5)
With ActiveSheet
    Set rall = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
    For Each rl In rall
        u = 0
        If rl = "Sum-Perm" Then
            k = rl.Row - rl.Offset(0, -1).End(xlUp).Row
            Set ra = rl.Offset(-k, 1).Resize(k, 1)
            For Each r In ra
                For i = 0 To UBound(a)
                    If r = a(i) Then
                        t = b(i)
                    End If
                    If t >= u Then
                        u = t
                    End If
                Next i
            Next r
            rl.Offset(0, 1) = a(u)
        End If
      Next rl
End With
End Sub

Re: อยากใช้ VBA สร้าง function

#3

by picpostman » Sun Oct 02, 2011 3:57 am

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

แต่ผมติดปัญหาเรื่องการเรียกใช้งาน เมื่อ user มีจำนวน group ไม่เท่ากัน จะใช้เมาส์ลากรวมทีเดียวไม่ได้
ต้องใช้วิธีลากทีละ User ซึ่งเยอะมากครับ
มีวิธีไหนช่วยได้บ้างไหมครับ

มีไฟล์แนบมาด้วยครับ sheet2 (update)

ปล. สูตรแรกที่อาจารย์เขียนมา สุดยอดมากทดลองแล้วครับ
Attachments
permission.xlsm
ใส่ code vba มาแล้วครับ
(20.49 KiB) Downloaded 10 times

Re: อยากใช้ VBA สร้าง function

#2

by snasui » Fri Sep 30, 2011 2:57 pm

:D กรณีใช้สูตรและไม่ใช้เซลล์ช่วย ที่เซลล์ B7 คีย์

=INDEX({"N";"R";"RW";"M";"F";"D"},MATCH(MAX(IF(ISNUMBER(MATCH({"N";"R";"RW";"M";"F";"D"},$B$2:$B$7,0)),{0;1;2;3;4;5})),{0;1;2;3;4;5},0))

Enter

แต่หากต้องการใช้ VBA ลองเขียนมาก่อนครับ ติดตรงไหนก็ค่อยมาช่วยกันดูต่อ :mrgreen:

อยากใช้ VBA สร้าง function

#1

by picpostman » Fri Sep 30, 2011 1:08 pm

มีเรื่องรบกวนครับ ตอนนี้ผมกำลังทำ report เกี่ยวกับ Permission file sharing โดย
ผมรับค่าจาก B2-B7 เป็นค่า permission แล้วนำไปแทนค่าเป็นตัวเลข
D=5
F=4
M=3
RW=2
R=1
N=0

แล้วส่งค่ากลับ โดยเอาค่ามากสุดมากแสดงที่ B8

วิธีดังกล่าวยุ่งยากมากครับเพราะ จำนวนข้อมูลเยอะมาก ของจริงมีมากกว่า 6 group
ผมอยากใช้ vba สร้างเป็น function โดยใช้ mouse ลากจากช่อง B2-B7 แล้วได้ผลลัพ ที่ช่อง B8 ทำได้ไหมครับ
ปล. จากไฟล์ที่แนบ ช่อง "คำนวณเท่านั้น" เอาออกก็ได้ครับ ถ้าใช้ IF เปรียบเทียบ permission ได้โดยตรงน่าจะดีกว่า
ขอบคุณครับ
Attachments
permission.xlsx
ตัวอย่าง file ครับ
(11.07 KiB) Downloaded 5 times

Top