EXCEL TOOLS
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
Excel Add-ins ที่พัฒนาโดยคุณสันติพงศ์ ณสุย (MVP Excel 2010-2020) ด้วยภาษา C# เพื่อแก้ไขปัญหาไฟล์ใหญ่ คำนวณนาน ทำงานช้า จัดการข้อมูลต่าง ๆ ที่ทำงานประจำวันได้อย่างสะดวกรวดเร็ว สนใจคลิกไปดูได้ที่นี่ครับ => Excel Tools
[code]
และปิดด้วย [/code]
ตัวอย่างเช่น [code]dim r as range[/code]
เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)ก็เหมือนเดิมครับ โปรแกรมไม่อัพเดท auto ตอนเปิดไฟล์ครับ คือต้องไปกด run ถึงจะอัพเดทpuriwutpokin wrote:ปรับเป็นlnongkungl wrote:ขอบคุณครับ puriwutpokin ได้แล้วครับ
แต่มีข้อสงสัยอีกอย่างครับ
คือผมเขียนโค๊ดไว้แบบนี้ครับแต่ทำไมเมื่อปิดแล้วเปิดใหม่ formtime ไม่อัพเดทเวลาเป็นปัจจุบันครับ ต้องไปกด run ถึงจะอัพเดท ทั้งๆที่ ผมเขียนไว้ใน sheet เลยCode: Select all
Private Sub Worksheet_open() Range("formtime") = Now() End Sub
Code: Select all
Range("a1") = Now()
ปรับเป็นlnongkungl wrote:ก็เหมือนเดิมครับ โปรแกรมไม่อัพเดท auto ตอนเปิดไฟล์ครับ คือต้องไปกด run ถึงจะอัพเดทpuriwutpokin wrote:ปรับเป็นlnongkungl wrote:ขอบคุณครับ puriwutpokin ได้แล้วครับ
แต่มีข้อสงสัยอีกอย่างครับ
คือผมเขียนโค๊ดไว้แบบนี้ครับแต่ทำไมเมื่อปิดแล้วเปิดใหม่ formtime ไม่อัพเดทเวลาเป็นปัจจุบันครับ ต้องไปกด run ถึงจะอัพเดท ทั้งๆที่ ผมเขียนไว้ใน sheet เลยCode: Select all
Private Sub Worksheet_open() Range("formtime") = Now() End Sub
Code: Select all
Range("a1") = Now()
Code: Select all
Private Sub Workbook_Open()
Sheets("รับเข้า").Range("a1") = Now()
End Sub
Code: Select all
Public Sub Save()
Dim source As Range
Dim Lr As Integer
Dim mySheet As String
Application.ScreenUpdating = False
With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า")
LL = Application.CountIf(.Range("a3:a41"), "<>")
Set source = .Range("a3", .Range("a" & .Rows.Count).End(xlUp)).Resize(LL, 4)
Workbooks.Open "C:\Users\it-support.cmk\Desktop\testmarcro\สรุปยอดรับ.xlsx"
source.Copy
With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า")
mySheet = Format(.Range("a1").Value, "mmm")
End With
Windows("สรุปยอดรับ.xlsx").Activate
Worksheets(mySheet).Activate
Lr = Range("b" & Rows.Count).End(xlUp).Row + 1
Range("b" & Lr).PasteSpecial xlPasteValues
With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า")
Range("b" & Lr).Offset(0, -1).Resize(LL, 1).Value = .Range("a1").Value
End With
End With
Application.CutCopyMode = False
Workbooks("รับเข้า.xlsm").Activate
Application.ScreenUpdating = True
End Sub
Code: Select all
LL = Application.CountIf(.Range("a3:a41"), "<>")
Set source = .Range("a3", .Range("a" & .Rows.Count).End(xlUp)).Resize(LL, 4)
เท่าที่ทราบนะครับ ถ้าค่านั้นมีค่าเดียว ไม่จำเป็นต้องประกาศตัวแปร ก็ได้ เช่น For i = 1 TO 10 , i ก็ไม่จำเป็นต้องประกาศครับ แต่ถ้าไม่อยากให้มีการเข้าใจผิดในการหาค่าตัวแปร ควรประกาศเป็น Dim LL As Long ตามนี้ครับlnongkungl wrote:ได้แล้วครับ ขอบคุณทั้งสองท่านครับ
puriwutpokin
logic
แล้วจากโค๊ดนี้รบกวนอธิบาย บรรทัดนี้ให้ทีครับCode: Select all
Public Sub Save() Dim source As Range Dim Lr As Integer Dim mySheet As String Application.ScreenUpdating = False With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า") LL = Application.CountIf(.Range("a3:a41"), "<>") Set source = .Range("a3", .Range("a" & .Rows.Count).End(xlUp)).Resize(LL, 4) Workbooks.Open "C:\Users\it-support.cmk\Desktop\testmarcro\สรุปยอดรับ.xlsx" source.Copy With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า") mySheet = Format(.Range("a1").Value, "mmm") End With Windows("สรุปยอดรับ.xlsx").Activate Worksheets(mySheet).Activate Lr = Range("b" & Rows.Count).End(xlUp).Row + 1 Range("b" & Lr).PasteSpecial xlPasteValues With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า") Range("b" & Lr).Offset(0, -1).Resize(LL, 1).Value = .Range("a1").Value End With End With Application.CutCopyMode = False Workbooks("รับเข้า.xlsm").Activate Application.ScreenUpdating = True End Sub
ผมไม่ทราบครับ สงสัยว่าCode: Select all
LL = Application.CountIf(.Range("a3:a41"), "<>") Set source = .Range("a3", .Range("a" & .Rows.Count).End(xlUp)).Resize(LL, 4)
1.ตัวแปร LL ไม่ต้องประกาศก็ได้หรอครับ กำหนดขึ้นได้มาเลย
2.ทำไมต้อง Resize(LL,4) ด้วยครับ
ไขข้อข้องใจให้ทีครับ ขอบคุณครับ
puriwutpokin wrote:เท่าที่ทราบนะครับ ถ้าค่านั้นมีค่าเดียว ไม่จำเป็นต้องประกาศตัวแปร ก็ได้ เช่น For i = 1 TO 10 , i ก็ไม่จำเป็นต้องประกาศครับ แต่ถ้าไม่อยากให้มีการเข้าใจผิดในการหาค่าตัวแปร ควรประกาศเป็น Dim LL As Long ตามนี้ครับlnongkungl wrote:ได้แล้วครับ ขอบคุณทั้งสองท่านครับ
puriwutpokin
logic
แล้วจากโค๊ดนี้รบกวนอธิบาย บรรทัดนี้ให้ทีครับCode: Select all
Public Sub Save() Dim source As Range Dim Lr As Integer Dim mySheet As String Application.ScreenUpdating = False With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า") LL = Application.CountIf(.Range("a3:a41"), "<>") Set source = .Range("a3", .Range("a" & .Rows.Count).End(xlUp)).Resize(LL, 4) Workbooks.Open "C:\Users\it-support.cmk\Desktop\testmarcro\สรุปยอดรับ.xlsx" source.Copy With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า") mySheet = Format(.Range("a1").Value, "mmm") End With Windows("สรุปยอดรับ.xlsx").Activate Worksheets(mySheet).Activate Lr = Range("b" & Rows.Count).End(xlUp).Row + 1 Range("b" & Lr).PasteSpecial xlPasteValues With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า") Range("b" & Lr).Offset(0, -1).Resize(LL, 1).Value = .Range("a1").Value End With End With Application.CutCopyMode = False Workbooks("รับเข้า.xlsm").Activate Application.ScreenUpdating = True End Sub
ผมไม่ทราบครับ สงสัยว่าCode: Select all
LL = Application.CountIf(.Range("a3:a41"), "<>") Set source = .Range("a3", .Range("a" & .Rows.Count).End(xlUp)).Resize(LL, 4)
1.ตัวแปร LL ไม่ต้องประกาศก็ได้หรอครับ กำหนดขึ้นได้มาเลย
2.ทำไมต้อง Resize(LL,4) ด้วยครับ
ไขข้อข้องใจให้ทีครับ ขอบคุณครับ
ส่วน Resize ไว้สำหรับยืดช่วงที่ต้องการครับ ในที่นี้ ยืดจาก LL ไป 4 คอลัมน์ครับ
Code: Select all
Set co = .Range("a3:a41", .Range("d" & .Rows.Count).End(xlUp))
คล้ายๆครับ ลองtest ดูเลยว่าผลลัพธ์เป็นอย่างไรครับ เป็นการศึกษาครับlnongkungl wrote:puriwutpokin wrote:เท่าที่ทราบนะครับ ถ้าค่านั้นมีค่าเดียว ไม่จำเป็นต้องประกาศตัวแปร ก็ได้ เช่น For i = 1 TO 10 , i ก็ไม่จำเป็นต้องประกาศครับ แต่ถ้าไม่อยากให้มีการเข้าใจผิดในการหาค่าตัวแปร ควรประกาศเป็น Dim LL As Long ตามนี้ครับlnongkungl wrote:ได้แล้วครับ ขอบคุณทั้งสองท่านครับ
puriwutpokin
logic
แล้วจากโค๊ดนี้รบกวนอธิบาย บรรทัดนี้ให้ทีครับCode: Select all
Public Sub Save() Dim source As Range Dim Lr As Integer Dim mySheet As String Application.ScreenUpdating = False With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า") LL = Application.CountIf(.Range("a3:a41"), "<>") Set source = .Range("a3", .Range("a" & .Rows.Count).End(xlUp)).Resize(LL, 4) Workbooks.Open "C:\Users\it-support.cmk\Desktop\testmarcro\สรุปยอดรับ.xlsx" source.Copy With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า") mySheet = Format(.Range("a1").Value, "mmm") End With Windows("สรุปยอดรับ.xlsx").Activate Worksheets(mySheet).Activate Lr = Range("b" & Rows.Count).End(xlUp).Row + 1 Range("b" & Lr).PasteSpecial xlPasteValues With Workbooks("รับเข้า.xlsm").Sheets("รับเข้า") Range("b" & Lr).Offset(0, -1).Resize(LL, 1).Value = .Range("a1").Value End With End With Application.CutCopyMode = False Workbooks("รับเข้า.xlsm").Activate Application.ScreenUpdating = True End Sub
ผมไม่ทราบครับ สงสัยว่าCode: Select all
LL = Application.CountIf(.Range("a3:a41"), "<>") Set source = .Range("a3", .Range("a" & .Rows.Count).End(xlUp)).Resize(LL, 4)
1.ตัวแปร LL ไม่ต้องประกาศก็ได้หรอครับ กำหนดขึ้นได้มาเลย
2.ทำไมต้อง Resize(LL,4) ด้วยครับ
ไขข้อข้องใจให้ทีครับ ขอบคุณครับ
ส่วน Resize ไว้สำหรับยืดช่วงที่ต้องการครับ ในที่นี้ ยืดจาก LL ไป 4 คอลัมน์ครับ
อ๋อ เข้าใจละครับ เพราะผมไม่เคยใช้ Resize เลยเข้าใจว่าเป็นเรื่องของขนาด
งั้นก็ความหมายเดียวกับ code นี้หรือปล่าวครับ ถ้าผมเข้าใจไม่ผิดนะCode: Select all
Set co = .Range("a3:a41", .Range("d" & .Rows.Count).End(xlUp))
puriwutpokin wrote:คล้ายๆครับ ลองtest ดูเลยว่าผลลัพธ์เป็นอย่างไรครับ เป็นการศึกษาครับlnongkungl wrote:puriwutpokin wrote: เท่าที่ทราบนะครับ ถ้าค่านั้นมีค่าเดียว ไม่จำเป็นต้องประกาศตัวแปร ก็ได้ เช่น For i = 1 TO 10 , i ก็ไม่จำเป็นต้องประกาศครับ แต่ถ้าไม่อยากให้มีการเข้าใจผิดในการหาค่าตัวแปร ควรประกาศเป็น Dim LL As Long ตามนี้ครับ
ส่วน Resize ไว้สำหรับยืดช่วงที่ต้องการครับ ในที่นี้ ยืดจาก LL ไป 4 คอลัมน์ครับ
อ๋อ เข้าใจละครับ เพราะผมไม่เคยใช้ Resize เลยเข้าใจว่าเป็นเรื่องของขนาด
งั้นก็ความหมายเดียวกับ code นี้หรือปล่าวครับ ถ้าผมเข้าใจไม่ผิดนะCode: Select all
Set co = .Range("a3:a41", .Range("d" & .Rows.Count).End(xlUp))