You are here:: Các bài học hay VBA trong Excel
 
 

VBA trong Excel

Lập trình VBA và API trong Excel để lấy tên máy tính và tên đăng nhập Windows

Trong lập trình VBA trong Excel, để lấy tên máy tính, tên đăng nhập Windows không có hàm nào cung cấp mà chúng ta phải sử dụng các hàm Windows API để lấy thông tin. Kỹ thuật lập trình Windows API rất hay và thú vị vì cho phép can thiệt sâu và hệ thống, tuy nhiên hiện nay ít người biết đến nó. Bài hướng dẫn này của tôi ngắn gọn, giúp các bạn lấy thông tin tên máy tính và tên đăng nhập, chỉ cần copy đoạn code dưới đây vào module trong VBAProject của mình.

Option Explicit 
'Author: Nguyen Duy Tuan - 
  Địa chỉ email này đã được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó.
  - www.bluesofts.net
'for Office 32, 64-bit
#If VBA7 Then 
Public Declare PtrSafe Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long 
Public Declare PtrSafe Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long 
#Else 
Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long 
Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long 
#End If 
Function ComputerName() As String 
   Dim Buf As String * 255, n& 
   If GetComputerName(Buf, 255) Then 
      ComputerName = Left(Buf, InStr(Buf, Chr(0)) - 1) 
   Else 
      ComputerName = "Error! gui loi ve cho toi 
  Địa chỉ email này đã được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó.
  de tim nguyen nhan." 
   End If 
End Function 
Function UserName() As String 
   Dim Buf As String * 255, n& 
   If GetUserName(Buf, 255) Then 
      UserName = Left(Buf, InStr(Buf, Chr(0)) - 1) 
   Else 
      UserName = "Error! gui loi ve cho toi 
  Địa chỉ email này đã được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó.
  de tim nguyen nhan." 
   End If 
End Function 

Khóa học lập trình VBA trong Excel nâng cao tại Bluesofts hướng dẫn phương pháp lập trình Windows API.

Lấy danh sách máy in và in các sheet tùy ý trong VBA

Khi lập trình VBA trong Excel chúng ta cần lấy danh sách các máy in tùy ý và chọn một sheet tùy ý để in. Phương pháp làm là lập trình VBA kết hợp phương pháp lập trình Windows API.

Mã nguồn lấy danh sách máy in và in tùy ý lập trình VBA trong Excel như sau:

'Cai tien dua vao userform - Nguyen Duy Tuan - http://bluesofts.net - 
  Địa chỉ email này đã được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó.
 
Option Explicit 
Private Sub cmdPrint_Click() 
   Dim sh As Worksheet 
   Set sh = ActiveWorkbook.Sheets(cbSheets.Value) 
   sh.PrintOut , , txtCopies.Value, False, cbPrinters.Value 
End Sub 
Private Sub SpinButton1_Change() 
   'Tang, giam so ban copy
   txtCopies.Value = SpinButton1.Value 
End Sub 
Private Sub UserForm_Initialize() 
   Dim PrinterName As Variant, sh As Object, I& 
   I = 0 
   For Each PrinterName In EnumeratePrinters 
      I = I + 1 
      cbPrinters.AddItem PrinterName 
      If cbPrinters.ListIndex < 0 And PrinterName = ActivePrinter Then 
         'Lay may in default
         cbPrinters.ListIndex = I - 1 
      End If 
   Next 
   'Hien may in dau tien
   If cbPrinters.ListIndex < 0 And cbPrinters.ListCount > 0 Then 
      cbPrinters.ListIndex = 0 
   End If 
   I = 0 
   For Each sh In ActiveWorkbook.Sheets 
      I = I + 1 
      cbSheets.AddItem sh.name 
      If cbSheets.ListIndex < 0 And sh.name = ActiveSheet.name Then 
         'Hien sheet dang mo
         cbSheets.ListIndex = I - 1 
      End If 
   Next 
End Sub 

Download

Tham khảo khóa đào tạo lập trình VBA cơ bảnlập trình VBA nâng cao tại Bluesofts.net

Các phương pháp để đo thời gian thực thi mã lệnh trong VB/VBA

Hàm Timer có thể dùng để xác định thời gian khi mà việc kiểm soát thời gian không quá khắt khe. 

Khi cần kiểm tra sự dịch chuyển thời gian mà mức thay đổi lên đến 1/1000 giây (1 millisecond - mili giây) thì cần dùng các hàm API.
Có thể liệt kê các hàm đo thời gian như sau:
Now, Time, Timer (thuộc VB/VBA)
GetTickCount
TimeGetTime
QueryPerformanceCounter, QueryPerformanceFrequency 


Chúng ta sẽ cùng thực hiện một loạt các thử nghiệm dưới đây sẽ có kết luận.
Với mỗi thủ tục test dưới đây là một phương pháp đo thời gian thực hiện mã lệnh.

Trong VB/VBA, đầu Module khai báo các hàm API

Code:
Declare Function QueryPerformanceCounter Lib "Kernel32" _
                        (X As Currency) As Boolean
Declare Function QueryPerformanceFrequency Lib "Kernel32" _
                        (X As Currency) As Boolean
Declare Function GetTickCount Lib "Kernel32" () As Long
Declare Function timeGetTime Lib "winmm.dll" () As Long

Ẩn sheet người dùng không thể unhide để hiện ra

h04_03

Để bảo vệ bảng tính không cho người khác xem chúng ta cần đặt bảng tính đó Hide, tuy nhiên người khác sẽ vẫn thấy trạng thái chờ Unhide để xem lại. Có một cách để tạo ra nút Unhide luôn mờ - không thể Unhide sheet mặc dù chúng ta đang cho ẩn sheet ở cấp độ cao...

Sắp xếp các sheet trong Excel tăng dần hoặc giảm dần

Một file Excel với nhiều sheet mà tên của nó không được sắp xếp theo trình tự sẽ khó quản lý. Sau đây tôi chia sẻ với các bạn phương pháp sắp xếp các sheet theo tên tăng dần hoặc giảm dần bằng VBA....

Trang 1 của 5