...ส บ า ย ๆ ส ไ ต ล์ มื อ ไ ม่ PRO แ ถ ม ยั ง... LOWFESSIONAL ...

 
กุมภาพันธ์ 2552
1234567
891011121314
15161718192021
22232425262728
 
4 กุมภาพันธ์ 2552
 

ใคร หรือคอมเครื่องใหน กำลังเปิดไฟล์นี้อยู่ในเน็ตเวิร์ค (Excel & VBA)


[รวมเรื่องที่ผ่านมา] รวมเรื่องต่างๆที่เขียนไว้ที่นี่

[เก็บvbaด่วนๆบนเว็บบอร์ด] เวลาทำงานแล้วติดขัด มักค้นหาข้อมูลจากอินเตอร์เน็ต ได้แล้ว ใช้แล้ว แต่อาจลืมอีกได้ง่ายๆ เลยเก็บบันทึกไว้ในเว็บบอร์ดตรงนี้

[simplevbawork] บันทึกงานการที่ทำ เน้นที่เกี่ยวข้องกับ Excel และ VBA

การแชร์ไฟล์เพื่อใช้งานหลายๆเครื่อง เมื่ออีกเครื่องหนึ่งจะเปิดใช้บ้าง ในขณะที่เครื่องแรกกำลังเปิดอยู่ จะมีข้อความเตือนขึ้นมา ก็ไม่เป็นปัญหามากนัก แต่บางครั้งเจ้าของไม่รู้ตัว แต่ไฟล์ค้างอยู่ข้างในเพราะถูกเปิดแบบซ่อน อันหลังนี่หายากมาก แต่เดิมแก้ปัญหาด้วยการให้พนักงานทั้งบริษัทออกจากเอ็กเซลแล้วค่อยเข้าใหม่ วันนี้เลยเข้าค้นข้อมูลในอินเตอร์เน็ต พบบทความประเภทนี้(ในภาษาอังกฤษ)เยอะมาก แต่ส่วนมากลึกซึ้งเกินภูมิปัญญาชาวบ้าน(อย่างผม)มาก จึงได้ทดลองเอาบางส่วนมาประยุกต์ใช้ ทดลองแล้วได้ผลดีทีเดียว

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


2. ไฟล์หลักๆในการทำงาน แบ่งเป็น 3 ไฟล์ คือ ไฟล์โค้ด VBA, ไฟล์เก็บ Log ชื่อว่า logfile.xls และไฟล์งานที่ชื่อ work.xls

3. โค้ดนี้เสิร์จมาจากอินเตอร์เน็ต ไม่ค่อยเข้าใจอะไรนัก รู้แต่ว่า ใช้ตรวจสอบว่าไฟล์เปิดอยู่หรือไม่

Function IsFileLocked(filePath As String) As Boolean
On Error Resume Next
Open filePath For Binary Access Read Write Lock Read Write As #1
Close #1
If Err.Number <> 0 Then
IsFileLocked = True
Err.Clear
Else
IsFileLocked = False
End If
End Function

4. โค้ดนี้ทดลองเขียนขึ้นมาเพื่อทดสอบการทำงาน

Sub xFileOpen()
Dim xText As String, aRow As Integer
Dim xLog

xText = ThisWorkbook.path & "work.xls"
Set xLog = GetObject(ThisWorkbook.path & "logfile.xls") 'เปิดไฟล์แบบซ่อนไว้ข้างหลังทันที

With xLog
With .Sheets("Sheet1")
aRow = .Range("a1").Value
If IsFileLocked(xText) = False Then
'ไฟล์ไม่ได้ถูกใช้งาน สามารถเปิดได้ตามปกติ
Workbooks xText
'เมื่อเปิดงานเรียบร้อยแล้ว จะบันทึก username ที่อ่านจากเอ็กเซลจากข้อ 1. ลงใน logfile.xls
'ในการบันทึกลงชีทของ logfile.xls จะนับบรรทัดไว้ด้วยสูตร CountA เพื่อให้ได้บรรทัดเรียงกันลงมาเรื่อยๆ
.Range("b" & aRow).Formula = Now()
.Range("c" & aRow).Formula = Application.UserName 'ชื่อผู้ใช้งาน จากที่เราใส่ไว้ในข้อ 1.
.Close True
Else
'ไฟล์กำลังถูกเปิดอยู่ในเครื่องใดเครื่องหนึ่ง จึงเข้าไปเปิด logfile.xls เพื่ออ่านข้อมูลจากบรรทัดล่าสุด
MsgBox "ไฟล์กำลังเปิดใช้งาน..." & vbCr & vbCr & _
.Range("b" & aRow - 1).text & vbCr & _
.Range("c" & aRow - 1).text
.Close False
End If
End With
End With
End Sub

5. ลักษณะของ logfile.xls



แนวทางประยุกต์เพิ่มเติม
1. ถ้าพบว่าไฟล์ถูกเปิดอยู่เครื่องอื่น สามารถเพิ่มเติมโค้ด ให้เปิดได้ แต่จะได้แบบ Readonly

2. ในไฟล์ work.xls สามารถใส่โค้ดเพื่อเขียน logfile.xls ไว้ได้แบบให้ละเอียดยิ่งขึ้น คือใช้ Auto_On เพื่อเขียนเวลาขณะเปิดไฟล์ และ Auto_Close เพื่อเขียนเวลาปิดไฟล์ ทำให้สามารถนำ logfile.xls ไปเป็นประวัติการทำงานได้ด้วย

3. logfile.xls ควรจะมีประจำของไฟล์ใครไฟล์มัน ไม่ควรใช้ไฟล์เดียวเพื่อเก็บจากไฟล์ทำงานหลายๆไฟล์ เพราะจากการทดลอง หากมีการต้องการเขียนพร้อมๆกัน ทำให้เกิดความผิดพลาดขึ้นได้




 

Create Date : 04 กุมภาพันธ์ 2552
0 comments
Last Update : 18 กุมภาพันธ์ 2552 21:38:46 น.
Counter : 4725 Pageviews.

 
Name
Opinion
*ใช้ code html ตกแต่งข้อความได้เฉพาะสมาชิก

mitrapap
 
Location :
สระบุรี Thailand

[ดู Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 18 คน [?]




Free Domain Names @ .co.nr!
[Add mitrapap's blog to your web]

MY VIP Friend

 
pantip.com pantipmarket.com pantown.com